From 11312c2c68a283bfe4c8d71d2321db4d1764c658 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Sun, 6 Sep 2026 19:23:55 -0700 Subject: [PATCH] Upgrade Growth to Dawn 0.8.26 and native Vercel output --- apps/growth-research/README.md | 17 +- .../deployment-package-lock.json | 124 +- apps/growth-research/package.json | 18 +- apps/growth-research/scripts/dawn-cli.mts | 2 +- .../growth-research/test/capabilities.spec.ts | 5 +- .../test/fixture-dependencies.ts | 27 + .../test/memory.integration.spec.ts | 5 +- apps/growth-research/test/packaging.spec.ts | 13 +- apps/growth-research/test/pilot-agent.spec.ts | 9 +- apps/lifecycle/README.md | 4 +- apps/lifecycle/api/index.ts | 4 - apps/lifecycle/dawn.config.ts | 2 +- apps/lifecycle/package.json | 14 +- apps/lifecycle/project.json | 9 +- apps/lifecycle/public/.gitkeep | 1 - apps/lifecycle/scripts/dawn-cli.mts | 24 + .../scripts/verify-vercel-adapter.mts | 212 +- .../scripts/verify-vercel-adapter.spec.ts | 160 +- apps/lifecycle/src/dispatcher.spec.ts | 43 +- apps/lifecycle/src/generated-dawn-app.d.ts | 6 - apps/lifecycle/src/growth.ts | 4 +- apps/lifecycle/src/vercel-adapter.ts | 35 +- apps/lifecycle/tsconfig.json | 2 +- apps/lifecycle/vercel.json | 8 +- package-lock.json | 2087 +++++------------ package.json | 2 +- 26 files changed, 982 insertions(+), 1855 deletions(-) create mode 100644 apps/growth-research/test/fixture-dependencies.ts delete mode 100644 apps/lifecycle/api/index.ts delete mode 100644 apps/lifecycle/public/.gitkeep create mode 100644 apps/lifecycle/scripts/dawn-cli.mts delete mode 100644 apps/lifecycle/src/generated-dawn-app.d.ts diff --git a/apps/growth-research/README.md b/apps/growth-research/README.md index b6e91339b..1e5f9335c 100644 --- a/apps/growth-research/README.md +++ b/apps/growth-research/README.md @@ -136,7 +136,7 @@ Human semantic review is not replaced by model grading or string matching. | Finding | Evidence / owning layer | Status and next verification | | --- | --- | --- | -| Nullable tool fields become required strings | Dawn 0.8.24 compiler JSON schema conversion; observed generated submit schema and failed unknown-field submissions | Upstream core and LangChain conversion regression/fix in progress. Pilot uses the supported authored Zod schema export; a package upgrade must rerun the original extraction probe before declaring the upstream defect released. | +| Nullable tool fields become required strings | Dawn 0.8.24 compiler JSON schema conversion; observed generated submit schema and failed unknown-field submissions | Reproduced with published 0.8.26: compiler extraction of `submitCandidate` still emits required string-only profile fields. Pilot retains the supported authored Zod schema export; this upgrade does not establish an upstream fix. | | Bound model calls bypass subclass generation hooks | Real bound-model regression in this application | Guards, request counts and JSON usage capture live at the actual provider fetch boundary; generated graph tests verify it. | | Page capture yields empty, partial, or mostly navigation evidence | Company-only acquisition against the six documented domains | Outcomes retained. Evaluate extraction improvements separately; do not hide failures by swapping cases. | | Baseline provider rejects billing state | Earlier live baseline synthetic calls returned a classified billing rejection | Historical finding for the retired adapter; failed calls provide no quality comparison. | @@ -150,7 +150,11 @@ The local evaluation harness remains isolated from those production jobs. ## Synthetic compatibility deployment Private synthetic Dawn application, separate from lifecycle and the Python cockpit. -Published Dawn packages are pinned to `0.8.24`; the app and deployment require Node 24. +Published Dawn packages are pinned to `0.8.26`; the app and deployment require Node 24. +The published 0.8.25 release contains no functional package changes; 0.8.26 adds +opt-in server CORS. The tagged core and LangChain sources contain no nullable-schema, +memory-enablement, or delegation-checkpoint fix, so the compatibility workarounds +below remain in place. Historical findings above retain their observed versions. The only public graph ID is `growth_research`, pointing to the unchanged generated Dawn `/enrichment/research#agent` entry. The safe alias avoids slash/hash routing failures in the Agent Server's internal per-graph HTTP endpoints. Its registered researcher is @@ -193,8 +197,13 @@ it after changing direct dependencies, use `deploymentManifest()` from `npm install --package-lock-only --ignore-scripts --workspaces=false` there, and copy its lock to `deployment-package-lock.json`. The build rejects stale direct dependency locks. Do not copy the monorepo lock or workspace dependencies into the artifact. -The workspace lock keeps this app's dependency tree nested so its testing helpers -and runtime resolve Dawn 0.8.24 while lifecycle retains Dawn 0.8.21. +The workspace lock pins this app's testing helpers and runtime, together with +lifecycle, to Dawn 0.8.26. +The SDK remains nested under each app so its Zod 4 peer resolves to that app's +version, rather than the root Zod 3 package. Regenerating the stale Dawn dependency lock entries +with peer resolution enabled restores this layout, which clean `npm ci` preserves +with the repository's existing install settings. The packaging suite checks +SDK-local Zod resolution to catch regressions during later lock regeneration. Set `GROWTH_RESEARCH_FIXTURE_MODE=synthetic-only` explicitly to permit model calls. The default blocks them. The fixed corpus contains `atlas` and `beacon`; tools accept diff --git a/apps/growth-research/deployment-package-lock.json b/apps/growth-research/deployment-package-lock.json index b2028a39b..a8eeb7e89 100644 --- a/apps/growth-research/deployment-package-lock.json +++ b/apps/growth-research/deployment-package-lock.json @@ -8,12 +8,12 @@ "name": "@threadplane-internal/growth-research", "version": "0.0.0", "dependencies": { - "@dawn-ai/cli": "0.8.24", - "@dawn-ai/core": "0.8.24", - "@dawn-ai/langchain": "0.8.24", - "@dawn-ai/memory": "0.8.24", - "@dawn-ai/memory-pgvector": "0.8.24", - "@dawn-ai/sdk": "0.8.24", + "@dawn-ai/cli": "0.8.26", + "@dawn-ai/core": "0.8.26", + "@dawn-ai/langchain": "0.8.26", + "@dawn-ai/memory": "0.8.26", + "@dawn-ai/memory-pgvector": "0.8.26", + "@dawn-ai/sdk": "0.8.26", "@langchain/core": "1.2.9", "@langchain/langgraph": "1.4.14", "@langchain/langgraph-checkpoint": "1.1.5", @@ -78,9 +78,9 @@ "license": "MIT" }, "node_modules/@dawn-ai/ag-ui": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/ag-ui/-/ag-ui-0.8.24.tgz", - "integrity": "sha512-7lce3QKiT4ZosMFIju+k1EebeSqxTqvPux+EuSTi/l0YblA1IMxtF+oMIrA0slDxJ3dv5IfRzYNbOcznVnOT/Q==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/ag-ui/-/ag-ui-0.8.26.tgz", + "integrity": "sha512-26NO74q7EAt0rAxg8bf6qd2U74EQoxXw75vMMIw3swzCy4SmB0tB+kaLX5xrBhoew5Ghze1vQVZ+g8fzRIvpHw==", "license": "MIT", "dependencies": { "@ag-ui/core": "0.0.59", @@ -104,20 +104,20 @@ } }, "node_modules/@dawn-ai/cli": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/cli/-/cli-0.8.24.tgz", - "integrity": "sha512-18+jxTh9vjXHNwX4Y+TrM5bYBSK94W1qevuU50BM54NA2ETw9dfUSPYxY2Se2Gffln/u6ubO6UCxChTLgTj+jQ==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/cli/-/cli-0.8.26.tgz", + "integrity": "sha512-hGL8L3YZCPoI4xbHZV3by3aw6hSrRGdja2zF9i0+qsCLdD2eBJ9eyU8tbkrCfwPQ+uabh59Kys+nMdh2l1AGKw==", "license": "MIT", "dependencies": { "@ag-ui/core": "0.0.59", - "@dawn-ai/ag-ui": "0.8.24", - "@dawn-ai/core": "0.8.24", - "@dawn-ai/langchain": "0.8.24", - "@dawn-ai/langgraph": "0.8.24", - "@dawn-ai/memory": "0.8.24", - "@dawn-ai/permissions": "0.8.24", - "@dawn-ai/sdk": "0.8.24", - "@dawn-ai/sqlite-storage": "0.8.24", + "@dawn-ai/ag-ui": "0.8.26", + "@dawn-ai/core": "0.8.26", + "@dawn-ai/langchain": "0.8.26", + "@dawn-ai/langgraph": "0.8.26", + "@dawn-ai/memory": "0.8.26", + "@dawn-ai/permissions": "0.8.26", + "@dawn-ai/sdk": "0.8.26", + "@dawn-ai/sqlite-storage": "0.8.26", "commander": "15.0.0", "esbuild": "^0.28.1", "tsx": "^4.23.5" @@ -130,15 +130,15 @@ } }, "node_modules/@dawn-ai/core": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/core/-/core-0.8.24.tgz", - "integrity": "sha512-zrx6H1vhFpfvbO9BQIkpKTUymTJPumyMZj/vkd4gWv/3L5iEAS+QOHkdmn8v1nUNPlXzag7W6NovmBIQCC5E0w==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/core/-/core-0.8.26.tgz", + "integrity": "sha512-2yh4s1APE86J9WpkBMlyziIVIvodZFybK+06Z1JDVZulN3T8w2qtHqSpMs47bOQ2Owz7pHmTiYPnkcoiZSwB1w==", "license": "MIT", "dependencies": { - "@dawn-ai/permissions": "0.8.24", - "@dawn-ai/sdk": "0.8.24", - "@dawn-ai/sqlite-storage": "0.8.24", - "@dawn-ai/workspace": "0.8.24", + "@dawn-ai/permissions": "0.8.26", + "@dawn-ai/sdk": "0.8.26", + "@dawn-ai/sqlite-storage": "0.8.26", + "@dawn-ai/workspace": "0.8.26", "@langchain/langgraph": "^1.4.9", "@typescript/old": "npm:typescript@6.0.2", "tsx": "^4.23.5", @@ -153,14 +153,14 @@ } }, "node_modules/@dawn-ai/langchain": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/langchain/-/langchain-0.8.24.tgz", - "integrity": "sha512-smwRLyflWG4fkvbv8bTXoILlEZX7kYB0NJWCFC4oX1tWf4rjO+cgeohECQgdkhktpVxuj0g34ASe2zOxonQHJQ==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/langchain/-/langchain-0.8.26.tgz", + "integrity": "sha512-3qeexYRMSb9+9t6NwiGHHYCjPWuu061cinP98D6erYMXXsIijxEVvW3EWLBOtha957MhVrb+rjzqEvRFIvpjzA==", "license": "MIT", "dependencies": { - "@dawn-ai/core": "0.8.24", - "@dawn-ai/sdk": "0.8.24", - "@dawn-ai/workspace": "0.8.24", + "@dawn-ai/core": "0.8.26", + "@dawn-ai/sdk": "0.8.26", + "@dawn-ai/workspace": "0.8.26", "@langchain/langgraph": "^1.4.9", "@langchain/openai": "^1.5.5", "gpt-tokenizer": "^3.4.0" @@ -207,36 +207,36 @@ } }, "node_modules/@dawn-ai/langgraph": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/langgraph/-/langgraph-0.8.24.tgz", - "integrity": "sha512-Tb/gLuuDQOYZJbEf4e6ZqBasvH38OJL9UdaM0jsXRanCFrC5u8mA1hRF9JXLqqfuA1Eyr1zJzDQHqv2/ZDv1HA==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/langgraph/-/langgraph-0.8.26.tgz", + "integrity": "sha512-rIOwcZ3fHFd1KN3Hbc1BKqNRkpsLu6f174YxO3poDkpdvraiTEz8d9r/zuriOsKZXtdMLjOBbKEtr6/UwVmZoA==", "license": "MIT", "dependencies": { - "@dawn-ai/sdk": "0.8.24" + "@dawn-ai/sdk": "0.8.26" }, "engines": { "node": ">=24.0.0" } }, "node_modules/@dawn-ai/memory": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/memory/-/memory-0.8.24.tgz", - "integrity": "sha512-yVptc9AeDEGm73j1SysyVDZLJmYriAp5mRBbhdVFzb5cULEI5X3Ysk3sxqlhZoM1z/7VZONhNA8g6zEL8ppRuA==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/memory/-/memory-0.8.26.tgz", + "integrity": "sha512-2C5izGXfefVple7zJxrACO5av4Sq4m5zDjnKn27SPBOjapcCo0G4xWAtd/67/s+LinzPbnPDwO8Q+kBVEEasng==", "license": "MIT", "dependencies": { - "@dawn-ai/sqlite-storage": "0.8.24" + "@dawn-ai/sqlite-storage": "0.8.26" }, "engines": { "node": ">=24.0.0" } }, "node_modules/@dawn-ai/memory-pgvector": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/memory-pgvector/-/memory-pgvector-0.8.24.tgz", - "integrity": "sha512-i6WWyts+Uga/xwRK7nFOEtlKt6fAPL8OgDo5U6m5VzGg0J35Gmv02gHww9PQ70RiyyVn5x8vp+RFCju/FRaQtw==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/memory-pgvector/-/memory-pgvector-0.8.26.tgz", + "integrity": "sha512-wAoqHVBZ7Cb/gKGhUJwHQvP4eIYvq5OQc/jSmI38oUyj6NI+lp8cNs66sNI5YCwxcJ+6wFChGeHMNZF/Tc/oAw==", "license": "MIT", "dependencies": { - "@dawn-ai/memory": "0.8.24", + "@dawn-ai/memory": "0.8.26", "pg": "^8.22.0", "pgvector": "^0.3.0" }, @@ -245,21 +245,21 @@ } }, "node_modules/@dawn-ai/permissions": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/permissions/-/permissions-0.8.24.tgz", - "integrity": "sha512-PfFQ9rm08TGmTi4twAeaUN+7cZLOB3s+Anfa5isVI/uM0mRKuRFr4hg/WEBQPaZVyDuTrCqiDgOcXTJ1mfySeA==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/permissions/-/permissions-0.8.26.tgz", + "integrity": "sha512-gRVedFYzuNsuqE9Gx18O1Ch6nlbYJdYIczXCWVR4r5Tclqb//Y22kHCS+s48juwnQ5jR2NTUFWeyh5vzFcAiLA==", "license": "MIT", "dependencies": { - "@dawn-ai/sdk": "0.8.24" + "@dawn-ai/sdk": "0.8.26" }, "engines": { "node": ">=24.0.0" } }, "node_modules/@dawn-ai/sdk": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/sdk/-/sdk-0.8.24.tgz", - "integrity": "sha512-YzBVD53dzPUNTkFwbYYdh/XMCX92wmSwmOmIsxkBgnxc3gX11b5z18F6NO7IeWJdmJbxRaLVBAAcUJvO/9E0qg==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/sdk/-/sdk-0.8.26.tgz", + "integrity": "sha512-iuPaJFjF4jAXV1ARN4eKaAtdHiaVDe/edCZdX72Obh2PADayx4undsyFwGXM7fiywjjKxRjMkud/9BXpou+Qsw==", "license": "MIT", "engines": { "node": ">=24.0.0" @@ -274,9 +274,9 @@ } }, "node_modules/@dawn-ai/sqlite-storage": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/sqlite-storage/-/sqlite-storage-0.8.24.tgz", - "integrity": "sha512-2fGt9K7PabDpN9KdguYrdzMC6mI+lMud/8chvRriCdIqJYeWGUXfZB+GWihXbTU+dR6o3NE1hyAabl+Sj6upkQ==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/sqlite-storage/-/sqlite-storage-0.8.26.tgz", + "integrity": "sha512-bG9W8re14XkMKom77O9XW9v3FaeMMD5a06aUfAhTaEQWR+Qqkza1+pY2cwGDyaCWWl00wH0XFLwWL55nszLRLQ==", "license": "MIT", "engines": { "node": ">=24.0.0" @@ -287,12 +287,12 @@ } }, "node_modules/@dawn-ai/workspace": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/workspace/-/workspace-0.8.24.tgz", - "integrity": "sha512-bW4c1Xj3lLqnbiPSHXkTDxcdJ4py/SGe4aKuPOWMKdxo64qso/2cuRcVh2kCOFP3sUv9KJXuE2RqdeJIV2Rf4Q==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/workspace/-/workspace-0.8.26.tgz", + "integrity": "sha512-VTSUy9i8Eq/zlZS1K0j3CaFmRSp06/rWdtcLpny70rIPxuq+emd9cnpPBbGVCJxYjNr1UJYVbqGpDg1grFms4w==", "license": "MIT", "dependencies": { - "@dawn-ai/sdk": "0.8.24" + "@dawn-ai/sdk": "0.8.26" }, "engines": { "node": ">=24.0.0" @@ -1007,9 +1007,9 @@ } }, "node_modules/langsmith": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.10.1.tgz", - "integrity": "sha512-zRDCnLznGdzx1VottX4CWr8v9ZZLRoSql2pbjEXYA1Jeg+NMDdq87x/v0Dk4GNkNZYhE+ZxFX3vTxwWq6W6gVA==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.10.2.tgz", + "integrity": "sha512-9iqIcEPBMlRT+vvijcjCo4AeHlJHUZjxwbPtDdvQPpGgvo7nYxhsQ7jVd53zXkPstiPfjRhexfnIe0vLltVFmg==", "license": "MIT", "dependencies": { "p-queue": "6.6.2" diff --git a/apps/growth-research/package.json b/apps/growth-research/package.json index 9764f2823..1a273e044 100644 --- a/apps/growth-research/package.json +++ b/apps/growth-research/package.json @@ -5,12 +5,12 @@ "type": "module", "engines": { "node": "24" }, "dependencies": { - "@dawn-ai/cli": "0.8.24", - "@dawn-ai/core": "0.8.24", - "@dawn-ai/langchain": "0.8.24", - "@dawn-ai/memory": "0.8.24", - "@dawn-ai/memory-pgvector": "0.8.24", - "@dawn-ai/sdk": "0.8.24", + "@dawn-ai/cli": "0.8.26", + "@dawn-ai/core": "0.8.26", + "@dawn-ai/langchain": "0.8.26", + "@dawn-ai/memory": "0.8.26", + "@dawn-ai/memory-pgvector": "0.8.26", + "@dawn-ai/sdk": "0.8.26", "@langchain/core": "1.2.9", "@langchain/langgraph": "1.4.14", "@langchain/langgraph-checkpoint": "1.1.5", @@ -20,8 +20,8 @@ "zod": "4.5.4" }, "devDependencies": { - "@dawn-ai/evals": "0.8.24", - "@dawn-ai/testing": "0.8.24", - "@dawn-ai/workspace": "0.8.24" + "@dawn-ai/evals": "0.8.26", + "@dawn-ai/testing": "0.8.26", + "@dawn-ai/workspace": "0.8.26" } } diff --git a/apps/growth-research/scripts/dawn-cli.mts b/apps/growth-research/scripts/dawn-cli.mts index 65818028b..c263d5b3a 100644 --- a/apps/growth-research/scripts/dawn-cli.mts +++ b/apps/growth-research/scripts/dawn-cli.mts @@ -9,7 +9,7 @@ const appRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..'); const require = createRequire(resolve(appRoot, 'package.json')); const cli = require.resolve('@dawn-ai/cli'); const metadata = JSON.parse(readFileSync(resolve(dirname(cli), '../package.json'), 'utf8')); -if (metadata.version !== '0.8.24') throw new Error(`Expected app-local Dawn CLI 0.8.24, resolved ${metadata.version}`); +if (metadata.version !== '0.8.26') throw new Error(`Expected app-local Dawn CLI 0.8.26, resolved ${metadata.version}`); const result = spawnSync(process.execPath, [cli, ...process.argv.slice(2)], { cwd: appRoot, stdio: 'inherit' }); if (result.error) throw result.error; process.exitCode = result.status ?? 1; diff --git a/apps/growth-research/test/capabilities.spec.ts b/apps/growth-research/test/capabilities.spec.ts index eed3f5ac3..73a9992be 100644 --- a/apps/growth-research/test/capabilities.spec.ts +++ b/apps/growth-research/test/capabilities.spec.ts @@ -1,4 +1,5 @@ -import { cp, mkdtemp, mkdir, rm, symlink, writeFile } from 'node:fs/promises'; +import { cp, mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises'; +import { linkFixtureDependencies } from './fixture-dependencies.js'; import { tmpdir } from 'node:os'; import { resolve, join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; @@ -93,7 +94,7 @@ describe('synthetic capability boundary', () => { await cp(join(appRoot, 'src'), join(temporaryRoot, 'src'), { recursive: true }); await cp(join(appRoot, 'dawn.config.ts'), join(temporaryRoot, 'dawn.config.ts')); await cp(join(appRoot, 'package.json'), join(temporaryRoot, 'package.json')); - await symlink(join(appRoot, 'node_modules'), join(temporaryRoot, 'node_modules')); + await linkFixtureDependencies(appRoot, temporaryRoot); const sibling = join(temporaryRoot, 'src/app/enrichment/research/subagents/undeclared'); await mkdir(sibling, { recursive: true }); await writeFile(join(sibling, 'index.ts'), 'import {agent} from "@dawn-ai/sdk"; export default agent({model:"gpt-4.1-mini",systemPrompt:"UNDECLARED_SIBLING_EXECUTED",description:"Forbidden sibling"});'); diff --git a/apps/growth-research/test/fixture-dependencies.ts b/apps/growth-research/test/fixture-dependencies.ts new file mode 100644 index 000000000..b4b9f8b4f --- /dev/null +++ b/apps/growth-research/test/fixture-dependencies.ts @@ -0,0 +1,27 @@ +import { mkdir, readFile, symlink } from 'node:fs/promises'; +import { createRequire } from 'node:module'; +import { dirname, join } from 'node:path'; + +/** Preserve application resolution in relocated fixtures with nested or hoisted installs. */ +export async function linkFixtureDependencies(appRoot: string, fixtureRoot: string): Promise { + const manifest = JSON.parse(await readFile(join(appRoot, 'package.json'), 'utf8')); + const require = createRequire(join(appRoot, 'package.json')); + for (const name of Object.keys({ ...manifest.dependencies, ...manifest.devDependencies })) { + let source: string | undefined; + for (const directory of require.resolve.paths(name) ?? []) { + const candidate = join(directory, name); + try { + if (JSON.parse(await readFile(join(candidate, 'package.json'), 'utf8')).name === name) { + source = candidate; + break; + } + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error; + } + } + if (!source) throw new Error(`Cannot resolve fixture dependency ${name}`); + const target = join(fixtureRoot, 'node_modules', name); + await mkdir(dirname(target), { recursive: true }); + await symlink(source, target, 'dir'); + } +} diff --git a/apps/growth-research/test/memory.integration.spec.ts b/apps/growth-research/test/memory.integration.spec.ts index d5f5e14b2..46bb9fc56 100644 --- a/apps/growth-research/test/memory.integration.spec.ts +++ b/apps/growth-research/test/memory.integration.spec.ts @@ -1,5 +1,6 @@ import { execFile } from 'node:child_process'; -import { cp, mkdir, mkdtemp, rm, symlink } from 'node:fs/promises'; +import { cp, mkdir, mkdtemp, rm } from 'node:fs/promises'; +import { linkFixtureDependencies } from './fixture-dependencies.js'; import { tmpdir } from 'node:os'; import { promisify } from 'node:util'; import { dirname, join, resolve } from 'node:path'; @@ -29,7 +30,7 @@ it('persists candidates across fresh processes, excludes them from active recall for (const name of ['dawn.config.ts', 'package.json']) await cp(join(appRoot, name), join(relocated, name)); await mkdir(join(relocated, 'scripts')); await cp(join(appRoot, 'scripts/memory-probe.mts'), join(relocated, 'scripts/memory-probe.mts')); - await symlink(join(appRoot, 'node_modules'), join(relocated, 'node_modules')); + await linkFixtureDependencies(appRoot, relocated); const read = await probe('read', 'atlas'); expect(read.pid).not.toBe(written.pid); expect(read.candidateIds).toContain(written.id); diff --git a/apps/growth-research/test/packaging.spec.ts b/apps/growth-research/test/packaging.spec.ts index 84673053d..f783fda5a 100644 --- a/apps/growth-research/test/packaging.spec.ts +++ b/apps/growth-research/test/packaging.spec.ts @@ -3,6 +3,7 @@ import { tmpdir } from 'node:os'; import { dirname, join } from 'node:path'; import { afterEach, describe, expect, it } from 'vitest'; import { stageLangSmith } from '../scripts/package-langsmith.mts'; +import { createRequire } from 'node:module'; const roots: string[] = []; const graphId = '/enrichment/research#agent'; @@ -13,8 +14,8 @@ async function fixture() { const root = await mkdtemp(join(tmpdir(), 'growth-packaging-test-')); roots.push(root); const files: Record = { - 'package.json': JSON.stringify({ name: 'fixture', version: '0.0.0', private: true, type: 'module', engines: { node: '24' }, dependencies: { '@dawn-ai/core': '0.8.24' } }), - 'deployment-package-lock.json': JSON.stringify({ name: 'fixture', version: '0.0.0', lockfileVersion: 3, packages: { '': { name: 'fixture', version: '0.0.0', engines: { node: '24' }, dependencies: { '@dawn-ai/core': '0.8.24' } }, 'node_modules/@dawn-ai/core': { version: '0.8.24', resolved: 'https://registry.npmjs.org/@dawn-ai/core/-/core-0.8.24.tgz' } } }), + 'package.json': JSON.stringify({ name: 'fixture', version: '0.0.0', private: true, type: 'module', engines: { node: '24' }, dependencies: { '@dawn-ai/core': '0.8.26' } }), + 'deployment-package-lock.json': JSON.stringify({ name: 'fixture', version: '0.0.0', lockfileVersion: 3, packages: { '': { name: 'fixture', version: '0.0.0', engines: { node: '24' }, dependencies: { '@dawn-ai/core': '0.8.26' } }, 'node_modules/@dawn-ai/core': { version: '0.8.26', resolved: 'https://registry.npmjs.org/@dawn-ai/core/-/core-0.8.26.tgz' } } }), 'dawn.config.ts': 'export default { build: { targets: ["langsmith"] } };', 'src/app/enrichment/research/index.ts': 'export default {};', 'src/app/enrichment/research/plan.md': '# Synthetic plan\nVerify fixture evidence.', @@ -37,6 +38,12 @@ async function fixture() { afterEach(async () => { await Promise.all(roots.splice(0).map(root => rm(root, { recursive: true, force: true }))); }); describe('standalone LangSmith packaging', () => { + it('resolves the Dawn SDK with its required Zod 4 peer in the workspace', () => { + const appRequire = createRequire(new URL('../package.json', import.meta.url)); + const sdkRequire = createRequire(appRequire.resolve('@dawn-ai/sdk')); + expect(sdkRequire('zod/package.json').version).toMatch(/^4\./); + }); + it('packages the production adapter and private generated company child, excluding operator modules', async () => { const root = await fixture(); const path = join(root, '.dawn/build/langgraph.json'); @@ -137,7 +144,7 @@ describe('standalone LangSmith packaging', () => { await expect(stageLangSmith(root)).rejects.toThrow(/symlink|outside/i); }); - it.each(['workspace:*', 'file:../../libs/growth', '^0.8.24'])('rejects non-exact or local dependencies: %s', async version => { + it.each(['workspace:*', 'file:../../libs/growth', '^0.8.26'])('rejects non-exact or local dependencies: %s', async version => { const root = await fixture(); const manifest = JSON.parse(await readFile(join(root, 'package.json'), 'utf8')); manifest.dependencies['@dawn-ai/core'] = version; diff --git a/apps/growth-research/test/pilot-agent.spec.ts b/apps/growth-research/test/pilot-agent.spec.ts index 4b3ca6810..3ec7879cf 100644 --- a/apps/growth-research/test/pilot-agent.spec.ts +++ b/apps/growth-research/test/pilot-agent.spec.ts @@ -1,5 +1,6 @@ import { expect, it, vi, afterEach, afterAll, beforeAll } from 'vitest'; -import { cp, mkdtemp, rm, symlink } from 'node:fs/promises'; +import { cp, mkdtemp, rm } from 'node:fs/promises'; +import { linkFixtureDependencies } from './fixture-dependencies.js'; import { execFileSync } from 'node:child_process'; import { tmpdir } from 'node:os'; import { resolve, join } from 'node:path'; @@ -31,11 +32,7 @@ beforeAll(async () => { recursive: true, }); } - await symlink( - join(appRoot, 'node_modules'), - join(generatedRoot, 'node_modules'), - 'dir' - ); + await linkFixtureDependencies(appRoot, generatedRoot); execFileSync(process.execPath, ['scripts/dawn-cli.mts', 'build'], { cwd: generatedRoot, stdio: 'pipe', diff --git a/apps/lifecycle/README.md b/apps/lifecycle/README.md index ce2bbe151..495345cf2 100644 --- a/apps/lifecycle/README.md +++ b/apps/lifecycle/README.md @@ -1,6 +1,6 @@ # Threadplane lifecycle service -This Node 24 service builds Dawn 0.8.21's supported Hono target and serves it through an app-owned Vercel function. The Vercel adapter requires the exact `LIFECYCLE_SERVICE_SECRET` bearer token on every Dawn path. Dawn route middleware repeats the same check for execution routes. +This Node 24 service builds Dawn 0.8.26's native Vercel target and adds a thin app-owned service boundary. The Vercel adapter requires the exact `LIFECYCLE_SERVICE_SECRET` bearer token on every Dawn path. Dawn route middleware repeats the same check for execution routes. The service has two database boundaries: @@ -25,7 +25,7 @@ Recipient delivery also requires `GROWTH_PUBLIC_ACTION_ORIGIN`, a server-only ba Set `GROWTH_DATABASE_ENVIRONMENT` to exactly `preview`, `production`, or `test` in every process that handles verified Resend events. A verified webhook whose `environment` provider tag is missing or differs from that value is acknowledged without opening a growth transaction or changing delivery/suppression state. -The app's Vercel project must use `apps/lifecycle` as its root directory, enable access to files outside that directory for the npm/Nx monorepo build, and select Node 24. `npx nx build lifecycle` generates the Dawn Hono artifact, rewrites its generated store binding to `DAWN_DATABASE_URL`, verifies the expected `app.mjs` fetch export, and drives an authenticated local request through the adapter. +The app's Vercel project must use `apps/lifecycle` as its root directory, enable access to files outside that directory for the npm/Nx monorepo build, and select Node 24. `npx nx build lifecycle` generates the closed native function in `.vercel/output`, bundles a sibling authentication wrapper, and verifies it under plain Node outside the workspace. The wrapper passes the original request with an explicit Dawn database binding; generated source is never rewritten. A missing `DAWN_DATABASE_URL` fails closed. Function metadata preserves the 60-second limit. The existing Nx build command is intentional; Dawn may emit a reference Vercel configuration because it only recognizes its direct CLI command. Resend's optional React email renderer is installed so the native bundle has no unresolved package imports; campaign templates remain unchanged. Keep `LIFECYCLE_CRON_ENABLED` unset or set to anything other than the exact value `true` until the preview dogfood checklist in `docs/superpowers/runbooks/2026-08-31-growth-lifecycle-cutover.md` passes. In particular, verify outer auth on all Dawn surfaces, named-thread dispatch, duplicate invocation behavior, recovery pause/resume, cancellation/AbortSignal propagation, and Dawn persistence across fresh instances. Send findings to Dawn task `01a05e2f-7e93-7bd0-af74-f13d5a7719cd` for generalized backport. diff --git a/apps/lifecycle/api/index.ts b/apps/lifecycle/api/index.ts deleted file mode 100644 index c494d2985..000000000 --- a/apps/lifecycle/api/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import dawnApp from '../.dawn/build/app.mjs'; -import { createLifecycleVercelAdapter } from '../src/vercel-adapter.js'; - -export default createLifecycleVercelAdapter(dawnApp); diff --git a/apps/lifecycle/dawn.config.ts b/apps/lifecycle/dawn.config.ts index 71eb9c66f..4911e110b 100644 --- a/apps/lifecycle/dawn.config.ts +++ b/apps/lifecycle/dawn.config.ts @@ -2,5 +2,5 @@ import type { DawnConfig } from '@dawn-ai/core'; export default { appDir: 'src/app', - build: { targets: ['hono'] }, + build: { targets: ['vercel'] }, } satisfies DawnConfig; diff --git a/apps/lifecycle/package.json b/apps/lifecycle/package.json index df2364f8e..bc44d39ba 100644 --- a/apps/lifecycle/package.json +++ b/apps/lifecycle/package.json @@ -6,13 +6,17 @@ "engines": { "node": ">=24.0.0" }, + "devDependencies": { + "esbuild": "0.27.4" + }, "dependencies": { - "@dawn-ai/cli": "0.8.21", - "@dawn-ai/core": "0.8.21", - "@dawn-ai/langgraph": "0.8.21", - "@dawn-ai/postgres-storage": "0.8.21", - "@dawn-ai/sdk": "0.8.21", + "@dawn-ai/cli": "0.8.26", + "@dawn-ai/core": "0.8.26", + "@dawn-ai/langgraph": "0.8.26", + "@dawn-ai/postgres-storage": "0.8.26", + "@dawn-ai/sdk": "0.8.26", "@neondatabase/serverless": "0.10.4", + "@react-email/render": "2.1.0", "@threadplane-internal/growth": "0.0.0", "hono": "4.13.5", "parse5": "8.0.1", diff --git a/apps/lifecycle/project.json b/apps/lifecycle/project.json index 19f63c68b..a8fa94814 100644 --- a/apps/lifecycle/project.json +++ b/apps/lifecycle/project.json @@ -29,7 +29,7 @@ "options": { "cwd": "apps/lifecycle", "commands": [ - "npx -y node@24 ../../node_modules/@dawn-ai/cli/dist/index.js check", + "npx -y node@24 ../../node_modules/tsx/dist/cli.mjs scripts/dawn-cli.mts check", "npx -y node@24 ../../node_modules/typescript/bin/tsc --noEmit -p tsconfig.json", "npx -y node@24 --test ../../deployments/company-scraper/*.test.cjs" ], @@ -39,11 +39,14 @@ "build": { "executor": "nx:run-commands", "cache": false, - "outputs": ["{projectRoot}/.dawn/build"], + "outputs": [ + "{projectRoot}/.dawn/build", + "{projectRoot}/.vercel/output" + ], "options": { "cwd": "apps/lifecycle", "commands": [ - "npx -y node@24 ../../node_modules/@dawn-ai/cli/dist/index.js build --clean", + "npx -y node@24 ../../node_modules/tsx/dist/cli.mjs scripts/dawn-cli.mts build --clean", "npx -y node@24 ../../node_modules/tsx/dist/cli.mjs scripts/verify-vercel-adapter.mts" ], "parallel": false diff --git a/apps/lifecycle/public/.gitkeep b/apps/lifecycle/public/.gitkeep deleted file mode 100644 index 8b1378917..000000000 --- a/apps/lifecycle/public/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/lifecycle/scripts/dawn-cli.mts b/apps/lifecycle/scripts/dawn-cli.mts new file mode 100644 index 000000000..68ab390f1 --- /dev/null +++ b/apps/lifecycle/scripts/dawn-cli.mts @@ -0,0 +1,24 @@ +import { spawnSync } from 'node:child_process'; +import { readFileSync } from 'node:fs'; +import { createRequire } from 'node:module'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +if (process.versions.node.split('.')[0] !== '24') + throw new Error('Lifecycle requires Node 24'); +const appRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const require = createRequire(resolve(appRoot, 'package.json')); +const cli = require.resolve('@dawn-ai/cli'); +const metadata = JSON.parse( + readFileSync(resolve(dirname(cli), '../package.json'), 'utf8') +); +if (metadata.version !== '0.8.26') + throw new Error( + `Expected app-local Dawn CLI 0.8.26, resolved ${metadata.version}` + ); +const result = spawnSync(process.execPath, [cli, ...process.argv.slice(2)], { + cwd: appRoot, + stdio: 'inherit', +}); +if (result.error) throw result.error; +process.exitCode = result.status ?? 1; diff --git a/apps/lifecycle/scripts/verify-vercel-adapter.mts b/apps/lifecycle/scripts/verify-vercel-adapter.mts index 63b73e73d..55ce9dd2b 100644 --- a/apps/lifecycle/scripts/verify-vercel-adapter.mts +++ b/apps/lifecycle/scripts/verify-vercel-adapter.mts @@ -1,117 +1,123 @@ -import { readFile, writeFile } from 'node:fs/promises'; +import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; +import { cp, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; import { dirname, resolve } from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; +import { build } from 'esbuild'; -import { createLifecycleVercelAdapter } from '../src/vercel-adapter.js'; +const sourceRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..'); -const GENERIC_DATABASE_ENV = /(? match[1] - ); - if ( - !imports.includes('../../src/middleware') || - !imports.some((specifier) => specifier?.startsWith('../../src/app/')) - ) { - throw new Error( - 'Generated Dawn modules are missing the expected TypeScript module imports' - ); - } - const rewritten = source.replaceAll(GENERATED_DAWN_TS_IMPORT, 'from "$1.js"'); - if (GENERATED_DAWN_TS_IMPORT.test(rewritten)) { - throw new Error('Generated Dawn TypeScript module imports remain'); - } - return rewritten; -} - -export async function verifyVercelAdapter( - appRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..') +export async function finalizeVercelAdapter( + appRoot = sourceRoot ): Promise { - const buildRoot = resolve(appRoot, '.dawn/build'); - const storesPath = resolve(buildRoot, 'stores.mjs'); - const appPath = resolve(buildRoot, 'app.mjs'); - const modulesPath = resolve(buildRoot, 'modules.edge.mjs'); - const stores = await readFile(storesPath, 'utf8'); - const rewrittenStores = rewriteDedicatedDawnDatabaseEnv(stores); - if (stores !== rewrittenStores) { - await writeFile(storesPath, rewrittenStores, 'utf8'); - } - - const modules = await readFile(modulesPath, 'utf8'); - const rewrittenModules = rewriteDawnModuleImports(modules); - if (modules !== rewrittenModules) { - await writeFile(modulesPath, rewrittenModules, 'utf8'); - } - - const appSource = await readFile(appPath, 'utf8'); - assertExpectedDawnDefaultExport(appSource); - const generated = (await import( - `${pathToFileURL(appPath).href}?verify=1` - )) as { - default?: { fetch?: unknown }; - }; - if (typeof generated.default?.fetch !== 'function') { - throw new Error( - 'Generated Dawn app default export is not fetch-compatible' - ); - } - const apiEntry = (await import( - `${pathToFileURL(resolve(appRoot, 'api/index.ts')).href}?verify=1` - )) as { default?: { fetch?: unknown } }; - if (typeof apiEntry.default?.fetch !== 'function') { - throw new Error('Lifecycle Vercel entry is not fetch-compatible'); - } - - let delegated = false; - const adapter = createLifecycleVercelAdapter( + const outputRoot = resolve(appRoot, '.vercel/output'); + const functionRoot = resolve(outputRoot, 'functions/index.func'); + const runtimePath = resolve(functionRoot, 'index.mjs'); + const native = await readFile(runtimePath); + const metadataPath = resolve(functionRoot, '.vc-config.json'); + const metadata = JSON.parse(await readFile(metadataPath, 'utf8')); + assert.deepEqual(metadata, { + handler: 'index.mjs', + launcherType: 'Nodejs', + runtime: 'nodejs24.x', + }); + assert.deepEqual( + JSON.parse(await readFile(resolve(outputRoot, 'config.json'), 'utf8')), { - fetch(request) { - delegated = request.url === 'https://lifecycle.invalid/healthz'; - return new Response('ok'); - }, + version: 3, + routes: [{ dest: '/index', src: '/(.*)' }], + } + ); + const result = await build({ + stdin: { + contents: `import app from './index.mjs';\nimport { createLifecycleVercelAdapter } from ${JSON.stringify( + resolve(sourceRoot, 'src/vercel-adapter.ts') + )};\nexport default createLifecycleVercelAdapter(app);`, + resolveDir: functionRoot, + sourcefile: 'lifecycle-entry.mjs', + loader: 'js', }, - () => 'adapter-verification-secret' + outfile: resolve(functionRoot, 'lifecycle.mjs'), + bundle: true, + platform: 'node', + target: 'node24', + format: 'esm', + external: ['./index.mjs'], + metafile: true, + }); + assert.ok(result.metafile); + const imports = Object.values(result.metafile.outputs).flatMap( + (output) => output.imports ); - const response = await adapter.fetch( - new Request('https://lifecycle.invalid/api/healthz', { - headers: { authorization: 'Bearer adapter-verification-secret' }, - }) + assert.deepEqual(imports.map((item) => item.path).sort(), [ + './index.mjs', + 'node:crypto', + ]); + assert.deepEqual( + await readFile(runtimePath), + native, + 'Native Dawn runtime must remain unchanged' ); - if (!delegated || !response.ok || (await response.text()) !== 'ok') { - throw new Error( - 'Lifecycle Vercel adapter local request verification failed' + await writeFile( + metadataPath, + `${JSON.stringify( + { ...metadata, handler: 'lifecycle.mjs', maxDuration: 60 }, + null, + 2 + )}\n` + ); +} + +export async function verifyVercelAdapter(appRoot = sourceRoot): Promise { + await finalizeVercelAdapter(appRoot); + // Import outside the workspace under plain Node, without tsx or node_modules. + const isolated = await mkdtemp(resolve(tmpdir(), 'lifecycle-vercel-')); + try { + await cp( + resolve(appRoot, '.vercel/output/functions/index.func'), + isolated, + { recursive: true } + ); + const code = ` + import assert from 'node:assert/strict'; + const {default:app} = await import(${JSON.stringify( + pathToFileURL(resolve(isolated, 'lifecycle.mjs')).href + )}); + for (const path of ['/healthz','/threads','/threads/id/state','/memory/candidates']) { + assert.equal((await app.fetch(new Request('https://lifecycle.invalid'+path))).status,401); + } + const request=()=>new Request('https://lifecycle.invalid/healthz',{headers:{authorization:'Bearer artifact-check'}}); + delete process.env.DAWN_DATABASE_URL; + assert.equal((await app.fetch(request())).status,503); + `; + const result = spawnSync( + process.execPath, + ['--input-type=module', '-e', code], + { + cwd: isolated, + encoding: 'utf8', + timeout: 30_000, + env: { + PATH: process.env['PATH'], + LIFECYCLE_SERVICE_SECRET: 'artifact-check', + VERCEL_DEPLOYMENT_ID: 'artifact-check', + }, + } ); + if (result.error || result.status !== 0) + throw new Error( + `Isolated native Vercel verification failed: ${ + result.error?.message ?? result.stderr + }` + ); + } finally { + await rm(isolated, { recursive: true, force: true }); } } -const invokedPath = process.argv[1] ? resolve(process.argv[1]) : ''; -if (invokedPath === fileURLToPath(import.meta.url)) { +if ( + process.argv[1] && + resolve(process.argv[1]) === fileURLToPath(import.meta.url) +) await verifyVercelAdapter(); -} diff --git a/apps/lifecycle/scripts/verify-vercel-adapter.spec.ts b/apps/lifecycle/scripts/verify-vercel-adapter.spec.ts index 4504dd2c8..a76d0bd99 100644 --- a/apps/lifecycle/scripts/verify-vercel-adapter.spec.ts +++ b/apps/lifecycle/scripts/verify-vercel-adapter.spec.ts @@ -1,116 +1,52 @@ -import { existsSync, readFileSync } from 'node:fs'; +import { mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; import { resolve } from 'node:path'; - import { describe, expect, it } from 'vitest'; - -import { - assertExpectedDawnDefaultExport, - rewriteDedicatedDawnDatabaseEnv, - rewriteDawnModuleImports, -} from './verify-vercel-adapter.mjs'; - -describe('Dawn generated storage isolation', () => { - it('rewrites only the generated Dawn store environment name', () => { - const generated = [ - 'const url = binding(env, "DATABASE_URL")', - 'throw new Error("DATABASE_URL is missing")', - ].join('\n'); - - const rewritten = rewriteDedicatedDawnDatabaseEnv(generated); - - expect(rewritten).toContain('binding(env, "DAWN_DATABASE_URL")'); - expect(rewritten).toContain('DAWN_DATABASE_URL is missing'); - expect(rewritten).not.toMatch(/(? { - expect(() => - rewriteDedicatedDawnDatabaseEnv('export const unrelated = true') - ).toThrow(/expected DATABASE_URL lookup/u); - }); - - it('rewrites generated Dawn TypeScript module imports for the Node bundle', () => { - const generated = [ - 'import * as middlewareModule from "../../src/middleware.ts"', - 'import * as route0 from "../../src/app/dispatch/index.ts"', - ].join('\n'); - - const rewritten = rewriteDawnModuleImports(generated); - - expect(rewritten).toContain('from "../../src/middleware.js"'); - expect(rewritten).toContain('from "../../src/app/dispatch/index.js"'); - expect(rewritten).not.toMatch(/from "\.\.\/\.\.\/src\/.+\.ts"/u); - }); - - it('fails closed when generated Dawn module imports change shape', () => { - expect(() => rewriteDawnModuleImports('export default {}')).toThrow( - /expected TypeScript module imports/u - ); - }); - - it('fails closed when Dawn changes the generated default export shape', () => { - expect(() => - assertExpectedDawnDefaultExport('export const app = {}') - ).toThrow(/expected default export/u); - expect(() => - assertExpectedDawnDefaultExport('export default app\n') - ).not.toThrow(); - }); - - it('pins the isolated Node 24 Hono/Vercel runtime without public secrets', async () => { - const packageJson = JSON.parse( - readFileSync( - resolve(process.cwd(), 'apps/lifecycle/package.json'), - 'utf8' - ) - ) as Record; - const vercel = JSON.parse( - readFileSync(resolve(process.cwd(), 'apps/lifecycle/vercel.json'), 'utf8') - ) as Record; - const tsconfig = JSON.parse( - readFileSync(resolve(process.cwd(), 'apps/lifecycle/tsconfig.json'), 'utf8') - ) as { compilerOptions?: Record; extends?: string }; - const runtimeTsconfigBase = JSON.parse( - readFileSync( - resolve(process.cwd(), 'apps/lifecycle/tsconfig.runtime-base.json'), - 'utf8' - ) - ) as { compilerOptions?: Record }; - const config = (await import('../dawn.config.js')).default; - expect(packageJson['engines']).toEqual({ node: '>=24.0.0' }); - expect(packageJson['dependencies']).toMatchObject({ - '@dawn-ai/cli': '0.8.21', - '@dawn-ai/core': '0.8.21', - '@dawn-ai/langgraph': '0.8.21', - '@dawn-ai/postgres-storage': '0.8.21', - '@dawn-ai/sdk': '0.8.21', - '@neondatabase/serverless': '0.10.4', - hono: '4.13.5', - resend: '6.10.0', - zod: '4.4.3', - }); - expect(config).toEqual({ appDir: 'src/app', build: { targets: ['hono'] } }); - expect(vercel['rewrites']).toEqual([ - { source: '/:path*', destination: '/api' }, - ]); - expect(vercel['functions']).toEqual({ - 'api/index.ts': { maxDuration: 60 }, - }); - expect(vercel['outputDirectory']).toBe('public'); - expect(tsconfig.extends).toBe('./tsconfig.runtime-base.json'); - expect(runtimeTsconfigBase.compilerOptions).toMatchObject({ - composite: false, - declaration: false, - declarationMap: false, - emitDeclarationOnly: false, - }); - expect(tsconfig.compilerOptions?.['noEmit']).toBe(false); - expect(tsconfig.compilerOptions?.['noEmitOnError']).toBe(false); - expect( - existsSync(resolve(process.cwd(), 'apps/lifecycle/public/.gitkeep')) - ).toBe(true); - expect(JSON.stringify({ packageJson, vercel })).not.toContain( - 'NEXT_PUBLIC_' - ); +import { finalizeVercelAdapter } from './verify-vercel-adapter.mjs'; + +describe('native Dawn Vercel packaging', () => { + it('wraps a closed native function without rewriting it and retains its limits', async () => { + const root = await mkdtemp(resolve(tmpdir(), 'lifecycle-native-test-')); + try { + const functionRoot = resolve(root, '.vercel/output/functions/index.func'); + await mkdir(functionRoot, { recursive: true }); + const native = + 'export default { fetch: async () => Response.json({ok:true}) };'; + await writeFile(resolve(functionRoot, 'index.mjs'), native); + await writeFile( + resolve(functionRoot, '.vc-config.json'), + JSON.stringify({ + handler: 'index.mjs', + launcherType: 'Nodejs', + runtime: 'nodejs24.x', + }) + ); + await writeFile( + resolve(root, '.vercel/output/config.json'), + JSON.stringify({ + version: 3, + routes: [{ src: '/(.*)', dest: '/index' }], + }) + ); + await finalizeVercelAdapter(root); + expect(await readFile(resolve(functionRoot, 'index.mjs'), 'utf8')).toBe( + native + ); + expect( + JSON.parse( + await readFile(resolve(functionRoot, '.vc-config.json'), 'utf8') + ) + ).toEqual({ + handler: 'lifecycle.mjs', + launcherType: 'Nodejs', + runtime: 'nodejs24.x', + maxDuration: 60, + }); + expect( + await readFile(resolve(functionRoot, 'lifecycle.mjs'), 'utf8') + ).toContain('./index.mjs'); + } finally { + await rm(root, { recursive: true, force: true }); + } }); }); diff --git a/apps/lifecycle/src/dispatcher.spec.ts b/apps/lifecycle/src/dispatcher.spec.ts index 90710179c..73f7ebed4 100644 --- a/apps/lifecycle/src/dispatcher.spec.ts +++ b/apps/lifecycle/src/dispatcher.spec.ts @@ -4,7 +4,7 @@ import { type GrowthJob, type SqlExecutor, } from '@threadplane-internal/growth'; -import { afterEach, describe, expect, it, vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import middleware from './middleware.js'; import { @@ -89,6 +89,27 @@ function dependencies( } describe('Dawn lifecycle service authorization', () => { + beforeEach(() => + vi.stubEnv('DAWN_DATABASE_URL', 'postgres://dawn.test/runtime') + ); + afterEach(() => vi.unstubAllEnvs()); + + it.each([undefined, '', ' '])( + 'rejects absent Dawn database binding: %s', + async (databaseUrl) => { + vi.stubEnv('DAWN_DATABASE_URL', databaseUrl); + vi.stubEnv('DATABASE_URL', 'postgres://growth.test/control'); + const fetch = vi.fn(); + const adapter = createLifecycleVercelAdapter({ fetch }, () => 'secret'); + const response = await adapter.fetch( + new Request('https://lifecycle.test/healthz', { + headers: { authorization: 'Bearer secret' }, + }) + ); + expect(response.status).toBe(503); + expect(fetch).not.toHaveBeenCalled(); + } + ); it.each([undefined, '', 'Bearer wrong', 'bearer service-secret'])( 'rejects a missing or wrong route-middleware token: %s', async (authorization) => { @@ -153,26 +174,28 @@ describe('Dawn lifecycle service authorization', () => { '/agui/%2Fdispatch%23workflow', '/memory/candidates', ])( - 'outer adapter preserves %s across the Vercel catch-all rewrite', + 'outer adapter preserves %s through the native Vercel catch-all', async (pathname) => { const fetch = vi.fn().mockResolvedValue(new Response('healthy')); const adapter = createLifecycleVercelAdapter({ fetch }, () => 'secret'); - const request = new Request( - `https://lifecycle.test/api${pathname}?probe=1`, - { headers: { authorization: 'Bearer secret' } } - ); + const request = new Request(`https://lifecycle.test${pathname}?probe=1`, { + headers: { authorization: 'Bearer secret' }, + }); const response = await adapter.fetch(request); expect(await response.text()).toBe('healthy'); - expect(fetch).toHaveBeenCalledOnce(); + expect(fetch).toHaveBeenCalledWith(request, { + DATABASE_URL: 'postgres://dawn.test/runtime', + }); const delegated = fetch.mock.calls[0]?.[0]; + expect(delegated).toBe(request); expect(new URL(delegated?.url ?? '').pathname).toBe(pathname); expect(new URL(delegated?.url ?? '').search).toBe('?probe=1'); } ); - it('outer adapter delegates the public path when Vercel preserves the rewrite URL', async () => { + it('outer adapter delegates the original public request', async () => { const fetch = vi.fn().mockResolvedValue(new Response('healthy')); const adapter = createLifecycleVercelAdapter({ fetch }, () => 'secret'); const request = new Request('https://lifecycle.test/healthz', { @@ -209,7 +232,7 @@ describe('Dawn lifecycle service authorization', () => { ); const response = await adapter.fetch( - new Request('https://lifecycle.test/api/healthz', { + new Request('https://lifecycle.test/healthz', { headers: { authorization: 'Bearer secret' }, }) ); @@ -230,7 +253,7 @@ describe('Dawn lifecycle service authorization', () => { ); const response = await adapter.fetch( - new Request('https://lifecycle.test/api/healthz') + new Request('https://lifecycle.test/healthz') ); expect(response.status).toBe(401); diff --git a/apps/lifecycle/src/generated-dawn-app.d.ts b/apps/lifecycle/src/generated-dawn-app.d.ts deleted file mode 100644 index 76cf93a71..000000000 --- a/apps/lifecycle/src/generated-dawn-app.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare module '*.mjs' { - const app: { - fetch(request: Request): Response | Promise; - }; - export default app; -} diff --git a/apps/lifecycle/src/growth.ts b/apps/lifecycle/src/growth.ts index 1140234d8..b4ad9746c 100644 --- a/apps/lifecycle/src/growth.ts +++ b/apps/lifecycle/src/growth.ts @@ -1,4 +1,4 @@ -// Keep the runtime dependency on the workspace library relative so Vercel's -// function tracer emits and resolves the compiled JavaScript copy. +// Keep the runtime dependency relative so Dawn's native Vercel bundler +// includes the workspace library in the closed function artifact. // eslint-disable-next-line @nx/enforce-module-boundaries -- the relative edge is required in the emitted Vercel function export * from '../../../libs/growth/src/index.js'; diff --git a/apps/lifecycle/src/vercel-adapter.ts b/apps/lifecycle/src/vercel-adapter.ts index f1fe0fc05..88e75003c 100644 --- a/apps/lifecycle/src/vercel-adapter.ts +++ b/apps/lifecycle/src/vercel-adapter.ts @@ -1,15 +1,16 @@ import { hasExactBearerToken } from './service-auth.js'; export interface DawnFetchApp { - fetch(request: Request): Response | Promise; + fetch( + request: Request, + env: { DATABASE_URL: string } + ): Response | Promise; } export interface LifecycleVercelAdapter { fetch(request: Request): Promise; } -const INTERNAL_FUNCTION_PREFIX = '/api'; - function jsonError(status: number, error: string): Response { return Response.json( { error }, @@ -17,25 +18,14 @@ function jsonError(status: number, error: string): Response { ); } -function dawnRequestFromVercelRewrite(request: Request): Request { - const url = new URL(request.url); - if (url.pathname === INTERNAL_FUNCTION_PREFIX) { - url.pathname = '/'; - } else if (url.pathname.startsWith(`${INTERNAL_FUNCTION_PREFIX}/`)) { - url.pathname = url.pathname.slice(INTERNAL_FUNCTION_PREFIX.length); - } else { - // Vercel rewrites can preserve the public URL presented to the function. - return request; - } - return new Request(url, request); -} - export function createLifecycleVercelAdapter( dawnApp: DawnFetchApp, readSecret: () => string | undefined = () => process.env['LIFECYCLE_SERVICE_SECRET'], readDeploymentId: () => string | undefined = () => - process.env['VERCEL_DEPLOYMENT_ID'] + process.env['VERCEL_DEPLOYMENT_ID'], + readDawnDatabaseUrl: () => string | undefined = () => + process.env['DAWN_DATABASE_URL'] ): LifecycleVercelAdapter { return { async fetch(request: Request): Promise { @@ -49,9 +39,14 @@ export function createLifecycleVercelAdapter( ) { return jsonError(401, 'Unauthorized'); } - const dawnRequest = dawnRequestFromVercelRewrite(request); - const response = await dawnApp.fetch(dawnRequest); - if (new URL(dawnRequest.url).pathname !== '/healthz') return response; + const databaseUrl = readDawnDatabaseUrl()?.trim(); + if (!databaseUrl) return jsonError(503, 'Service unavailable'); + // Dawn binds stores to this exact request. Keep Growth's process-level + // DATABASE_URL untouched and never fall back to it for runtime storage. + const response = await dawnApp.fetch(request, { + DATABASE_URL: databaseUrl, + }); + if (new URL(request.url).pathname !== '/healthz') return response; const deploymentId = readDeploymentId()?.trim(); if (!deploymentId) return response; const headers = new Headers(response.headers); diff --git a/apps/lifecycle/tsconfig.json b/apps/lifecycle/tsconfig.json index 04c9e9fe4..74862c126 100644 --- a/apps/lifecycle/tsconfig.json +++ b/apps/lifecycle/tsconfig.json @@ -13,5 +13,5 @@ "noEmitOnError": false, "types": ["node", "vitest/globals"] }, - "include": ["api/**/*.ts", "scripts/**/*.ts", "src/**/*.ts", "*.ts"] + "include": ["scripts/**/*.ts", "scripts/**/*.mts", "src/**/*.ts", "*.ts"] } diff --git a/apps/lifecycle/vercel.json b/apps/lifecycle/vercel.json index f3f32bd50..e82d42139 100644 --- a/apps/lifecycle/vercel.json +++ b/apps/lifecycle/vercel.json @@ -2,12 +2,6 @@ "$schema": "https://openapi.vercel.sh/vercel.json", "installCommand": "cd ../.. && npm ci --ignore-scripts", "buildCommand": "cd ../.. && npx nx build lifecycle", - "outputDirectory": "public", "framework": null, - "functions": { - "api/index.ts": { - "maxDuration": 60 - } - }, - "rewrites": [{ "source": "/:path*", "destination": "/api" }] + "fluid": true } diff --git a/package-lock.json b/package-lock.json index 0b1b6cdea..ebf2d3404 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "@angular/router": "~21.1.0", "@cacheplane/partial-json": "^0.1.1", "@cacheplane/partial-markdown": "0.5.8", - "@langchain/core": "^1.1.33", + "@langchain/core": "^1.2.9", "@langchain/langgraph-sdk": "^1.7.4", "@neondatabase/serverless": "^0.10.0", "@upstash/ratelimit": "^2.0.5", @@ -111,1397 +111,196 @@ "typescript": "~5.9.2", "typescript-eslint": "^8.40.0", "verdaccio": "^6.0.5", - "vitest": "^4.1.0", - "zod": "^3.25.76" - } - }, - "apps/growth-research": { - "name": "@threadplane-internal/growth-research", - "version": "0.0.0", - "dependencies": { - "@dawn-ai/cli": "0.8.24", - "@dawn-ai/core": "0.8.24", - "@dawn-ai/langchain": "0.8.24", - "@dawn-ai/memory": "0.8.24", - "@dawn-ai/memory-pgvector": "0.8.24", - "@dawn-ai/sdk": "0.8.24", - "@langchain/core": "1.2.9", - "@langchain/langgraph": "1.4.14", - "@langchain/langgraph-checkpoint": "1.1.5", - "@langchain/openai": "1.5.11", - "@types/node": "25.6.0", - "pg": "8.23.0", - "zod": "4.5.4" - }, - "devDependencies": { - "@dawn-ai/evals": "0.8.24", - "@dawn-ai/testing": "0.8.24", - "@dawn-ai/workspace": "0.8.24" - }, - "engines": { - "node": "24" - } - }, - "apps/growth-research/node_modules/@ag-ui/core": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/@ag-ui/core/-/core-0.0.59.tgz", - "integrity": "sha512-hDgy4ipTqXieT8YG8Mr917Y+FD/f11VK1GefZ5CwTDCuNqS/oTwjJ5l/DZkicThgS8hQW/Y7wPylPBMBJ8BkUg==", - "license": "MIT", - "dependencies": { - "zod": "^3.22.4" - } - }, - "apps/growth-research/node_modules/@ag-ui/core/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "apps/growth-research/node_modules/@ag-ui/encoder": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/@ag-ui/encoder/-/encoder-0.0.59.tgz", - "integrity": "sha512-wQCzBsStyZMm8nzhTdTx1G0B1C8yv5rbzZLnz1ka/l5LcJEsK3KTounU8CR9l+7QtcpOUUDJKd0xAbyI6gNcSw==", - "license": "MIT", - "dependencies": { - "@ag-ui/core": "0.0.59", - "@ag-ui/proto": "0.0.59" - } - }, - "apps/growth-research/node_modules/@ag-ui/proto": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/@ag-ui/proto/-/proto-0.0.59.tgz", - "integrity": "sha512-X+uvDaegLEHw5kJu8tv2eSqHH8ouat+JCfFokGV1uuMquY8qCEQSlGsM7xzexwX9fujuxgHOWumg5kJDqa0+RA==", - "license": "MIT", - "dependencies": { - "@ag-ui/core": "0.0.59", - "@bufbuild/protobuf": "^2.2.5", - "@protobuf-ts/protoc": "^2.11.1" - } - }, - "apps/growth-research/node_modules/@bufbuild/protobuf": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.14.1.tgz", - "integrity": "sha512-agRJn3+EJDUe8AvxTx/LnHA/GErvLE62pSaSk7+MwFOtOv8eWBu/qCq2qoZjBjVZ3C2aiFJCveuSs17KMkYGOw==", - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "apps/growth-research/node_modules/@cfworker/json-schema": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz", - "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", - "license": "MIT" - }, - "apps/growth-research/node_modules/@copilotkit/aimock": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@copilotkit/aimock/-/aimock-1.39.0.tgz", - "integrity": "sha512-AWw4vmW2hBchHoggh0G4McWGmGZD6wtXAehL6K5ncWF5lVIjlv++bPmxmRwrpQCi/K4/xK10N9Zp9srJYipEJw==", - "dev": true, - "license": "MIT", - "bin": { - "aimock": "dist/aimock-cli.js", - "llmock": "dist/cli.js" - }, - "engines": { - "node": ">=20.15.0" - }, - "peerDependencies": { - "jest": ">=29", - "vitest": ">=3" - }, - "peerDependenciesMeta": { - "jest": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "apps/growth-research/node_modules/@dawn-ai/ag-ui": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/ag-ui/-/ag-ui-0.8.24.tgz", - "integrity": "sha512-7lce3QKiT4ZosMFIju+k1EebeSqxTqvPux+EuSTi/l0YblA1IMxtF+oMIrA0slDxJ3dv5IfRzYNbOcznVnOT/Q==", - "license": "MIT", - "dependencies": { - "@ag-ui/core": "0.0.59", - "@ag-ui/encoder": "0.0.59", - "zod": "^4.4.3" - }, - "engines": { - "node": ">=24.0.0" - }, - "peerDependencies": { - "@copilotkit/react-core": ">=1.66.0", - "react": ">=19.0.0" - }, - "peerDependenciesMeta": { - "@copilotkit/react-core": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "apps/growth-research/node_modules/@dawn-ai/cli": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/cli/-/cli-0.8.24.tgz", - "integrity": "sha512-18+jxTh9vjXHNwX4Y+TrM5bYBSK94W1qevuU50BM54NA2ETw9dfUSPYxY2Se2Gffln/u6ubO6UCxChTLgTj+jQ==", - "license": "MIT", - "dependencies": { - "@ag-ui/core": "0.0.59", - "@dawn-ai/ag-ui": "0.8.24", - "@dawn-ai/core": "0.8.24", - "@dawn-ai/langchain": "0.8.24", - "@dawn-ai/langgraph": "0.8.24", - "@dawn-ai/memory": "0.8.24", - "@dawn-ai/permissions": "0.8.24", - "@dawn-ai/sdk": "0.8.24", - "@dawn-ai/sqlite-storage": "0.8.24", - "commander": "15.0.0", - "esbuild": "^0.28.1", - "tsx": "^4.23.5" - }, - "bin": { - "dawn": "dist/index.js" - }, - "engines": { - "node": ">=24.0.0" - } - }, - "apps/growth-research/node_modules/@dawn-ai/core": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/core/-/core-0.8.24.tgz", - "integrity": "sha512-zrx6H1vhFpfvbO9BQIkpKTUymTJPumyMZj/vkd4gWv/3L5iEAS+QOHkdmn8v1nUNPlXzag7W6NovmBIQCC5E0w==", - "license": "MIT", - "dependencies": { - "@dawn-ai/permissions": "0.8.24", - "@dawn-ai/sdk": "0.8.24", - "@dawn-ai/sqlite-storage": "0.8.24", - "@dawn-ai/workspace": "0.8.24", - "@langchain/langgraph": "^1.4.9", - "@typescript/old": "npm:typescript@6.0.2", - "tsx": "^4.23.5", - "typescript": "npm:@typescript/typescript6@6.0.2", - "zod": "^4.4.3" - }, - "engines": { - "node": ">=24.0.0" - }, - "peerDependencies": { - "@langchain/langgraph-checkpoint": "^1.1.3" - } - }, - "apps/growth-research/node_modules/@dawn-ai/evals": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/evals/-/evals-0.8.24.tgz", - "integrity": "sha512-0VfCXZlMittXPQZgfrXjhd/gkBE/ahLB8QM7gItIqbPlcSmc9Ag/RX1H3ToC9ugqG+daaqfz3cR0f/6AzEl9wg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=24.0.0" - }, - "peerDependencies": { - "@dawn-ai/testing": "0.8.24" - } - }, - "apps/growth-research/node_modules/@dawn-ai/langchain": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/langchain/-/langchain-0.8.24.tgz", - "integrity": "sha512-smwRLyflWG4fkvbv8bTXoILlEZX7kYB0NJWCFC4oX1tWf4rjO+cgeohECQgdkhktpVxuj0g34ASe2zOxonQHJQ==", - "license": "MIT", - "dependencies": { - "@dawn-ai/core": "0.8.24", - "@dawn-ai/sdk": "0.8.24", - "@dawn-ai/workspace": "0.8.24", - "@langchain/langgraph": "^1.4.9", - "@langchain/openai": "^1.5.5", - "gpt-tokenizer": "^3.4.0" - }, - "engines": { - "node": ">=24.0.0" - }, - "peerDependencies": { - "@langchain/anthropic": "^1.5.2", - "@langchain/core": "^1.1.47", - "@langchain/google-genai": "^2.2.0", - "@langchain/groq": "^1.3.1", - "@langchain/langgraph-checkpoint": "^1.1.3", - "@langchain/mistralai": "^1.2.0", - "@langchain/ollama": "^1.3.0", - "@langchain/openrouter": "^0.4.5", - "@langchain/xai": "^1.4.5" - }, - "peerDependenciesMeta": { - "@langchain/anthropic": { - "optional": true - }, - "@langchain/google-genai": { - "optional": true - }, - "@langchain/groq": { - "optional": true - }, - "@langchain/langgraph-checkpoint": { - "optional": false - }, - "@langchain/mistralai": { - "optional": true - }, - "@langchain/ollama": { - "optional": true - }, - "@langchain/openrouter": { - "optional": true - }, - "@langchain/xai": { - "optional": true - } - } - }, - "apps/growth-research/node_modules/@dawn-ai/langgraph": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/langgraph/-/langgraph-0.8.24.tgz", - "integrity": "sha512-Tb/gLuuDQOYZJbEf4e6ZqBasvH38OJL9UdaM0jsXRanCFrC5u8mA1hRF9JXLqqfuA1Eyr1zJzDQHqv2/ZDv1HA==", - "license": "MIT", - "dependencies": { - "@dawn-ai/sdk": "0.8.24" - }, - "engines": { - "node": ">=24.0.0" - } - }, - "apps/growth-research/node_modules/@dawn-ai/memory": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/memory/-/memory-0.8.24.tgz", - "integrity": "sha512-yVptc9AeDEGm73j1SysyVDZLJmYriAp5mRBbhdVFzb5cULEI5X3Ysk3sxqlhZoM1z/7VZONhNA8g6zEL8ppRuA==", - "license": "MIT", - "dependencies": { - "@dawn-ai/sqlite-storage": "0.8.24" - }, - "engines": { - "node": ">=24.0.0" - } - }, - "apps/growth-research/node_modules/@dawn-ai/memory-pgvector": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/memory-pgvector/-/memory-pgvector-0.8.24.tgz", - "integrity": "sha512-i6WWyts+Uga/xwRK7nFOEtlKt6fAPL8OgDo5U6m5VzGg0J35Gmv02gHww9PQ70RiyyVn5x8vp+RFCju/FRaQtw==", - "license": "MIT", - "dependencies": { - "@dawn-ai/memory": "0.8.24", - "pg": "^8.22.0", - "pgvector": "^0.3.0" - }, - "engines": { - "node": ">=24.0.0" - } - }, - "apps/growth-research/node_modules/@dawn-ai/permissions": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/permissions/-/permissions-0.8.24.tgz", - "integrity": "sha512-PfFQ9rm08TGmTi4twAeaUN+7cZLOB3s+Anfa5isVI/uM0mRKuRFr4hg/WEBQPaZVyDuTrCqiDgOcXTJ1mfySeA==", - "license": "MIT", - "dependencies": { - "@dawn-ai/sdk": "0.8.24" - }, - "engines": { - "node": ">=24.0.0" - } - }, - "apps/growth-research/node_modules/@dawn-ai/sdk": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/sdk/-/sdk-0.8.24.tgz", - "integrity": "sha512-YzBVD53dzPUNTkFwbYYdh/XMCX92wmSwmOmIsxkBgnxc3gX11b5z18F6NO7IeWJdmJbxRaLVBAAcUJvO/9E0qg==", - "license": "MIT", - "engines": { - "node": ">=24.0.0" - }, - "peerDependencies": { - "zod": "^4.0.0" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "apps/growth-research/node_modules/@dawn-ai/sqlite-storage": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/sqlite-storage/-/sqlite-storage-0.8.24.tgz", - "integrity": "sha512-2fGt9K7PabDpN9KdguYrdzMC6mI+lMud/8chvRriCdIqJYeWGUXfZB+GWihXbTU+dR6o3NE1hyAabl+Sj6upkQ==", - "license": "MIT", - "engines": { - "node": ">=24.0.0" - }, - "peerDependencies": { - "@langchain/core": "^1.2.4", - "@langchain/langgraph-checkpoint": "^1.1.3" - } - }, - "apps/growth-research/node_modules/@dawn-ai/testing": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/testing/-/testing-0.8.24.tgz", - "integrity": "sha512-AJIsMp3jWWGz4NrnfbLDBfNTvndDg0NlOXxaEqvPKu/5BLMY7DSYYv+VeHvrKTyIeS2rby55mErAVY7gL5C7fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@copilotkit/aimock": "^1.37.4", - "@dawn-ai/memory": "0.8.24" - }, - "engines": { - "node": ">=24.0.0" - }, - "peerDependencies": { - "@dawn-ai/cli": "0.8.24", - "@dawn-ai/core": "0.8.24", - "@dawn-ai/sdk": "0.8.24", - "@dawn-ai/workspace": "0.8.24" - } - }, - "apps/growth-research/node_modules/@dawn-ai/workspace": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@dawn-ai/workspace/-/workspace-0.8.24.tgz", - "integrity": "sha512-bW4c1Xj3lLqnbiPSHXkTDxcdJ4py/SGe4aKuPOWMKdxo64qso/2cuRcVh2kCOFP3sUv9KJXuE2RqdeJIV2Rf4Q==", - "license": "MIT", - "dependencies": { - "@dawn-ai/sdk": "0.8.24" - }, - "engines": { - "node": ">=24.0.0" - } - }, - "apps/growth-research/node_modules/@esbuild/aix-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", - "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/android-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", - "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/android-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", - "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/android-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", - "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/darwin-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", - "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/darwin-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", - "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", - "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/freebsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", - "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/linux-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", - "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/linux-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", - "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/linux-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", - "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/linux-loong64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", - "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/linux-mips64el": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", - "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/linux-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", - "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/linux-riscv64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", - "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/linux-s390x": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", - "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/linux-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", - "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", - "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/netbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", - "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", - "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/openbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", - "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", - "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/sunos-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", - "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/win32-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", - "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/win32-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", - "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@esbuild/win32-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", - "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "apps/growth-research/node_modules/@langchain/core": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.2.9.tgz", - "integrity": "sha512-conzSEj9Zu1AyXJLXsSbgrtxtxinmI1yGqQ5CIJZSoV5rvv+yvQE/vgBnoySpBQ/bl3YPgj2FL/gbDjWykLSfg==", - "license": "MIT", - "dependencies": { - "@cfworker/json-schema": "^4.0.2", - "@standard-schema/spec": "^1.1.0", - "js-tiktoken": "^1.0.12", - "langsmith": ">=0.5.0 <1.0.0", - "mustache": "^4.2.0", - "p-queue": "^6.6.2", - "zod": "^3.25.76 || ^4" - }, - "engines": { - "node": ">=20" - } - }, - "apps/growth-research/node_modules/@langchain/langgraph": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-1.4.14.tgz", - "integrity": "sha512-uWAdRYTllfKCnTrlyovExPJCHJwcf3Wl2LzUlnaqsT7Rmoo3aCeYtq/7MV/Pw4q11motG8pR8bjr6T6V8Pe1gQ==", - "license": "MIT", - "dependencies": { - "@langchain/langgraph-checkpoint": "^1.1.5", - "@langchain/langgraph-sdk": "~1.10.2", - "@langchain/protocol": "^0.0.19", - "@standard-schema/spec": "1.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@langchain/core": "^1.1.48", - "zod": "^3.25.32 || ^4.2.0" - } - }, - "apps/growth-research/node_modules/@langchain/langgraph-checkpoint": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-1.1.5.tgz", - "integrity": "sha512-BwDwl5VeTOh6CVuiIPgsUgfK51vTJDMSbFcSCUfjJWsl8/DPdK/mbv+ejxJstkSk/BlSPMP4JfXWcN6jD2ea2Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@langchain/core": "^1.1.48" - } - }, - "apps/growth-research/node_modules/@langchain/langgraph-sdk": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-1.10.2.tgz", - "integrity": "sha512-86qsfdBZWu1ZgywLN8AThU/jXi9rjPDZPWcTJp4SA1A/L62ypTNoSXbvtiwZt1odokXccYTxK1XWS8tmVdvEmw==", - "license": "MIT", - "dependencies": { - "@langchain/protocol": "^0.0.19", - "@types/json-schema": "^7.0.15", - "p-queue": "^9.0.1", - "p-retry": "^7.1.1" - }, - "peerDependencies": { - "@langchain/core": "^1.1.48", - "react": "^18 || ^19", - "react-dom": "^18 || ^19" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "apps/growth-research/node_modules/@langchain/langgraph-sdk/node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT" - }, - "apps/growth-research/node_modules/@langchain/langgraph-sdk/node_modules/p-queue": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz", - "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.4", - "p-timeout": "^7.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "apps/growth-research/node_modules/@langchain/langgraph-sdk/node_modules/p-timeout": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", - "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "apps/growth-research/node_modules/@langchain/openai": { - "version": "1.5.11", - "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-1.5.11.tgz", - "integrity": "sha512-BvGp5lQk5//0WVwTIepscazFpneT9I9+mc+kp+cLuhGHFb7mc9zGNrusZOXoa3p73SN0i3XqTo8lyIndpVx3Hw==", - "license": "MIT", - "dependencies": { - "js-tiktoken": "^1.0.12", - "openai": "^7.5.0", - "zod": "^3.25.76 || ^4" - }, - "engines": { - "node": ">=22" - }, - "peerDependencies": { - "@langchain/core": "^1.2.9" - } - }, - "apps/growth-research/node_modules/@langchain/protocol": { - "version": "0.0.19", - "resolved": "https://registry.npmjs.org/@langchain/protocol/-/protocol-0.0.19.tgz", - "integrity": "sha512-9hKcRrH7cBX6gfutdfXPoft1OCchHe4FEpALoDJMl5Qu+n/YG5ynZmyu8+8cxORlPwHBoKTxggvXz+76M1yX1Q==", - "license": "MIT" - }, - "apps/growth-research/node_modules/@protobuf-ts/protoc": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/@protobuf-ts/protoc/-/protoc-2.11.1.tgz", - "integrity": "sha512-mUZJaV0daGO6HUX90o/atzQ6A7bbN2RSuHtdwo8SSF2Qoe3zHwa4IHyCN1evftTeHfLmdz+45qo47sL+5P8nyg==", - "license": "Apache-2.0", - "bin": { - "protoc": "protoc.js" - } - }, - "apps/growth-research/node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "license": "MIT" - }, - "apps/growth-research/node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "apps/growth-research/node_modules/@types/node": { - "version": "25.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", - "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.19.0" - } - }, - "apps/growth-research/node_modules/@typescript/old": { - "name": "typescript", - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "apps/growth-research/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "apps/growth-research/node_modules/commander": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", - "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", - "license": "MIT", - "engines": { - "node": ">=22.12.0" + "vitest": "^4.1.0", + "zod": "^3.25.76" } }, - "apps/growth-research/node_modules/esbuild": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", - "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "apps/growth-research": { + "name": "@threadplane-internal/growth-research", + "version": "0.0.0", + "dependencies": { + "@dawn-ai/cli": "0.8.26", + "@dawn-ai/core": "0.8.26", + "@dawn-ai/langchain": "0.8.26", + "@dawn-ai/memory": "0.8.26", + "@dawn-ai/memory-pgvector": "0.8.26", + "@dawn-ai/sdk": "0.8.26", + "@langchain/core": "1.2.9", + "@langchain/langgraph": "1.4.14", + "@langchain/langgraph-checkpoint": "1.1.5", + "@langchain/openai": "1.5.11", + "@types/node": "25.6.0", + "pg": "8.23.0", + "zod": "4.5.4" }, - "engines": { - "node": ">=18" + "devDependencies": { + "@dawn-ai/evals": "0.8.26", + "@dawn-ai/testing": "0.8.26", + "@dawn-ai/workspace": "0.8.26" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.2", - "@esbuild/android-arm": "0.28.2", - "@esbuild/android-arm64": "0.28.2", - "@esbuild/android-x64": "0.28.2", - "@esbuild/darwin-arm64": "0.28.2", - "@esbuild/darwin-x64": "0.28.2", - "@esbuild/freebsd-arm64": "0.28.2", - "@esbuild/freebsd-x64": "0.28.2", - "@esbuild/linux-arm": "0.28.2", - "@esbuild/linux-arm64": "0.28.2", - "@esbuild/linux-ia32": "0.28.2", - "@esbuild/linux-loong64": "0.28.2", - "@esbuild/linux-mips64el": "0.28.2", - "@esbuild/linux-ppc64": "0.28.2", - "@esbuild/linux-riscv64": "0.28.2", - "@esbuild/linux-s390x": "0.28.2", - "@esbuild/linux-x64": "0.28.2", - "@esbuild/netbsd-arm64": "0.28.2", - "@esbuild/netbsd-x64": "0.28.2", - "@esbuild/openbsd-arm64": "0.28.2", - "@esbuild/openbsd-x64": "0.28.2", - "@esbuild/openharmony-arm64": "0.28.2", - "@esbuild/sunos-x64": "0.28.2", - "@esbuild/win32-arm64": "0.28.2", - "@esbuild/win32-ia32": "0.28.2", - "@esbuild/win32-x64": "0.28.2" - } - }, - "apps/growth-research/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, - "apps/growth-research/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": "24" } }, - "apps/growth-research/node_modules/gpt-tokenizer": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/gpt-tokenizer/-/gpt-tokenizer-3.4.0.tgz", - "integrity": "sha512-wxFLnhIXTDjYebd9A9pGl3e31ZpSypbpIJSOswbgop5jLte/AsZVDvjlbEuVFlsqZixVKqbcoNmRlFDf6pz/UQ==", - "license": "MIT" - }, - "apps/growth-research/node_modules/is-network-error": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", - "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", + "apps/growth-research/node_modules/@dawn-ai/evals": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/evals/-/evals-0.8.26.tgz", + "integrity": "sha512-wiX6p97HtCv8QcB9x2o8Ts4qpySJHM04i2HIxwOU8JGT6th5cdfRb0dhY46FhaoAUTuAkRE2sfPXpDIARlOizQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "apps/growth-research/node_modules/js-tiktoken": { - "version": "1.0.21", - "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz", - "integrity": "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.5.1" - } - }, - "apps/growth-research/node_modules/langsmith": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.10.1.tgz", - "integrity": "sha512-zRDCnLznGdzx1VottX4CWr8v9ZZLRoSql2pbjEXYA1Jeg+NMDdq87x/v0Dk4GNkNZYhE+ZxFX3vTxwWq6W6gVA==", - "license": "MIT", - "dependencies": { - "p-queue": "6.6.2" + "node": ">=24.0.0" }, "peerDependencies": { - "@opentelemetry/api": "*", - "@opentelemetry/exporter-trace-otlp-proto": "*", - "@opentelemetry/sdk-trace-base": "*", - "openai": "*", - "ws": ">=7" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@opentelemetry/exporter-trace-otlp-proto": { - "optional": true - }, - "@opentelemetry/sdk-trace-base": { - "optional": true - }, - "openai": { - "optional": true - }, - "ws": { - "optional": true - } + "@dawn-ai/testing": "0.8.26" } }, - "apps/growth-research/node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "apps/growth-research/node_modules/@dawn-ai/sdk": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/sdk/-/sdk-0.8.26.tgz", + "integrity": "sha512-iuPaJFjF4jAXV1ARN4eKaAtdHiaVDe/edCZdX72Obh2PADayx4undsyFwGXM7fiywjjKxRjMkud/9BXpou+Qsw==", "license": "MIT", - "bin": { - "mustache": "bin/mustache" - } - }, - "apps/growth-research/node_modules/openai": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-7.10.0.tgz", - "integrity": "sha512-sn9t2Kls7O52PwuF9BUTYNu4Gk/r0lXJyrgaNht4TNRlZFb3dJIGO0RciSgjARGCBRtWjySubAQFJttlzUvGQQ==", - "license": "Apache-2.0", "engines": { - "node": ">=22.0.0" + "node": ">=24.0.0" }, "peerDependencies": { - "@aws-sdk/credential-provider-node": ">=3.972.0 <4", - "@smithy/hash-node": ">=4.3.0 <5", - "@smithy/signature-v4": ">=5.4.0 <6", - "undici": ">=5 <9", - "ws": "^8.21.0", - "zod": "^3.25 || ^4.0" + "zod": "^4.0.0" }, "peerDependenciesMeta": { - "@aws-sdk/credential-provider-node": { - "optional": true - }, - "@smithy/hash-node": { - "optional": true - }, - "@smithy/signature-v4": { - "optional": true - }, - "undici": { - "optional": true - }, - "ws": { - "optional": true - }, "zod": { "optional": true } } }, - "apps/growth-research/node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "apps/growth-research/node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "apps/growth-research/node_modules/@dawn-ai/testing": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/testing/-/testing-0.8.26.tgz", + "integrity": "sha512-doZkZhk7gqyV+pAOtRi1m+JtRvtyWeqZ6hhYMj+9eM4/KxnRW6Y2b2liKs8po39LUKyWn2J5QkDyncnRxcn+rw==", + "dev": true, "license": "MIT", "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" + "@copilotkit/aimock": "^1.37.4", + "@dawn-ai/memory": "0.8.26" }, "engines": { - "node": ">=8" + "node": ">=24.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@dawn-ai/cli": "0.8.26", + "@dawn-ai/core": "0.8.26", + "@dawn-ai/sdk": "0.8.26", + "@dawn-ai/workspace": "0.8.26" } }, - "apps/growth-research/node_modules/p-retry": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-7.1.1.tgz", - "integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==", + "apps/growth-research/node_modules/@langchain/langgraph": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-1.4.14.tgz", + "integrity": "sha512-uWAdRYTllfKCnTrlyovExPJCHJwcf3Wl2LzUlnaqsT7Rmoo3aCeYtq/7MV/Pw4q11motG8pR8bjr6T6V8Pe1gQ==", "license": "MIT", "dependencies": { - "is-network-error": "^1.1.0" + "@langchain/langgraph-checkpoint": "^1.1.5", + "@langchain/langgraph-sdk": "~1.10.2", + "@langchain/protocol": "^0.0.19", + "@standard-schema/spec": "1.1.0" }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "apps/growth-research/node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" + "node": ">=18" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@langchain/core": "^1.1.48", + "zod": "^3.25.32 || ^4.2.0" } }, - "apps/growth-research/node_modules/pg": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.23.0.tgz", - "integrity": "sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==", + "apps/growth-research/node_modules/@langchain/langgraph-sdk": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-1.10.2.tgz", + "integrity": "sha512-86qsfdBZWu1ZgywLN8AThU/jXi9rjPDZPWcTJp4SA1A/L62ypTNoSXbvtiwZt1odokXccYTxK1XWS8tmVdvEmw==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.14.0", - "pg-pool": "^3.14.0", - "pg-protocol": "^1.16.0", - "pg-types": "2.2.0", - "pgpass": "1.0.5" - }, - "engines": { - "node": ">= 16.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.4.0" + "@langchain/protocol": "^0.0.19", + "@types/json-schema": "^7.0.15", + "p-queue": "^9.0.1", + "p-retry": "^7.1.1" }, "peerDependencies": { - "pg-native": ">=3.0.1" + "@langchain/core": "^1.1.48", + "react": "^18 || ^19", + "react-dom": "^18 || ^19" }, "peerDependenciesMeta": { - "pg-native": { + "react": { + "optional": true + }, + "react-dom": { "optional": true } } }, - "apps/growth-research/node_modules/pg-cloudflare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz", - "integrity": "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==", - "license": "MIT", - "optional": true - }, - "apps/growth-research/node_modules/pg-connection-string": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.0.tgz", - "integrity": "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==", - "license": "MIT" - }, - "apps/growth-research/node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "license": "ISC", - "engines": { - "node": ">=4.0.0" - } - }, - "apps/growth-research/node_modules/pg-pool": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", - "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", - "license": "MIT", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "apps/growth-research/node_modules/pg-protocol": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.0.tgz", - "integrity": "sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==", + "apps/growth-research/node_modules/@langchain/langgraph-sdk/node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, - "apps/growth-research/node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "apps/growth-research/node_modules/@langchain/langgraph-sdk/node_modules/p-queue": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz", + "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==", "license": "MIT", "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" + "eventemitter3": "^5.0.4", + "p-timeout": "^7.0.0" }, "engines": { - "node": ">=4" - } - }, - "apps/growth-research/node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "license": "MIT", - "dependencies": { - "split2": "^4.1.0" - } - }, - "apps/growth-research/node_modules/pgvector": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/pgvector/-/pgvector-0.3.0.tgz", - "integrity": "sha512-+t7qcQD2us8fO8YIq/3lA0gUrD+bVO70MG1MhcDcxJz/OlRGGIIHzFq/4x57Vn/LpzX5wFdfOTLQp9QMPd4ljQ==", - "license": "MIT", - "engines": { - "node": ">=22" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "apps/growth-research/node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "apps/growth-research/node_modules/@langchain/langgraph-sdk/node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "apps/growth-research/node_modules/postgres-bytea": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", - "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "apps/growth-research/node_modules/@langchain/protocol": { + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/@langchain/protocol/-/protocol-0.0.19.tgz", + "integrity": "sha512-9hKcRrH7cBX6gfutdfXPoft1OCchHe4FEpALoDJMl5Qu+n/YG5ynZmyu8+8cxORlPwHBoKTxggvXz+76M1yX1Q==", + "license": "MIT" }, - "apps/growth-research/node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "apps/growth-research/node_modules/is-network-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", + "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "apps/growth-research/node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" + "node": ">=16" }, - "engines": { - "node": ">=0.10.0" - } - }, - "apps/growth-research/node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "apps/growth-research/node_modules/tsx": { - "version": "4.23.13", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.13.tgz", - "integrity": "sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw==", + "apps/growth-research/node_modules/p-retry": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-7.1.1.tgz", + "integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==", "license": "MIT", "dependencies": { - "esbuild": "~0.28.0" - }, - "bin": { - "tsx": "dist/cli.mjs" + "is-network-error": "^1.1.0" }, "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "apps/growth-research/node_modules/typescript": { - "name": "@typescript/typescript6", - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript6/-/typescript6-6.0.2.tgz", - "integrity": "sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==", - "license": "Apache-2.0", - "dependencies": { - "@typescript/old": "npm:typescript@^6" + "node": ">=20" }, - "bin": { - "tsc6": "bin/tsc6" - } - }, - "apps/growth-research/node_modules/undici-types": { - "version": "7.19.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", - "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", - "license": "MIT" - }, - "apps/growth-research/node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "apps/growth-research/node_modules/zod": { @@ -1517,20 +316,41 @@ "name": "@threadplane-internal/lifecycle", "version": "0.0.0", "dependencies": { - "@dawn-ai/cli": "0.8.21", - "@dawn-ai/core": "0.8.21", - "@dawn-ai/langgraph": "0.8.21", - "@dawn-ai/postgres-storage": "0.8.21", - "@dawn-ai/sdk": "0.8.21", + "@dawn-ai/cli": "0.8.26", + "@dawn-ai/core": "0.8.26", + "@dawn-ai/langgraph": "0.8.26", + "@dawn-ai/postgres-storage": "0.8.26", + "@dawn-ai/sdk": "0.8.26", "@neondatabase/serverless": "0.10.4", + "@react-email/render": "2.1.0", "@threadplane-internal/growth": "0.0.0", "hono": "4.13.5", "parse5": "8.0.1", "resend": "6.10.0", "zod": "4.4.3" }, + "devDependencies": { + "esbuild": "0.27.4" + }, + "engines": { + "node": ">=24.0.0" + } + }, + "apps/lifecycle/node_modules/@dawn-ai/sdk": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/sdk/-/sdk-0.8.26.tgz", + "integrity": "sha512-iuPaJFjF4jAXV1ARN4eKaAtdHiaVDe/edCZdX72Obh2PADayx4undsyFwGXM7fiywjjKxRjMkud/9BXpou+Qsw==", + "license": "MIT", "engines": { "node": ">=24.0.0" + }, + "peerDependencies": { + "zod": "^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } } }, "apps/lifecycle/node_modules/entities": { @@ -1545,15 +365,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "apps/lifecycle/node_modules/hono": { - "version": "4.13.5", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.5.tgz", - "integrity": "sha512-O6+/eCYRkzzzy0rPWwKLiGBR1nFuUPZynnwjxN1MBA62NNqbT0wQEzQyK2gSO5yDIDB336sXQleAhOHrzlYyKw==", - "license": "MIT", - "engines": { - "node": ">=16.9.0" - } - }, "apps/lifecycle/node_modules/parse5": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", @@ -8717,6 +7528,32 @@ "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", "license": "MIT" }, + "node_modules/@copilotkit/aimock": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/@copilotkit/aimock/-/aimock-1.39.0.tgz", + "integrity": "sha512-AWw4vmW2hBchHoggh0G4McWGmGZD6wtXAehL6K5ncWF5lVIjlv++bPmxmRwrpQCi/K4/xK10N9Zp9srJYipEJw==", + "dev": true, + "license": "MIT", + "bin": { + "aimock": "dist/aimock-cli.js", + "llmock": "dist/cli.js" + }, + "engines": { + "node": ">=20.15.0" + }, + "peerDependencies": { + "jest": ">=29", + "vitest": ">=3" + }, + "peerDependenciesMeta": { + "jest": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, "node_modules/@csstools/color-helpers": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", @@ -8863,61 +7700,57 @@ } }, "node_modules/@dawn-ai/ag-ui": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/@dawn-ai/ag-ui/-/ag-ui-0.8.21.tgz", - "integrity": "sha512-WckkEMMuc6ZDNgGy/eqnB+lrzcT5EngU+EUFCYrKz+An/nKv7zzc18B+a0J/0CJqt8ol404Nri36+u8Og/2Q8w==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/ag-ui/-/ag-ui-0.8.26.tgz", + "integrity": "sha512-26NO74q7EAt0rAxg8bf6qd2U74EQoxXw75vMMIw3swzCy4SmB0tB+kaLX5xrBhoew5Ghze1vQVZ+g8fzRIvpHw==", "license": "MIT", "dependencies": { - "@ag-ui/core": "0.0.57", - "@ag-ui/encoder": "0.0.57" + "@ag-ui/core": "0.0.59", + "@ag-ui/encoder": "0.0.59", + "zod": "^4.4.3" }, "engines": { "node": ">=24.0.0" + }, + "peerDependencies": { + "@copilotkit/react-core": ">=1.66.0", + "react": ">=19.0.0" + }, + "peerDependenciesMeta": { + "@copilotkit/react-core": { + "optional": true + }, + "react": { + "optional": true + } } }, - "node_modules/@dawn-ai/ag-ui/node_modules/@ag-ui/core": { - "version": "0.0.57", - "resolved": "https://registry.npmjs.org/@ag-ui/core/-/core-0.0.57.tgz", - "integrity": "sha512-gho1OWjNE6E3Rl7ZEZ1wr2CEpUHjLFU0FqzCZZk439TicLu+BfLCMkMokB07bMGlRmbJ60hM6LW60iOVauCx+Q==", - "dependencies": { - "zod": "^3.22.4" - } - }, - "node_modules/@dawn-ai/ag-ui/node_modules/@ag-ui/encoder": { - "version": "0.0.57", - "resolved": "https://registry.npmjs.org/@ag-ui/encoder/-/encoder-0.0.57.tgz", - "integrity": "sha512-ifD9NctR4xyPDR58xF9GK1bj/S8oECFkTeDfuYD8tXdbcOstIJ2TOqU2zhiCKnw7Vw+zR9Qv3TbsM9E7Gi9X3Q==", - "dependencies": { - "@ag-ui/core": "0.0.57", - "@ag-ui/proto": "0.0.57" - } - }, - "node_modules/@dawn-ai/ag-ui/node_modules/@ag-ui/proto": { - "version": "0.0.57", - "resolved": "https://registry.npmjs.org/@ag-ui/proto/-/proto-0.0.57.tgz", - "integrity": "sha512-pPENOZt0P6ibH8sCTgq05wLYXi5t3P9B5r/1bWYehXjUxtyOdnukSlWM++SsCIwUXsQdm/b3aBgGjEeTF7RenA==", - "dependencies": { - "@ag-ui/core": "0.0.57", - "@bufbuild/protobuf": "^2.2.5", - "@protobuf-ts/protoc": "^2.11.1" + "node_modules/@dawn-ai/ag-ui/node_modules/zod": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz", + "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/@dawn-ai/cli": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/@dawn-ai/cli/-/cli-0.8.21.tgz", - "integrity": "sha512-rLRrg1fk89rYJ4inpV0TBpe7DHVzsTUKA8CGN4gH5dNrbpwPywYAN8n4kiuBhEeDjSDS2JBLnOas96LsnhrIcw==", - "license": "MIT", - "dependencies": { - "@ag-ui/core": "0.0.57", - "@dawn-ai/ag-ui": "0.8.21", - "@dawn-ai/core": "0.8.21", - "@dawn-ai/langchain": "0.8.21", - "@dawn-ai/langgraph": "0.8.21", - "@dawn-ai/memory": "0.8.21", - "@dawn-ai/permissions": "0.8.21", - "@dawn-ai/sdk": "0.8.21", - "@dawn-ai/sqlite-storage": "0.8.21", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/cli/-/cli-0.8.26.tgz", + "integrity": "sha512-hGL8L3YZCPoI4xbHZV3by3aw6hSrRGdja2zF9i0+qsCLdD2eBJ9eyU8tbkrCfwPQ+uabh59Kys+nMdh2l1AGKw==", + "license": "MIT", + "dependencies": { + "@ag-ui/core": "0.0.59", + "@dawn-ai/ag-ui": "0.8.26", + "@dawn-ai/core": "0.8.26", + "@dawn-ai/langchain": "0.8.26", + "@dawn-ai/langgraph": "0.8.26", + "@dawn-ai/memory": "0.8.26", + "@dawn-ai/permissions": "0.8.26", + "@dawn-ai/sdk": "0.8.26", + "@dawn-ai/sqlite-storage": "0.8.26", "commander": "15.0.0", + "esbuild": "^0.28.1", "tsx": "^4.23.5" }, "bin": { @@ -8927,12 +7760,21 @@ "node": ">=24.0.0" } }, - "node_modules/@dawn-ai/cli/node_modules/@ag-ui/core": { - "version": "0.0.57", - "resolved": "https://registry.npmjs.org/@ag-ui/core/-/core-0.0.57.tgz", - "integrity": "sha512-gho1OWjNE6E3Rl7ZEZ1wr2CEpUHjLFU0FqzCZZk439TicLu+BfLCMkMokB07bMGlRmbJ60hM6LW60iOVauCx+Q==", - "dependencies": { - "zod": "^3.22.4" + "node_modules/@dawn-ai/cli/node_modules/@dawn-ai/sdk": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/sdk/-/sdk-0.8.26.tgz", + "integrity": "sha512-iuPaJFjF4jAXV1ARN4eKaAtdHiaVDe/edCZdX72Obh2PADayx4undsyFwGXM7fiywjjKxRjMkud/9BXpou+Qsw==", + "license": "MIT", + "engines": { + "node": ">=24.0.0" + }, + "peerDependencies": { + "zod": "^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } } }, "node_modules/@dawn-ai/cli/node_modules/@esbuild/aix-ppc64": { @@ -9420,15 +8262,15 @@ } }, "node_modules/@dawn-ai/core": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/@dawn-ai/core/-/core-0.8.21.tgz", - "integrity": "sha512-XpiTDzFnf+KFV28A4ivqNuyJ6mM5AWOgELhhlFfeLRYsPWoeU0ZpvN0FYP/jq9qug9uLdlh9t7LmdPhAEWjFWA==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/core/-/core-0.8.26.tgz", + "integrity": "sha512-2yh4s1APE86J9WpkBMlyziIVIvodZFybK+06Z1JDVZulN3T8w2qtHqSpMs47bOQ2Owz7pHmTiYPnkcoiZSwB1w==", "license": "MIT", "dependencies": { - "@dawn-ai/permissions": "0.8.21", - "@dawn-ai/sdk": "0.8.21", - "@dawn-ai/sqlite-storage": "0.8.21", - "@dawn-ai/workspace": "0.8.21", + "@dawn-ai/permissions": "0.8.26", + "@dawn-ai/sdk": "0.8.26", + "@dawn-ai/sqlite-storage": "0.8.26", + "@dawn-ai/workspace": "0.8.26", "@langchain/langgraph": "^1.4.9", "@typescript/old": "npm:typescript@6.0.2", "tsx": "^4.23.5", @@ -9442,6 +8284,23 @@ "@langchain/langgraph-checkpoint": "^1.1.3" } }, + "node_modules/@dawn-ai/core/node_modules/@dawn-ai/sdk": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/sdk/-/sdk-0.8.26.tgz", + "integrity": "sha512-iuPaJFjF4jAXV1ARN4eKaAtdHiaVDe/edCZdX72Obh2PADayx4undsyFwGXM7fiywjjKxRjMkud/9BXpou+Qsw==", + "license": "MIT", + "engines": { + "node": ">=24.0.0" + }, + "peerDependencies": { + "zod": "^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, "node_modules/@dawn-ai/core/node_modules/@esbuild/aix-ppc64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", @@ -9940,14 +8799,14 @@ } }, "node_modules/@dawn-ai/langchain": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/@dawn-ai/langchain/-/langchain-0.8.21.tgz", - "integrity": "sha512-QZbqC+2mqDwcugfq/RqjLxBAOCgTDjJNkh7dy5gNybKJ32IdwTp1CgTHiYcAsNhAtfC763ErjS6IQgYAJ4XStg==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/langchain/-/langchain-0.8.26.tgz", + "integrity": "sha512-3qeexYRMSb9+9t6NwiGHHYCjPWuu061cinP98D6erYMXXsIijxEVvW3EWLBOtha957MhVrb+rjzqEvRFIvpjzA==", "license": "MIT", "dependencies": { - "@dawn-ai/core": "0.8.21", - "@dawn-ai/sdk": "0.8.21", - "@dawn-ai/workspace": "0.8.21", + "@dawn-ai/core": "0.8.26", + "@dawn-ai/sdk": "0.8.26", + "@dawn-ai/workspace": "0.8.26", "@langchain/langgraph": "^1.4.9", "@langchain/openai": "^1.5.5", "gpt-tokenizer": "^3.4.0" @@ -9993,63 +8852,94 @@ } } }, + "node_modules/@dawn-ai/langchain/node_modules/@dawn-ai/sdk": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/sdk/-/sdk-0.8.26.tgz", + "integrity": "sha512-iuPaJFjF4jAXV1ARN4eKaAtdHiaVDe/edCZdX72Obh2PADayx4undsyFwGXM7fiywjjKxRjMkud/9BXpou+Qsw==", + "license": "MIT", + "engines": { + "node": ">=24.0.0" + }, + "peerDependencies": { + "zod": "^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, "node_modules/@dawn-ai/langgraph": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/@dawn-ai/langgraph/-/langgraph-0.8.21.tgz", - "integrity": "sha512-LNoV9o4He1i6L5QKSSqbngn0cMPw16xwhkf74ApJgJiHQKJ8kGi3s0bzo9f9h0dALeOVZ8BO42bNz91U603szg==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/langgraph/-/langgraph-0.8.26.tgz", + "integrity": "sha512-rIOwcZ3fHFd1KN3Hbc1BKqNRkpsLu6f174YxO3poDkpdvraiTEz8d9r/zuriOsKZXtdMLjOBbKEtr6/UwVmZoA==", "license": "MIT", "dependencies": { - "@dawn-ai/sdk": "0.8.21" + "@dawn-ai/sdk": "0.8.26" }, "engines": { "node": ">=24.0.0" } }, + "node_modules/@dawn-ai/langgraph/node_modules/@dawn-ai/sdk": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/sdk/-/sdk-0.8.26.tgz", + "integrity": "sha512-iuPaJFjF4jAXV1ARN4eKaAtdHiaVDe/edCZdX72Obh2PADayx4undsyFwGXM7fiywjjKxRjMkud/9BXpou+Qsw==", + "license": "MIT", + "engines": { + "node": ">=24.0.0" + }, + "peerDependencies": { + "zod": "^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, "node_modules/@dawn-ai/memory": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/@dawn-ai/memory/-/memory-0.8.21.tgz", - "integrity": "sha512-j6QwP96+lH3bSSUnUB+JU/OAVmoKY/B39yYRDpOJ0aTnWcon2g6RTTjwc140BSiMKZzDO3/HaBERK19sPBLJ/w==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/memory/-/memory-0.8.26.tgz", + "integrity": "sha512-2C5izGXfefVple7zJxrACO5av4Sq4m5zDjnKn27SPBOjapcCo0G4xWAtd/67/s+LinzPbnPDwO8Q+kBVEEasng==", "license": "MIT", "dependencies": { - "@dawn-ai/sqlite-storage": "0.8.21" + "@dawn-ai/sqlite-storage": "0.8.26" }, "engines": { "node": ">=24.0.0" } }, - "node_modules/@dawn-ai/permissions": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/@dawn-ai/permissions/-/permissions-0.8.21.tgz", - "integrity": "sha512-KUGrDa5q3BV0UKXEf652Bdg87lkHdGn4X+GPrpsFEkoe+cFmhYZuvS8B/CGM8ptHCbg0Ca6pXZDg0LY6mkIYeg==", + "node_modules/@dawn-ai/memory-pgvector": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/memory-pgvector/-/memory-pgvector-0.8.26.tgz", + "integrity": "sha512-wAoqHVBZ7Cb/gKGhUJwHQvP4eIYvq5OQc/jSmI38oUyj6NI+lp8cNs66sNI5YCwxcJ+6wFChGeHMNZF/Tc/oAw==", "license": "MIT", "dependencies": { - "@dawn-ai/sdk": "0.8.21" + "@dawn-ai/memory": "0.8.26", + "pg": "^8.22.0", + "pgvector": "^0.3.0" }, "engines": { "node": ">=24.0.0" } }, - "node_modules/@dawn-ai/postgres-storage": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/@dawn-ai/postgres-storage/-/postgres-storage-0.8.21.tgz", - "integrity": "sha512-fRgJ2gWuzdJRXWkaaaik7FhNhgdLgLndiCmmNW50WdxTHgm6Q49pR6dGvh/7ABfzQhSW+B1q8JMDp9C7bsfAsg==", + "node_modules/@dawn-ai/permissions": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/permissions/-/permissions-0.8.26.tgz", + "integrity": "sha512-gRVedFYzuNsuqE9Gx18O1Ch6nlbYJdYIczXCWVR4r5Tclqb//Y22kHCS+s48juwnQ5jR2NTUFWeyh5vzFcAiLA==", "license": "MIT", "dependencies": { - "@dawn-ai/permissions": "0.8.21", - "pg": "^8.22.0" + "@dawn-ai/sdk": "0.8.26" }, "engines": { "node": ">=24.0.0" - }, - "peerDependencies": { - "@langchain/core": "^1.2.1", - "@langchain/langgraph-checkpoint": "^1.1.3" } }, - "node_modules/@dawn-ai/sdk": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/@dawn-ai/sdk/-/sdk-0.8.21.tgz", - "integrity": "sha512-AIZQSUOD/xBI3o5G/eHN9hDLggLXvctNS1rluxe0p5holh5yiEmUcsYFAukpj130hSLWKMAirvtNZf+UiKPtaA==", + "node_modules/@dawn-ai/permissions/node_modules/@dawn-ai/sdk": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/sdk/-/sdk-0.8.26.tgz", + "integrity": "sha512-iuPaJFjF4jAXV1ARN4eKaAtdHiaVDe/edCZdX72Obh2PADayx4undsyFwGXM7fiywjjKxRjMkud/9BXpou+Qsw==", "license": "MIT", "engines": { "node": ">=24.0.0" @@ -10063,10 +8953,27 @@ } } }, + "node_modules/@dawn-ai/postgres-storage": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/postgres-storage/-/postgres-storage-0.8.26.tgz", + "integrity": "sha512-peOrUiq9AIhFNntiWXXR2O0TGA8bDfKooDzUXBOqOFbjKtgyLkREtu/M2/UFQ0s+1eISi9nNz+twU1VZcJJqDQ==", + "license": "MIT", + "dependencies": { + "@dawn-ai/permissions": "0.8.26", + "pg": "^8.22.0" + }, + "engines": { + "node": ">=24.0.0" + }, + "peerDependencies": { + "@langchain/core": "^1.2.1", + "@langchain/langgraph-checkpoint": "^1.1.3" + } + }, "node_modules/@dawn-ai/sqlite-storage": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/@dawn-ai/sqlite-storage/-/sqlite-storage-0.8.21.tgz", - "integrity": "sha512-xtQi5ioZIFACUsWPTznIkp4zNXY4C0lr1CssHmyACO5PxQ98EJc/rjN5qMRjvUGir2APsaI9229oongBst5ShQ==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/sqlite-storage/-/sqlite-storage-0.8.26.tgz", + "integrity": "sha512-bG9W8re14XkMKom77O9XW9v3FaeMMD5a06aUfAhTaEQWR+Qqkza1+pY2cwGDyaCWWl00wH0XFLwWL55nszLRLQ==", "license": "MIT", "engines": { "node": ">=24.0.0" @@ -10077,17 +8984,34 @@ } }, "node_modules/@dawn-ai/workspace": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/@dawn-ai/workspace/-/workspace-0.8.21.tgz", - "integrity": "sha512-7GjGP8oU6bzh1EtXiTGWpd2hzNPUwhs41wv5ucp2DOYsYcr/Fk2Czk6gqbCKtAhUFOBTNXH+nRif36/xruozuw==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/workspace/-/workspace-0.8.26.tgz", + "integrity": "sha512-VTSUy9i8Eq/zlZS1K0j3CaFmRSp06/rWdtcLpny70rIPxuq+emd9cnpPBbGVCJxYjNr1UJYVbqGpDg1grFms4w==", "license": "MIT", "dependencies": { - "@dawn-ai/sdk": "0.8.21" + "@dawn-ai/sdk": "0.8.26" }, "engines": { "node": ">=24.0.0" } }, + "node_modules/@dawn-ai/workspace/node_modules/@dawn-ai/sdk": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@dawn-ai/sdk/-/sdk-0.8.26.tgz", + "integrity": "sha512-iuPaJFjF4jAXV1ARN4eKaAtdHiaVDe/edCZdX72Obh2PADayx4undsyFwGXM7fiywjjKxRjMkud/9BXpou+Qsw==", + "license": "MIT", + "engines": { + "node": ">=24.0.0" + }, + "peerDependencies": { + "zod": "^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", @@ -12062,7 +10986,6 @@ "version": "0.16.0", "resolved": "https://registry.npmjs.org/@json-render/core/-/core-0.16.0.tgz", "integrity": "sha512-qQp8BB/3pWYapTGXBDSBMXRCdrC05VJPLL3drXMPX/QbUB3nuvtyXUGmAZFUz8eLUy7JImODvb3GNIq38dGzhQ==", - "dev": true, "license": "Apache-2.0", "dependencies": { "zod": "^4.3.6" @@ -12075,7 +10998,6 @@ "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -12512,9 +11434,9 @@ } }, "node_modules/@langchain/core": { - "version": "1.1.49", - "resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.1.49.tgz", - "integrity": "sha512-7wkN3Qv/qZqsY0p3h48CNu6E6y5GMYatYxj+JrX4uVNBiqIVQm1Z528QrmayJWVW9SQTQicqRNoyTCzl+K9F8Q==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.2.9.tgz", + "integrity": "sha512-conzSEj9Zu1AyXJLXsSbgrtxtxinmI1yGqQ5CIJZSoV5rvv+yvQE/vgBnoySpBQ/bl3YPgj2FL/gbDjWykLSfg==", "license": "MIT", "dependencies": { "@cfworker/json-schema": "^4.0.2", @@ -13035,6 +11957,28 @@ "node": ">=8" } }, + "node_modules/@module-federation/dts-plugin/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@module-federation/enhanced": { "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.21.6.tgz", @@ -13481,6 +12425,28 @@ "node": ">=10" } }, + "node_modules/@module-federation/node/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@module-federation/rspack": { "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.21.6.tgz", @@ -17154,6 +16120,28 @@ "node": ">=10" } }, + "node_modules/@nx/react/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@nx/rollup": { "version": "22.6.0", "resolved": "https://registry.npmjs.org/@nx/rollup/-/rollup-22.6.0.tgz", @@ -18536,7 +17524,6 @@ "version": "2.5.6", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -18576,7 +17563,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18597,7 +17583,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18618,7 +17603,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18639,7 +17623,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18660,7 +17643,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18681,7 +17663,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18702,7 +17683,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18723,7 +17703,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18744,7 +17723,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18765,7 +17743,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18786,7 +17763,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18807,7 +17783,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18828,7 +17803,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -18846,7 +17820,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, "license": "MIT", "optional": true, "engines": { @@ -19040,7 +18013,7 @@ "version": "1.58.2", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "playwright": "1.58.2" @@ -19487,6 +18460,40 @@ } } }, + "node_modules/@react-email/render": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@react-email/render/-/render-2.1.0.tgz", + "integrity": "sha512-F+zE3O6d6sW6Aj2UjvZAA17R7tJKM7kcq2mgV6k4HCT8jeLLFaVP2txMtH1lgqYFRMZ0Gxsd37q2PRyiXLXXxA==", + "license": "MIT", + "dependencies": { + "entities": "^4.5.0", + "html-to-text": "^9.0.5", + "html5parser": "^3.0.0", + "prettier": "^3.5.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": "^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^18.0 || ^19.0 || ^19.0.0-rc" + } + }, + "node_modules/@react-email/render/node_modules/prettier": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/@redocly/ajv": { "version": "8.11.2", "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", @@ -21031,6 +20038,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@selderee/plugin-htmlparser2": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "selderee": "^0.11.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/@shikijs/core": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz", @@ -22978,7 +21998,6 @@ "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -22988,7 +22007,7 @@ "version": "19.2.3", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" @@ -28133,7 +27152,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, "license": "MIT" }, "node_modules/cuint": { @@ -28337,7 +27355,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -28570,7 +27587,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -28585,7 +27601,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, "funding": [ { "type": "github", @@ -28598,7 +27613,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -28623,7 +27637,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -28932,7 +27945,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -31668,10 +30680,9 @@ } }, "node_modules/hono": { - "version": "4.12.8", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.8.tgz", - "integrity": "sha512-VJCEvtrezO1IAR+kqEYnxUOoStaQPGrCmX3j4wDTNOcD1uRPFpGlwQUIW8niPuvHXaTUxeOUl5MMDGrl+tmO9A==", - "dev": true, + "version": "4.13.5", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.5.tgz", + "integrity": "sha512-O6+/eCYRkzzzy0rPWwKLiGBR1nFuUPZynnwjxN1MBA62NNqbT0wQEzQyK2gSO5yDIDB336sXQleAhOHrzlYyKw==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -31783,6 +30794,41 @@ "dev": true, "license": "MIT" }, + "node_modules/html-to-text": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", + "license": "MIT", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.11.0", + "deepmerge": "^4.3.1", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.2", + "selderee": "^0.11.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/html-to-text/node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", @@ -31793,6 +30839,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/html5parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html5parser/-/html5parser-3.0.0.tgz", + "integrity": "sha512-iNpSopa+4YHX50UOk825tBy7MghmXHo/ZpLskBYN0kAr1xhH8GlIMk5bLRXcZlfP3AnLUcSuFMu8C4MdOUxA8A==", + "license": "MIT" + }, "node_modules/htmlparser2": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", @@ -32152,7 +31204,7 @@ "version": "5.1.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/import-fresh": { @@ -32373,7 +31425,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -32393,7 +31445,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -33399,7 +32451,7 @@ "version": "0.17.0", "resolved": "https://registry.npmjs.org/katex/-/katex-0.17.0.tgz", "integrity": "sha512-Vdw0ATsQ9V+LuegM/BTwQqV/6cTl5lbGcIrU+BCgLxyf6bo38ybOr372tuSIxir3CN720flu1meYR6XzNMwQnw==", - "dev": true, + "devOptional": true, "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -33416,7 +32468,7 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 12" @@ -33646,6 +32698,15 @@ "shell-quote": "^1.8.3" } }, + "node_modules/leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "license": "MIT", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/less": { "version": "4.6.4", "resolved": "https://registry.npmjs.org/less/-/less-4.6.4.tgz", @@ -34810,7 +33871,6 @@ "version": "15.0.12", "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", - "dev": true, "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -37051,7 +36111,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, "license": "MIT", "optional": true }, @@ -37580,9 +36639,9 @@ } }, "node_modules/openai": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-7.9.0.tgz", - "integrity": "sha512-Qfx4qKmPllnilbuP6NgEj5KPUxLShYxrlRPWh3ZRQgNgs5B1V52PrfAdEQbW9MTGq7MquDYFMm+K/KXxiY736w==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-7.10.0.tgz", + "integrity": "sha512-sn9t2Kls7O52PwuF9BUTYNu4Gk/r0lXJyrgaNht4TNRlZFb3dJIGO0RciSgjARGCBRtWjySubAQFJttlzUvGQQ==", "license": "Apache-2.0", "engines": { "node": ">=22.0.0" @@ -38172,6 +37231,19 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parseley": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", + "license": "MIT", + "dependencies": { + "leac": "^0.6.0", + "peberminta": "^0.9.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -38281,6 +37353,15 @@ "dev": true, "license": "MIT" }, + "node_modules/peberminta": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", + "license": "MIT", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/peek-stream": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", @@ -38462,6 +37543,15 @@ "split2": "^4.1.0" } }, + "node_modules/pgvector": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pgvector/-/pgvector-0.3.0.tgz", + "integrity": "sha512-+t7qcQD2us8fO8YIq/3lA0gUrD+bVO70MG1MhcDcxJz/OlRGGIIHzFq/4x57Vn/LpzX5wFdfOTLQp9QMPd4ljQ==", + "license": "MIT", + "engines": { + "node": ">=22" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -38771,7 +37861,7 @@ "version": "1.58.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "playwright-core": "1.58.2" @@ -38790,7 +37880,7 @@ "version": "1.58.2", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -38803,7 +37893,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -40278,6 +39367,17 @@ "dev": true, "license": "MIT" }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -41252,7 +40352,7 @@ "version": "1.98.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.98.0.tgz", "integrity": "sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "chokidar": "^4.0.0", @@ -41678,7 +40778,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "readdirp": "^4.0.1" @@ -41694,7 +40794,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 14.18.0" @@ -41843,6 +40943,18 @@ "node": ">= 6" } }, + "node_modules/selderee": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", + "license": "MIT", + "dependencies": { + "parseley": "^0.12.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -43165,7 +42277,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", - "dev": true, "license": "MIT" }, "node_modules/tapable": { @@ -44174,7 +43285,7 @@ "version": "7.24.4", "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=20.18.1" @@ -45627,10 +44738,10 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index bc9bb719f..4d3df39c7 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "@angular/router": "~21.1.0", "@cacheplane/partial-json": "^0.1.1", "@cacheplane/partial-markdown": "0.5.8", - "@langchain/core": "^1.1.33", + "@langchain/core": "^1.2.9", "@langchain/langgraph-sdk": "^1.7.4", "@neondatabase/serverless": "^0.10.0", "@upstash/ratelimit": "^2.0.5",