@covro/covro 0.0.0-stage → 0.1.0-dev.1

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 (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +173 -2
  3. package/README.zh-CN.md +174 -0
  4. package/bin/covro.mjs +8 -0
  5. package/dist/cli/control.js +66 -0
  6. package/dist/cli/control.js.map +7 -0
  7. package/dist/cli/daemon.js +118 -0
  8. package/dist/cli/daemon.js.map +7 -0
  9. package/dist/cli/main.js +152 -0
  10. package/dist/cli/main.js.map +7 -0
  11. package/dist/cli/paths.js +60 -0
  12. package/dist/cli/paths.js.map +7 -0
  13. package/dist/cli/service.js +87 -0
  14. package/dist/cli/service.js.map +7 -0
  15. package/dist/codex/adapter.js +1195 -0
  16. package/dist/codex/adapter.js.map +7 -0
  17. package/dist/codex/auto-review.js +102 -0
  18. package/dist/codex/auto-review.js.map +7 -0
  19. package/dist/codex/compatibility.js +7 -0
  20. package/dist/codex/compatibility.js.map +7 -0
  21. package/dist/codex/mapping.js +210 -0
  22. package/dist/codex/mapping.js.map +7 -0
  23. package/dist/codex/permissions.js +51 -0
  24. package/dist/codex/permissions.js.map +7 -0
  25. package/dist/codex/thread-title-policy.js +52 -0
  26. package/dist/codex/thread-title-policy.js.map +7 -0
  27. package/dist/codex/thread-titles.js +259 -0
  28. package/dist/codex/thread-titles.js.map +7 -0
  29. package/dist/codex/transport.js +236 -0
  30. package/dist/codex/transport.js.map +7 -0
  31. package/dist/codex/turn-token-usage.js +46 -0
  32. package/dist/codex/turn-token-usage.js.map +7 -0
  33. package/dist/codex/types.js +1 -0
  34. package/dist/codex/types.js.map +7 -0
  35. package/dist/drizzle/0000_past_wildside.sql +45 -0
  36. package/dist/drizzle/0001_shocking_ender_wiggin.sql +2 -0
  37. package/dist/drizzle/0002_allow_parallel_threads.sql +1 -0
  38. package/dist/drizzle/0003_project_registrations.sql +11 -0
  39. package/dist/drizzle/0004_turn_usage.sql +6 -0
  40. package/dist/drizzle/meta/0000_snapshot.json +309 -0
  41. package/dist/drizzle/meta/0001_snapshot.json +323 -0
  42. package/dist/drizzle/meta/0002_snapshot.json +315 -0
  43. package/dist/drizzle/meta/0003_snapshot.json +381 -0
  44. package/dist/drizzle/meta/0004_snapshot.json +420 -0
  45. package/dist/drizzle/meta/_journal.json +41 -0
  46. package/dist/server/auth.js +47 -0
  47. package/dist/server/auth.js.map +7 -0
  48. package/dist/server/compaction.js +40 -0
  49. package/dist/server/compaction.js.map +7 -0
  50. package/dist/server/config-store.js +147 -0
  51. package/dist/server/config-store.js.map +7 -0
  52. package/dist/server/config.js +124 -0
  53. package/dist/server/config.js.map +7 -0
  54. package/dist/server/db/index.js +21 -0
  55. package/dist/server/db/index.js.map +7 -0
  56. package/dist/server/db/migrate.js +26 -0
  57. package/dist/server/db/migrate.js.map +7 -0
  58. package/dist/server/db/operations.js +201 -0
  59. package/dist/server/db/operations.js.map +7 -0
  60. package/dist/server/db/schema.js +99 -0
  61. package/dist/server/db/schema.js.map +7 -0
  62. package/dist/server/db/turn-usage.js +31 -0
  63. package/dist/server/db/turn-usage.js.map +7 -0
  64. package/dist/server/events.js +123 -0
  65. package/dist/server/events.js.map +7 -0
  66. package/dist/server/http.js +305 -0
  67. package/dist/server/http.js.map +7 -0
  68. package/dist/server/images.js +49 -0
  69. package/dist/server/images.js.map +7 -0
  70. package/dist/server/instance-lock.js +25 -0
  71. package/dist/server/instance-lock.js.map +7 -0
  72. package/dist/server/local-files.js +100 -0
  73. package/dist/server/local-files.js.map +7 -0
  74. package/dist/server/main.js +125 -0
  75. package/dist/server/main.js.map +7 -0
  76. package/dist/server/markdown.js +28 -0
  77. package/dist/server/markdown.js.map +7 -0
  78. package/dist/server/projection.js +348 -0
  79. package/dist/server/projection.js.map +7 -0
  80. package/dist/server/projects.js +230 -0
  81. package/dist/server/projects.js.map +7 -0
  82. package/dist/server/service.js +1221 -0
  83. package/dist/server/service.js.map +7 -0
  84. package/dist/server/snapshot.js +98 -0
  85. package/dist/server/snapshot.js.map +7 -0
  86. package/dist/server/thread-export.js +97 -0
  87. package/dist/server/thread-export.js.map +7 -0
  88. package/dist/server/websocket.js +126 -0
  89. package/dist/server/websocket.js.map +7 -0
  90. package/dist/shared/async-questions.js +39 -0
  91. package/dist/shared/async-questions.js.map +7 -0
  92. package/dist/shared/codex-compatibility.js +56 -0
  93. package/dist/shared/codex-compatibility.js.map +7 -0
  94. package/dist/shared/elicitation.js +314 -0
  95. package/dist/shared/elicitation.js.map +7 -0
  96. package/dist/shared/errors.js +24 -0
  97. package/dist/shared/errors.js.map +7 -0
  98. package/dist/shared/gateway-config.js +1 -0
  99. package/dist/shared/gateway-config.js.map +7 -0
  100. package/dist/shared/images.js +21 -0
  101. package/dist/shared/images.js.map +7 -0
  102. package/dist/shared/package.js +5 -0
  103. package/dist/shared/package.js.map +7 -0
  104. package/dist/shared/permissions.js +63 -0
  105. package/dist/shared/permissions.js.map +7 -0
  106. package/dist/shared/thread-name.js +14 -0
  107. package/dist/shared/thread-name.js.map +7 -0
  108. package/dist/shared/thread-summary.js +24 -0
  109. package/dist/shared/thread-summary.js.map +7 -0
  110. package/dist/shared/types.js +1 -0
  111. package/dist/shared/types.js.map +7 -0
  112. package/dist/shared/updates.js +7 -0
  113. package/dist/shared/updates.js.map +7 -0
  114. package/dist/shared/validation.js +116 -0
  115. package/dist/shared/validation.js.map +7 -0
  116. package/dist/shared/versions.js +36 -0
  117. package/dist/shared/versions.js.map +7 -0
  118. package/dist/update-worker.cjs +21968 -0
  119. package/dist/updates/files.js +54 -0
  120. package/dist/updates/files.js.map +7 -0
  121. package/dist/updates/manager.js +315 -0
  122. package/dist/updates/manager.js.map +7 -0
  123. package/dist/updates/registry.js +71 -0
  124. package/dist/updates/registry.js.map +7 -0
  125. package/dist/updates/transaction.js +96 -0
  126. package/dist/updates/transaction.js.map +7 -0
  127. package/dist/updates/worker.js +345 -0
  128. package/dist/updates/worker.js.map +7 -0
  129. package/dist/web/assets/index-BW9afH_Y.js +83 -0
  130. package/dist/web/assets/index-L3S1ZiO0.css +1 -0
  131. package/dist/web/covro.svg +6 -0
  132. package/dist/web/index.html +15 -0
  133. package/package.json +88 -4
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/server/projects.ts"],
4
+ "sourcesContent": ["import { execFileSync } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { accessSync, constants, realpathSync, statSync } from 'node:fs';\nimport { basename, isAbsolute, relative, resolve, sep } from 'node:path';\nimport { asc } from 'drizzle-orm';\nimport { AppError } from '../shared/errors.js';\nimport type { CreateProjectInput, Project, RenameProjectInput } from '../shared/types.js';\nimport { createProjectSchema, renameProjectSchema } from '../shared/validation.js';\nimport type { AppDatabase } from './db/index.js';\nimport { projectRegistrations } from './db/schema.js';\n\nexport interface ProjectConfig {\n id: string;\n name: string;\n path: string;\n}\ntype Registration = typeof projectRegistrations.$inferSelect;\n\nexport function containsPath(root: string, candidate: string): boolean {\n const difference = relative(root, candidate);\n return (\n difference === '' ||\n (difference !== '..' && !difference.startsWith(`..${sep}`) && !isAbsolute(difference))\n );\n}\n\nfunction checkoutRoot(cwd: string): string | undefined {\n try {\n const output = execFileSync('git', ['-C', cwd, 'rev-parse', '--show-toplevel'], {\n encoding: 'utf8',\n timeout: 3000,\n stdio: ['ignore', 'pipe', 'ignore'],\n }).trim();\n return output ? realpathSync(output) : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport class ProjectRegistry {\n private readonly registered = new Map<string, Registration>();\n\n constructor(\n configs: ProjectConfig[],\n private readonly database?: AppDatabase,\n ) {\n for (const row of database\n ?.select()\n .from(projectRegistrations)\n .orderBy(asc(projectRegistrations.createdAt), asc(projectRegistrations.id))\n .all() ?? [])\n this.registered.set(row.id, row);\n // JSON remains a source of new registrations, while persisted UI decisions win.\n // Keep legacy aliases and IDs intact; only new UI registrations reject aliases.\n const seeds: Registration[] = [];\n for (const config of configs) {\n const path = resolve(config.path);\n const existing = this.registered.get(config.id);\n if (existing) {\n if (existing.path !== path)\n throw new AppError(\n 'PROJECT_ID_CONFLICT',\n `\u9879\u76EE ${config.id} \u5DF2\u7ED1\u5B9A\u5176\u4ED6\u76EE\u5F55\uFF1B\u9879\u76EE ID \u548C\u76EE\u5F55\u4E0D\u53EF\u4FEE\u6539\uFF0C\u8BF7\u4F7F\u7528\u65B0 ID`,\n 409,\n { projectId: config.id },\n );\n continue;\n }\n let canonicalRoot: string | null = null;\n try {\n canonicalRoot = this.directory(path);\n } catch {\n // Existing configurations with temporarily missing directories still start.\n }\n const now = this.nextCreatedAt();\n const row = {\n ...config,\n path,\n canonicalRoot,\n removedAt: null,\n createdAt: now,\n updatedAt: now,\n };\n this.registered.set(config.id, row);\n seeds.push(row);\n }\n if (seeds.length) database?.insert(projectRegistrations).values(seeds).run();\n }\n\n private nextCreatedAt(): number {\n // Preserve seed order for legacy aliases even when imported within one millisecond.\n return [...this.registered.values()].reduce(\n (next, row) => Math.max(next, row.createdAt + 1),\n Date.now(),\n );\n }\n\n private directory(path: string): string {\n if (!isAbsolute(path) || path.includes('\\0'))\n throw new AppError('INVALID_PROJECT_PATH', '\u8BF7\u8F93\u5165\u8FD0\u884C Codex \u7684\u7535\u8111\u4E0A\u7684\u7EDD\u5BF9\u76EE\u5F55\u8DEF\u5F84', 400);\n try {\n const canonicalRoot = realpathSync(path);\n if (!statSync(canonicalRoot).isDirectory())\n throw new AppError('PROJECT_UNAVAILABLE', '\u9879\u76EE\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55', 409);\n accessSync(canonicalRoot, constants.R_OK | constants.X_OK);\n return canonicalRoot;\n } catch (error) {\n if (error instanceof AppError) throw error;\n const code = (error as NodeJS.ErrnoException).code;\n throw new AppError(\n 'PROJECT_UNAVAILABLE',\n code === 'ENOENT' || code === 'ENOTDIR'\n ? '\u9879\u76EE\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1B\u8BF7\u8F93\u5165\u8FD0\u884C Codex \u7684\u7535\u8111\u4E0A\u7684\u76EE\u5F55'\n : code === 'EACCES' || code === 'EPERM'\n ? '\u9879\u76EE\u76EE\u5F55\u4E0D\u53EF\u8BBF\u95EE\uFF0C\u9700\u8981\u8BFB\u53D6\u548C\u8FDB\u5165\u76EE\u5F55\u7684\u6743\u9650'\n : '\u9879\u76EE\u76EE\u5F55\u4E0D\u53EF\u7528\uFF0C\u8BF7\u68C0\u67E5\u8DEF\u5F84\u548C\u8BBF\u95EE\u6743\u9650',\n 409,\n );\n }\n }\n\n private save(row: Registration): void {\n this.database\n ?.insert(projectRegistrations)\n .values(row)\n .onConflictDoUpdate({ target: projectRegistrations.id, set: row })\n .run();\n this.registered.set(row.id, row);\n }\n\n private registration(id: string): Registration {\n const row = this.registered.get(id);\n if (!row || row.removedAt !== null)\n throw new AppError('PROJECT_NOT_FOUND', '\u9879\u76EE\u672A\u6CE8\u518C\u6216\u5DF2\u79FB\u9664', 404);\n return row;\n }\n\n private inspect(config: Registration): Project {\n const rootPath = config.path;\n try {\n const canonicalRoot = this.directory(rootPath);\n if (config.canonicalRoot !== null && canonicalRoot !== config.canonicalRoot)\n throw new AppError(\n 'PROJECT_UNAVAILABLE',\n '\u9879\u76EE\u76EE\u5F55\u7684\u771F\u5B9E\u8DEF\u5F84\u5DF2\u6539\u53D8\uFF0C\u4E0D\u80FD\u6CBF\u7528\u539F\u9879\u76EE\u8EAB\u4EFD',\n 409,\n );\n if (config.canonicalRoot === null)\n this.save({ ...config, canonicalRoot, updatedAt: Date.now() });\n return {\n id: config.id,\n name: config.name,\n rootPath,\n canonicalRoot,\n workspaceKey: checkoutRoot(canonicalRoot) ?? canonicalRoot,\n available: true,\n };\n } catch (error) {\n return {\n id: config.id,\n name: config.name,\n rootPath,\n canonicalRoot: config.canonicalRoot ?? rootPath,\n workspaceKey: config.canonicalRoot ?? rootPath,\n available: false,\n error: error instanceof Error ? error.message : '\u9879\u76EE\u4E0D\u53EF\u7528',\n };\n }\n }\n\n list(): Project[] {\n return [...this.registered.values()]\n .filter((project) => project.removedAt === null)\n .map((project) => this.inspect(project));\n }\n\n /** Also usable when a saved directory is missing, so it can still be managed. */\n describe(id: string): Project {\n return this.inspect(this.registration(id));\n }\n\n add(input: CreateProjectInput): Project {\n const parsed = createProjectSchema.parse(input);\n const canonicalRoot = this.directory(parsed.path);\n // Inspect lazily imported paths before checking, including legacy unavailable seeds.\n this.list();\n for (const row of this.registered.values()) {\n if (row.canonicalRoot !== null || row.removedAt === null) continue;\n try {\n this.save({ ...row, canonicalRoot: this.directory(row.path), updatedAt: Date.now() });\n } catch {\n // A tombstone still reserves its ID while its directory remains unavailable.\n }\n }\n const matching = [...this.registered.values()].filter(\n (row) => row.canonicalRoot === canonicalRoot,\n );\n const removed = matching.find((row) => row.removedAt !== null);\n const now = Date.now();\n if (removed) {\n // Restoring a grandfathered alias reuses an existing identity; it does not\n // create a duplicate registration even when another legacy alias is active.\n // A spelling/alias supplied during restoration does not change saved identity.\n const restored = { ...removed, removedAt: null, updatedAt: now };\n const project = this.inspect(restored);\n if (!project.available)\n throw new AppError('PROJECT_UNAVAILABLE', project.error ?? '\u539F\u9879\u76EE\u76EE\u5F55\u4E0D\u53EF\u7528', 409);\n this.save({ ...restored, name: parsed.name ?? removed.name });\n return this.get(removed.id);\n }\n const existing = matching[0];\n if (existing)\n throw new AppError('PROJECT_EXISTS', '\u8BE5\u76EE\u5F55\u5DF2\u6DFB\u52A0\uFF0C\u8BF7\u9009\u62E9\u5DF2\u6709\u9879\u76EE', 409, {\n projectId: existing.id,\n });\n const row: Registration = {\n id: randomUUID(),\n name: parsed.name ?? (basename(canonicalRoot) || canonicalRoot),\n path: canonicalRoot,\n canonicalRoot,\n removedAt: null,\n createdAt: this.nextCreatedAt(),\n updatedAt: now,\n };\n this.save(row);\n return this.get(row.id);\n }\n\n rename(id: string, input: RenameProjectInput): Project {\n const { name } = renameProjectSchema.parse(input);\n this.save({ ...this.registration(id), name, updatedAt: Date.now() });\n return this.describe(id);\n }\n\n remove(id: string): void {\n const now = Date.now();\n this.save({ ...this.registration(id), removedAt: now, updatedAt: now });\n }\n\n get(id: string): Project {\n const project = this.describe(id);\n if (!project.available)\n throw new AppError('PROJECT_UNAVAILABLE', '\u9879\u76EE\u76EE\u5F55\u4E0D\u53EF\u7528', 409, { projectId: id });\n return project;\n }\n\n assertOwnership(\n projectId: string,\n cwd: string,\n ): { project: Project; cwd: string; workspaceKey: string } {\n const project = this.get(projectId);\n let canonicalCwd: string;\n try {\n canonicalCwd = realpathSync(cwd);\n if (!statSync(canonicalCwd).isDirectory()) throw new Error('not a directory');\n } catch {\n throw new AppError('PROJECT_UNAVAILABLE', '\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u53EF\u7528', 409);\n }\n if (!containsPath(project.canonicalRoot, canonicalCwd))\n throw new AppError('PROJECT_OWNERSHIP', '\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u6240\u9009\u9879\u76EE\u76EE\u5F55', 403);\n return {\n project,\n cwd: canonicalCwd,\n workspaceKey: checkoutRoot(canonicalCwd) ?? project.canonicalRoot,\n };\n }\n\n findOwner(cwd: string): { project: Project; cwd: string; workspaceKey: string } {\n let canonicalCwd: string;\n try {\n canonicalCwd = realpathSync(cwd);\n } catch {\n throw new AppError('PROJECT_UNAVAILABLE', '\u4F1A\u8BDD\u76EE\u5F55\u4E0D\u53EF\u7528', 409);\n }\n // Tombstones reserve automatic ownership as well: a parent must not adopt\n // previously undiscovered history from a removed nested project.\n // An active grandfathered alias at the same root remains eligible; only a\n // deeper tombstone reserves history against a different, shallower directory.\n const project = [...this.registered.values()]\n .map((entry) => ({ project: this.inspect(entry), removed: entry.removedAt !== null }))\n .filter((entry) => containsPath(entry.project.canonicalRoot, canonicalCwd))\n .sort(\n (a, b) =>\n b.project.canonicalRoot.length - a.project.canonicalRoot.length ||\n Number(a.removed) - Number(b.removed),\n )[0]?.project;\n if (!project) throw new AppError('PROJECT_OWNERSHIP', '\u4F1A\u8BDD\u4E0D\u5C5E\u4E8E\u5DF2\u6CE8\u518C\u9879\u76EE', 403);\n return this.assertOwnership(project.id, canonicalCwd);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["row"]
7
+ }