@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.
Files changed (109) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +18 -0
  3. package/corpus/core/package.json +3 -1
  4. package/corpus/core/src/cli/code-agent-executor.ts +17 -5
  5. package/corpus/core/src/cli/code-agent-runs.ts +43 -2
  6. package/corpus/core/src/cli/migration-codemod.ts +59 -9
  7. package/corpus/core/src/cli/multi-frontier-runs.ts +841 -0
  8. package/corpus/core/src/coding-tools/index.ts +27 -8
  9. package/corpus/core/src/embeddings/index.ts +233 -0
  10. package/corpus/core/src/index.ts +2 -0
  11. package/corpus/core/src/search/index.ts +413 -0
  12. package/corpus/templates/brain/.agents/skills/brain/RUNBOOK.md +48 -5
  13. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +46 -14
  14. package/corpus/templates/brain/README.md +34 -3
  15. package/corpus/templates/brain/actions/approve-proposal.ts +2 -0
  16. package/corpus/templates/brain/actions/claim-distillation.ts +24 -27
  17. package/corpus/templates/brain/actions/create-source.ts +1 -1
  18. package/corpus/templates/brain/actions/get-knowledge.ts +6 -2
  19. package/corpus/templates/brain/actions/get-pilot-report.ts +44 -8
  20. package/corpus/templates/brain/actions/import-capture.ts +21 -9
  21. package/corpus/templates/brain/actions/import-transcript.ts +42 -14
  22. package/corpus/templates/brain/actions/list-captures.ts +10 -1
  23. package/corpus/templates/brain/actions/list-distillation-queue.ts +39 -14
  24. package/corpus/templates/brain/actions/list-projects.ts +51 -0
  25. package/corpus/templates/brain/actions/list-proposals.ts +80 -4
  26. package/corpus/templates/brain/actions/list-sources.ts +17 -3
  27. package/corpus/templates/brain/actions/manage-project.ts +118 -0
  28. package/corpus/templates/brain/actions/mark-capture-distilled.ts +68 -20
  29. package/corpus/templates/brain/actions/navigate.ts +1 -0
  30. package/corpus/templates/brain/actions/reject-proposal.ts +6 -1
  31. package/corpus/templates/brain/actions/resanitize-captures.ts +159 -33
  32. package/corpus/templates/brain/actions/review-proposal.ts +2 -0
  33. package/corpus/templates/brain/actions/search-everything.ts +10 -1
  34. package/corpus/templates/brain/actions/search-knowledge.ts +1 -1
  35. package/corpus/templates/brain/actions/set-settings.ts +36 -1
  36. package/corpus/templates/brain/actions/update-proposal.ts +2 -0
  37. package/corpus/templates/brain/app/hooks/use-distillation-bridge.ts +18 -9
  38. package/corpus/templates/brain/app/hooks/use-navigation-state.ts +3 -0
  39. package/corpus/templates/brain/app/i18n-data.ts +731 -2
  40. package/corpus/templates/brain/app/lib/brain.ts +33 -1
  41. package/corpus/templates/brain/app/routes/ops.tsx +47 -0
  42. package/corpus/templates/brain/app/routes/review.tsx +41 -2
  43. package/corpus/templates/brain/app/routes/search.tsx +33 -2
  44. package/corpus/templates/brain/app/routes/settings.tsx +158 -0
  45. package/corpus/templates/brain/app/routes/sources.tsx +31 -0
  46. package/corpus/templates/brain/changelog/2026-07-19-added-private-source-safe-semantic-search.md +6 -0
  47. package/corpus/templates/brain/jobs/process-ingest-queue.ts +270 -36
  48. package/corpus/templates/brain/package.json +1 -0
  49. package/corpus/templates/brain/server/db/index.ts +18 -0
  50. package/corpus/templates/brain/server/db/schema.ts +197 -1
  51. package/corpus/templates/brain/server/jobs/distillation-queue.ts +12 -5
  52. package/corpus/templates/brain/server/lib/audiences.ts +708 -0
  53. package/corpus/templates/brain/server/lib/brain-health.ts +251 -38
  54. package/corpus/templates/brain/server/lib/brain.ts +877 -50
  55. package/corpus/templates/brain/server/lib/capture-sanitization.ts +217 -53
  56. package/corpus/templates/brain/server/lib/connectors.ts +556 -70
  57. package/corpus/templates/brain/server/lib/demo.ts +17 -4
  58. package/corpus/templates/brain/server/lib/hybrid-search.ts +363 -0
  59. package/corpus/templates/brain/server/lib/ingest-queue.ts +104 -0
  60. package/corpus/templates/brain/server/lib/privacy-readiness.ts +24 -0
  61. package/corpus/templates/brain/server/lib/search-index-contracts.ts +72 -0
  62. package/corpus/templates/brain/server/lib/search-index.ts +714 -0
  63. package/corpus/templates/brain/server/lib/search.ts +120 -4
  64. package/corpus/templates/brain/server/lib/sensitivity-policy.ts +174 -0
  65. package/corpus/templates/brain/server/lib/slack-events.ts +281 -0
  66. package/corpus/templates/brain/server/onboarding.ts +29 -0
  67. package/corpus/templates/brain/server/plugins/db.ts +204 -0
  68. package/corpus/templates/brain/server/register-secrets.ts +46 -0
  69. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +36 -16
  70. package/corpus/templates/brain/server/routes/api/_agent-native/brain/slack-events.post.ts +28 -0
  71. package/corpus/templates/brain/shared/types.ts +10 -0
  72. package/dist/cli/code-agent-executor.d.ts +8 -9
  73. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  74. package/dist/cli/code-agent-executor.js +9 -3
  75. package/dist/cli/code-agent-executor.js.map +1 -1
  76. package/dist/cli/code-agent-runs.d.ts +5 -0
  77. package/dist/cli/code-agent-runs.d.ts.map +1 -1
  78. package/dist/cli/code-agent-runs.js +33 -2
  79. package/dist/cli/code-agent-runs.js.map +1 -1
  80. package/dist/cli/migration-codemod.d.ts.map +1 -1
  81. package/dist/cli/migration-codemod.js +48 -10
  82. package/dist/cli/migration-codemod.js.map +1 -1
  83. package/dist/cli/multi-frontier-runs.d.ts +131 -0
  84. package/dist/cli/multi-frontier-runs.d.ts.map +1 -0
  85. package/dist/cli/multi-frontier-runs.js +529 -0
  86. package/dist/cli/multi-frontier-runs.js.map +1 -0
  87. package/dist/coding-tools/index.d.ts +1 -0
  88. package/dist/coding-tools/index.d.ts.map +1 -1
  89. package/dist/coding-tools/index.js +25 -7
  90. package/dist/coding-tools/index.js.map +1 -1
  91. package/dist/collab/awareness.d.ts +2 -2
  92. package/dist/collab/awareness.d.ts.map +1 -1
  93. package/dist/embeddings/index.d.ts +24 -0
  94. package/dist/embeddings/index.d.ts.map +1 -0
  95. package/dist/embeddings/index.js +172 -0
  96. package/dist/embeddings/index.js.map +1 -0
  97. package/dist/index.d.ts +2 -0
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +2 -0
  100. package/dist/index.js.map +1 -1
  101. package/dist/notifications/routes.d.ts +3 -3
  102. package/dist/progress/routes.d.ts +1 -1
  103. package/dist/resources/handlers.d.ts +1 -1
  104. package/dist/search/index.d.ts +88 -0
  105. package/dist/search/index.d.ts.map +1 -0
  106. package/dist/search/index.js +267 -0
  107. package/dist/search/index.js.map +1 -0
  108. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  109. 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
- fs.writeFileSync(codeAgentRunRecordPath(record.id), `${JSON.stringify(record, null, 2)}\n`);
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: `evt-${timestampSlug(createdAt)}-${crypto.randomUUID().slice(0, 8)}`,
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":"AAYA,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;AAyWD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,2BAA2B,GACnC,sBAAsB,CA4DxB;AAiCD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,sBAAsB,EAC9B,IAAI,EAAE,MAAM,GACX,MAAM,CAIR"}
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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"}