@agent-native/core 0.111.3 → 0.112.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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +18 -0
- package/corpus/core/package.json +3 -1
- package/corpus/core/src/cli/code-agent-executor.ts +17 -5
- package/corpus/core/src/cli/code-agent-runs.ts +43 -2
- package/corpus/core/src/cli/migration-codemod.ts +59 -9
- package/corpus/core/src/cli/multi-frontier-runs.ts +841 -0
- package/corpus/core/src/coding-tools/index.ts +27 -8
- package/corpus/core/src/embeddings/index.ts +233 -0
- package/corpus/core/src/index.ts +2 -0
- package/corpus/core/src/search/index.ts +413 -0
- package/corpus/templates/brain/.agents/skills/brain/RUNBOOK.md +48 -5
- package/corpus/templates/brain/.agents/skills/brain/SKILL.md +46 -14
- package/corpus/templates/brain/README.md +34 -3
- package/corpus/templates/brain/actions/approve-proposal.ts +2 -0
- package/corpus/templates/brain/actions/claim-distillation.ts +24 -27
- package/corpus/templates/brain/actions/create-source.ts +1 -1
- package/corpus/templates/brain/actions/get-knowledge.ts +6 -2
- package/corpus/templates/brain/actions/get-pilot-report.ts +44 -8
- package/corpus/templates/brain/actions/import-capture.ts +21 -9
- package/corpus/templates/brain/actions/import-transcript.ts +42 -14
- package/corpus/templates/brain/actions/list-captures.ts +10 -1
- package/corpus/templates/brain/actions/list-distillation-queue.ts +39 -14
- package/corpus/templates/brain/actions/list-projects.ts +51 -0
- package/corpus/templates/brain/actions/list-proposals.ts +80 -4
- package/corpus/templates/brain/actions/list-sources.ts +17 -3
- package/corpus/templates/brain/actions/manage-project.ts +118 -0
- package/corpus/templates/brain/actions/mark-capture-distilled.ts +68 -20
- package/corpus/templates/brain/actions/navigate.ts +1 -0
- package/corpus/templates/brain/actions/reject-proposal.ts +6 -1
- package/corpus/templates/brain/actions/resanitize-captures.ts +159 -33
- package/corpus/templates/brain/actions/review-proposal.ts +2 -0
- package/corpus/templates/brain/actions/search-everything.ts +10 -1
- package/corpus/templates/brain/actions/search-knowledge.ts +1 -1
- package/corpus/templates/brain/actions/set-settings.ts +36 -1
- package/corpus/templates/brain/actions/update-proposal.ts +2 -0
- package/corpus/templates/brain/app/hooks/use-distillation-bridge.ts +18 -9
- package/corpus/templates/brain/app/hooks/use-navigation-state.ts +3 -0
- package/corpus/templates/brain/app/i18n-data.ts +731 -2
- package/corpus/templates/brain/app/lib/brain.ts +33 -1
- package/corpus/templates/brain/app/routes/ops.tsx +47 -0
- package/corpus/templates/brain/app/routes/review.tsx +41 -2
- package/corpus/templates/brain/app/routes/search.tsx +33 -2
- package/corpus/templates/brain/app/routes/settings.tsx +158 -0
- package/corpus/templates/brain/app/routes/sources.tsx +31 -0
- package/corpus/templates/brain/changelog/2026-07-19-added-private-source-safe-semantic-search.md +6 -0
- package/corpus/templates/brain/jobs/process-ingest-queue.ts +270 -36
- package/corpus/templates/brain/package.json +1 -0
- package/corpus/templates/brain/server/db/index.ts +18 -0
- package/corpus/templates/brain/server/db/schema.ts +197 -1
- package/corpus/templates/brain/server/jobs/distillation-queue.ts +12 -5
- package/corpus/templates/brain/server/lib/audiences.ts +708 -0
- package/corpus/templates/brain/server/lib/brain-health.ts +251 -38
- package/corpus/templates/brain/server/lib/brain.ts +877 -50
- package/corpus/templates/brain/server/lib/capture-sanitization.ts +217 -53
- package/corpus/templates/brain/server/lib/connectors.ts +556 -70
- package/corpus/templates/brain/server/lib/demo.ts +17 -4
- package/corpus/templates/brain/server/lib/hybrid-search.ts +363 -0
- package/corpus/templates/brain/server/lib/ingest-queue.ts +104 -0
- package/corpus/templates/brain/server/lib/privacy-readiness.ts +24 -0
- package/corpus/templates/brain/server/lib/search-index-contracts.ts +72 -0
- package/corpus/templates/brain/server/lib/search-index.ts +714 -0
- package/corpus/templates/brain/server/lib/search.ts +120 -4
- package/corpus/templates/brain/server/lib/sensitivity-policy.ts +174 -0
- package/corpus/templates/brain/server/lib/slack-events.ts +281 -0
- package/corpus/templates/brain/server/onboarding.ts +29 -0
- package/corpus/templates/brain/server/plugins/db.ts +204 -0
- package/corpus/templates/brain/server/register-secrets.ts +46 -0
- package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +36 -16
- package/corpus/templates/brain/server/routes/api/_agent-native/brain/slack-events.post.ts +28 -0
- package/corpus/templates/brain/shared/types.ts +10 -0
- package/dist/cli/code-agent-executor.d.ts +8 -9
- package/dist/cli/code-agent-executor.d.ts.map +1 -1
- package/dist/cli/code-agent-executor.js +9 -3
- package/dist/cli/code-agent-executor.js.map +1 -1
- package/dist/cli/code-agent-runs.d.ts +5 -0
- package/dist/cli/code-agent-runs.d.ts.map +1 -1
- package/dist/cli/code-agent-runs.js +33 -2
- package/dist/cli/code-agent-runs.js.map +1 -1
- package/dist/cli/migration-codemod.d.ts.map +1 -1
- package/dist/cli/migration-codemod.js +48 -10
- package/dist/cli/migration-codemod.js.map +1 -1
- package/dist/cli/multi-frontier-runs.d.ts +131 -0
- package/dist/cli/multi-frontier-runs.d.ts.map +1 -0
- package/dist/cli/multi-frontier-runs.js +529 -0
- package/dist/cli/multi-frontier-runs.js.map +1 -0
- package/dist/coding-tools/index.d.ts +1 -0
- package/dist/coding-tools/index.d.ts.map +1 -1
- package/dist/coding-tools/index.js +25 -7
- package/dist/coding-tools/index.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/embeddings/index.d.ts +24 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +172 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/search/index.d.ts +88 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +267 -0
- package/dist/search/index.js.map +1 -0
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/package.json +3 -1
|
@@ -95,7 +95,7 @@ export function normalizeCodeAgentPermissionMode(value) {
|
|
|
95
95
|
}
|
|
96
96
|
export function writeCodeAgentRunRecord(record) {
|
|
97
97
|
fs.mkdirSync(codeAgentRunsDir(), { recursive: true });
|
|
98
|
-
|
|
98
|
+
writeFileAtomically(codeAgentRunRecordPath(record.id), `${JSON.stringify(record, null, 2)}\n`);
|
|
99
99
|
}
|
|
100
100
|
export function getCodeAgentRunRecord(runId) {
|
|
101
101
|
return readRunFile(codeAgentRunRecordPath(runId));
|
|
@@ -133,10 +133,17 @@ export function getLastCodeAgentRunRecord(goalId) {
|
|
|
133
133
|
return listCodeAgentRunRecords(goalId)[0] ?? null;
|
|
134
134
|
}
|
|
135
135
|
export function appendCodeAgentTranscriptEvent(input) {
|
|
136
|
+
const requestedId = input.id?.trim();
|
|
137
|
+
if (requestedId) {
|
|
138
|
+
const existing = listCodeAgentTranscriptEvents(input.runId).find((event) => event.id === requestedId);
|
|
139
|
+
if (existing)
|
|
140
|
+
return existing;
|
|
141
|
+
}
|
|
136
142
|
const createdAt = input.createdAt ?? new Date().toISOString();
|
|
137
143
|
const event = {
|
|
138
144
|
schemaVersion: 1,
|
|
139
|
-
id:
|
|
145
|
+
id: requestedId ??
|
|
146
|
+
`evt-${timestampSlug(createdAt)}-${crypto.randomUUID().slice(0, 8)}`,
|
|
140
147
|
runId: input.runId,
|
|
141
148
|
kind: input.kind,
|
|
142
149
|
message: input.message,
|
|
@@ -203,6 +210,30 @@ export function dequeueCodeAgentFollowUp(runId) {
|
|
|
203
210
|
function codeAgentRunRecordPath(runId) {
|
|
204
211
|
return path.join(codeAgentRunsDir(), `${runId}.json`);
|
|
205
212
|
}
|
|
213
|
+
function writeFileAtomically(filePath, contents) {
|
|
214
|
+
const directory = path.dirname(filePath);
|
|
215
|
+
const temporaryPath = path.join(directory, `.${path.basename(filePath)}.tmp-${process.pid}-${crypto.randomUUID()}`);
|
|
216
|
+
let mode;
|
|
217
|
+
try {
|
|
218
|
+
mode = fs.statSync(filePath).mode & 0o777;
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// A new run record uses the process umask.
|
|
222
|
+
}
|
|
223
|
+
try {
|
|
224
|
+
fs.writeFileSync(temporaryPath, contents, {
|
|
225
|
+
encoding: "utf-8",
|
|
226
|
+
flag: "wx",
|
|
227
|
+
});
|
|
228
|
+
if (mode !== undefined)
|
|
229
|
+
fs.chmodSync(temporaryPath, mode);
|
|
230
|
+
fs.renameSync(temporaryPath, filePath);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
fs.rmSync(temporaryPath, { force: true });
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
206
237
|
function readPendingFollowUps(value) {
|
|
207
238
|
if (!Array.isArray(value))
|
|
208
239
|
return [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-agent-runs.js","sourceRoot":"","sources":["../../src/cli/code-agent-runs.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"crypto\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport type { AgentPromptAttachment } from \"../code-agents/prompt-attachments.js\";\n\nexport type CodeAgentRunStatus =\n | \"queued\"\n | \"running\"\n | \"paused\"\n | \"needs-approval\"\n | \"completed\"\n | \"errored\"\n | \"unknown\";\n\nexport const CODE_AGENT_PERMISSION_MODES = [\n \"read-only\",\n \"ask-before-edit\",\n \"auto-edit\",\n \"full-auto\",\n] as const;\n\nexport type CodeAgentPermissionMode =\n (typeof CODE_AGENT_PERMISSION_MODES)[number];\n\nexport interface CodeAgentRunProgress {\n label?: string;\n completed: number;\n total: number;\n failed?: number;\n percent: number;\n}\n\nexport interface CodeAgentRunDetail {\n label: string;\n value: string;\n}\n\nexport type CodeAgentFollowUpMode = \"immediate\" | \"queued\";\n\nexport interface CodeAgentPendingFollowUp {\n id: string;\n prompt: string;\n mode: CodeAgentFollowUpMode;\n createdAt: string;\n eventId?: string;\n permissionMode?: CodeAgentPermissionMode;\n source?: string;\n attachments?: AgentPromptAttachment[];\n}\n\nexport interface CodeAgentRunRecord {\n schemaVersion: 1;\n id: string;\n goalId: string;\n title: string;\n subtitle?: string;\n status: CodeAgentRunStatus;\n phase?: string;\n needsApproval?: boolean;\n progress?: CodeAgentRunProgress;\n permissionMode?: CodeAgentPermissionMode;\n details?: CodeAgentRunDetail[];\n artifactRoot?: string;\n surfaceUrl?: string;\n cwd: string;\n createdAt: string;\n updatedAt: string;\n metadata?: Record<string, unknown>;\n}\n\nexport type CodeAgentTranscriptEventKind =\n | \"user\"\n | \"system\"\n | \"note\"\n | \"artifact\"\n | \"status\";\n\n/**\n * Structured, machine-checkable marker for transcript events that need\n * special handling in the UI beyond free-text matching. `\"credential-gap\"`\n * marks the status event the executor appends when no LLM provider key (or\n * Codex CLI login) is available; consumers should prefer this field over\n * regex-matching `message` (see `isCredentialGapCodeAgentEvent` in\n * `../code-agents/transcript-normalizer.js`). Optional so older, already\n * persisted JSONL transcripts without the field keep parsing unchanged.\n */\nexport type CodeAgentTranscriptEventSignal = \"credential-gap\";\n\nexport interface CodeAgentTranscriptEvent {\n schemaVersion: 1;\n id: string;\n runId: string;\n kind: CodeAgentTranscriptEventKind;\n message: string;\n createdAt: string;\n metadata?: Record<string, unknown>;\n signal?: CodeAgentTranscriptEventSignal;\n}\n\nexport interface CreateCodeAgentRunInput {\n goalId: string;\n title: string;\n subtitle?: string;\n status?: CodeAgentRunStatus;\n phase?: string;\n needsApproval?: boolean;\n progress?: CodeAgentRunProgress;\n permissionMode?: CodeAgentPermissionMode;\n details?: CodeAgentRunDetail[];\n artifactRoot?: string;\n surfaceUrl?: string;\n cwd?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AppendCodeAgentTranscriptEventInput {\n runId: string;\n kind: CodeAgentTranscriptEventKind;\n message: string;\n createdAt?: string;\n metadata?: Record<string, unknown>;\n signal?: CodeAgentTranscriptEventSignal;\n}\n\nexport interface QueueCodeAgentFollowUpInput {\n runId: string;\n prompt: string;\n mode: CodeAgentFollowUpMode;\n eventId?: string;\n permissionMode?: CodeAgentPermissionMode;\n source?: string;\n createdAt?: string;\n attachments?: AgentPromptAttachment[];\n}\n\nconst STORE_ENV = \"AGENT_NATIVE_CODE_AGENTS_HOME\";\n\nexport function codeAgentStoreRoot(): string {\n return path.resolve(\n process.env[STORE_ENV] ??\n path.join(os.homedir(), \".agent-native\", \"code-agents\"),\n );\n}\n\nexport function codeAgentRunsDir(): string {\n return path.join(codeAgentStoreRoot(), \"runs\");\n}\n\nexport function codeAgentRunArtifactsDir(runId: string): string {\n return path.join(codeAgentStoreRoot(), \"artifacts\", runId);\n}\n\nexport function codeAgentTranscriptsDir(): string {\n return path.join(codeAgentStoreRoot(), \"transcripts\");\n}\n\nexport function codeAgentRunTranscriptPath(runId: string): string {\n return path.join(codeAgentTranscriptsDir(), `${runId}.jsonl`);\n}\n\n// --------------- Command allowlist ---------------\n\nconst COMMAND_ALLOWLIST_FILENAME = \"command-allowlist.json\";\n\nexport function codeAgentCommandAllowlistPath(): string {\n return path.join(codeAgentStoreRoot(), COMMAND_ALLOWLIST_FILENAME);\n}\n\n/**\n * Load the per-store command allowlist. Returns an array of exact command\n * strings the user has marked \"always allow\".\n */\nexport function readCodeAgentCommandAllowlist(): string[] {\n try {\n const raw = JSON.parse(\n fs.readFileSync(codeAgentCommandAllowlistPath(), \"utf-8\"),\n ) as unknown;\n if (!Array.isArray(raw)) return [];\n return raw.filter((entry): entry is string => typeof entry === \"string\");\n } catch {\n return [];\n }\n}\n\n/**\n * Persist a command to the per-store allowlist so future identical commands\n * are auto-approved without a prompt. Deduplicates by exact string match.\n */\nexport function addCodeAgentCommandToAllowlist(command: string): void {\n const current = readCodeAgentCommandAllowlist();\n if (current.includes(command)) return;\n const next = [...current, command];\n fs.mkdirSync(codeAgentStoreRoot(), { recursive: true });\n fs.writeFileSync(\n codeAgentCommandAllowlistPath(),\n JSON.stringify(next, null, 2),\n );\n}\n\n/** Return true if `command` is in the stored allowlist. */\nexport function isCodeAgentCommandAllowed(command: string): boolean {\n return readCodeAgentCommandAllowlist().includes(command);\n}\n\nexport function createCodeAgentRunRecord(\n input: CreateCodeAgentRunInput,\n): CodeAgentRunRecord {\n const now = new Date().toISOString();\n const id = `${input.goalId}-${timestampSlug(now)}-${crypto.randomUUID().slice(0, 8)}`;\n const record: CodeAgentRunRecord = {\n schemaVersion: 1,\n id,\n goalId: input.goalId,\n title: input.title,\n subtitle: input.subtitle,\n status: input.status ?? \"queued\",\n phase: input.phase,\n needsApproval: input.needsApproval,\n progress: input.progress,\n permissionMode: input.permissionMode,\n details: input.details,\n artifactRoot: input.artifactRoot,\n surfaceUrl: input.surfaceUrl,\n cwd: input.cwd ?? process.cwd(),\n createdAt: now,\n updatedAt: now,\n metadata: input.metadata,\n };\n writeCodeAgentRunRecord(record);\n return record;\n}\n\nexport function normalizeCodeAgentPermissionMode(\n value: unknown,\n): CodeAgentPermissionMode | null {\n if (typeof value !== \"string\") return null;\n return CODE_AGENT_PERMISSION_MODES.includes(value as CodeAgentPermissionMode)\n ? (value as CodeAgentPermissionMode)\n : null;\n}\n\nexport function writeCodeAgentRunRecord(record: CodeAgentRunRecord): void {\n fs.mkdirSync(codeAgentRunsDir(), { recursive: true });\n fs.writeFileSync(\n codeAgentRunRecordPath(record.id),\n `${JSON.stringify(record, null, 2)}\\n`,\n );\n}\n\nexport function getCodeAgentRunRecord(\n runId: string,\n): CodeAgentRunRecord | null {\n return readRunFile(codeAgentRunRecordPath(runId));\n}\n\nexport function updateCodeAgentRunRecord(\n runId: string,\n updates:\n | Partial<CodeAgentRunRecord>\n | ((record: CodeAgentRunRecord) => Partial<CodeAgentRunRecord>),\n): CodeAgentRunRecord | null {\n const record = getCodeAgentRunRecord(runId);\n if (!record) return null;\n const patch = typeof updates === \"function\" ? updates(record) : updates;\n const next: CodeAgentRunRecord = {\n ...record,\n ...patch,\n metadata: {\n ...(record.metadata ?? {}),\n ...(patch.metadata ?? {}),\n },\n updatedAt: patch.updatedAt ?? new Date().toISOString(),\n };\n writeCodeAgentRunRecord(next);\n return next;\n}\n\nexport function listCodeAgentRunRecords(goalId?: string): CodeAgentRunRecord[] {\n const dir = codeAgentRunsDir();\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter((file) => file.endsWith(\".json\"))\n .map((file) => readRunFile(path.join(dir, file)))\n .filter((run): run is CodeAgentRunRecord => Boolean(run))\n .filter((run) => !goalId || run.goalId === goalId)\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n}\n\nexport function getLastCodeAgentRunRecord(\n goalId?: string,\n): CodeAgentRunRecord | null {\n return listCodeAgentRunRecords(goalId)[0] ?? null;\n}\n\nexport function appendCodeAgentTranscriptEvent(\n input: AppendCodeAgentTranscriptEventInput,\n): CodeAgentTranscriptEvent {\n const createdAt = input.createdAt ?? new Date().toISOString();\n const event: CodeAgentTranscriptEvent = {\n schemaVersion: 1,\n id: `evt-${timestampSlug(createdAt)}-${crypto.randomUUID().slice(0, 8)}`,\n runId: input.runId,\n kind: input.kind,\n message: input.message,\n createdAt,\n metadata: input.metadata,\n ...(input.signal ? { signal: input.signal } : {}),\n };\n\n fs.mkdirSync(codeAgentTranscriptsDir(), { recursive: true });\n fs.appendFileSync(\n codeAgentRunTranscriptPath(input.runId),\n `${JSON.stringify(event)}\\n`,\n );\n touchCodeAgentRunRecord(input.runId, createdAt);\n return event;\n}\n\nexport function listCodeAgentTranscriptEvents(\n runId: string,\n): CodeAgentTranscriptEvent[] {\n const transcriptPath = codeAgentRunTranscriptPath(runId);\n if (!fs.existsSync(transcriptPath)) return [];\n return fs\n .readFileSync(transcriptPath, \"utf-8\")\n .split(/\\r?\\n/)\n .filter(Boolean)\n .map(readTranscriptLine)\n .filter((event): event is CodeAgentTranscriptEvent => Boolean(event));\n}\n\nexport function isActiveCodeAgentRun(run: CodeAgentRunRecord): boolean {\n return run.status === \"running\" || run.status === \"needs-approval\";\n}\n\nexport function queueCodeAgentFollowUp(\n input: QueueCodeAgentFollowUpInput,\n): CodeAgentPendingFollowUp | null {\n const createdAt = input.createdAt ?? new Date().toISOString();\n const followUp: CodeAgentPendingFollowUp = {\n id: `followup-${timestampSlug(createdAt)}-${crypto.randomUUID().slice(0, 8)}`,\n prompt: input.prompt,\n mode: input.mode,\n createdAt,\n eventId: input.eventId,\n permissionMode: input.permissionMode,\n source: input.source,\n ...(input.attachments && input.attachments.length > 0\n ? { attachments: input.attachments }\n : {}),\n };\n const updated = updateCodeAgentRunRecord(input.runId, (record) => ({\n metadata: {\n pendingFollowUps: [\n ...readPendingFollowUps(record.metadata?.pendingFollowUps),\n followUp,\n ],\n },\n }));\n return updated ? followUp : null;\n}\n\nexport function dequeueCodeAgentFollowUp(\n runId: string,\n): CodeAgentPendingFollowUp | null {\n let selected: CodeAgentPendingFollowUp | null = null;\n updateCodeAgentRunRecord(runId, (record) => {\n const [first, ...rest] = readPendingFollowUps(\n record.metadata?.pendingFollowUps,\n );\n selected = first ?? null;\n return {\n metadata: {\n pendingFollowUps: rest.length > 0 ? rest : undefined,\n },\n };\n });\n return selected;\n}\n\nfunction codeAgentRunRecordPath(runId: string): string {\n return path.join(codeAgentRunsDir(), `${runId}.json`);\n}\n\nfunction readPendingFollowUps(value: unknown): CodeAgentPendingFollowUp[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((item): CodeAgentPendingFollowUp | null => {\n if (!item || typeof item !== \"object\") return null;\n const candidate = item as Record<string, unknown>;\n if (\n typeof candidate.id !== \"string\" ||\n typeof candidate.prompt !== \"string\" ||\n typeof candidate.createdAt !== \"string\" ||\n (candidate.mode !== \"immediate\" && candidate.mode !== \"queued\")\n ) {\n return null;\n }\n return {\n id: candidate.id,\n prompt: candidate.prompt,\n mode: candidate.mode,\n createdAt: candidate.createdAt,\n eventId:\n typeof candidate.eventId === \"string\" ? candidate.eventId : undefined,\n permissionMode:\n normalizeCodeAgentPermissionMode(candidate.permissionMode) ??\n undefined,\n source:\n typeof candidate.source === \"string\" ? candidate.source : undefined,\n } satisfies CodeAgentPendingFollowUp;\n })\n .filter((item): item is CodeAgentPendingFollowUp => Boolean(item));\n}\n\nfunction touchCodeAgentRunRecord(runId: string, updatedAt: string): void {\n const record = readRunFile(codeAgentRunRecordPath(runId));\n if (!record) return;\n writeCodeAgentRunRecord({ ...record, updatedAt });\n}\n\nfunction readRunFile(filePath: string): CodeAgentRunRecord | null {\n try {\n const raw = JSON.parse(fs.readFileSync(filePath, \"utf-8\")) as unknown;\n if (!raw || typeof raw !== \"object\") return null;\n const record = raw as Partial<CodeAgentRunRecord>;\n if (\n record.schemaVersion !== 1 ||\n typeof record.id !== \"string\" ||\n typeof record.goalId !== \"string\" ||\n typeof record.title !== \"string\" ||\n typeof record.status !== \"string\" ||\n typeof record.cwd !== \"string\" ||\n typeof record.createdAt !== \"string\" ||\n typeof record.updatedAt !== \"string\"\n ) {\n return null;\n }\n return record as CodeAgentRunRecord;\n } catch {\n return null;\n }\n}\n\nfunction readTranscriptLine(line: string): CodeAgentTranscriptEvent | null {\n try {\n const raw = JSON.parse(line) as unknown;\n if (!raw || typeof raw !== \"object\") return null;\n const event = raw as Partial<CodeAgentTranscriptEvent> & {\n type?: unknown;\n role?: unknown;\n text?: unknown;\n content?: unknown;\n };\n const kind = isTranscriptEventKind(event.kind)\n ? event.kind\n : normalizeTranscriptKind(event.type ?? event.role);\n const message =\n typeof event.message === \"string\"\n ? event.message\n : typeof event.text === \"string\"\n ? event.text\n : typeof event.content === \"string\"\n ? event.content\n : undefined;\n if (\n event.schemaVersion !== 1 ||\n typeof event.id !== \"string\" ||\n typeof event.runId !== \"string\" ||\n !kind ||\n typeof message !== \"string\" ||\n typeof event.createdAt !== \"string\"\n ) {\n return null;\n }\n return {\n ...(event as Partial<CodeAgentTranscriptEvent>),\n kind,\n message,\n } as CodeAgentTranscriptEvent;\n } catch {\n return null;\n }\n}\n\nfunction normalizeTranscriptKind(\n value: unknown,\n): CodeAgentTranscriptEventKind | null {\n if (typeof value !== \"string\") return null;\n const normalized = value.toLowerCase();\n if (normalized === \"human\" || normalized === \"prompt\") return \"user\";\n if (normalized === \"assistant\") return \"system\";\n if (isTranscriptEventKind(normalized)) return normalized;\n return null;\n}\n\nfunction isTranscriptEventKind(\n value: unknown,\n): value is CodeAgentTranscriptEventKind {\n return (\n value === \"user\" ||\n value === \"system\" ||\n value === \"note\" ||\n value === \"artifact\" ||\n value === \"status\"\n );\n}\n\nfunction timestampSlug(value: string): string {\n return value.replace(/\\D/g, \"\").slice(0, 14);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"code-agent-runs.js","sourceRoot":"","sources":["../../src/cli/code-agent-runs.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"crypto\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport type { AgentPromptAttachment } from \"../code-agents/prompt-attachments.js\";\n\nexport type CodeAgentRunStatus =\n | \"queued\"\n | \"running\"\n | \"paused\"\n | \"needs-approval\"\n | \"completed\"\n | \"errored\"\n | \"unknown\";\n\nexport const CODE_AGENT_PERMISSION_MODES = [\n \"read-only\",\n \"ask-before-edit\",\n \"auto-edit\",\n \"full-auto\",\n] as const;\n\nexport type CodeAgentPermissionMode =\n (typeof CODE_AGENT_PERMISSION_MODES)[number];\n\nexport interface CodeAgentRunProgress {\n label?: string;\n completed: number;\n total: number;\n failed?: number;\n percent: number;\n}\n\nexport interface CodeAgentRunDetail {\n label: string;\n value: string;\n}\n\nexport type CodeAgentFollowUpMode = \"immediate\" | \"queued\";\n\nexport interface CodeAgentPendingFollowUp {\n id: string;\n prompt: string;\n mode: CodeAgentFollowUpMode;\n createdAt: string;\n eventId?: string;\n permissionMode?: CodeAgentPermissionMode;\n source?: string;\n attachments?: AgentPromptAttachment[];\n}\n\nexport interface CodeAgentRunRecord {\n schemaVersion: 1;\n id: string;\n goalId: string;\n title: string;\n subtitle?: string;\n status: CodeAgentRunStatus;\n phase?: string;\n needsApproval?: boolean;\n progress?: CodeAgentRunProgress;\n permissionMode?: CodeAgentPermissionMode;\n details?: CodeAgentRunDetail[];\n artifactRoot?: string;\n surfaceUrl?: string;\n cwd: string;\n createdAt: string;\n updatedAt: string;\n metadata?: Record<string, unknown>;\n}\n\nexport type CodeAgentTranscriptEventKind =\n | \"user\"\n | \"system\"\n | \"note\"\n | \"artifact\"\n | \"status\";\n\n/**\n * Structured, machine-checkable marker for transcript events that need\n * special handling in the UI beyond free-text matching. `\"credential-gap\"`\n * marks the status event the executor appends when no LLM provider key (or\n * Codex CLI login) is available; consumers should prefer this field over\n * regex-matching `message` (see `isCredentialGapCodeAgentEvent` in\n * `../code-agents/transcript-normalizer.js`). Optional so older, already\n * persisted JSONL transcripts without the field keep parsing unchanged.\n */\nexport type CodeAgentTranscriptEventSignal = \"credential-gap\";\n\nexport interface CodeAgentTranscriptEvent {\n schemaVersion: 1;\n id: string;\n runId: string;\n kind: CodeAgentTranscriptEventKind;\n message: string;\n createdAt: string;\n metadata?: Record<string, unknown>;\n signal?: CodeAgentTranscriptEventSignal;\n}\n\nexport interface CreateCodeAgentRunInput {\n goalId: string;\n title: string;\n subtitle?: string;\n status?: CodeAgentRunStatus;\n phase?: string;\n needsApproval?: boolean;\n progress?: CodeAgentRunProgress;\n permissionMode?: CodeAgentPermissionMode;\n details?: CodeAgentRunDetail[];\n artifactRoot?: string;\n surfaceUrl?: string;\n cwd?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AppendCodeAgentTranscriptEventInput {\n /**\n * Stable event identity supplied by a retrying caller. Reusing this value\n * returns the previously persisted event instead of appending a duplicate.\n */\n id?: string;\n runId: string;\n kind: CodeAgentTranscriptEventKind;\n message: string;\n createdAt?: string;\n metadata?: Record<string, unknown>;\n signal?: CodeAgentTranscriptEventSignal;\n}\n\nexport interface QueueCodeAgentFollowUpInput {\n runId: string;\n prompt: string;\n mode: CodeAgentFollowUpMode;\n eventId?: string;\n permissionMode?: CodeAgentPermissionMode;\n source?: string;\n createdAt?: string;\n attachments?: AgentPromptAttachment[];\n}\n\nconst STORE_ENV = \"AGENT_NATIVE_CODE_AGENTS_HOME\";\n\nexport function codeAgentStoreRoot(): string {\n return path.resolve(\n process.env[STORE_ENV] ??\n path.join(os.homedir(), \".agent-native\", \"code-agents\"),\n );\n}\n\nexport function codeAgentRunsDir(): string {\n return path.join(codeAgentStoreRoot(), \"runs\");\n}\n\nexport function codeAgentRunArtifactsDir(runId: string): string {\n return path.join(codeAgentStoreRoot(), \"artifacts\", runId);\n}\n\nexport function codeAgentTranscriptsDir(): string {\n return path.join(codeAgentStoreRoot(), \"transcripts\");\n}\n\nexport function codeAgentRunTranscriptPath(runId: string): string {\n return path.join(codeAgentTranscriptsDir(), `${runId}.jsonl`);\n}\n\n// --------------- Command allowlist ---------------\n\nconst COMMAND_ALLOWLIST_FILENAME = \"command-allowlist.json\";\n\nexport function codeAgentCommandAllowlistPath(): string {\n return path.join(codeAgentStoreRoot(), COMMAND_ALLOWLIST_FILENAME);\n}\n\n/**\n * Load the per-store command allowlist. Returns an array of exact command\n * strings the user has marked \"always allow\".\n */\nexport function readCodeAgentCommandAllowlist(): string[] {\n try {\n const raw = JSON.parse(\n fs.readFileSync(codeAgentCommandAllowlistPath(), \"utf-8\"),\n ) as unknown;\n if (!Array.isArray(raw)) return [];\n return raw.filter((entry): entry is string => typeof entry === \"string\");\n } catch {\n return [];\n }\n}\n\n/**\n * Persist a command to the per-store allowlist so future identical commands\n * are auto-approved without a prompt. Deduplicates by exact string match.\n */\nexport function addCodeAgentCommandToAllowlist(command: string): void {\n const current = readCodeAgentCommandAllowlist();\n if (current.includes(command)) return;\n const next = [...current, command];\n fs.mkdirSync(codeAgentStoreRoot(), { recursive: true });\n fs.writeFileSync(\n codeAgentCommandAllowlistPath(),\n JSON.stringify(next, null, 2),\n );\n}\n\n/** Return true if `command` is in the stored allowlist. */\nexport function isCodeAgentCommandAllowed(command: string): boolean {\n return readCodeAgentCommandAllowlist().includes(command);\n}\n\nexport function createCodeAgentRunRecord(\n input: CreateCodeAgentRunInput,\n): CodeAgentRunRecord {\n const now = new Date().toISOString();\n const id = `${input.goalId}-${timestampSlug(now)}-${crypto.randomUUID().slice(0, 8)}`;\n const record: CodeAgentRunRecord = {\n schemaVersion: 1,\n id,\n goalId: input.goalId,\n title: input.title,\n subtitle: input.subtitle,\n status: input.status ?? \"queued\",\n phase: input.phase,\n needsApproval: input.needsApproval,\n progress: input.progress,\n permissionMode: input.permissionMode,\n details: input.details,\n artifactRoot: input.artifactRoot,\n surfaceUrl: input.surfaceUrl,\n cwd: input.cwd ?? process.cwd(),\n createdAt: now,\n updatedAt: now,\n metadata: input.metadata,\n };\n writeCodeAgentRunRecord(record);\n return record;\n}\n\nexport function normalizeCodeAgentPermissionMode(\n value: unknown,\n): CodeAgentPermissionMode | null {\n if (typeof value !== \"string\") return null;\n return CODE_AGENT_PERMISSION_MODES.includes(value as CodeAgentPermissionMode)\n ? (value as CodeAgentPermissionMode)\n : null;\n}\n\nexport function writeCodeAgentRunRecord(record: CodeAgentRunRecord): void {\n fs.mkdirSync(codeAgentRunsDir(), { recursive: true });\n writeFileAtomically(\n codeAgentRunRecordPath(record.id),\n `${JSON.stringify(record, null, 2)}\\n`,\n );\n}\n\nexport function getCodeAgentRunRecord(\n runId: string,\n): CodeAgentRunRecord | null {\n return readRunFile(codeAgentRunRecordPath(runId));\n}\n\nexport function updateCodeAgentRunRecord(\n runId: string,\n updates:\n | Partial<CodeAgentRunRecord>\n | ((record: CodeAgentRunRecord) => Partial<CodeAgentRunRecord>),\n): CodeAgentRunRecord | null {\n const record = getCodeAgentRunRecord(runId);\n if (!record) return null;\n const patch = typeof updates === \"function\" ? updates(record) : updates;\n const next: CodeAgentRunRecord = {\n ...record,\n ...patch,\n metadata: {\n ...(record.metadata ?? {}),\n ...(patch.metadata ?? {}),\n },\n updatedAt: patch.updatedAt ?? new Date().toISOString(),\n };\n writeCodeAgentRunRecord(next);\n return next;\n}\n\nexport function listCodeAgentRunRecords(goalId?: string): CodeAgentRunRecord[] {\n const dir = codeAgentRunsDir();\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter((file) => file.endsWith(\".json\"))\n .map((file) => readRunFile(path.join(dir, file)))\n .filter((run): run is CodeAgentRunRecord => Boolean(run))\n .filter((run) => !goalId || run.goalId === goalId)\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n}\n\nexport function getLastCodeAgentRunRecord(\n goalId?: string,\n): CodeAgentRunRecord | null {\n return listCodeAgentRunRecords(goalId)[0] ?? null;\n}\n\nexport function appendCodeAgentTranscriptEvent(\n input: AppendCodeAgentTranscriptEventInput,\n): CodeAgentTranscriptEvent {\n const requestedId = input.id?.trim();\n if (requestedId) {\n const existing = listCodeAgentTranscriptEvents(input.runId).find(\n (event) => event.id === requestedId,\n );\n if (existing) return existing;\n }\n\n const createdAt = input.createdAt ?? new Date().toISOString();\n const event: CodeAgentTranscriptEvent = {\n schemaVersion: 1,\n id:\n requestedId ??\n `evt-${timestampSlug(createdAt)}-${crypto.randomUUID().slice(0, 8)}`,\n runId: input.runId,\n kind: input.kind,\n message: input.message,\n createdAt,\n metadata: input.metadata,\n ...(input.signal ? { signal: input.signal } : {}),\n };\n\n fs.mkdirSync(codeAgentTranscriptsDir(), { recursive: true });\n fs.appendFileSync(\n codeAgentRunTranscriptPath(input.runId),\n `${JSON.stringify(event)}\\n`,\n );\n touchCodeAgentRunRecord(input.runId, createdAt);\n return event;\n}\n\nexport function listCodeAgentTranscriptEvents(\n runId: string,\n): CodeAgentTranscriptEvent[] {\n const transcriptPath = codeAgentRunTranscriptPath(runId);\n if (!fs.existsSync(transcriptPath)) return [];\n return fs\n .readFileSync(transcriptPath, \"utf-8\")\n .split(/\\r?\\n/)\n .filter(Boolean)\n .map(readTranscriptLine)\n .filter((event): event is CodeAgentTranscriptEvent => Boolean(event));\n}\n\nexport function isActiveCodeAgentRun(run: CodeAgentRunRecord): boolean {\n return run.status === \"running\" || run.status === \"needs-approval\";\n}\n\nexport function queueCodeAgentFollowUp(\n input: QueueCodeAgentFollowUpInput,\n): CodeAgentPendingFollowUp | null {\n const createdAt = input.createdAt ?? new Date().toISOString();\n const followUp: CodeAgentPendingFollowUp = {\n id: `followup-${timestampSlug(createdAt)}-${crypto.randomUUID().slice(0, 8)}`,\n prompt: input.prompt,\n mode: input.mode,\n createdAt,\n eventId: input.eventId,\n permissionMode: input.permissionMode,\n source: input.source,\n ...(input.attachments && input.attachments.length > 0\n ? { attachments: input.attachments }\n : {}),\n };\n const updated = updateCodeAgentRunRecord(input.runId, (record) => ({\n metadata: {\n pendingFollowUps: [\n ...readPendingFollowUps(record.metadata?.pendingFollowUps),\n followUp,\n ],\n },\n }));\n return updated ? followUp : null;\n}\n\nexport function dequeueCodeAgentFollowUp(\n runId: string,\n): CodeAgentPendingFollowUp | null {\n let selected: CodeAgentPendingFollowUp | null = null;\n updateCodeAgentRunRecord(runId, (record) => {\n const [first, ...rest] = readPendingFollowUps(\n record.metadata?.pendingFollowUps,\n );\n selected = first ?? null;\n return {\n metadata: {\n pendingFollowUps: rest.length > 0 ? rest : undefined,\n },\n };\n });\n return selected;\n}\n\nfunction codeAgentRunRecordPath(runId: string): string {\n return path.join(codeAgentRunsDir(), `${runId}.json`);\n}\n\nfunction writeFileAtomically(filePath: string, contents: string): void {\n const directory = path.dirname(filePath);\n const temporaryPath = path.join(\n directory,\n `.${path.basename(filePath)}.tmp-${process.pid}-${crypto.randomUUID()}`,\n );\n let mode: number | undefined;\n try {\n mode = fs.statSync(filePath).mode & 0o777;\n } catch {\n // A new run record uses the process umask.\n }\n\n try {\n fs.writeFileSync(temporaryPath, contents, {\n encoding: \"utf-8\",\n flag: \"wx\",\n });\n if (mode !== undefined) fs.chmodSync(temporaryPath, mode);\n fs.renameSync(temporaryPath, filePath);\n } catch (error) {\n fs.rmSync(temporaryPath, { force: true });\n throw error;\n }\n}\n\nfunction readPendingFollowUps(value: unknown): CodeAgentPendingFollowUp[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((item): CodeAgentPendingFollowUp | null => {\n if (!item || typeof item !== \"object\") return null;\n const candidate = item as Record<string, unknown>;\n if (\n typeof candidate.id !== \"string\" ||\n typeof candidate.prompt !== \"string\" ||\n typeof candidate.createdAt !== \"string\" ||\n (candidate.mode !== \"immediate\" && candidate.mode !== \"queued\")\n ) {\n return null;\n }\n return {\n id: candidate.id,\n prompt: candidate.prompt,\n mode: candidate.mode,\n createdAt: candidate.createdAt,\n eventId:\n typeof candidate.eventId === \"string\" ? candidate.eventId : undefined,\n permissionMode:\n normalizeCodeAgentPermissionMode(candidate.permissionMode) ??\n undefined,\n source:\n typeof candidate.source === \"string\" ? candidate.source : undefined,\n } satisfies CodeAgentPendingFollowUp;\n })\n .filter((item): item is CodeAgentPendingFollowUp => Boolean(item));\n}\n\nfunction touchCodeAgentRunRecord(runId: string, updatedAt: string): void {\n const record = readRunFile(codeAgentRunRecordPath(runId));\n if (!record) return;\n writeCodeAgentRunRecord({ ...record, updatedAt });\n}\n\nfunction readRunFile(filePath: string): CodeAgentRunRecord | null {\n try {\n const raw = JSON.parse(fs.readFileSync(filePath, \"utf-8\")) as unknown;\n if (!raw || typeof raw !== \"object\") return null;\n const record = raw as Partial<CodeAgentRunRecord>;\n if (\n record.schemaVersion !== 1 ||\n typeof record.id !== \"string\" ||\n typeof record.goalId !== \"string\" ||\n typeof record.title !== \"string\" ||\n typeof record.status !== \"string\" ||\n typeof record.cwd !== \"string\" ||\n typeof record.createdAt !== \"string\" ||\n typeof record.updatedAt !== \"string\"\n ) {\n return null;\n }\n return record as CodeAgentRunRecord;\n } catch {\n return null;\n }\n}\n\nfunction readTranscriptLine(line: string): CodeAgentTranscriptEvent | null {\n try {\n const raw = JSON.parse(line) as unknown;\n if (!raw || typeof raw !== \"object\") return null;\n const event = raw as Partial<CodeAgentTranscriptEvent> & {\n type?: unknown;\n role?: unknown;\n text?: unknown;\n content?: unknown;\n };\n const kind = isTranscriptEventKind(event.kind)\n ? event.kind\n : normalizeTranscriptKind(event.type ?? event.role);\n const message =\n typeof event.message === \"string\"\n ? event.message\n : typeof event.text === \"string\"\n ? event.text\n : typeof event.content === \"string\"\n ? event.content\n : undefined;\n if (\n event.schemaVersion !== 1 ||\n typeof event.id !== \"string\" ||\n typeof event.runId !== \"string\" ||\n !kind ||\n typeof message !== \"string\" ||\n typeof event.createdAt !== \"string\"\n ) {\n return null;\n }\n return {\n ...(event as Partial<CodeAgentTranscriptEvent>),\n kind,\n message,\n } as CodeAgentTranscriptEvent;\n } catch {\n return null;\n }\n}\n\nfunction normalizeTranscriptKind(\n value: unknown,\n): CodeAgentTranscriptEventKind | null {\n if (typeof value !== \"string\") return null;\n const normalized = value.toLowerCase();\n if (normalized === \"human\" || normalized === \"prompt\") return \"user\";\n if (normalized === \"assistant\") return \"system\";\n if (isTranscriptEventKind(normalized)) return normalized;\n return null;\n}\n\nfunction isTranscriptEventKind(\n value: unknown,\n): value is CodeAgentTranscriptEventKind {\n return (\n value === \"user\" ||\n value === \"system\" ||\n value === \"note\" ||\n value === \"artifact\" ||\n value === \"status\"\n );\n}\n\nfunction timestampSlug(value: string): string {\n return value.replace(/\\D/g, \"\").slice(0, 14);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration-codemod.d.ts","sourceRoot":"","sources":["../../src/cli/migration-codemod.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"migration-codemod.d.ts","sourceRoot":"","sources":["../../src/cli/migration-codemod.ts"],"names":[],"mappings":"AAaA,OAAO,EAML,KAAK,iBAAiB,EAEvB,MAAM,4CAA4C,CAAC;AAcpD,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACtC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACpE;AAqCD,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,GAClB,iBAAiB,EAAE,CAKrB;AAqBD,wBAAgB,qCAAqC,CACnD,WAAW,EAAE,MAAM,GAClB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAcrD;AAkaD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,2BAA2B,GACnC,sBAAsB,CAoDxB;AAiCD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,sBAAsB,EAC9B,IAAI,EAAE,MAAM,GACX,MAAM,CAIR"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
1
2
|
import fs from "node:fs";
|
|
2
3
|
import { createRequire } from "node:module";
|
|
3
4
|
import path from "node:path";
|
|
@@ -70,6 +71,52 @@ export function createMigrationPlanningTargetResolver(projectRoot) {
|
|
|
70
71
|
}
|
|
71
72
|
};
|
|
72
73
|
}
|
|
74
|
+
const FRESH_RESOLVE_SCRIPT = [
|
|
75
|
+
'const { createRequire } = require("node:module");',
|
|
76
|
+
"try {",
|
|
77
|
+
" createRequire(process.argv[1]).resolve(process.argv[2]);",
|
|
78
|
+
"} catch {",
|
|
79
|
+
" process.exitCode = 1;",
|
|
80
|
+
"}",
|
|
81
|
+
].join("\n");
|
|
82
|
+
function nodeConditionArgs() {
|
|
83
|
+
const conditions = [];
|
|
84
|
+
for (let index = 0; index < process.execArgv.length; index += 1) {
|
|
85
|
+
const argument = process.execArgv[index];
|
|
86
|
+
if (argument === "--conditions" || argument === "-C") {
|
|
87
|
+
const value = process.execArgv[index + 1];
|
|
88
|
+
if (value) {
|
|
89
|
+
conditions.push(argument, value);
|
|
90
|
+
index += 1;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if (argument.startsWith("--conditions=") ||
|
|
94
|
+
argument.startsWith("-C=")) {
|
|
95
|
+
conditions.push(argument);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return conditions;
|
|
99
|
+
}
|
|
100
|
+
function createFreshMigrationTargetResolver(projectRoot) {
|
|
101
|
+
const fallbackPath = path.join(path.resolve(projectRoot), "package.json");
|
|
102
|
+
const cache = new Map();
|
|
103
|
+
return (specifier, sourceFile = fallbackPath) => {
|
|
104
|
+
const resolutionBase = nearestPackageFile(sourceFile, projectRoot) ?? sourceFile;
|
|
105
|
+
const key = `${resolutionBase}\0${specifier}`;
|
|
106
|
+
const cached = cache.get(key);
|
|
107
|
+
if (cached !== undefined)
|
|
108
|
+
return cached;
|
|
109
|
+
const resolved = spawnSync(process.execPath, [
|
|
110
|
+
...nodeConditionArgs(),
|
|
111
|
+
"-e",
|
|
112
|
+
FRESH_RESOLVE_SCRIPT,
|
|
113
|
+
resolutionBase,
|
|
114
|
+
specifier,
|
|
115
|
+
], { stdio: "ignore" }).status === 0;
|
|
116
|
+
cache.set(key, resolved);
|
|
117
|
+
return resolved;
|
|
118
|
+
};
|
|
119
|
+
}
|
|
73
120
|
function nearestPackageFile(file, root) {
|
|
74
121
|
let directory = path.dirname(file);
|
|
75
122
|
const boundary = path.resolve(root);
|
|
@@ -305,16 +352,7 @@ export function runMigrationCodemods(options) {
|
|
|
305
352
|
const root = path.resolve(options.root);
|
|
306
353
|
const manifests = options.manifests ?? loadMigrationManifests(root);
|
|
307
354
|
const moves = mergeManifestMoves(manifests);
|
|
308
|
-
const targetExists = options.targetExists ??
|
|
309
|
-
((specifier, sourceFile = path.join(root, "package.json")) => {
|
|
310
|
-
try {
|
|
311
|
-
createRequire(sourceFile).resolve(specifier);
|
|
312
|
-
return true;
|
|
313
|
-
}
|
|
314
|
-
catch {
|
|
315
|
-
return false;
|
|
316
|
-
}
|
|
317
|
-
});
|
|
355
|
+
const targetExists = options.targetExists ?? createFreshMigrationTargetResolver(root);
|
|
318
356
|
const project = new Project({
|
|
319
357
|
skipAddingFilesFromTsConfig: true,
|
|
320
358
|
manipulationSettings: { quoteKind: QuoteKind.Double },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration-codemod.js","sourceRoot":"","sources":["../../src/cli/migration-codemod.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport {\n Project,\n QuoteKind,\n type ImportDeclaration,\n type ImportSpecifierStructure,\n type SourceFile,\n} from \"ts-morph\";\n\nimport {\n bundledCorePackageVersion,\n isMigrationManifestActive,\n loadMigrationManifestsForProject,\n migrationMoveStatus,\n resolveMigrationSymbolMove,\n type MigrationManifest,\n type MigrationMove,\n} from \"../package-lifecycle/migration-manifest.js\";\n\nconst SOURCE_EXTENSIONS = new Set([\".ts\", \".tsx\"]);\nconst SKIP_DIRECTORIES = new Set([\n \".git\",\n \".next\",\n \".output\",\n \".turbo\",\n \"build\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n]);\n\nexport interface MigrationCodemodFileChange {\n file: string;\n before: string;\n after: string;\n}\n\nexport interface MigrationCodemodResult {\n changes: MigrationCodemodFileChange[];\n dependencyFiles: string[];\n warnings: string[];\n}\n\nexport interface RunMigrationCodemodsOptions {\n root: string;\n manifests?: MigrationManifest[];\n apply?: boolean;\n targetExists?: (specifier: string, sourceFile?: string) => boolean;\n}\n\ninterface PendingDependency {\n packageFile: string;\n packageName: string;\n}\n\nfunction collectSourceFiles(root: string): string[] {\n const files: string[] = [];\n const visit = (directory: string): void => {\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n if (entry.isDirectory() && SKIP_DIRECTORIES.has(entry.name)) continue;\n const entryPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n visit(entryPath);\n } else if (\n SOURCE_EXTENSIONS.has(path.extname(entry.name)) &&\n !entry.name.endsWith(\".d.ts\")\n ) {\n files.push(entryPath);\n }\n }\n };\n visit(root);\n return files.sort();\n}\n\nfunction mergeManifestMoves(\n manifests: MigrationManifest[],\n): Record<string, MigrationMove> {\n const moves: Record<string, MigrationMove> = {};\n for (const manifest of manifests) {\n Object.assign(moves, manifest.moves);\n }\n return moves;\n}\n\nexport function loadMigrationManifests(\n projectRoot: string,\n): MigrationManifest[] {\n const packageVersion = bundledCorePackageVersion();\n return loadMigrationManifestsForProject(projectRoot).filter((manifest) =>\n isMigrationManifestActive(manifest, packageVersion),\n );\n}\n\nfunction packageNameFromSpecifier(specifier: string): string | null {\n if (specifier.startsWith(\"@\")) {\n const [scope, name] = specifier.split(\"/\");\n return scope && name ? `${scope}/${name}` : null;\n }\n const [name] = specifier.split(\"/\");\n return name && !name.startsWith(\".\") ? name : null;\n}\n\nfunction isPackageInstalled(\n requireFromProject: ReturnType<typeof createRequire>,\n packageName: string,\n): boolean {\n const searchPaths = requireFromProject.resolve.paths(packageName) ?? [];\n return searchPaths.some((searchPath) =>\n fs.existsSync(path.join(searchPath, packageName, \"package.json\")),\n );\n}\n\nexport function createMigrationPlanningTargetResolver(\n projectRoot: string,\n): (specifier: string, sourceFile?: string) => boolean {\n const fallbackPath = path.join(path.resolve(projectRoot), \"package.json\");\n return (specifier: string, sourceFile = fallbackPath): boolean => {\n const requireFromSource = createRequire(sourceFile);\n try {\n requireFromSource.resolve(specifier);\n return true;\n } catch {\n const packageName = packageNameFromSpecifier(specifier);\n return Boolean(\n packageName && !isPackageInstalled(requireFromSource, packageName),\n );\n }\n };\n}\n\nfunction nearestPackageFile(file: string, root: string): string | null {\n let directory = path.dirname(file);\n const boundary = path.resolve(root);\n while (directory.startsWith(boundary)) {\n const packageFile = path.join(directory, \"package.json\");\n if (fs.existsSync(packageFile)) return packageFile;\n if (directory === boundary) break;\n directory = path.dirname(directory);\n }\n return null;\n}\n\nfunction recordIntroducedDependency(\n pending: PendingDependency[],\n sourceFile: string,\n root: string,\n from: string,\n to: string,\n): void {\n const fromPackage = packageNameFromSpecifier(from);\n const toPackage = packageNameFromSpecifier(to);\n if (!toPackage || toPackage === fromPackage) return;\n const packageFile = nearestPackageFile(sourceFile, root);\n if (!packageFile) return;\n if (\n !pending.some(\n (entry) =>\n entry.packageFile === packageFile && entry.packageName === toPackage,\n )\n ) {\n pending.push({ packageFile, packageName: toPackage });\n }\n}\n\nfunction importedNameStructure(\n importedName: string,\n localName: string,\n nextName: string,\n typeOnly: boolean,\n): ImportSpecifierStructure {\n return {\n name: nextName,\n alias:\n localName !== nextName\n ? localName\n : importedName !== nextName\n ? importedName\n : undefined,\n isTypeOnly: typeOnly,\n };\n}\n\nfunction warnSkippedTarget(\n warnings: string[],\n sourceFile: string,\n target: string,\n reason: \"planned\" | \"unresolved\",\n): void {\n const message =\n reason === \"planned\"\n ? `${sourceFile}: migration to ${target} is planned but not active; no rewrite was applied`\n : `${sourceFile}: migration target ${target} is not exported by an installed package; no rewrite was applied`;\n if (!warnings.includes(message)) warnings.push(message);\n}\n\nfunction rewriteImportDeclaration(\n declaration: ImportDeclaration,\n move: MigrationMove,\n root: string,\n pendingDependencies: PendingDependency[],\n warnings: string[],\n targetExists: (specifier: string, sourceFile?: string) => boolean,\n): boolean {\n const originalSpecifier = declaration.getModuleSpecifierValue();\n const sourceFile = declaration.getSourceFile();\n const namedImports = declaration.getNamedImports();\n\n if (!move.symbols) {\n if (migrationMoveStatus(move) === \"planned\") {\n warnSkippedTarget(warnings, sourceFile.getFilePath(), move.to, \"planned\");\n return false;\n }\n if (!targetExists(move.to, sourceFile.getFilePath())) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n move.to,\n \"unresolved\",\n );\n return false;\n }\n declaration.setModuleSpecifier(move.to);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n move.to,\n );\n return originalSpecifier !== move.to;\n }\n\n if (namedImports.length === 0) {\n warnings.push(\n `${sourceFile.getFilePath()}: cannot split default, namespace, or side-effect import from ${originalSpecifier}`,\n );\n return false;\n }\n\n const groups = new Map<string, ImportSpecifierStructure[]>();\n const movedImports = new Set<(typeof namedImports)[number]>();\n for (const namedImport of namedImports) {\n const importedName = namedImport.getName();\n const resolved = resolveMigrationSymbolMove(move, importedName);\n if (!resolved || resolved.to === originalSpecifier) continue;\n if (resolved.status === \"planned\") {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"planned\",\n );\n continue;\n }\n if (!targetExists(resolved.to, sourceFile.getFilePath())) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"unresolved\",\n );\n continue;\n }\n const localName = namedImport.getAliasNode()?.getText() ?? importedName;\n const group = groups.get(resolved.to) ?? [];\n group.push(\n importedNameStructure(\n importedName,\n localName,\n resolved.name,\n !declaration.isTypeOnly() && namedImport.isTypeOnly(),\n ),\n );\n groups.set(resolved.to, group);\n movedImports.add(namedImport);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n resolved.to,\n );\n }\n if (groups.size === 0) return false;\n\n const declarationIndex = declaration.getChildIndex();\n for (const namedImport of movedImports) namedImport.remove();\n let offset = 1;\n for (const [target, imports] of groups) {\n sourceFile.insertImportDeclaration(declarationIndex + offset, {\n moduleSpecifier: target,\n isTypeOnly: declaration.isTypeOnly(),\n namedImports: imports,\n });\n offset += 1;\n }\n if (\n declaration.getNamedImports().length === 0 &&\n !declaration.getDefaultImport() &&\n !declaration.getNamespaceImport()\n ) {\n declaration.remove();\n }\n return true;\n}\n\nfunction rewriteExportDeclarations(\n sourceFile: SourceFile,\n moves: Record<string, MigrationMove>,\n root: string,\n pendingDependencies: PendingDependency[],\n warnings: string[],\n targetExists: (specifier: string, sourceFile?: string) => boolean,\n): void {\n for (const declaration of [...sourceFile.getExportDeclarations()]) {\n const originalSpecifier = declaration.getModuleSpecifierValue();\n if (!originalSpecifier) continue;\n const move = moves[originalSpecifier];\n if (!move) continue;\n const namedExports = declaration.getNamedExports();\n\n if (!move.symbols) {\n if (migrationMoveStatus(move) === \"planned\") {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n move.to,\n \"planned\",\n );\n continue;\n }\n if (!targetExists(move.to, sourceFile.getFilePath())) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n move.to,\n \"unresolved\",\n );\n continue;\n }\n declaration.setModuleSpecifier(move.to);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n move.to,\n );\n continue;\n }\n if (namedExports.length === 0) {\n warnings.push(\n `${sourceFile.getFilePath()}: cannot split export star from ${originalSpecifier}`,\n );\n continue;\n }\n\n const groups = new Map<\n string,\n Array<{ name: string; alias?: string; isTypeOnly?: boolean }>\n >();\n const movedExports = new Set<(typeof namedExports)[number]>();\n for (const namedExport of namedExports) {\n const exportedFromName = namedExport.getName();\n const resolved = resolveMigrationSymbolMove(move, exportedFromName);\n if (!resolved || resolved.to === originalSpecifier) continue;\n if (resolved.status === \"planned\") {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"planned\",\n );\n continue;\n }\n if (!targetExists(resolved.to, sourceFile.getFilePath())) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"unresolved\",\n );\n continue;\n }\n const publicName =\n namedExport.getAliasNode()?.getText() ?? exportedFromName;\n const group = groups.get(resolved.to) ?? [];\n group.push({\n name: resolved.name,\n alias:\n publicName !== resolved.name\n ? publicName\n : exportedFromName !== resolved.name\n ? exportedFromName\n : undefined,\n isTypeOnly:\n !declaration.isTypeOnly() && namedExport.isTypeOnly()\n ? true\n : undefined,\n });\n groups.set(resolved.to, group);\n movedExports.add(namedExport);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n resolved.to,\n );\n }\n if (groups.size === 0) continue;\n\n const declarationIndex = declaration.getChildIndex();\n for (const namedExport of movedExports) namedExport.remove();\n let offset = 1;\n for (const [target, exports] of groups) {\n sourceFile.insertExportDeclaration(declarationIndex + offset, {\n moduleSpecifier: target,\n isTypeOnly: declaration.isTypeOnly(),\n namedExports: exports,\n });\n offset += 1;\n }\n if (declaration.getNamedExports().length === 0) declaration.remove();\n }\n}\n\nfunction readPackageJson(packageFile: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(packageFile, \"utf-8\")) as Record<\n string,\n unknown\n >;\n } catch {\n return null;\n }\n}\n\nfunction addDependencies(\n pending: PendingDependency[],\n apply: boolean,\n): MigrationCodemodFileChange[] {\n const changes: MigrationCodemodFileChange[] = [];\n const byFile = new Map<string, Set<string>>();\n for (const entry of pending) {\n const packages = byFile.get(entry.packageFile) ?? new Set<string>();\n packages.add(entry.packageName);\n byFile.set(entry.packageFile, packages);\n }\n for (const [packageFile, packageNames] of byFile) {\n const packageJson = readPackageJson(packageFile);\n if (!packageJson) continue;\n const allDependencySections = [\n \"dependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"peerDependencies\",\n ];\n const missing = [...packageNames].filter(\n (packageName) =>\n !allDependencySections.some((section) => {\n const dependencies = packageJson[section];\n return (\n dependencies &&\n typeof dependencies === \"object\" &&\n packageName in dependencies\n );\n }),\n );\n if (missing.length === 0) continue;\n const before = `${JSON.stringify(packageJson, null, 2)}\\n`;\n const dependencies =\n packageJson.dependencies && typeof packageJson.dependencies === \"object\"\n ? (packageJson.dependencies as Record<string, string>)\n : {};\n for (const packageName of missing.sort())\n dependencies[packageName] = \"latest\";\n packageJson.dependencies = Object.fromEntries(\n Object.entries(dependencies).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n );\n const after = `${JSON.stringify(packageJson, null, 2)}\\n`;\n changes.push({ file: packageFile, before, after });\n if (apply) fs.writeFileSync(packageFile, after);\n }\n return changes;\n}\n\nexport function runMigrationCodemods(\n options: RunMigrationCodemodsOptions,\n): MigrationCodemodResult {\n const root = path.resolve(options.root);\n const manifests = options.manifests ?? loadMigrationManifests(root);\n const moves = mergeManifestMoves(manifests);\n const targetExists =\n options.targetExists ??\n ((specifier: string, sourceFile = path.join(root, \"package.json\")) => {\n try {\n createRequire(sourceFile).resolve(specifier);\n return true;\n } catch {\n return false;\n }\n });\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: { quoteKind: QuoteKind.Double },\n });\n const sourceFiles = project.addSourceFilesAtPaths(collectSourceFiles(root));\n const pendingDependencies: PendingDependency[] = [];\n const warnings: string[] = [];\n const changes: MigrationCodemodFileChange[] = [];\n\n for (const sourceFile of sourceFiles) {\n const before = sourceFile.getFullText();\n for (const declaration of [...sourceFile.getImportDeclarations()]) {\n const move = moves[declaration.getModuleSpecifierValue()];\n if (!move) continue;\n rewriteImportDeclaration(\n declaration,\n move,\n root,\n pendingDependencies,\n warnings,\n targetExists,\n );\n }\n rewriteExportDeclarations(\n sourceFile,\n moves,\n root,\n pendingDependencies,\n warnings,\n targetExists,\n );\n const after = sourceFile.getFullText();\n if (before === after) continue;\n changes.push({ file: sourceFile.getFilePath(), before, after });\n if (options.apply) sourceFile.saveSync();\n }\n\n const dependencyChanges = addDependencies(\n pendingDependencies,\n Boolean(options.apply),\n );\n return {\n changes: [...changes, ...dependencyChanges],\n dependencyFiles: dependencyChanges.map((change) => change.file),\n warnings,\n };\n}\n\nfunction focusedDiff(change: MigrationCodemodFileChange, root: string): string {\n const beforeLines = change.before.split(\"\\n\");\n const afterLines = change.after.split(\"\\n\");\n let prefix = 0;\n while (\n prefix < beforeLines.length &&\n prefix < afterLines.length &&\n beforeLines[prefix] === afterLines[prefix]\n ) {\n prefix += 1;\n }\n let suffix = 0;\n while (\n suffix < beforeLines.length - prefix &&\n suffix < afterLines.length - prefix &&\n beforeLines[beforeLines.length - 1 - suffix] ===\n afterLines[afterLines.length - 1 - suffix]\n ) {\n suffix += 1;\n }\n const beforeChanged = beforeLines.slice(prefix, beforeLines.length - suffix);\n const afterChanged = afterLines.slice(prefix, afterLines.length - suffix);\n return [\n `--- ${path.relative(root, change.file)}`,\n `+++ ${path.relative(root, change.file)}`,\n `@@ -${prefix + 1} +${prefix + 1} @@`,\n ...beforeChanged.map((line) => `-${line}`),\n ...afterChanged.map((line) => `+${line}`),\n ].join(\"\\n\");\n}\n\nexport function formatMigrationCodemodDiff(\n result: MigrationCodemodResult,\n root: string,\n): string {\n return result.changes\n .map((change) => focusedDiff(change, path.resolve(root)))\n .join(\"\\n\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"migration-codemod.js","sourceRoot":"","sources":["../../src/cli/migration-codemod.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport {\n Project,\n QuoteKind,\n type ImportDeclaration,\n type ImportSpecifierStructure,\n type SourceFile,\n} from \"ts-morph\";\n\nimport {\n bundledCorePackageVersion,\n isMigrationManifestActive,\n loadMigrationManifestsForProject,\n migrationMoveStatus,\n resolveMigrationSymbolMove,\n type MigrationManifest,\n type MigrationMove,\n} from \"../package-lifecycle/migration-manifest.js\";\n\nconst SOURCE_EXTENSIONS = new Set([\".ts\", \".tsx\"]);\nconst SKIP_DIRECTORIES = new Set([\n \".git\",\n \".next\",\n \".output\",\n \".turbo\",\n \"build\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n]);\n\nexport interface MigrationCodemodFileChange {\n file: string;\n before: string;\n after: string;\n}\n\nexport interface MigrationCodemodResult {\n changes: MigrationCodemodFileChange[];\n dependencyFiles: string[];\n warnings: string[];\n}\n\nexport interface RunMigrationCodemodsOptions {\n root: string;\n manifests?: MigrationManifest[];\n apply?: boolean;\n targetExists?: (specifier: string, sourceFile?: string) => boolean;\n}\n\ninterface PendingDependency {\n packageFile: string;\n packageName: string;\n}\n\nfunction collectSourceFiles(root: string): string[] {\n const files: string[] = [];\n const visit = (directory: string): void => {\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n if (entry.isDirectory() && SKIP_DIRECTORIES.has(entry.name)) continue;\n const entryPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n visit(entryPath);\n } else if (\n SOURCE_EXTENSIONS.has(path.extname(entry.name)) &&\n !entry.name.endsWith(\".d.ts\")\n ) {\n files.push(entryPath);\n }\n }\n };\n visit(root);\n return files.sort();\n}\n\nfunction mergeManifestMoves(\n manifests: MigrationManifest[],\n): Record<string, MigrationMove> {\n const moves: Record<string, MigrationMove> = {};\n for (const manifest of manifests) {\n Object.assign(moves, manifest.moves);\n }\n return moves;\n}\n\nexport function loadMigrationManifests(\n projectRoot: string,\n): MigrationManifest[] {\n const packageVersion = bundledCorePackageVersion();\n return loadMigrationManifestsForProject(projectRoot).filter((manifest) =>\n isMigrationManifestActive(manifest, packageVersion),\n );\n}\n\nfunction packageNameFromSpecifier(specifier: string): string | null {\n if (specifier.startsWith(\"@\")) {\n const [scope, name] = specifier.split(\"/\");\n return scope && name ? `${scope}/${name}` : null;\n }\n const [name] = specifier.split(\"/\");\n return name && !name.startsWith(\".\") ? name : null;\n}\n\nfunction isPackageInstalled(\n requireFromProject: ReturnType<typeof createRequire>,\n packageName: string,\n): boolean {\n const searchPaths = requireFromProject.resolve.paths(packageName) ?? [];\n return searchPaths.some((searchPath) =>\n fs.existsSync(path.join(searchPath, packageName, \"package.json\")),\n );\n}\n\nexport function createMigrationPlanningTargetResolver(\n projectRoot: string,\n): (specifier: string, sourceFile?: string) => boolean {\n const fallbackPath = path.join(path.resolve(projectRoot), \"package.json\");\n return (specifier: string, sourceFile = fallbackPath): boolean => {\n const requireFromSource = createRequire(sourceFile);\n try {\n requireFromSource.resolve(specifier);\n return true;\n } catch {\n const packageName = packageNameFromSpecifier(specifier);\n return Boolean(\n packageName && !isPackageInstalled(requireFromSource, packageName),\n );\n }\n };\n}\n\nconst FRESH_RESOLVE_SCRIPT = [\n 'const { createRequire } = require(\"node:module\");',\n \"try {\",\n \" createRequire(process.argv[1]).resolve(process.argv[2]);\",\n \"} catch {\",\n \" process.exitCode = 1;\",\n \"}\",\n].join(\"\\n\");\n\nfunction nodeConditionArgs(): string[] {\n const conditions: string[] = [];\n for (let index = 0; index < process.execArgv.length; index += 1) {\n const argument = process.execArgv[index];\n if (argument === \"--conditions\" || argument === \"-C\") {\n const value = process.execArgv[index + 1];\n if (value) {\n conditions.push(argument, value);\n index += 1;\n }\n } else if (\n argument.startsWith(\"--conditions=\") ||\n argument.startsWith(\"-C=\")\n ) {\n conditions.push(argument);\n }\n }\n return conditions;\n}\n\nfunction createFreshMigrationTargetResolver(\n projectRoot: string,\n): (specifier: string, sourceFile?: string) => boolean {\n const fallbackPath = path.join(path.resolve(projectRoot), \"package.json\");\n const cache = new Map<string, boolean>();\n return (specifier: string, sourceFile = fallbackPath): boolean => {\n const resolutionBase =\n nearestPackageFile(sourceFile, projectRoot) ?? sourceFile;\n const key = `${resolutionBase}\\0${specifier}`;\n const cached = cache.get(key);\n if (cached !== undefined) return cached;\n const resolved =\n spawnSync(\n process.execPath,\n [\n ...nodeConditionArgs(),\n \"-e\",\n FRESH_RESOLVE_SCRIPT,\n resolutionBase,\n specifier,\n ],\n { stdio: \"ignore\" },\n ).status === 0;\n cache.set(key, resolved);\n return resolved;\n };\n}\n\nfunction nearestPackageFile(file: string, root: string): string | null {\n let directory = path.dirname(file);\n const boundary = path.resolve(root);\n while (directory.startsWith(boundary)) {\n const packageFile = path.join(directory, \"package.json\");\n if (fs.existsSync(packageFile)) return packageFile;\n if (directory === boundary) break;\n directory = path.dirname(directory);\n }\n return null;\n}\n\nfunction recordIntroducedDependency(\n pending: PendingDependency[],\n sourceFile: string,\n root: string,\n from: string,\n to: string,\n): void {\n const fromPackage = packageNameFromSpecifier(from);\n const toPackage = packageNameFromSpecifier(to);\n if (!toPackage || toPackage === fromPackage) return;\n const packageFile = nearestPackageFile(sourceFile, root);\n if (!packageFile) return;\n if (\n !pending.some(\n (entry) =>\n entry.packageFile === packageFile && entry.packageName === toPackage,\n )\n ) {\n pending.push({ packageFile, packageName: toPackage });\n }\n}\n\nfunction importedNameStructure(\n importedName: string,\n localName: string,\n nextName: string,\n typeOnly: boolean,\n): ImportSpecifierStructure {\n return {\n name: nextName,\n alias:\n localName !== nextName\n ? localName\n : importedName !== nextName\n ? importedName\n : undefined,\n isTypeOnly: typeOnly,\n };\n}\n\nfunction warnSkippedTarget(\n warnings: string[],\n sourceFile: string,\n target: string,\n reason: \"planned\" | \"unresolved\",\n): void {\n const message =\n reason === \"planned\"\n ? `${sourceFile}: migration to ${target} is planned but not active; no rewrite was applied`\n : `${sourceFile}: migration target ${target} is not exported by an installed package; no rewrite was applied`;\n if (!warnings.includes(message)) warnings.push(message);\n}\n\nfunction rewriteImportDeclaration(\n declaration: ImportDeclaration,\n move: MigrationMove,\n root: string,\n pendingDependencies: PendingDependency[],\n warnings: string[],\n targetExists: (specifier: string, sourceFile?: string) => boolean,\n): boolean {\n const originalSpecifier = declaration.getModuleSpecifierValue();\n const sourceFile = declaration.getSourceFile();\n const namedImports = declaration.getNamedImports();\n\n if (!move.symbols) {\n if (migrationMoveStatus(move) === \"planned\") {\n warnSkippedTarget(warnings, sourceFile.getFilePath(), move.to, \"planned\");\n return false;\n }\n if (!targetExists(move.to, sourceFile.getFilePath())) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n move.to,\n \"unresolved\",\n );\n return false;\n }\n declaration.setModuleSpecifier(move.to);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n move.to,\n );\n return originalSpecifier !== move.to;\n }\n\n if (namedImports.length === 0) {\n warnings.push(\n `${sourceFile.getFilePath()}: cannot split default, namespace, or side-effect import from ${originalSpecifier}`,\n );\n return false;\n }\n\n const groups = new Map<string, ImportSpecifierStructure[]>();\n const movedImports = new Set<(typeof namedImports)[number]>();\n for (const namedImport of namedImports) {\n const importedName = namedImport.getName();\n const resolved = resolveMigrationSymbolMove(move, importedName);\n if (!resolved || resolved.to === originalSpecifier) continue;\n if (resolved.status === \"planned\") {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"planned\",\n );\n continue;\n }\n if (!targetExists(resolved.to, sourceFile.getFilePath())) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"unresolved\",\n );\n continue;\n }\n const localName = namedImport.getAliasNode()?.getText() ?? importedName;\n const group = groups.get(resolved.to) ?? [];\n group.push(\n importedNameStructure(\n importedName,\n localName,\n resolved.name,\n !declaration.isTypeOnly() && namedImport.isTypeOnly(),\n ),\n );\n groups.set(resolved.to, group);\n movedImports.add(namedImport);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n resolved.to,\n );\n }\n if (groups.size === 0) return false;\n\n const declarationIndex = declaration.getChildIndex();\n for (const namedImport of movedImports) namedImport.remove();\n let offset = 1;\n for (const [target, imports] of groups) {\n sourceFile.insertImportDeclaration(declarationIndex + offset, {\n moduleSpecifier: target,\n isTypeOnly: declaration.isTypeOnly(),\n namedImports: imports,\n });\n offset += 1;\n }\n if (\n declaration.getNamedImports().length === 0 &&\n !declaration.getDefaultImport() &&\n !declaration.getNamespaceImport()\n ) {\n declaration.remove();\n }\n return true;\n}\n\nfunction rewriteExportDeclarations(\n sourceFile: SourceFile,\n moves: Record<string, MigrationMove>,\n root: string,\n pendingDependencies: PendingDependency[],\n warnings: string[],\n targetExists: (specifier: string, sourceFile?: string) => boolean,\n): void {\n for (const declaration of [...sourceFile.getExportDeclarations()]) {\n const originalSpecifier = declaration.getModuleSpecifierValue();\n if (!originalSpecifier) continue;\n const move = moves[originalSpecifier];\n if (!move) continue;\n const namedExports = declaration.getNamedExports();\n\n if (!move.symbols) {\n if (migrationMoveStatus(move) === \"planned\") {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n move.to,\n \"planned\",\n );\n continue;\n }\n if (!targetExists(move.to, sourceFile.getFilePath())) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n move.to,\n \"unresolved\",\n );\n continue;\n }\n declaration.setModuleSpecifier(move.to);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n move.to,\n );\n continue;\n }\n if (namedExports.length === 0) {\n warnings.push(\n `${sourceFile.getFilePath()}: cannot split export star from ${originalSpecifier}`,\n );\n continue;\n }\n\n const groups = new Map<\n string,\n Array<{ name: string; alias?: string; isTypeOnly?: boolean }>\n >();\n const movedExports = new Set<(typeof namedExports)[number]>();\n for (const namedExport of namedExports) {\n const exportedFromName = namedExport.getName();\n const resolved = resolveMigrationSymbolMove(move, exportedFromName);\n if (!resolved || resolved.to === originalSpecifier) continue;\n if (resolved.status === \"planned\") {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"planned\",\n );\n continue;\n }\n if (!targetExists(resolved.to, sourceFile.getFilePath())) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"unresolved\",\n );\n continue;\n }\n const publicName =\n namedExport.getAliasNode()?.getText() ?? exportedFromName;\n const group = groups.get(resolved.to) ?? [];\n group.push({\n name: resolved.name,\n alias:\n publicName !== resolved.name\n ? publicName\n : exportedFromName !== resolved.name\n ? exportedFromName\n : undefined,\n isTypeOnly:\n !declaration.isTypeOnly() && namedExport.isTypeOnly()\n ? true\n : undefined,\n });\n groups.set(resolved.to, group);\n movedExports.add(namedExport);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n resolved.to,\n );\n }\n if (groups.size === 0) continue;\n\n const declarationIndex = declaration.getChildIndex();\n for (const namedExport of movedExports) namedExport.remove();\n let offset = 1;\n for (const [target, exports] of groups) {\n sourceFile.insertExportDeclaration(declarationIndex + offset, {\n moduleSpecifier: target,\n isTypeOnly: declaration.isTypeOnly(),\n namedExports: exports,\n });\n offset += 1;\n }\n if (declaration.getNamedExports().length === 0) declaration.remove();\n }\n}\n\nfunction readPackageJson(packageFile: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(packageFile, \"utf-8\")) as Record<\n string,\n unknown\n >;\n } catch {\n return null;\n }\n}\n\nfunction addDependencies(\n pending: PendingDependency[],\n apply: boolean,\n): MigrationCodemodFileChange[] {\n const changes: MigrationCodemodFileChange[] = [];\n const byFile = new Map<string, Set<string>>();\n for (const entry of pending) {\n const packages = byFile.get(entry.packageFile) ?? new Set<string>();\n packages.add(entry.packageName);\n byFile.set(entry.packageFile, packages);\n }\n for (const [packageFile, packageNames] of byFile) {\n const packageJson = readPackageJson(packageFile);\n if (!packageJson) continue;\n const allDependencySections = [\n \"dependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"peerDependencies\",\n ];\n const missing = [...packageNames].filter(\n (packageName) =>\n !allDependencySections.some((section) => {\n const dependencies = packageJson[section];\n return (\n dependencies &&\n typeof dependencies === \"object\" &&\n packageName in dependencies\n );\n }),\n );\n if (missing.length === 0) continue;\n const before = `${JSON.stringify(packageJson, null, 2)}\\n`;\n const dependencies =\n packageJson.dependencies && typeof packageJson.dependencies === \"object\"\n ? (packageJson.dependencies as Record<string, string>)\n : {};\n for (const packageName of missing.sort())\n dependencies[packageName] = \"latest\";\n packageJson.dependencies = Object.fromEntries(\n Object.entries(dependencies).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n );\n const after = `${JSON.stringify(packageJson, null, 2)}\\n`;\n changes.push({ file: packageFile, before, after });\n if (apply) fs.writeFileSync(packageFile, after);\n }\n return changes;\n}\n\nexport function runMigrationCodemods(\n options: RunMigrationCodemodsOptions,\n): MigrationCodemodResult {\n const root = path.resolve(options.root);\n const manifests = options.manifests ?? loadMigrationManifests(root);\n const moves = mergeManifestMoves(manifests);\n const targetExists =\n options.targetExists ?? createFreshMigrationTargetResolver(root);\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: { quoteKind: QuoteKind.Double },\n });\n const sourceFiles = project.addSourceFilesAtPaths(collectSourceFiles(root));\n const pendingDependencies: PendingDependency[] = [];\n const warnings: string[] = [];\n const changes: MigrationCodemodFileChange[] = [];\n\n for (const sourceFile of sourceFiles) {\n const before = sourceFile.getFullText();\n for (const declaration of [...sourceFile.getImportDeclarations()]) {\n const move = moves[declaration.getModuleSpecifierValue()];\n if (!move) continue;\n rewriteImportDeclaration(\n declaration,\n move,\n root,\n pendingDependencies,\n warnings,\n targetExists,\n );\n }\n rewriteExportDeclarations(\n sourceFile,\n moves,\n root,\n pendingDependencies,\n warnings,\n targetExists,\n );\n const after = sourceFile.getFullText();\n if (before === after) continue;\n changes.push({ file: sourceFile.getFilePath(), before, after });\n if (options.apply) sourceFile.saveSync();\n }\n\n const dependencyChanges = addDependencies(\n pendingDependencies,\n Boolean(options.apply),\n );\n return {\n changes: [...changes, ...dependencyChanges],\n dependencyFiles: dependencyChanges.map((change) => change.file),\n warnings,\n };\n}\n\nfunction focusedDiff(change: MigrationCodemodFileChange, root: string): string {\n const beforeLines = change.before.split(\"\\n\");\n const afterLines = change.after.split(\"\\n\");\n let prefix = 0;\n while (\n prefix < beforeLines.length &&\n prefix < afterLines.length &&\n beforeLines[prefix] === afterLines[prefix]\n ) {\n prefix += 1;\n }\n let suffix = 0;\n while (\n suffix < beforeLines.length - prefix &&\n suffix < afterLines.length - prefix &&\n beforeLines[beforeLines.length - 1 - suffix] ===\n afterLines[afterLines.length - 1 - suffix]\n ) {\n suffix += 1;\n }\n const beforeChanged = beforeLines.slice(prefix, beforeLines.length - suffix);\n const afterChanged = afterLines.slice(prefix, afterLines.length - suffix);\n return [\n `--- ${path.relative(root, change.file)}`,\n `+++ ${path.relative(root, change.file)}`,\n `@@ -${prefix + 1} +${prefix + 1} @@`,\n ...beforeChanged.map((line) => `-${line}`),\n ...afterChanged.map((line) => `+${line}`),\n ].join(\"\\n\");\n}\n\nexport function formatMigrationCodemodDiff(\n result: MigrationCodemodResult,\n root: string,\n): string {\n return result.changes\n .map((change) => focusedDiff(change, path.resolve(root)))\n .join(\"\\n\");\n}\n"]}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
export type MultiFrontierPhase = "proposing" | "cross_review" | "converging" | "awaiting_go" | "implementing" | "checkpoint_review" | "paused" | "completed" | "failed" | "canceled";
|
|
2
|
+
export type MultiFrontierParticipantRole = "driver" | "watchdog";
|
|
3
|
+
export type MultiFrontierParticipantPermission = "read_only" | "workspace_write";
|
|
4
|
+
export type MultiFrontierParticipantStatus = "idle" | "running" | "waiting" | "failed" | "completed";
|
|
5
|
+
export type MultiFrontierApprovalState = "not_required" | "pending" | "approved" | "rejected";
|
|
6
|
+
export type MultiFrontierRecoveryReason = "main_process_restarted" | "driver_crashed" | "watchdog_crashed" | "app_quit" | "canceled";
|
|
7
|
+
export interface MultiFrontierParticipantState {
|
|
8
|
+
participantId: string;
|
|
9
|
+
provider: string;
|
|
10
|
+
runtime: string;
|
|
11
|
+
model?: string;
|
|
12
|
+
capabilities?: string[];
|
|
13
|
+
sessionRef?: string;
|
|
14
|
+
role: MultiFrontierParticipantRole;
|
|
15
|
+
permission: MultiFrontierParticipantPermission;
|
|
16
|
+
status: MultiFrontierParticipantStatus;
|
|
17
|
+
}
|
|
18
|
+
export interface MultiFrontierDriverLease {
|
|
19
|
+
participantId: string;
|
|
20
|
+
generation: number;
|
|
21
|
+
leaseState: "inactive" | "active" | "revoked";
|
|
22
|
+
}
|
|
23
|
+
export interface MultiFrontierApproval {
|
|
24
|
+
state: MultiFrontierApprovalState;
|
|
25
|
+
proposalId?: string;
|
|
26
|
+
reviewPacketId?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface MultiFrontierRecovery {
|
|
29
|
+
reason: MultiFrontierRecoveryReason;
|
|
30
|
+
recoveredAt: string;
|
|
31
|
+
resumablePhase: MultiFrontierPhase;
|
|
32
|
+
checkpointId?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The durable state contract shared by the main process and every participant.
|
|
36
|
+
* Only the main-process coordinator writes it through this module.
|
|
37
|
+
*/
|
|
38
|
+
export interface MultiFrontierRunState {
|
|
39
|
+
schemaVersion: 1;
|
|
40
|
+
collaborationId: string;
|
|
41
|
+
phase: MultiFrontierPhase;
|
|
42
|
+
participants: MultiFrontierParticipantState[];
|
|
43
|
+
driver: MultiFrontierDriverLease | null;
|
|
44
|
+
approval: MultiFrontierApproval;
|
|
45
|
+
checkpointIds: string[];
|
|
46
|
+
round: number;
|
|
47
|
+
proposalIds: string[];
|
|
48
|
+
reviewIds: string[];
|
|
49
|
+
recovery?: MultiFrontierRecovery;
|
|
50
|
+
}
|
|
51
|
+
export interface CreateMultiFrontierRunInput {
|
|
52
|
+
collaborationId: string;
|
|
53
|
+
phase?: MultiFrontierPhase;
|
|
54
|
+
participants: MultiFrontierParticipantState[];
|
|
55
|
+
approval?: MultiFrontierApproval;
|
|
56
|
+
checkpointIds?: string[];
|
|
57
|
+
}
|
|
58
|
+
export interface RecoverMultiFrontierRunInput {
|
|
59
|
+
now: string;
|
|
60
|
+
reason: MultiFrontierRecoveryReason;
|
|
61
|
+
}
|
|
62
|
+
export interface MultiFrontierParticipantEvent {
|
|
63
|
+
participantId: string;
|
|
64
|
+
generation?: number;
|
|
65
|
+
permission: MultiFrontierParticipantPermission;
|
|
66
|
+
}
|
|
67
|
+
export interface PersistedMultiFrontierParticipantEvent extends MultiFrontierParticipantEvent {
|
|
68
|
+
schemaVersion: 1;
|
|
69
|
+
id: string;
|
|
70
|
+
collaborationId: string;
|
|
71
|
+
createdAt: string;
|
|
72
|
+
status?: MultiFrontierParticipantStatus;
|
|
73
|
+
}
|
|
74
|
+
export interface AppendMultiFrontierParticipantEventInput extends MultiFrontierParticipantEvent {
|
|
75
|
+
id: string;
|
|
76
|
+
collaborationId: string;
|
|
77
|
+
createdAt?: string;
|
|
78
|
+
status?: MultiFrontierParticipantStatus;
|
|
79
|
+
}
|
|
80
|
+
export interface MultiFrontierStoredRun extends MultiFrontierRunState {
|
|
81
|
+
createdAt: string;
|
|
82
|
+
updatedAt: string;
|
|
83
|
+
}
|
|
84
|
+
export type AppendMultiFrontierParticipantEventResult = {
|
|
85
|
+
accepted: true;
|
|
86
|
+
deduplicated: boolean;
|
|
87
|
+
event: PersistedMultiFrontierParticipantEvent;
|
|
88
|
+
run: MultiFrontierStoredRun;
|
|
89
|
+
} | {
|
|
90
|
+
accepted: false;
|
|
91
|
+
reason: "missing-run" | "stale-driver" | "missing-participant" | "event-conflict" | "terminal-participant";
|
|
92
|
+
run: MultiFrontierStoredRun | null;
|
|
93
|
+
};
|
|
94
|
+
/** All multi-frontier state stays alongside the existing local Code store. */
|
|
95
|
+
export declare function multiFrontierRunsStoreRoot(): string;
|
|
96
|
+
export declare function multiFrontierRunsDir(): string;
|
|
97
|
+
export declare function multiFrontierParticipantEventsDir(): string;
|
|
98
|
+
export declare function createMultiFrontierRun(input: CreateMultiFrontierRunInput): MultiFrontierStoredRun;
|
|
99
|
+
export declare function getMultiFrontierRun(collaborationId: string): MultiFrontierStoredRun | null;
|
|
100
|
+
export declare function listMultiFrontierRuns(): MultiFrontierStoredRun[];
|
|
101
|
+
/**
|
|
102
|
+
* Recovery never resumes a native participant automatically. Any in-flight
|
|
103
|
+
* driver lease is revoked and requires an explicit, newly fenced activation.
|
|
104
|
+
*/
|
|
105
|
+
export declare function recoverMultiFrontierRun(state: MultiFrontierRunState, input: RecoverMultiFrontierRunInput): MultiFrontierRunState;
|
|
106
|
+
/** Persist the recovery decision made by the main-process coordinator. */
|
|
107
|
+
export declare function recoverStoredMultiFrontierRun(collaborationId: string, input: RecoverMultiFrontierRunInput): MultiFrontierStoredRun | null;
|
|
108
|
+
/**
|
|
109
|
+
* Coordinators must call this before applying a participant event. Write
|
|
110
|
+
* events are accepted only from the active driver generation.
|
|
111
|
+
*/
|
|
112
|
+
export declare function canApplyMultiFrontierParticipantEvent(state: MultiFrontierRunState, event: MultiFrontierParticipantEvent): boolean;
|
|
113
|
+
/**
|
|
114
|
+
* Explicitly restores a write lease after recovery. The generation increments
|
|
115
|
+
* so an event from the interrupted process can never regain write authority.
|
|
116
|
+
*/
|
|
117
|
+
export declare function reactivateMultiFrontierDriver(state: MultiFrontierRunState, participantId: string): MultiFrontierRunState | null;
|
|
118
|
+
/** Assign the first explicit write lease for an implementing run. */
|
|
119
|
+
export declare function activateMultiFrontierDriver(state: MultiFrontierRunState, participantId: string): MultiFrontierRunState | null;
|
|
120
|
+
/** Persist the first explicit driver activation from the main-process coordinator. */
|
|
121
|
+
export declare function activateStoredMultiFrontierDriver(collaborationId: string, participantId: string, now?: string): MultiFrontierStoredRun | null;
|
|
122
|
+
/** Persist an explicit driver reactivation after the human-approved resume. */
|
|
123
|
+
export declare function reactivateStoredMultiFrontierDriver(collaborationId: string, participantId: string, now?: string): MultiFrontierStoredRun | null;
|
|
124
|
+
/**
|
|
125
|
+
* Appends an idempotent participant event after the coordinator has fenced it.
|
|
126
|
+
* The event journal is diagnostic; state is mutated only through this guarded
|
|
127
|
+
* coordinator entry point.
|
|
128
|
+
*/
|
|
129
|
+
export declare function appendMultiFrontierParticipantEvent(input: AppendMultiFrontierParticipantEventInput): AppendMultiFrontierParticipantEventResult;
|
|
130
|
+
export declare function listMultiFrontierParticipantEvents(collaborationId: string): PersistedMultiFrontierParticipantEvent[];
|
|
131
|
+
//# sourceMappingURL=multi-frontier-runs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-frontier-runs.d.ts","sourceRoot":"","sources":["../../src/cli/multi-frontier-runs.ts"],"names":[],"mappings":"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"}
|