diff --git a/package.json b/package.json index e8553e5..de549ab 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "type": "module", "scripts": { - "build": "pnpm -r build" + "build": "node scripts/build.mjs" }, "dependencies": { "@uncaged/nerve-adapter-cursor": "link:../repos/nerve/packages/adapter-cursor", @@ -19,7 +19,10 @@ "zod": "^4.3.6" }, "devDependencies": { - "drizzle-kit": "latest" + "@types/node": "^22.0.0", + "drizzle-kit": "latest", + "esbuild": "^0.27.0", + "typescript": "^5.7.0" }, "pnpm": { "onlyBuiltDependencies": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a0abac9..94e2b4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,9 +48,18 @@ importers: specifier: ^4.3.6 version: 4.3.6 devDependencies: + '@types/node': + specifier: ^22.0.0 + version: 22.19.17 drizzle-kit: specifier: latest version: 0.31.10 + esbuild: + specifier: ^0.27.0 + version: 0.27.7 + typescript: + specifier: ^5.7.0 + version: 5.9.3 senses/git-workspace-status: devDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index d7bdb1b..0000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,3 +0,0 @@ -packages: - - "workflows/*" - - "senses/*" diff --git a/scripts/build.mjs b/scripts/build.mjs new file mode 100644 index 0000000..82079e9 --- /dev/null +++ b/scripts/build.mjs @@ -0,0 +1,50 @@ +import * as esbuild from "esbuild"; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const root = path.join(path.dirname(fileURLToPath(import.meta.url)), ".."); + +const opts = { + bundle: true, + platform: "node", + format: "esm", + packages: "external", +}; + +function listDirs(dir) { + if (!fs.existsSync(dir)) return []; + return fs + .readdirSync(dir) + .filter((name) => !name.startsWith(".")) + .map((name) => path.join(dir, name)) + .filter((p) => fs.statSync(p).isDirectory()); +} + +async function main() { + for (const dir of listDirs(path.join(root, "senses"))) { + const entry = path.join(dir, "src", "index.ts"); + if (!fs.existsSync(entry)) continue; + await esbuild.build({ + ...opts, + entryPoints: [entry], + outfile: path.join(dir, "index.js"), + }); + } + + for (const dir of listDirs(path.join(root, "workflows"))) { + const base = path.basename(dir); + if (base.startsWith("_")) continue; + const entry = path.join(dir, "index.ts"); + if (!fs.existsSync(entry)) continue; + const outDir = path.join(dir, "dist"); + fs.mkdirSync(outDir, { recursive: true }); + await esbuild.build({ + ...opts, + entryPoints: [entry], + outfile: path.join(outDir, "index.js"), + }); + } +} + +await main(); diff --git a/senses/git-workspace-status/index.js b/senses/git-workspace-status/index.js index 5a90a3d..cc60d6a 100644 --- a/senses/git-workspace-status/index.js +++ b/senses/git-workspace-status/index.js @@ -1,8 +1,8 @@ -// src/index.ts +// senses/git-workspace-status/src/index.ts import { execFileSync } from "node:child_process"; import { resolve } from "node:path"; -// src/schema.ts +// senses/git-workspace-status/src/schema.ts import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core"; var snapshots = sqliteTable("snapshots", { ts: integer("ts").primaryKey(), @@ -16,7 +16,7 @@ var snapshots = sqliteTable("snapshots", { gitError: text("git_error").notNull() }); -// src/index.ts +// senses/git-workspace-status/src/index.ts var GIT_TIMEOUT_MS = 15e3; function workspaceRoot() { const raw = process.env.GIT_WORKSPACE_ROOT; diff --git a/senses/git-workspace-status/package.json b/senses/git-workspace-status/package.json deleted file mode 100644 index 2ec7b90..0000000 --- a/senses/git-workspace-status/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "sense-git-workspace-status", - "version": "0.0.1", - "private": true, - "type": "module", - "scripts": { - "build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=index.js --packages=external" - }, - "devDependencies": { - "@types/node": "^22.0.0", - "esbuild": "^0.27.0", - "typescript": "^5.7.0" - } -} diff --git a/senses/hermes-gateway-health/index.js b/senses/hermes-gateway-health/index.js index ebd7d02..995943b 100644 --- a/senses/hermes-gateway-health/index.js +++ b/senses/hermes-gateway-health/index.js @@ -1,7 +1,7 @@ -// src/index.ts +// senses/hermes-gateway-health/src/index.ts import { execFile } from "node:child_process"; -// src/schema.ts +// senses/hermes-gateway-health/src/schema.ts import { integer, real, sqliteTable, text } from "drizzle-orm/sqlite-core"; var hermesGatewayHealth = sqliteTable("hermes_gateway_health", { id: integer("id").primaryKey({ autoIncrement: true }), @@ -19,7 +19,7 @@ var hermesGatewayHealth = sqliteTable("hermes_gateway_health", { httpError: text("http_error").notNull() }); -// src/index.ts +// senses/hermes-gateway-health/src/index.ts var EXEC_TIMEOUT_MS = 25e3; var HTTP_TIMEOUT_MS = Math.min(23e3, EXEC_TIMEOUT_MS - 2e3); var HTTP_ERROR_MAX_LEN = 256; diff --git a/senses/hermes-gateway-health/package.json b/senses/hermes-gateway-health/package.json deleted file mode 100644 index 8912327..0000000 --- a/senses/hermes-gateway-health/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "sense-hermes-gateway-health", - "version": "0.0.1", - "private": true, - "type": "module", - "scripts": { - "build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=index.js --packages=external" - }, - "devDependencies": { - "@types/node": "^22.0.0", - "esbuild": "^0.27.0", - "typescript": "^5.7.0" - } -} diff --git a/senses/hermes-session-message-stats/index.js b/senses/hermes-session-message-stats/index.js index 325eb15..0c15a34 100644 --- a/senses/hermes-session-message-stats/index.js +++ b/senses/hermes-session-message-stats/index.js @@ -1,11 +1,11 @@ -// src/index.ts +// senses/hermes-session-message-stats/src/index.ts import { createReadStream } from "node:fs"; import { readdir } from "node:fs/promises"; import { homedir } from "node:os"; import { join } from "node:path"; import { createInterface } from "node:readline"; -// src/schema.ts +// senses/hermes-session-message-stats/src/schema.ts import { integer, sqliteTable } from "drizzle-orm/sqlite-core"; var hermesSessionMessageStats = sqliteTable("hermes_session_message_stats", { id: integer("id").primaryKey({ autoIncrement: true }), @@ -18,7 +18,7 @@ var hermesSessionMessageStats = sqliteTable("hermes_session_message_stats", { measurementWindowSeconds: integer("measurement_window_seconds").notNull() }); -// src/index.ts +// senses/hermes-session-message-stats/src/index.ts var MEASUREMENT_WINDOW_MS = 9e5; var MEASUREMENT_WINDOW_SECONDS = 900; async function aggregateJsonlFile(filePath, cutoffMs, nowMs) { diff --git a/senses/hermes-session-message-stats/package.json b/senses/hermes-session-message-stats/package.json deleted file mode 100644 index 0f0e31d..0000000 --- a/senses/hermes-session-message-stats/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "sense-hermes-session-message-stats", - "version": "0.0.1", - "private": true, - "type": "module", - "scripts": { - "build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=index.js --packages=external" - }, - "devDependencies": { - "@types/node": "^22.0.0", - "esbuild": "^0.27.0", - "typescript": "^5.7.0" - } -} diff --git a/senses/linux-system-health/index.js b/senses/linux-system-health/index.js index 8173fc0..ae44f58 100644 --- a/senses/linux-system-health/index.js +++ b/senses/linux-system-health/index.js @@ -1,9 +1,9 @@ -// src/index.ts +// senses/linux-system-health/src/index.ts import { loadavg, totalmem, freemem, uptime } from "node:os"; import { execSync } from "node:child_process"; import { readFile } from "node:fs/promises"; -// src/schema.ts +// senses/linux-system-health/src/schema.ts import { integer, real, sqliteTable } from "drizzle-orm/sqlite-core"; var snapshots = sqliteTable("snapshots", { ts: integer("ts").primaryKey(), @@ -26,7 +26,7 @@ var snapshots = sqliteTable("snapshots", { tcpMemPages: integer("tcp_mem_pages") }); -// src/index.ts +// senses/linux-system-health/src/index.ts var SOCKSTAT_PATH = "/proc/net/sockstat"; function parseSockstat(content) { let socketsUsed = 0, tcpInuse = 0, tcpOrphan = 0, tcpTw = 0, tcpAlloc = 0, tcpMemPages = 0; diff --git a/senses/linux-system-health/package.json b/senses/linux-system-health/package.json deleted file mode 100644 index 56de8f3..0000000 --- a/senses/linux-system-health/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "sense-linux-system-health", - "version": "0.0.1", - "private": true, - "type": "module", - "scripts": { - "build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=index.js --packages=external" - }, - "devDependencies": { - "@types/node": "^22.0.0", - "esbuild": "^0.27.0", - "typescript": "^5.7.0" - } -} diff --git a/senses/worker-process-metrics/index.js b/senses/worker-process-metrics/index.js index c0f56b0..226d16c 100644 --- a/senses/worker-process-metrics/index.js +++ b/senses/worker-process-metrics/index.js @@ -1,4 +1,4 @@ -// src/schema.ts +// senses/worker-process-metrics/src/schema.ts import { integer, real, sqliteTable } from "drizzle-orm/sqlite-core"; var workerProcessMetrics = sqliteTable("worker_process_metrics", { ts: integer("ts").primaryKey(), @@ -9,7 +9,7 @@ var workerProcessMetrics = sqliteTable("worker_process_metrics", { externalMB: real("external_mb").notNull() }); -// src/index.ts +// senses/worker-process-metrics/src/index.ts function round2(n) { return Math.round(n * 100) / 100; } diff --git a/senses/worker-process-metrics/package.json b/senses/worker-process-metrics/package.json deleted file mode 100644 index 68a2128..0000000 --- a/senses/worker-process-metrics/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "sense-worker-process-metrics", - "version": "0.0.1", - "private": true, - "type": "module", - "scripts": { - "build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=index.js --packages=external" - }, - "devDependencies": { - "@types/node": "^22.0.0", - "esbuild": "^0.27.0", - "typescript": "^5.7.0" - } -} diff --git a/workflows/develop-workflow/tsconfig.json b/tsconfig.json similarity index 58% rename from workflows/develop-workflow/tsconfig.json rename to tsconfig.json index c42d321..4317983 100644 --- a/workflows/develop-workflow/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,13 @@ "strict": true, "skipLibCheck": true, "noEmit": true, + "allowImportingTsExtensions": true, "types": ["node"] }, - "include": ["./**/*.ts", "../_shared/**/*.ts"] + "include": [ + "senses/**/*.ts", + "workflows/**/*.ts", + "scripts/**/*.ts", + "workflows/_shared/**/*.ts" + ] } diff --git a/workflows/develop-sense/package.json b/workflows/develop-sense/package.json deleted file mode 100644 index 8ff3392..0000000 --- a/workflows/develop-sense/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "generate-sense-workflow", - "version": "0.0.1", - "private": true, - "type": "module", - "scripts": { - "build": "esbuild index.ts --bundle --platform=node --format=esm --outdir=dist --packages=external" - }, - "dependencies": { - "@uncaged/nerve-adapter-cursor": "latest", - "@uncaged/nerve-adapter-hermes": "latest", - "@uncaged/nerve-core": "latest", - "@uncaged/nerve-workflow-meta": "link:../../../repos/nerve/packages/workflow-meta", - "@uncaged/nerve-workflow-utils": "latest", - "zod": "^4.3.6" - }, - "devDependencies": { - "@types/node": "^22.0.0", - "esbuild": "^0.27.0", - "typescript": "^5.7.0" - } -} diff --git a/workflows/develop-sense/tsconfig.json b/workflows/develop-sense/tsconfig.json deleted file mode 100644 index aa299d8..0000000 --- a/workflows/develop-sense/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "lib": ["ES2022"], - "module": "NodeNext", - "moduleResolution": "NodeNext", - "strict": true, - "skipLibCheck": true, - "noEmit": false, - "declaration": false, - "types": ["node"] - }, - "include": ["./**/*.ts", "../_shared/**/*.ts"] -} diff --git a/workflows/develop-workflow/package.json b/workflows/develop-workflow/package.json deleted file mode 100644 index 4a6b93b..0000000 --- a/workflows/develop-workflow/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "generate-workflow-workflow", - "version": "0.0.1", - "private": true, - "type": "module", - "scripts": { - "build": "esbuild index.ts --bundle --platform=node --format=esm --outdir=dist --packages=external" - }, - "dependencies": { - "@uncaged/nerve-adapter-cursor": "latest", - "@uncaged/nerve-adapter-hermes": "latest", - "@uncaged/nerve-core": "latest", - "@uncaged/nerve-workflow-meta": "link:../../../repos/nerve/packages/workflow-meta", - "@uncaged/nerve-workflow-utils": "latest", - "zod": "^4.3.6" - }, - "devDependencies": { - "@types/node": "^22.0.0", - "esbuild": "^0.27.0", - "typescript": "^5.7.0" - } -} diff --git a/workflows/knowledge-extraction/package.json b/workflows/knowledge-extraction/package.json deleted file mode 100644 index 182e008..0000000 --- a/workflows/knowledge-extraction/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "knowledge-extraction-workflow", - "version": "0.0.1", - "private": true, - "type": "module", - "scripts": { - "build": "esbuild index.ts --bundle --platform=node --format=esm --outdir=dist --packages=external" - }, - "dependencies": { - "@uncaged/nerve-adapter-cursor": "latest", - "@uncaged/nerve-adapter-hermes": "latest", - "@uncaged/nerve-core": "latest", - "@uncaged/nerve-workflow-utils": "latest", - "zod": "^4.3.6" - }, - "devDependencies": { - "@types/node": "^22.0.0", - "esbuild": "^0.27.0", - "typescript": "^5.7.0" - } -} diff --git a/workflows/knowledge-extraction/tsconfig.json b/workflows/knowledge-extraction/tsconfig.json deleted file mode 100644 index fc00159..0000000 --- a/workflows/knowledge-extraction/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "lib": ["ES2022"], - "module": "NodeNext", - "moduleResolution": "NodeNext", - "strict": true, - "skipLibCheck": true, - "noEmit": true, - "types": ["node"] - }, - "include": ["./**/*.ts"] -} diff --git a/workflows/solve-issue/package.json b/workflows/solve-issue/package.json deleted file mode 100644 index ce6e1eb..0000000 --- a/workflows/solve-issue/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "solve-issue-workflow", - "version": "0.0.1", - "private": true, - "type": "module", - "scripts": { - "build": "esbuild index.ts --bundle --platform=node --format=esm --outdir=dist --packages=external" - }, - "dependencies": { - "@uncaged/nerve-adapter-cursor": "latest", - "@uncaged/nerve-adapter-hermes": "latest", - "@uncaged/nerve-core": "latest", - "@uncaged/nerve-workflow-utils": "latest", - "zod": "^4.3.6" - }, - "devDependencies": { - "@types/node": "^22.0.0", - "esbuild": "^0.27.0", - "typescript": "^5.7.0" - } -} diff --git a/workflows/solve-issue/tsconfig.json b/workflows/solve-issue/tsconfig.json deleted file mode 100644 index fc00159..0000000 --- a/workflows/solve-issue/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "lib": ["ES2022"], - "module": "NodeNext", - "moduleResolution": "NodeNext", - "strict": true, - "skipLibCheck": true, - "noEmit": true, - "types": ["node"] - }, - "include": ["./**/*.ts"] -}