chore(deno): migrate toolchain from Node 24 + pnpm to Deno 2.9.7 + TypeScript 7.0.2 (W1.5)

- root deno.json workspace (nodeModulesDir auto), npm versions registered once in imports, deno.lock;
  remove pnpm-lock/pnpm-workspace/root package.json; members keep minimal package.json (name/type/exports)
- tasks: dev, typecheck (tsc 7.0.2 per member + deno check), lint/fmt (biome, useImportExtensions),
  test (vitest via deno), check:tokens, build (web + deno compile), ci, db:migrate/reset, gen:types
- tsconfig base moved to config/ (no root tsconfig.json); deno types -> types/deno.d.ts; web drops baseUrl
- server: Deno.serve entry with graceful shutdown, --role migrate|preflight|probe, WEB_ROOT static SPA hosting;
  drop @hono/node-server, tsx, esbuild build.mjs
- logger: redact child() bindings and serialize err by message/stack; sync stdout destination; tests
- relative imports get explicit extensions (sites/mp-sync paths left for follow-up)
- crash-recovery tests spawn `deno run -A`; tasks tests use unique per-file schemas
- single-container Dockerfile + entrypoint (migrate -> preflight -> api+worker watchdog), docker-compose.yml
- docs: README, runbook, ADR-001 superseded, plan §1 validation row

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
rootandClaude Fable 5.1 committed 2026-09-27 18:53:06 +08:00
1 parent d9f2af2f3c
commit 304feea141
226 files changed
+6601 -8620

No files matched your search

+9
View File
@@ -0,0 +1,9 @@
{
"name": "@umt/agent",
"version": "0.0.0",
"exports": { ".": "./src/index.ts" },
"tasks": {
"test": "deno run -A npm:vitest run",
"typecheck": "deno run -A npm:typescript/tsc --noEmit -p tsconfig.json"
}
}
-12
View File
@@ -1,20 +1,8 @@
{
"name": "@umt/agent",
"version": "0.0.0",
"private": true,
"type": "module",
"exports": {
".": "./src/index.ts"
},
"scripts": {
"typecheck": "tsc -p tsconfig.json",
"test": "vitest run"
},
"dependencies": {
"@earendil-works/pi-agent-core": "0.87.1",
"@earendil-works/pi-ai": "0.87.1",
"@umt/contracts": "workspace:*",
"typebox": "1.3.27",
"zod": "^4.6.5"
}
}
+4 -4
View File
@@ -1,8 +1,8 @@
import { createHash } from "node:crypto";
import { z } from "zod";
import { summarizeForLog } from "../redact";
import { CapabilityError, isCapabilityError } from "./errors";
import { capabilityIdToToolName, isCapabilityId } from "./tool-name";
import { summarizeForLog } from "../redact.ts";
import { CapabilityError, isCapabilityError } from "./errors.ts";
import { capabilityIdToToolName, isCapabilityId } from "./tool-name.ts";
import {
type AuditSink,
type AuthorizationChecker,
@@ -15,7 +15,7 @@ import {
type HandlerContext,
type IdempotencyKeyGenerator,
type InvokeContext,
} from "./types";
} from "./types.ts";
export interface RegisteredCapability {
descriptor: CapabilityDescriptor;
+11 -11
View File
@@ -1,16 +1,16 @@
// @umt/agent 公开入口。Pi SDK 类型只出现在 src/pi/*,这里只导出本包自有接口。
export const PACKAGE_NAME = "@umt/agent";
export { CapabilityError, type CapabilityErrorCode, isCapabilityError } from "./capability/errors";
export { CapabilityError, type CapabilityErrorCode, isCapabilityError } from "./capability/errors.ts";
export {
CapabilityRegistry,
type CapabilityRegistryOptions,
defaultIdempotencyKey,
type RegisteredCapability,
stableStringify,
} from "./capability/registry";
export { capabilityIdToToolName, isCapabilityId, toolNameToCapabilityId } from "./capability/tool-name";
export * from "./capability/types";
} from "./capability/registry.ts";
export { capabilityIdToToolName, isCapabilityId, toolNameToCapabilityId } from "./capability/tool-name.ts";
export * from "./capability/types.ts";
export {
type CreateFakeRuntimeOptions,
createFakeRuntime,
@@ -21,16 +21,16 @@ export {
type FakeStep,
type FakeToolCall,
type FakeToolResult,
} from "./pi/fake";
} from "./pi/fake.ts";
export {
checkToolCall,
DEFAULT_COMPACTION_INSTRUCTIONS,
PiAgentRuntime,
type PiAgentRuntimeOptions,
} from "./pi/runtime";
export { sessionPathFor } from "./pi/session";
export { isSensitiveKey, REDACTED, redactForModel, redactString, summarizeForLog } from "./redact";
export * from "./runtime/port";
} from "./pi/runtime.ts";
export { sessionPathFor } from "./pi/session.ts";
export { isSensitiveKey, REDACTED, redactForModel, redactString, summarizeForLog } from "./redact.ts";
export * from "./runtime/port.ts";
export {
type AgentSettings,
AgentSettingsSchema,
@@ -39,5 +39,5 @@ export {
type ResolvedAgentSettings,
resolveAgentSettings,
THINKING_LEVELS,
} from "./settings";
export { buildSystemPrompt, type SystemPromptInput } from "./system-prompt";
} from "./settings.ts";
export { buildSystemPrompt, type SystemPromptInput } from "./system-prompt.ts";
+4 -4
View File
@@ -12,10 +12,10 @@ import {
type Message,
type TranscriptContext,
} from "@earendil-works/pi-ai";
import type { CapabilityRegistry } from "../capability/registry";
import { capabilityIdToToolName, toolNameToCapabilityId } from "../capability/tool-name";
import type { ResolvedPiModel } from "./model";
import { PiAgentRuntime, type PiAgentRuntimeOptions } from "./runtime";
import type { CapabilityRegistry } from "../capability/registry.ts";
import { capabilityIdToToolName, toolNameToCapabilityId } from "../capability/tool-name.ts";
import type { ResolvedPiModel } from "./model.ts";
import { PiAgentRuntime, type PiAgentRuntimeOptions } from "./runtime.ts";
/** 前面各步工具调用的结果(按发生顺序),供脚本根据结果决定下一步 */
export interface FakeToolResult {
+1 -1
View File
@@ -2,7 +2,7 @@ import type { CompactionSettings } from "@earendil-works/pi-agent-core";
import { type Api, createModels, createProvider, type Model, type MutableModels } from "@earendil-works/pi-ai";
import { anthropicMessagesApi } from "@earendil-works/pi-ai/api/anthropic-messages.lazy";
import { openAICompletionsApi } from "@earendil-works/pi-ai/api/openai-completions.lazy";
import type { ResolvedAgentSettings } from "../settings";
import type { ResolvedAgentSettings } from "../settings.ts";
/** Pi 侧需要的模型装配结果(仅在 src/pi/* 内部流转) */
export interface ResolvedPiModel {
+9 -9
View File
@@ -11,11 +11,11 @@ import {
} from "@earendil-works/pi-agent-core";
import type { Usage } from "@earendil-works/pi-ai";
import type { TSchema } from "typebox";
import { isCapabilityError } from "../capability/errors";
import type { CapabilityRegistry, RegisteredCapability } from "../capability/registry";
import { toolNameToCapabilityId } from "../capability/tool-name";
import { redactForModel, redactString, summarizeForLog } from "../redact";
import { EventChannel } from "../runtime/event-channel";
import { isCapabilityError } from "../capability/errors.ts";
import type { CapabilityRegistry, RegisteredCapability } from "../capability/registry.ts";
import { toolNameToCapabilityId } from "../capability/tool-name.ts";
import { redactForModel, redactString, summarizeForLog } from "../redact.ts";
import { EventChannel } from "../runtime/event-channel.ts";
import {
type AgentEvent,
type AgentEventBody,
@@ -26,10 +26,10 @@ import {
type CreateRunSpec,
emptyUsage,
type RunOutcome,
} from "../runtime/port";
import { type ResolvedAgentSettings, resolveAgentSettings } from "../settings";
import { compactionFromSettings, type PiModelResolver, resolveModelFromSettings } from "./model";
import { openRunSession } from "./session";
} from "../runtime/port.ts";
import { type ResolvedAgentSettings, resolveAgentSettings } from "../settings.ts";
import { compactionFromSettings, type PiModelResolver, resolveModelFromSettings } from "./model.ts";
import { openRunSession } from "./session.ts";
export interface PiAgentRuntimeOptions {
registry: CapabilityRegistry;
+2 -2
View File
@@ -1,5 +1,5 @@
import type { CapabilityScope } from "../capability/types";
import type { AgentSettings } from "../settings";
import type { CapabilityScope } from "../capability/types.ts";
import type { AgentSettings } from "../settings.ts";
/** 本包对外的用量统计(与 SDK 类型解耦) */
export interface AgentUsage {
+3 -3
View File
@@ -1,7 +1,7 @@
// 子进程:启动 run,download.submit 执行中挂起;父进程收到 SUBMIT_STARTED 后 SIGKILL 本进程。
import { createFakeRuntime } from "../../src";
import { makeFixture, settings } from "../helpers";
import { crashScript, RUN_ID } from "./crash-script";
import { createFakeRuntime } from "../../src/index.ts";
import { makeFixture, settings } from "../helpers.ts";
import { crashScript, RUN_ID } from "./crash-script.ts";
const sessionDir = process.argv[2]!;
const fx = makeFixture({ slowMs: 60_000 });
+1 -1
View File
@@ -1,4 +1,4 @@
import type { FakeScript } from "../../src";
import type { FakeScript } from "../../src/index.ts";
export const RUN_ID = "run-crash-1";
+1 -1
View File
@@ -11,7 +11,7 @@ import {
CapabilityRegistry,
FAKE_AGENT_SETTINGS,
type InvokeContext,
} from "../src";
} from "../src/index.ts";
export interface Fixture {
registry: CapabilityRegistry;
+1 -1
View File
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { buildSystemPrompt, REDACTED, redactForModel, redactString, summarizeForLog } from "../src";
import { buildSystemPrompt, REDACTED, redactForModel, redactString, summarizeForLog } from "../src/index.ts";
describe("redactForModel", () => {
it("遮蔽敏感键、含 passkey 的 URL、Bearer、请求头、URL 账号密码", () => {
+2 -2
View File
@@ -6,8 +6,8 @@ import {
capabilityIdToToolName,
defaultIdempotencyKey,
toolNameToCapabilityId,
} from "../src";
import { ctx, makeFixture } from "./helpers";
} from "../src/index.ts";
import { ctx, makeFixture } from "./helpers.ts";
describe("能力 ID ↔ 工具名", () => {
it("双向映射且无歧义", () => {
+11 -7
View File
@@ -9,9 +9,9 @@ import {
checkToolCall,
createFakeRuntime,
type FakeScript,
} from "../src";
import { crashScript, RUN_ID } from "./fixtures/crash-script";
import { type Fixture, makeFixture, settings, tempDir, types } from "./helpers";
} from "../src/index.ts";
import { crashScript, RUN_ID } from "./fixtures/crash-script.ts";
import { type Fixture, makeFixture, settings, tempDir, types } from "./helpers.ts";
const opened: AgentRun[] = [];
afterEach(async () => {
@@ -276,10 +276,14 @@ describe("PiAgentRuntime + FakeModelProvider", () => {
it("JSONL 恢复:子进程在 download.submit 执行中被 SIGKILL,新进程 resume 得到“结果未知”且不重复提交", async () => {
const sessionDir = await tempDir();
const child = spawn(process.execPath, ["--import", "tsx", join(__dirname, "fixtures/crash-run.ts"), sessionDir], {
cwd: join(__dirname, ".."),
stdio: ["ignore", "pipe", "pipe"],
});
const child = spawn(
process.execPath,
["run", "-A", join(import.meta.dirname!, "fixtures/crash-run.ts"), sessionDir],
{
cwd: join(import.meta.dirname!, ".."),
stdio: ["ignore", "pipe", "pipe"],
},
);
let stderr = "";
child.stderr.on("data", (d) => {
stderr += String(d);
+2 -2
View File
@@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
import { describeSettings, resolveAgentSettings } from "../src";
import { compactionFromSettings, resolveModelFromSettings } from "../src/pi/model";
import { describeSettings, resolveAgentSettings } from "../src/index.ts";
import { compactionFromSettings, resolveModelFromSettings } from "../src/pi/model.ts";
describe("AgentSettings → pi-ai", () => {
it("anthropic:baseUrl 去掉 /v1,上下文预算即 contextWindow,apiKey 只在 resolve 时给出", async () => {
+1 -1
View File
@@ -1,4 +1,4 @@
{
"extends": "../../tsconfig.base.json",
"extends": "../../config/tsconfig.base.json",
"include": ["src", "test"]
}