@pinpatch/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.cjs +1365 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1240 -0
- package/dist/index.d.ts +1240 -0
- package/dist/index.js +1289 -0
- package/dist/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contracts/artifacts.ts","../src/contracts/provider.ts","../src/contracts/bridge.ts","../src/config.ts","../src/storage/artifact-store.ts","../src/utils/fs.ts","../src/runtime/ids.ts","../src/runtime/task-runner.ts","../src/bridge/event-bus.ts","../src/bridge/server.ts","../src/logging/logger.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { ProviderNameSchema, ProviderProgressStatusSchema } from \"./provider\";\n\nexport const PinStateSchema = z.enum([\n \"idle\",\n \"queued\",\n \"running\",\n \"completed\",\n \"error\",\n \"cancelled\",\n \"timeout\",\n]);\nexport type PinState = z.infer<typeof PinStateSchema>;\n\nexport const ViewportSchema = z.object({\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n});\nexport type Viewport = z.infer<typeof ViewportSchema>;\n\nexport const BoundingBoxSchema = z.object({\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n});\nexport type BoundingBox = z.infer<typeof BoundingBoxSchema>;\n\nexport const ElementDescriptorSchema = z.object({\n tag: z.string().min(1),\n role: z.string().nullable().optional(),\n text: z.string().nullable().optional(),\n attributes: z.record(z.union([z.string(), z.null()])),\n boundingBox: BoundingBoxSchema,\n});\nexport type ElementDescriptor = z.infer<typeof ElementDescriptorSchema>;\n\nexport const UiChangePacketSchema = z.object({\n id: z.string().min(1),\n timestamp: z.string().datetime(),\n url: z.string().min(1),\n viewport: ViewportSchema,\n element: ElementDescriptorSchema,\n nearbyText: z.array(z.string()),\n domSnippet: z.string(),\n computedStyleSummary: z.record(z.string()),\n screenshotPath: z.string().min(1),\n userRequest: z.string().min(1),\n});\nexport type UiChangePacket = z.infer<typeof UiChangePacketSchema>;\n\nexport const TaskStatusSchema = z.enum([\n \"created\",\n \"queued\",\n \"running\",\n \"completed\",\n \"error\",\n \"cancelled\",\n \"timeout\",\n]);\nexport type TaskStatus = z.infer<typeof TaskStatusSchema>;\n\nexport const TaskPinSchema = z.object({\n x: z.number(),\n y: z.number(),\n body: z.string().min(1),\n});\n\nexport const TaskRecordSchema = z.object({\n taskId: z.string().min(1),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n status: TaskStatusSchema,\n url: z.string().min(1),\n viewport: ViewportSchema,\n pin: TaskPinSchema,\n uiChangePacket: UiChangePacketSchema,\n screenshotPath: z.string().min(1),\n provider: ProviderNameSchema.optional(),\n model: z.string().optional(),\n latestSessionId: z.string().optional(),\n sessions: z.array(z.string()),\n summary: z.string().optional(),\n changedFiles: z.array(z.string()).default([]),\n errorCode: z.string().optional(),\n errorMessage: z.string().optional(),\n});\nexport type TaskRecord = z.infer<typeof TaskRecordSchema>;\n\nexport const SessionEventSchema = z.object({\n status: ProviderProgressStatusSchema,\n message: z.string().min(1),\n percent: z.number().min(0).max(100).optional(),\n timestamp: z.string().datetime(),\n});\nexport type SessionEvent = z.infer<typeof SessionEventSchema>;\n\nexport const SessionRecordSchema = z.object({\n sessionId: z.string().min(1),\n taskId: z.string().min(1),\n provider: ProviderNameSchema,\n model: z.string().min(1),\n status: ProviderProgressStatusSchema,\n dryRun: z.boolean(),\n startedAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n endedAt: z.string().datetime().optional(),\n events: z.array(SessionEventSchema),\n summary: z.string().optional(),\n changedFiles: z.array(z.string()).default([]),\n errorCode: z.string().optional(),\n errorMessage: z.string().optional(),\n});\nexport type SessionRecord = z.infer<typeof SessionRecordSchema>;\n\nexport const RuntimeLogLevelSchema = z.enum([\"debug\", \"info\", \"warn\", \"error\"]);\n\nexport const RuntimeLogEventSchema = z.object({\n timestamp: z.string().datetime(),\n level: RuntimeLogLevelSchema,\n component: z.string().min(1),\n taskId: z.string().optional(),\n sessionId: z.string().optional(),\n event: z.string().min(1),\n message: z.string().min(1),\n meta: z.record(z.unknown()).optional(),\n});\nexport type RuntimeLogEvent = z.infer<typeof RuntimeLogEventSchema>;\n\nexport const PinpatchConfigSchema = z.object({\n provider: ProviderNameSchema.default(\"codex\"),\n model: z.string().default(\"gpt-5.3-codex-spark\"),\n target: z.number().int().positive().default(3000),\n debug: z.boolean().default(false),\n bridgePort: z.number().int().positive().default(7331),\n proxyPort: z.number().int().positive().default(3030),\n});\nexport type PinpatchConfig = z.infer<typeof PinpatchConfigSchema>;\n","import { z } from \"zod\";\nimport type { TaskRecord } from \"./artifacts\";\n\nexport const ProviderNameSchema = z.enum([\"codex\", \"claude\", \"cursor\"]);\nexport type ProviderName = z.infer<typeof ProviderNameSchema>;\n\nexport const ProviderProgressStatusSchema = z.enum([\n \"queued\",\n \"running\",\n \"completed\",\n \"error\",\n \"cancelled\",\n \"timeout\"\n]);\nexport type ProviderProgressStatus = z.infer<typeof ProviderProgressStatusSchema>;\n\nexport const ProviderTerminalStatusSchema = z.enum([\"completed\", \"error\", \"cancelled\", \"timeout\"]);\nexport type ProviderTerminalStatus = z.infer<typeof ProviderTerminalStatusSchema>;\n\nexport const ProviderProgressSchema = z.object({\n taskId: z.string().min(1),\n sessionId: z.string().min(1),\n status: ProviderProgressStatusSchema,\n message: z.string().min(1),\n percent: z.number().min(0).max(100).optional(),\n timestamp: z.string().datetime()\n});\nexport type ProviderProgress = z.infer<typeof ProviderProgressSchema>;\n\nexport const ProviderResultSchema = z.object({\n taskId: z.string().min(1),\n sessionId: z.string().min(1),\n status: ProviderTerminalStatusSchema,\n summary: z.string().min(1),\n changedFiles: z.array(z.string()),\n errorCode: z.string().optional(),\n errorMessage: z.string().optional()\n});\nexport type ProviderResult = z.infer<typeof ProviderResultSchema>;\n\nexport type ProviderTaskInput = {\n taskId: string;\n sessionId: string;\n task: TaskRecord;\n prompt: string;\n model: string;\n dryRun: boolean;\n debug: boolean;\n cwd: string;\n timeoutMs: number;\n};\n\nexport interface ProviderAdapter {\n name: ProviderName;\n submitTask(input: ProviderTaskInput, onProgress: (event: ProviderProgress) => void): Promise<ProviderResult>;\n cancelTask(taskId: string, sessionId: string): Promise<void>;\n}\n\nexport const ProviderErrorCodes = {\n ProviderUnavailable: \"PROVIDER_UNAVAILABLE\",\n ProviderNotEnabled: \"PROVIDER_NOT_ENABLED\",\n ProviderTimeout: \"PROVIDER_TIMEOUT\",\n ProcessFailed: \"PROVIDER_PROCESS_FAILED\",\n ValidationFailed: \"PROVIDER_VALIDATION_FAILED\",\n Unknown: \"UNKNOWN\"\n} as const;\n","import { z } from \"zod\";\nimport { UiChangePacketSchema, ViewportSchema } from \"./artifacts\";\nimport { ProviderNameSchema } from \"./provider\";\n\nexport const CreateTaskRequestSchema = z.object({\n sessionId: z.string().min(1),\n url: z.string().min(1),\n viewport: ViewportSchema,\n pin: z.object({\n x: z.number(),\n y: z.number(),\n body: z.string().min(1),\n }),\n uiChangePacket: UiChangePacketSchema,\n screenshotPath: z.string().min(1),\n screenshotDataUrl: z.string().startsWith(\"data:image/\").optional(),\n clientTaskId: z.string().min(1).optional(),\n});\nexport type CreateTaskRequest = z.infer<typeof CreateTaskRequestSchema>;\n\nexport const CreateTaskResponseSchema = z.object({\n taskId: z.string(),\n sessionId: z.string(),\n status: z.literal(\"created\"),\n taskPath: z.string(),\n eventsUrl: z.string(),\n});\nexport type CreateTaskResponse = z.infer<typeof CreateTaskResponseSchema>;\n\nexport const SubmitTaskRequestSchema = z.object({\n sessionId: z.string().min(1),\n provider: ProviderNameSchema,\n model: z.string().min(1),\n dryRun: z.boolean().default(false),\n debug: z.boolean().default(false),\n followUpBody: z.string().trim().min(1).optional(),\n});\nexport type SubmitTaskRequest = z.infer<typeof SubmitTaskRequestSchema>;\n\nexport const SubmitTaskResponseSchema = z.object({\n taskId: z.string().min(1),\n sessionId: z.string().min(1),\n status: z.literal(\"queued\"),\n acceptedAt: z.string().datetime(),\n eventsUrl: z.string().min(1),\n});\nexport type SubmitTaskResponse = z.infer<typeof SubmitTaskResponseSchema>;\n\nexport const SseProgressEventSchema = z.object({\n type: z.literal(\"progress\"),\n taskId: z.string().min(1),\n sessionId: z.string().min(1),\n status: z.enum([\n \"queued\",\n \"running\",\n \"completed\",\n \"error\",\n \"cancelled\",\n \"timeout\",\n ]),\n message: z.string().min(1),\n percent: z.number().min(0).max(100).optional(),\n timestamp: z.string().datetime(),\n});\nexport type SseProgressEvent = z.infer<typeof SseProgressEventSchema>;\n\nexport const SseTerminalEventSchema = z.object({\n type: z.literal(\"terminal\"),\n taskId: z.string().min(1),\n sessionId: z.string().min(1),\n status: z.enum([\"completed\", \"error\", \"cancelled\", \"timeout\"]),\n summary: z.string().min(1),\n changedFiles: z.array(z.string()),\n errorCode: z.string().optional(),\n errorMessage: z.string().optional(),\n timestamp: z.string().datetime(),\n});\nexport type SseTerminalEvent = z.infer<typeof SseTerminalEventSchema>;\n\nexport const SseHeartbeatEventSchema = z.object({\n type: z.literal(\"heartbeat\"),\n timestamp: z.string().datetime(),\n});\nexport type SseHeartbeatEvent = z.infer<typeof SseHeartbeatEventSchema>;\n\nexport const SseEventSchema = z.union([\n SseProgressEventSchema,\n SseTerminalEventSchema,\n SseHeartbeatEventSchema,\n]);\nexport type SseEvent = z.infer<typeof SseEventSchema>;\n","import path from \"node:path\";\nimport { promises as fs } from \"node:fs\";\nimport { PinpatchConfigSchema, type PinpatchConfig, type ProviderName } from \"./contracts/index\";\n\nexport type ConfigOverrides = Partial<{\n provider: ProviderName;\n model: string;\n target: number;\n debug: boolean;\n bridgePort: number;\n proxyPort: number;\n}>;\n\nexport const DEFAULT_CONFIG: PinpatchConfig = {\n provider: \"codex\",\n model: \"gpt-5.3-codex-spark\",\n target: 3000,\n debug: false,\n bridgePort: 7331,\n proxyPort: 3030\n};\n\nconst DEFAULT_CLAUDE_MODEL = \"sonnet\";\n\nconst resolveConfigPath = (cwd: string): string => path.join(cwd, \".pinpatch\", \"config.json\");\n\nconst omitUndefined = <T extends Record<string, unknown>>(value: T): Partial<T> => {\n return Object.fromEntries(Object.entries(value).filter(([, fieldValue]) => fieldValue !== undefined)) as Partial<T>;\n};\n\nexport const readConfigFile = async (cwd: string): Promise<Partial<PinpatchConfig>> => {\n const configPath = resolveConfigPath(cwd);\n\n try {\n const raw = await fs.readFile(configPath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n return PinpatchConfigSchema.partial().parse(parsed);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return {};\n }\n\n return {};\n }\n};\n\nexport const resolveConfig = async (cwd: string, overrides: ConfigOverrides = {}): Promise<PinpatchConfig> => {\n const fileConfig = await readConfigFile(cwd);\n const overrideConfig = omitUndefined(overrides);\n const hasCliModelOverride = Object.prototype.hasOwnProperty.call(overrideConfig, \"model\");\n const hasFileModel = Object.prototype.hasOwnProperty.call(fileConfig, \"model\");\n const hasFileProvider = Object.prototype.hasOwnProperty.call(fileConfig, \"provider\");\n const isBaselineFileModel =\n hasFileModel &&\n hasFileProvider &&\n fileConfig.model === DEFAULT_CONFIG.model &&\n fileConfig.provider === DEFAULT_CONFIG.provider;\n\n const merged: PinpatchConfig = {\n ...DEFAULT_CONFIG,\n ...fileConfig,\n ...overrideConfig\n };\n\n const shouldUseClaudeDefault =\n merged.provider === \"claude\" &&\n merged.model === DEFAULT_CONFIG.model &&\n !hasCliModelOverride &&\n (!hasFileModel || isBaselineFileModel);\n\n if (shouldUseClaudeDefault) {\n merged.model = DEFAULT_CLAUDE_MODEL;\n }\n\n return PinpatchConfigSchema.parse(merged);\n};\n\nexport const ensureConfigFile = async (cwd: string): Promise<PinpatchConfig> => {\n const configPath = resolveConfigPath(cwd);\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n\n try {\n const raw = await fs.readFile(configPath, \"utf8\");\n return PinpatchConfigSchema.parse(JSON.parse(raw));\n } catch {\n await fs.writeFile(configPath, `${JSON.stringify(DEFAULT_CONFIG, null, 2)}\\n`, \"utf8\");\n return DEFAULT_CONFIG;\n }\n};\n\nexport const getConfigPath = resolveConfigPath;\n","import path from \"node:path\";\nimport { promises as fs } from \"node:fs\";\nimport {\n PinpatchConfigSchema,\n RuntimeLogEventSchema,\n SessionRecordSchema,\n TaskRecordSchema,\n type PinpatchConfig,\n type RuntimeLogEvent,\n type SessionRecord,\n type TaskRecord\n} from \"../contracts/index\";\nimport { ensureDir, listJsonFiles, readJsonIfExists, writeJsonAtomic } from \"../utils/fs\";\nimport { DEFAULT_CONFIG } from \"../config\";\n\nexport type PruneResult = {\n removedLogs: number;\n removedSessions: number;\n};\n\nexport class ArtifactStore {\n readonly cwd: string;\n readonly rootDir: string;\n readonly tasksDir: string;\n readonly sessionsDir: string;\n readonly screenshotsDir: string;\n readonly runtimeDir: string;\n readonly logsDir: string;\n readonly configPath: string;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n this.rootDir = path.join(cwd, \".pinpatch\");\n this.tasksDir = path.join(this.rootDir, \"tasks\");\n this.sessionsDir = path.join(this.rootDir, \"sessions\");\n this.screenshotsDir = path.join(this.rootDir, \"screenshots\");\n this.runtimeDir = path.join(this.rootDir, \"runtime\");\n this.logsDir = path.join(this.runtimeDir, \"logs\");\n this.configPath = path.join(this.rootDir, \"config.json\");\n }\n\n async ensureStructure(): Promise<void> {\n await ensureDir(this.tasksDir);\n await ensureDir(this.sessionsDir);\n await ensureDir(this.screenshotsDir);\n await ensureDir(this.logsDir);\n\n const existingConfig = await readJsonIfExists<PinpatchConfig>(this.configPath);\n if (!existingConfig) {\n await writeJsonAtomic(this.configPath, DEFAULT_CONFIG);\n }\n }\n\n async ensureGitignoreEntry(): Promise<void> {\n const gitignorePath = path.join(this.cwd, \".gitignore\");\n\n try {\n const content = await fs.readFile(gitignorePath, \"utf8\");\n if (!content.includes(\".pinpatch/\")) {\n await fs.appendFile(gitignorePath, \"\\n.pinpatch/\\n\", \"utf8\");\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n await fs.writeFile(gitignorePath, \".pinpatch/\\n\", \"utf8\");\n return;\n }\n\n throw error;\n }\n }\n\n getTaskPath(taskId: string): string {\n return path.join(this.tasksDir, `${taskId}.json`);\n }\n\n getSessionPath(sessionId: string): string {\n return path.join(this.sessionsDir, `${sessionId}.json`);\n }\n\n getRelativePath(absolutePath: string): string {\n return path.relative(this.cwd, absolutePath);\n }\n\n async readConfig(): Promise<PinpatchConfig> {\n const data = await readJsonIfExists<PinpatchConfig>(this.configPath);\n return PinpatchConfigSchema.parse({ ...DEFAULT_CONFIG, ...data });\n }\n\n async writeConfig(config: PinpatchConfig): Promise<void> {\n const validated = PinpatchConfigSchema.parse(config);\n await writeJsonAtomic(this.configPath, validated);\n }\n\n async createTask(task: TaskRecord): Promise<TaskRecord> {\n const validated = TaskRecordSchema.parse(task);\n await writeJsonAtomic(this.getTaskPath(validated.taskId), validated);\n return validated;\n }\n\n async getTask(taskId: string): Promise<TaskRecord | undefined> {\n const raw = await readJsonIfExists<TaskRecord>(this.getTaskPath(taskId));\n if (!raw) {\n return undefined;\n }\n\n return TaskRecordSchema.parse(raw);\n }\n\n async updateTask(taskId: string, updater: (current: TaskRecord) => TaskRecord): Promise<TaskRecord> {\n const current = await this.getTask(taskId);\n if (!current) {\n throw new Error(`Task ${taskId} does not exist`);\n }\n\n const updated = TaskRecordSchema.parse(updater(current));\n await writeJsonAtomic(this.getTaskPath(taskId), updated);\n return updated;\n }\n\n async listTasks(): Promise<TaskRecord[]> {\n const files = await listJsonFiles(this.tasksDir);\n const rows = await Promise.all(\n files.map(async (filePath) => {\n const raw = await readJsonIfExists<TaskRecord>(filePath);\n return raw ? TaskRecordSchema.parse(raw) : undefined;\n })\n );\n\n return rows.filter((row): row is TaskRecord => row !== undefined);\n }\n\n async createSession(session: SessionRecord): Promise<SessionRecord> {\n const validated = SessionRecordSchema.parse(session);\n await writeJsonAtomic(this.getSessionPath(validated.sessionId), validated);\n return validated;\n }\n\n async getSession(sessionId: string): Promise<SessionRecord | undefined> {\n const raw = await readJsonIfExists<SessionRecord>(this.getSessionPath(sessionId));\n if (!raw) {\n return undefined;\n }\n\n return SessionRecordSchema.parse(raw);\n }\n\n async updateSession(sessionId: string, updater: (current: SessionRecord) => SessionRecord): Promise<SessionRecord> {\n const current = await this.getSession(sessionId);\n if (!current) {\n throw new Error(`Session ${sessionId} does not exist`);\n }\n\n const updated = SessionRecordSchema.parse(updater(current));\n await writeJsonAtomic(this.getSessionPath(sessionId), updated);\n return updated;\n }\n\n async listSessions(): Promise<SessionRecord[]> {\n const files = await listJsonFiles(this.sessionsDir);\n const rows = await Promise.all(\n files.map(async (filePath) => {\n const raw = await readJsonIfExists<SessionRecord>(filePath);\n return raw ? SessionRecordSchema.parse(raw) : undefined;\n })\n );\n\n return rows.filter((row): row is SessionRecord => row !== undefined);\n }\n\n async writeScreenshot(taskId: string, screenshotDataUrl: string): Promise<string> {\n const matches = screenshotDataUrl.match(/^data:image\\/(png|jpeg|jpg);base64,(?<bytes>.+)$/);\n if (!matches?.groups?.bytes) {\n throw new Error(\"Invalid screenshot payload\");\n }\n\n const filePath = path.join(this.screenshotsDir, `${taskId}.png`);\n const buffer = Buffer.from(matches.groups.bytes, \"base64\");\n await fs.writeFile(filePath, buffer);\n return this.getRelativePath(filePath);\n }\n\n async appendLog(logPath: string, event: RuntimeLogEvent): Promise<void> {\n const validated = RuntimeLogEventSchema.parse(event);\n await fs.appendFile(logPath, `${JSON.stringify(validated)}\\n`, \"utf8\");\n }\n\n async prune(options?: { logsOlderThanDays?: number; orphanSessionAgeHours?: number }): Promise<PruneResult> {\n const logsOlderThanDays = options?.logsOlderThanDays ?? 14;\n const orphanSessionAgeHours = options?.orphanSessionAgeHours ?? 24;\n\n const logFiles = await fs.readdir(this.logsDir).catch(() => []);\n const cutoffLogs = Date.now() - logsOlderThanDays * 24 * 60 * 60 * 1000;\n let removedLogs = 0;\n\n for (const file of logFiles) {\n const fullPath = path.join(this.logsDir, file);\n const stats = await fs.stat(fullPath).catch(() => undefined);\n if (!stats) {\n continue;\n }\n\n if (stats.mtimeMs < cutoffLogs) {\n await fs.unlink(fullPath);\n removedLogs += 1;\n }\n }\n\n const tasks = await this.listTasks();\n const taskIds = new Set(tasks.map((task) => task.taskId));\n const sessions = await this.listSessions();\n const cutoffSessions = Date.now() - orphanSessionAgeHours * 60 * 60 * 1000;\n let removedSessions = 0;\n\n for (const session of sessions) {\n const updatedAtMs = Date.parse(session.updatedAt);\n const isOrphan = !taskIds.has(session.taskId);\n\n if (isOrphan && updatedAtMs < cutoffSessions) {\n await fs.unlink(this.getSessionPath(session.sessionId));\n removedSessions += 1;\n }\n }\n\n return {\n removedLogs,\n removedSessions\n };\n }\n}\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\n\nexport const ensureDir = async (dirPath: string): Promise<void> => {\n await fs.mkdir(dirPath, { recursive: true });\n};\n\nexport const writeJsonAtomic = async (filePath: string, payload: unknown): Promise<void> => {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n const tempPath = `${filePath}.${process.pid}.${Date.now()}.${crypto.randomUUID()}.tmp`;\n await fs.writeFile(tempPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n await fs.rename(tempPath, filePath);\n};\n\nexport const readJsonIfExists = async <T>(filePath: string): Promise<T | undefined> => {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n};\n\nexport const listJsonFiles = async (dirPath: string): Promise<string[]> => {\n try {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map((entry) => path.join(dirPath, entry.name));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n\n throw error;\n }\n};\n","import crypto from \"node:crypto\";\n\nexport const nowIso = (): string => new Date().toISOString();\n\nexport const generateSessionId = (): string => crypto.randomUUID();\n\nexport const generateTaskId = (): string => {\n const date = new Date().toISOString().slice(0, 10);\n const suffix = crypto.randomBytes(3).toString(\"hex\");\n return `${date}-${suffix}`;\n};\n","import {\n type ProviderAdapter,\n type ProviderName,\n type ProviderProgress,\n type ProviderResult,\n type TaskRecord,\n type SessionRecord,\n ProviderErrorCodes,\n} from \"../contracts/index\";\nimport { nowIso } from \"./ids\";\nimport type { ArtifactStore } from \"../storage/artifact-store\";\nimport type { TaskEventBus } from \"../bridge/event-bus\";\nimport type { Logger } from \"../logging/logger\";\n\nconst toMillis = (timestamp: string): number => {\n const value = Date.parse(timestamp);\n return Number.isNaN(value) ? Date.now() : value;\n};\n\nconst forceMonotonicTimestamp = (\n nextTs: string,\n lastTs: number,\n): { timestamp: string; millis: number } => {\n const parsed = toMillis(nextTs);\n if (parsed > lastTs) {\n return { timestamp: new Date(parsed).toISOString(), millis: parsed };\n }\n\n const shifted = lastTs + 1;\n return { timestamp: new Date(shifted).toISOString(), millis: shifted };\n};\n\ntype InFlightTask = {\n adapter: ProviderAdapter;\n startedAt: number;\n};\n\nconst TERMINAL_STATUSES = new Set<ProviderResult[\"status\"]>([\n \"completed\",\n \"error\",\n \"cancelled\",\n \"timeout\",\n]);\n\nconst isTerminalStatus = (status: string): status is ProviderResult[\"status\"] =>\n TERMINAL_STATUSES.has(status as ProviderResult[\"status\"]);\n\nexport type TaskRunnerOptions = {\n cwd: string;\n store: ArtifactStore;\n logger: Logger;\n eventBus: TaskEventBus;\n getProviderAdapter(provider: ProviderName): ProviderAdapter | undefined;\n defaultTimeoutMs?: number;\n dryRunTimeoutMs?: number;\n};\n\nexport type RunTaskInput = {\n taskId: string;\n sessionId: string;\n provider: ProviderName;\n model: string;\n dryRun: boolean;\n debug: boolean;\n};\n\nexport class TaskRunner {\n private readonly cwd: string;\n private readonly store: ArtifactStore;\n private readonly logger: Logger;\n private readonly eventBus: TaskEventBus;\n private readonly getProviderAdapter: TaskRunnerOptions[\"getProviderAdapter\"];\n private readonly defaultTimeoutMs: number;\n private readonly dryRunTimeoutMs: number;\n private readonly inFlight = new Map<string, InFlightTask>();\n\n constructor(options: TaskRunnerOptions) {\n this.cwd = options.cwd;\n this.store = options.store;\n this.logger = options.logger;\n this.eventBus = options.eventBus;\n this.getProviderAdapter = options.getProviderAdapter;\n this.defaultTimeoutMs = options.defaultTimeoutMs ?? 10 * 60 * 1000;\n this.dryRunTimeoutMs = options.dryRunTimeoutMs ?? 2 * 60 * 1000;\n }\n\n private key(taskId: string, sessionId: string): string {\n return `${taskId}:${sessionId}`;\n }\n\n async cancelTask(taskId: string, sessionId: string): Promise<void> {\n const key = this.key(taskId, sessionId);\n const entry = this.inFlight.get(key);\n\n if (!entry) {\n return;\n }\n\n await entry.adapter.cancelTask(taskId, sessionId);\n this.logger.info(\"Cancel request forwarded to provider\", {\n component: \"runner\",\n taskId,\n sessionId,\n event: \"task.cancel\",\n });\n }\n\n async runTask(input: RunTaskInput): Promise<ProviderResult> {\n const { taskId, sessionId, provider, model, dryRun, debug } = input;\n const task = await this.store.getTask(taskId);\n\n if (!task) {\n throw new Error(`Task ${taskId} does not exist`);\n }\n\n const queuedTimestamp = nowIso();\n await this.store.updateTask(taskId, (current) => ({\n ...current,\n status: \"queued\",\n provider,\n model,\n latestSessionId: sessionId,\n sessions: Array.from(new Set([...current.sessions, sessionId])),\n updatedAt: queuedTimestamp,\n }));\n\n await this.store.createSession({\n sessionId,\n taskId,\n provider,\n model,\n status: \"queued\",\n dryRun,\n startedAt: queuedTimestamp,\n updatedAt: queuedTimestamp,\n events: [\n {\n status: \"queued\",\n message: \"Task queued\",\n timestamp: queuedTimestamp,\n },\n ],\n changedFiles: [],\n });\n\n const adapter = this.getProviderAdapter(provider);\n if (!adapter) {\n const unavailable: ProviderResult = {\n taskId,\n sessionId,\n status: \"error\",\n summary: `Provider ${provider} is not available in this runtime`,\n changedFiles: [],\n errorCode: ProviderErrorCodes.ProviderUnavailable,\n errorMessage: `Provider ${provider} was not registered`,\n };\n await this.persistTerminalState(\n task,\n unavailable,\n provider,\n model,\n dryRun,\n );\n return unavailable;\n }\n\n const queuedEvent = {\n type: \"progress\" as const,\n taskId,\n sessionId,\n status: \"queued\" as const,\n message: \"Task queued\",\n timestamp: queuedTimestamp,\n };\n\n this.eventBus.publish(taskId, sessionId, queuedEvent);\n\n const key = this.key(taskId, sessionId);\n this.inFlight.set(key, {\n adapter,\n startedAt: Date.now(),\n });\n\n let lastProgressTime = toMillis(queuedTimestamp);\n const timeoutMs = dryRun ? this.dryRunTimeoutMs : this.defaultTimeoutMs;\n let terminalCommitted = false;\n\n const handleProgress = async (event: ProviderProgress): Promise<void> => {\n if (terminalCommitted) {\n return;\n }\n\n const monotonic = forceMonotonicTimestamp(\n event.timestamp,\n lastProgressTime,\n );\n lastProgressTime = monotonic.millis;\n\n const normalizedEvent: ProviderProgress = {\n ...event,\n timestamp: monotonic.timestamp,\n };\n\n await this.store.updateSession(sessionId, (session) => {\n if (isTerminalStatus(session.status)) {\n return session;\n }\n\n return {\n ...session,\n status: normalizedEvent.status,\n updatedAt: normalizedEvent.timestamp,\n events: [\n ...session.events,\n {\n status: normalizedEvent.status,\n message: normalizedEvent.message,\n percent: normalizedEvent.percent,\n timestamp: normalizedEvent.timestamp,\n },\n ],\n };\n });\n\n if (terminalCommitted) {\n return;\n }\n\n if (\n normalizedEvent.status === \"running\" ||\n normalizedEvent.status === \"queued\"\n ) {\n await this.store.updateTask(taskId, (current) => {\n if (isTerminalStatus(current.status)) {\n return current;\n }\n\n return {\n ...current,\n status: normalizedEvent.status,\n updatedAt: normalizedEvent.timestamp,\n };\n });\n }\n\n if (terminalCommitted) {\n return;\n }\n\n this.eventBus.publish(taskId, sessionId, {\n type: \"progress\",\n taskId,\n sessionId,\n status: normalizedEvent.status,\n message: normalizedEvent.message,\n percent: normalizedEvent.percent,\n timestamp: normalizedEvent.timestamp,\n });\n\n this.logger.debug(normalizedEvent.message, {\n component: \"runner\",\n taskId,\n sessionId,\n event: \"task.progress\",\n meta: {\n status: normalizedEvent.status,\n percent: normalizedEvent.percent,\n },\n });\n };\n\n try {\n const providerTaskPromise = adapter.submitTask(\n {\n taskId,\n sessionId,\n task,\n prompt: this.buildPrompt(task),\n model,\n dryRun,\n debug,\n cwd: this.cwd,\n timeoutMs,\n },\n (event) => {\n void handleProgress(event);\n },\n );\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n\n const timeoutPromise = new Promise<ProviderResult>((resolve) => {\n timeoutHandle = setTimeout(() => {\n resolve({\n taskId,\n sessionId,\n status: \"timeout\",\n summary: `Task timed out after ${timeoutMs}ms`,\n changedFiles: [],\n errorCode: ProviderErrorCodes.ProviderTimeout,\n errorMessage: `Provider timed out after ${timeoutMs}ms`,\n });\n }, timeoutMs);\n });\n\n const result = await Promise.race([providerTaskPromise, timeoutPromise]);\n const normalizedResult = {\n ...result,\n taskId,\n sessionId,\n };\n terminalCommitted = true;\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n\n await this.persistTerminalState(\n task,\n normalizedResult,\n provider,\n model,\n dryRun,\n );\n this.inFlight.delete(key);\n return normalizedResult;\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown provider error\";\n const failedResult: ProviderResult = {\n taskId,\n sessionId,\n status: \"error\",\n summary: \"Provider execution failed\",\n changedFiles: [],\n errorCode: ProviderErrorCodes.ProcessFailed,\n errorMessage: message,\n };\n\n terminalCommitted = true;\n await this.persistTerminalState(\n task,\n failedResult,\n provider,\n model,\n dryRun,\n );\n this.inFlight.delete(key);\n return failedResult;\n }\n }\n\n private buildPrompt(task: TaskRecord): string {\n const selectedAttributes = JSON.stringify(\n task.uiChangePacket.element.attributes,\n );\n\n return [\n \"You are implementing a UI change request from Pinpatch.\",\n \"Scope guardrails (must follow):\",\n \"- Implement only the requested UI change.\",\n \"- Treat the selected element as the primary edit target by default.\",\n \"- Do not move the change to ancestors, siblings, or page/global wrappers unless the request explicitly asks for a page-level or app-wide change or the selected element cannot satisfy the request without broader changes.\",\n \"- If the request is ambiguous, prefer changing the selected element directly.\",\n \"- Do not edit, reformat, or reorganize unrelated files.\",\n \"- Never revert, overwrite, or clean up unrelated repo changes (other agents may be editing in parallel).\",\n \"- If unrelated files are modified or dirty, leave them untouched.\",\n \"- If you cannot complete the request without touching unrelated areas, stop and report the exact blocker.\",\n `User request: ${task.pin.body}`,\n `Page URL: ${task.url}`,\n `Element: <${task.uiChangePacket.element.tag}> text=\\\"${task.uiChangePacket.element.text ?? \"\"}\\\"`,\n `Element attributes: ${selectedAttributes}`,\n `Bounding box: ${JSON.stringify(task.uiChangePacket.element.boundingBox)}`,\n `Nearby text: ${task.uiChangePacket.nearbyText.join(\" | \")}`,\n `DOM snippet: ${task.uiChangePacket.domSnippet}`,\n `Computed style summary: ${JSON.stringify(task.uiChangePacket.computedStyleSummary)}`,\n `Screenshot path: ${task.screenshotPath}`,\n \"Apply the change in local files.\",\n \"Output format (must follow):\",\n \"- For each modified file, print a line exactly as: CHANGED: <path>\",\n \"- Final line must be exactly one sentence summarizing the changes made.\",\n ].join(\"\\n\");\n }\n\n private async persistTerminalState(\n task: TaskRecord,\n result: ProviderResult,\n provider: ProviderName,\n model: string,\n dryRun: boolean,\n ): Promise<void> {\n const finishedAt = nowIso();\n\n await this.store.updateSession(result.sessionId, (session) => ({\n ...session,\n provider,\n model,\n dryRun,\n status: result.status,\n summary: result.summary,\n changedFiles: result.changedFiles,\n errorCode: result.errorCode,\n errorMessage: result.errorMessage,\n endedAt: finishedAt,\n updatedAt: finishedAt,\n events: [\n ...session.events,\n {\n status: result.status,\n message: result.summary,\n timestamp: finishedAt,\n },\n ],\n }));\n\n await this.store.updateTask(task.taskId, (current) => ({\n ...current,\n status: result.status,\n updatedAt: finishedAt,\n provider,\n model,\n summary: result.summary,\n changedFiles: result.changedFiles,\n errorCode: result.errorCode,\n errorMessage: result.errorMessage,\n }));\n\n this.eventBus.publish(task.taskId, result.sessionId, {\n type: \"terminal\",\n taskId: task.taskId,\n sessionId: result.sessionId,\n status: result.status,\n summary: result.summary,\n changedFiles: result.changedFiles,\n errorCode: result.errorCode,\n errorMessage: result.errorMessage,\n timestamp: finishedAt,\n });\n\n this.logger.info(result.summary, {\n component: \"runner\",\n taskId: task.taskId,\n sessionId: result.sessionId,\n event: \"task.terminal\",\n meta: {\n status: result.status,\n changedFiles: result.changedFiles,\n errorCode: result.errorCode,\n },\n });\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport type { SseEvent } from \"../contracts/index\";\n\nconst keyFor = (taskId: string, sessionId: string): string => `${taskId}:${sessionId}`;\n\nexport class TaskEventBus {\n private readonly emitter = new EventEmitter();\n\n subscribe(taskId: string, sessionId: string, listener: (event: SseEvent) => void): () => void {\n const key = keyFor(taskId, sessionId);\n this.emitter.on(key, listener);\n\n return () => {\n this.emitter.off(key, listener);\n };\n }\n\n publish(taskId: string, sessionId: string, event: SseEvent): void {\n this.emitter.emit(keyFor(taskId, sessionId), event);\n }\n}\n","import { createServer, type Server } from \"node:http\";\nimport path from \"node:path\";\nimport { promises as fs } from \"node:fs\";\nimport express, { type Request, type Response } from \"express\";\nimport cors from \"cors\";\nimport {\n CreateTaskRequestSchema,\n SubmitTaskRequestSchema,\n type ProviderName,\n type SseEvent,\n type TaskRecord,\n} from \"../contracts/index\";\nimport { generateTaskId, nowIso } from \"../runtime/ids\";\nimport type { ArtifactStore } from \"../storage/artifact-store\";\nimport type { Logger } from \"../logging/logger\";\nimport { TaskEventBus } from \"./event-bus\";\nimport { TaskRunner } from \"../runtime/task-runner\";\nimport type { ProviderAdapter } from \"../contracts/provider\";\n\nconst sanitizeTaskId = (candidate: string): string =>\n candidate.replace(/[^a-zA-Z0-9-_]/g, \"-\").slice(0, 64);\n\nconst serializeSse = (\n eventName: \"progress\" | \"terminal\" | \"heartbeat\",\n payload: SseEvent,\n): string => {\n return `event: ${eventName}\\ndata: ${JSON.stringify(payload)}\\n\\n`;\n};\n\nconst fallbackOverlayScript = `\n(function(){\n if (window.__PINPATCH_OVERLAY_FALLBACK__) return;\n window.__PINPATCH_OVERLAY_FALLBACK__ = true;\n console.warn('[pinpatch] overlay bundle is missing. Build apps/overlay first.');\n})();\n`;\n\nexport type BridgeServerOptions = {\n cwd: string;\n port: number;\n store: ArtifactStore;\n logger: Logger;\n overlayScriptPath?: string;\n getProviderAdapter(provider: ProviderName): ProviderAdapter | undefined;\n};\n\nexport type BridgeServerHandle = {\n app: express.Express;\n server: Server;\n eventBus: TaskEventBus;\n taskRunner: TaskRunner;\n start(): Promise<void>;\n stop(): Promise<void>;\n};\n\nconst resolveAvailableTaskId = async (\n store: ArtifactStore,\n initialTaskId?: string,\n): Promise<string> => {\n if (initialTaskId) {\n const candidate = sanitizeTaskId(initialTaskId);\n const existing = await store.getTask(candidate);\n if (!existing) {\n return candidate;\n }\n }\n\n let tries = 0;\n while (tries < 10) {\n const candidate = generateTaskId();\n const existing = await store.getTask(candidate);\n if (!existing) {\n return candidate;\n }\n tries += 1;\n }\n\n throw new Error(\"Failed to allocate a unique task id\");\n};\n\nexport const createBridgeServer = (\n options: BridgeServerOptions,\n): BridgeServerHandle => {\n const app = express();\n const eventBus = new TaskEventBus();\n const taskRunner = new TaskRunner({\n cwd: options.cwd,\n store: options.store,\n logger: options.logger,\n eventBus,\n getProviderAdapter: options.getProviderAdapter,\n });\n\n app.use(cors());\n app.use(express.json({ limit: \"25mb\" }));\n\n app.get(\"/health\", (_req, res) => {\n res.status(200).json({ ok: true });\n });\n\n app.get(\"/overlay.js\", async (_req, res) => {\n const requestedPath = options.overlayScriptPath;\n\n if (requestedPath) {\n try {\n const script = await fs.readFile(path.resolve(requestedPath), \"utf8\");\n res.setHeader(\"content-type\", \"application/javascript; charset=utf-8\");\n res.status(200).send(script);\n return;\n } catch {\n options.logger.warn(\n \"Overlay bundle not found, serving fallback overlay script\",\n {\n component: \"bridge\",\n event: \"overlay.fallback\",\n meta: {\n overlayScriptPath: requestedPath,\n },\n },\n );\n }\n }\n\n res.setHeader(\"content-type\", \"application/javascript; charset=utf-8\");\n res.status(200).send(fallbackOverlayScript);\n });\n\n app.post(\"/api/tasks\", async (req: Request, res: Response) => {\n const parsed = CreateTaskRequestSchema.safeParse(req.body);\n if (!parsed.success) {\n res.status(400).json({\n error: \"Invalid request\",\n details: parsed.error.flatten(),\n });\n return;\n }\n\n const payload = parsed.data;\n const taskId = await resolveAvailableTaskId(\n options.store,\n payload.clientTaskId,\n );\n\n let screenshotPath = payload.screenshotPath;\n if (payload.screenshotDataUrl) {\n screenshotPath = await options.store.writeScreenshot(\n taskId,\n payload.screenshotDataUrl,\n );\n }\n\n const createdAt = nowIso();\n\n const taskRecord: TaskRecord = {\n taskId,\n createdAt,\n updatedAt: createdAt,\n status: \"created\",\n url: payload.url,\n viewport: payload.viewport,\n pin: payload.pin,\n uiChangePacket: {\n ...payload.uiChangePacket,\n screenshotPath,\n userRequest: payload.pin.body,\n },\n screenshotPath,\n sessions: [payload.sessionId],\n latestSessionId: payload.sessionId,\n changedFiles: [],\n };\n\n await options.store.createTask(taskRecord);\n\n options.logger.info(\"Task created\", {\n component: \"bridge\",\n taskId,\n sessionId: payload.sessionId,\n event: \"task.created\",\n meta: {\n screenshotPath,\n },\n });\n\n res.status(201).json({\n taskId,\n sessionId: payload.sessionId,\n status: \"created\",\n taskPath: `.pinpatch/tasks/${taskId}.json`,\n eventsUrl: `/api/tasks/${taskId}/events?sessionId=${payload.sessionId}`,\n });\n });\n\n app.post(\"/api/tasks/:taskId/submit\", async (req: Request, res: Response) => {\n const taskId = String(req.params.taskId ?? \"\");\n if (!taskId) {\n res.status(400).json({ error: \"taskId is required\" });\n return;\n }\n\n const task = await options.store.getTask(taskId);\n if (!task) {\n res.status(404).json({ error: \"Task not found\" });\n return;\n }\n\n const parsed = SubmitTaskRequestSchema.safeParse(req.body);\n if (!parsed.success) {\n res.status(400).json({\n error: \"Invalid request\",\n details: parsed.error.flatten(),\n });\n return;\n }\n\n const payload = parsed.data;\n\n if (payload.followUpBody) {\n const updatedAt = nowIso();\n const followUpBody = payload.followUpBody;\n await options.store.updateTask(taskId, (current) => ({\n ...current,\n updatedAt,\n pin: {\n ...current.pin,\n body: followUpBody,\n },\n uiChangePacket: {\n ...current.uiChangePacket,\n userRequest: followUpBody,\n },\n }));\n }\n\n void taskRunner\n .runTask({\n taskId,\n sessionId: payload.sessionId,\n provider: payload.provider,\n model: payload.model,\n dryRun: payload.dryRun,\n debug: payload.debug,\n })\n .catch((error: unknown) => {\n options.logger.error(\"Provider task execution failed\", {\n component: \"bridge\",\n taskId,\n sessionId: payload.sessionId,\n event: \"task.run.error\",\n meta: {\n error: error instanceof Error ? error.message : String(error),\n },\n });\n });\n\n const acceptedAt = nowIso();\n res.status(202).json({\n taskId,\n sessionId: payload.sessionId,\n status: \"queued\",\n acceptedAt,\n eventsUrl: `/api/tasks/${taskId}/events?sessionId=${payload.sessionId}`,\n });\n });\n\n app.post(\"/api/tasks/:taskId/cancel\", async (req: Request, res: Response) => {\n const taskId = String(req.params.taskId ?? \"\");\n const sessionId = String(req.body?.sessionId ?? \"\");\n\n if (!taskId || !sessionId) {\n res.status(400).json({ error: \"taskId and sessionId are required\" });\n return;\n }\n\n await taskRunner.cancelTask(taskId, sessionId);\n res.status(202).json({ taskId, sessionId, status: \"cancelled\" });\n });\n\n app.get(\"/api/tasks/:taskId/events\", async (req: Request, res: Response) => {\n const taskId = String(req.params.taskId ?? \"\");\n const sessionId = String(req.query.sessionId ?? \"\");\n if (!taskId || !sessionId) {\n res\n .status(400)\n .json({ error: \"taskId and sessionId query params are required\" });\n return;\n }\n\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.flushHeaders();\n\n const push = (event: SseEvent): void => {\n const type =\n event.type === \"terminal\"\n ? \"terminal\"\n : event.type === \"heartbeat\"\n ? \"heartbeat\"\n : \"progress\";\n res.write(serializeSse(type, event));\n };\n\n push({\n type: \"heartbeat\",\n timestamp: nowIso(),\n });\n\n const unsubscribe = eventBus.subscribe(taskId, sessionId, push);\n\n const heartbeat = setInterval(() => {\n push({\n type: \"heartbeat\",\n timestamp: nowIso(),\n });\n }, 15_000);\n\n req.on(\"close\", () => {\n clearInterval(heartbeat);\n unsubscribe();\n res.end();\n });\n });\n\n const server = createServer(app);\n\n return {\n app,\n server,\n eventBus,\n taskRunner,\n async start() {\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(options.port, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n options.logger.info(\n `Bridge listening on http://localhost:${options.port}`,\n {\n component: \"bridge\",\n event: \"bridge.started\",\n },\n );\n },\n async stop() {\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n options.logger.info(\"Bridge stopped\", {\n component: \"bridge\",\n event: \"bridge.stopped\",\n });\n },\n };\n};\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { RuntimeLogEventSchema, type RuntimeLogEvent } from \"../contracts/index\";\nimport type { ArtifactStore } from \"../storage/artifact-store\";\nimport { nowIso } from \"../runtime/ids\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type LoggerMeta = Record<string, unknown>;\n\nexport type Logger = {\n debug(message: string, details?: Omit<RuntimeLogEvent, \"timestamp\" | \"level\" | \"message\">): void;\n info(message: string, details?: Omit<RuntimeLogEvent, \"timestamp\" | \"level\" | \"message\">): void;\n warn(message: string, details?: Omit<RuntimeLogEvent, \"timestamp\" | \"level\" | \"message\">): void;\n error(message: string, details?: Omit<RuntimeLogEvent, \"timestamp\" | \"level\" | \"message\">): void;\n};\n\nconst redactValue = (value: unknown): unknown => {\n if (typeof value === \"string\") {\n const home = os.homedir();\n\n return value\n .replaceAll(home, \"~\")\n .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/gi, \"$1[REDACTED]\")\n .replace(/(token=)[^\\s&]+/gi, \"$1[REDACTED]\");\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => redactValue(entry));\n }\n\n if (value && typeof value === \"object\") {\n const output: Record<string, unknown> = {};\n for (const [key, fieldValue] of Object.entries(value as Record<string, unknown>)) {\n if ([\"token\", \"authorization\", \"auth\", \"apiKey\", \"apikey\"].includes(key.toLowerCase())) {\n output[key] = \"[REDACTED]\";\n } else {\n output[key] = redactValue(fieldValue);\n }\n }\n\n return output;\n }\n\n return value;\n};\n\nconst getDateKey = (dateIso: string): string => dateIso.slice(0, 10);\n\nconst resolveLogPath = (logsDir: string, timestamp: string, maxFileSizeBytes: number): string => {\n const dateKey = getDateKey(timestamp);\n let index = 0;\n\n while (true) {\n const candidateName = index === 0 ? `${dateKey}.jsonl` : `${dateKey}-${index}.jsonl`;\n const candidatePath = path.join(logsDir, candidateName);\n\n if (!existsSync(candidatePath)) {\n return candidatePath;\n }\n\n const size = statSync(candidatePath).size;\n if (size < maxFileSizeBytes) {\n return candidatePath;\n }\n\n index += 1;\n }\n};\n\nexport const createLogger = (options: {\n store: ArtifactStore;\n debugEnabled: boolean;\n component: string;\n maxFileSizeBytes?: number;\n}): Logger => {\n const { store, debugEnabled, component, maxFileSizeBytes = 2 * 1024 * 1024 } = options;\n\n const emit = (level: LogLevel, message: string, details?: Omit<RuntimeLogEvent, \"timestamp\" | \"level\" | \"message\">): void => {\n if (level === \"debug\" && !debugEnabled) {\n return;\n }\n\n const timestamp = nowIso();\n\n const payload = RuntimeLogEventSchema.parse({\n timestamp,\n level,\n component: details?.component ?? component,\n taskId: details?.taskId,\n sessionId: details?.sessionId,\n event: details?.event ?? \"log\",\n message,\n meta: redactValue(details?.meta ?? {}) as LoggerMeta\n });\n\n const line = `[${payload.timestamp}] ${payload.level.toUpperCase()} ${payload.component}: ${payload.message}`;\n if (level === \"error\") {\n console.error(line);\n } else if (level === \"warn\") {\n console.warn(line);\n } else {\n console.log(line);\n }\n\n const logPath = resolveLogPath(store.logsDir, timestamp, maxFileSizeBytes);\n void store.appendLog(logPath, payload);\n };\n\n return {\n debug: (message, details) => emit(\"debug\", message, details),\n info: (message, details) => emit(\"info\", message, details),\n warn: (message, details) => emit(\"warn\", message, details),\n error: (message, details) => emit(\"error\", message, details)\n };\n};\n"],"mappings":"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","names":["z","z","z","z","path","fs","fs","path","path","fs","crypto","path","fs","fs","path","path","path"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pinpatch/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Core contracts, config, storage, bridge API, and task runtime for Pinpatch.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/alex1craig/pinpatch.git"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"pinpatch",
|
|
12
|
+
"core",
|
|
13
|
+
"bridge",
|
|
14
|
+
"task-runner",
|
|
15
|
+
"contracts"
|
|
16
|
+
],
|
|
17
|
+
"type": "module",
|
|
18
|
+
"main": "dist/index.cjs",
|
|
19
|
+
"module": "dist/index.js",
|
|
20
|
+
"types": "dist/index.d.ts",
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"import": "./dist/index.js",
|
|
25
|
+
"require": "./dist/index.cjs"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18"
|
|
33
|
+
},
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"cors": "^2.8.5",
|
|
39
|
+
"express": "^4.21.2",
|
|
40
|
+
"zod": "^3.24.1"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/cors": "^2.8.17",
|
|
44
|
+
"@types/express": "^5.0.0",
|
|
45
|
+
"@types/supertest": "^6.0.3",
|
|
46
|
+
"supertest": "^7.0.0",
|
|
47
|
+
"tsup": "^8.3.5",
|
|
48
|
+
"vitest": "^3.0.6"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsup",
|
|
52
|
+
"dev": "tsup --watch",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
55
|
+
"lint": "echo 'lint not configured'",
|
|
56
|
+
"clean": "rm -rf dist coverage"
|
|
57
|
+
}
|
|
58
|
+
}
|