@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/shared/elicitation.ts"],
4
+ "sourcesContent": ["import { AppError } from './errors.js';\nimport type {\n ActionResolution,\n ElicitationField,\n ElicitationRequest,\n ElicitationValue,\n} from './types.js';\n\nconst record = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\nconst has = (value: object, key: string): boolean => Object.hasOwn(value, key);\nconst fail = (message: string): never => {\n throw new AppError('VALIDATION_ERROR', message);\n};\n\nfunction onlyKeys(value: Record<string, unknown>, keys: string[], context: string): void {\n const unknown = Object.keys(value).find((key) => !keys.includes(key));\n if (unknown !== undefined) fail(`${context}\u5305\u542B\u5C1A\u4E0D\u652F\u6301\u7684\u7EA6\u675F\uFF1A${unknown}`);\n}\n\nfunction optionalText(value: Record<string, unknown>, key: string): string | undefined {\n if (!has(value, key)) return undefined;\n if (typeof value[key] !== 'string') fail(`${key} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32`);\n return value[key] as string;\n}\n\nfunction limit(value: Record<string, unknown>, key: string, integer: boolean): number | undefined {\n if (!has(value, key)) return undefined;\n const number = value[key];\n if (\n typeof number !== 'number' ||\n !Number.isFinite(number) ||\n (integer && (!Number.isSafeInteger(number) || number < 0))\n )\n fail(`${key} \u4E0D\u662F\u6709\u6548\u7684${integer ? '\u975E\u8D1F\u6574\u6570' : '\u6570\u503C'}`);\n return number as number;\n}\n\nfunction enumOptions(schema: Record<string, unknown>, variant: 'oneOf' | 'anyOf' = 'oneOf') {\n let options: { value: string; label: string }[];\n if (has(schema, 'enum')) {\n const values = schema.enum;\n if (!Array.isArray(values) || values.some((value) => typeof value !== 'string'))\n fail('\u679A\u4E3E\u9009\u9879\u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u5217\u8868');\n const names = schema.enumNames;\n if (\n names !== undefined &&\n (!Array.isArray(names) ||\n names.length !== (values as string[]).length ||\n names.some((name) => typeof name !== 'string'))\n )\n fail('\u679A\u4E3E\u6807\u9898\u5FC5\u987B\u4E0E\u9009\u9879\u4E00\u4E00\u5BF9\u5E94');\n if (has(schema, variant)) fail('\u4E0D\u80FD\u540C\u65F6\u63D0\u4F9B\u591A\u79CD\u679A\u4E3E\u7EA6\u675F');\n options = (values as string[]).map((value, index) => ({\n value,\n label: (names as string[] | undefined)?.[index] ?? value,\n }));\n } else {\n if (has(schema, 'enumNames')) fail('\u679A\u4E3E\u6807\u9898\u7F3A\u5C11 enum \u9009\u9879');\n const values = schema[variant];\n if (!Array.isArray(values)) fail('\u7F3A\u5C11\u53EF\u7528\u7684\u679A\u4E3E\u9009\u9879');\n options = (values as unknown[]).map((value) => {\n if (!record(value)) fail('\u679A\u4E3E\u9009\u9879\u683C\u5F0F\u4E0D\u53D7\u652F\u6301');\n const option = value as Record<string, unknown>;\n onlyKeys(option, ['const', 'title', 'description', 'type'], '\u679A\u4E3E\u9009\u9879');\n if (typeof option.const !== 'string' || (has(option, 'type') && option.type !== 'string'))\n fail('\u4EC5\u652F\u6301\u5B57\u7B26\u4E32\u679A\u4E3E\u9009\u9879');\n optionalText(option, 'description');\n return {\n value: option.const as string,\n label: optionalText(option, 'title') ?? String(option.const),\n };\n });\n }\n if (!options.length || new Set(options.map((option) => option.value)).size !== options.length)\n fail('\u679A\u4E3E\u9009\u9879\u4E0D\u80FD\u4E3A\u7A7A\u6216\u91CD\u590D');\n if (options.some((option) => option.value.length > 10_000)) fail('\u679A\u4E3E\u503C\u8D85\u8FC7\u53EF\u63D0\u4EA4\u7684\u957F\u5EA6\u4E0A\u9650');\n return options;\n}\n\nfunction dateValid(value: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return false;\n const date = new Date(`${value}T00:00:00.000Z`);\n return Number.isFinite(date.getTime()) && date.toISOString().slice(0, 10) === value;\n}\n\nfunction formatValid(format: ElicitationField['format'], value: string): boolean {\n switch (format) {\n case 'email':\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value);\n case 'uri':\n try {\n return !/\\s/.test(value) && Boolean(new URL(value).protocol);\n } catch {\n return false;\n }\n case 'date':\n return dateValid(value);\n case 'date-time': {\n const match =\n /^(\\d{4}-\\d{2}-\\d{2})[Tt](\\d{2}):(\\d{2}):(\\d{2})(?:\\.\\d+)?(?:[Zz]|[+-](\\d{2}):(\\d{2}))$/.exec(\n value,\n );\n return Boolean(\n match &&\n dateValid(match[1]!) &&\n Number(match[2]) <= 23 &&\n Number(match[3]) <= 59 &&\n Number(match[4]) <= 59 &&\n (match[5] === undefined || Number(match[5]) <= 23) &&\n (match[6] === undefined || Number(match[6]) <= 59) &&\n Number.isFinite(Date.parse(value)),\n );\n }\n default:\n return true;\n }\n}\n\nexport function validateElicitationFieldValue(\n field: ElicitationField,\n value: unknown,\n): asserts value is ElicitationValue {\n const invalid = () => fail(`\u201C${field.title}\u201D\u7684\u56DE\u7B54\u4E0D\u7B26\u5408\u5B57\u6BB5\u8981\u6C42`);\n switch (field.type) {\n case 'string':\n if (typeof value !== 'string') invalid();\n else {\n const length = [...value].length;\n if (\n (field.minLength !== undefined && length < field.minLength) ||\n (field.maxLength !== undefined && length > field.maxLength) ||\n value.length > 10_000 ||\n !formatValid(field.format, value)\n )\n invalid();\n }\n break;\n case 'number':\n case 'integer':\n if (\n typeof value !== 'number' ||\n !Number.isFinite(value) ||\n (field.type === 'integer' && !Number.isSafeInteger(value)) ||\n (field.minimum !== undefined && value < field.minimum) ||\n (field.maximum !== undefined && value > field.maximum)\n )\n invalid();\n break;\n case 'boolean':\n if (typeof value !== 'boolean') invalid();\n break;\n case 'enum':\n if (\n typeof value !== 'string' ||\n value.length > 10_000 ||\n !field.options?.some((option) => option.value === value)\n )\n invalid();\n break;\n case 'multiEnum':\n if (\n !Array.isArray(value) ||\n value.some(\n (item) =>\n typeof item !== 'string' ||\n item.length > 10_000 ||\n !field.options?.some((option) => option.value === item),\n ) ||\n value.length > 500 ||\n new Set(value).size !== value.length ||\n (field.minItems !== undefined && value.length < field.minItems) ||\n (field.maxItems !== undefined && value.length > field.maxItems)\n )\n invalid();\n break;\n }\n}\n\nfunction normalizeField(name: string, value: unknown, required: boolean): ElicitationField {\n // Zod's HTTP record parser discards this own key; never offer a field it cannot round-trip.\n if (name === '__proto__') fail('\u5B57\u6BB5\u540D\u79F0 __proto__ \u4E0D\u53D7\u5F53\u524D\u8868\u5355\u4F20\u8F93\u652F\u6301');\n if (name.length > 1000) fail('\u5B57\u6BB5\u540D\u79F0\u8D85\u8FC7\u53EF\u63D0\u4EA4\u7684\u957F\u5EA6\u4E0A\u9650');\n if (!record(value)) fail(`\u5B57\u6BB5 ${name} \u7684\u5B9A\u4E49\u683C\u5F0F\u4E0D\u53D7\u652F\u6301`);\n const schema = value as Record<string, unknown>;\n const commonKeys = ['type', 'title', 'description', 'default'];\n const field: ElicitationField = {\n name,\n title: optionalText(schema, 'title') ?? name,\n description: optionalText(schema, 'description'),\n required,\n type: 'string',\n };\n switch (schema.type) {\n case 'string':\n if (has(schema, 'enum') || has(schema, 'oneOf') || has(schema, 'enumNames')) {\n onlyKeys(schema, [...commonKeys, 'enum', 'enumNames', 'oneOf'], `\u5B57\u6BB5 ${name}`);\n field.type = 'enum';\n field.options = enumOptions(schema);\n } else {\n onlyKeys(schema, [...commonKeys, 'minLength', 'maxLength', 'format'], `\u5B57\u6BB5 ${name}`);\n field.minLength = limit(schema, 'minLength', true);\n field.maxLength = limit(schema, 'maxLength', true);\n if (field.minLength !== undefined && field.minLength > 10_000)\n fail(`\u5B57\u6BB5 ${name} \u7684\u6700\u5C0F\u957F\u5EA6\u8D85\u8FC7\u53EF\u63D0\u4EA4\u7684\u957F\u5EA6\u4E0A\u9650`);\n if (\n field.minLength !== undefined &&\n field.maxLength !== undefined &&\n field.minLength > field.maxLength\n )\n fail(`\u5B57\u6BB5 ${name} \u7684\u957F\u5EA6\u8303\u56F4\u65E0\u6548`);\n if (has(schema, 'format')) {\n if (!['email', 'uri', 'date', 'date-time'].includes(String(schema.format)))\n fail(`\u5B57\u6BB5 ${name} \u7684 format \u4E0D\u53D7\u652F\u6301`);\n field.format = schema.format as ElicitationField['format'];\n }\n }\n break;\n case 'number':\n case 'integer':\n onlyKeys(schema, [...commonKeys, 'minimum', 'maximum'], `\u5B57\u6BB5 ${name}`);\n field.type = schema.type;\n field.minimum = limit(schema, 'minimum', false);\n field.maximum = limit(schema, 'maximum', false);\n if (\n field.minimum !== undefined &&\n field.maximum !== undefined &&\n field.minimum > field.maximum\n )\n fail(`\u5B57\u6BB5 ${name} \u7684\u6570\u503C\u8303\u56F4\u65E0\u6548`);\n break;\n case 'boolean':\n onlyKeys(schema, commonKeys, `\u5B57\u6BB5 ${name}`);\n field.type = 'boolean';\n break;\n case 'array': {\n onlyKeys(\n schema,\n [...commonKeys, 'items', 'minItems', 'maxItems', 'uniqueItems'],\n `\u5B57\u6BB5 ${name}`,\n );\n if (has(schema, 'uniqueItems') && schema.uniqueItems !== true)\n fail(`\u5B57\u6BB5 ${name} \u4EC5\u652F\u6301\u4E0D\u91CD\u590D\u7684\u591A\u9009\u9879`);\n if (!record(schema.items)) fail(`\u5B57\u6BB5 ${name} \u7F3A\u5C11\u6709\u6548\u7684\u591A\u9009\u9879`);\n const items = schema.items as Record<string, unknown>;\n onlyKeys(items, ['type', 'enum', 'enumNames', 'anyOf'], `\u5B57\u6BB5 ${name} \u7684\u591A\u9009\u9879`);\n if (has(items, 'type') && items.type !== 'string') fail(`\u5B57\u6BB5 ${name} \u4EC5\u652F\u6301\u5B57\u7B26\u4E32\u591A\u9009\u9879`);\n field.type = 'multiEnum';\n field.options = enumOptions(items, 'anyOf');\n field.minItems = limit(schema, 'minItems', true);\n field.maxItems = limit(schema, 'maxItems', true);\n if (field.minItems !== undefined && field.minItems > 500)\n fail(`\u5B57\u6BB5 ${name} \u7684\u6700\u5C11\u9009\u9879\u6570\u8D85\u8FC7\u53EF\u63D0\u4EA4\u7684\u6570\u91CF\u4E0A\u9650`);\n if (\n field.minItems !== undefined &&\n field.maxItems !== undefined &&\n field.minItems > field.maxItems\n )\n fail(`\u5B57\u6BB5 ${name} \u7684\u9009\u9879\u6570\u91CF\u8303\u56F4\u65E0\u6548`);\n break;\n }\n default:\n fail(`\u5B57\u6BB5 ${name} \u7684\u7C7B\u578B\u4E0D\u53D7\u652F\u6301\uFF1A${String(schema.type)}`);\n }\n if (has(schema, 'default')) {\n validateElicitationFieldValue(field, schema.default);\n field.default = schema.default as ElicitationValue;\n }\n return field;\n}\n\n/** A deliberately bounded form contract: unknown constraints disable acceptance, never disappear. */\nexport function normalizeElicitationSchema(\n schema: unknown,\n): Pick<ElicitationRequest, 'fields' | 'schemaError'> {\n try {\n if (!record(schema)) fail('\u8868\u5355\u7ED3\u6784\u5FC5\u987B\u662F JSON \u5BF9\u8C61');\n const root = schema as Record<string, unknown>;\n onlyKeys(\n root,\n ['$schema', 'type', 'title', 'description', 'properties', 'required', 'additionalProperties'],\n '\u8868\u5355',\n );\n if (root.type !== 'object' || !record(root.properties))\n fail('\u4EC5\u652F\u6301\u5305\u542B properties \u7684\u6241\u5E73\u5BF9\u8C61\u8868\u5355');\n optionalText(root, '$schema');\n optionalText(root, 'title');\n optionalText(root, 'description');\n if (has(root, 'additionalProperties') && typeof root.additionalProperties !== 'boolean')\n fail('additionalProperties \u7EA6\u675F\u4E0D\u53D7\u652F\u6301');\n const properties = root.properties as Record<string, unknown>;\n const required = has(root, 'required') ? root.required : [];\n if (\n !Array.isArray(required) ||\n required.some((name) => typeof name !== 'string' || !has(properties, name)) ||\n new Set(required as unknown[]).size !== (required as unknown[]).length\n )\n fail('\u5FC5\u586B\u5B57\u6BB5\u5FC5\u987B\u5B58\u5728\u4E8E\u8868\u5355\u4E2D');\n return {\n fields: Object.entries(properties).map(([name, value]) =>\n normalizeField(name, value, (required as string[]).includes(name)),\n ),\n };\n } catch (error) {\n return { fields: [], schemaError: error instanceof Error ? error.message : '\u8868\u5355\u7ED3\u6784\u4E0D\u53D7\u652F\u6301' };\n }\n}\n\nexport function normalizeElicitationRequest(params: Record<string, unknown>): ElicitationRequest {\n const base = { serverName: typeof params.serverName === 'string' ? params.serverName : 'MCP' };\n if (params.mode === 'url') {\n const url = typeof params.url === 'string' ? params.url : '';\n try {\n const parsed = new URL(url);\n if (!['http:', 'https:'].includes(parsed.protocol) || parsed.username || parsed.password)\n throw new Error('unsupported URL');\n return { ...base, mode: 'url', url };\n } catch {\n return {\n ...base,\n mode: 'url',\n url,\n schemaError: '\u6B64\u8BF7\u6C42\u7684\u94FE\u63A5\u65E0\u6548\uFF1B\u4EC5\u652F\u6301 HTTP \u6216 HTTPS \u94FE\u63A5',\n };\n }\n }\n if (['form', 'openai/form', 'openaiForm'].includes(String(params.mode))) {\n const schema = params.requestedSchema;\n const form: Pick<ElicitationRequest, 'fields' | 'schemaError'> =\n schema === null ? { fields: [] } : normalizeElicitationSchema(schema);\n const meta = record(params._meta) ? params._meta : undefined;\n const allowSession =\n meta?.persist === 'session' ||\n (Array.isArray(meta?.persist) && meta.persist.includes('session'));\n // Like the CLI, only message-only forms can carry an approval action. A data form or\n // URL remains an information request even if its metadata advertises persistence.\n const approval =\n !form.schemaError &&\n form.fields?.length === 0 &&\n (meta?.codex_approval_kind === 'mcp_tool_call' || allowSession)\n ? { allowSession }\n : undefined;\n return { ...base, mode: 'form', ...form, ...(approval ? { approval } : {}) };\n }\n return {\n ...base,\n mode: 'form',\n fields: [],\n schemaError: `\u5C1A\u4E0D\u652F\u6301\u7684\u4EA4\u4E92\u6A21\u5F0F\uFF1A${String(params.mode)}`,\n };\n}\n\n/** Called before claiming an action and again against the adapter's original request. */\nexport function validateElicitationResolution(\n request: ElicitationRequest | undefined,\n resolution: ActionResolution,\n): Record<string, ElicitationValue> | null {\n if (!record(resolution)) fail('\u8BF7\u63D0\u4EA4\u6709\u6548\u7684\u4EA4\u4E92\u56DE\u7B54');\n onlyKeys(resolution as Record<string, unknown>, ['decision', 'content', 'persist'], '\u4EA4\u4E92\u56DE\u7B54');\n if (!('decision' in resolution) || !['accept', 'decline', 'cancel'].includes(resolution.decision))\n fail('\u6B64\u8BF7\u6C42\u4E0D\u652F\u6301\u6240\u63D0\u4EA4\u7684\u51B3\u5B9A');\n const answer = resolution as Extract<ActionResolution, { decision: string }>;\n if (\n has(answer, 'persist') &&\n (answer.persist !== 'session' ||\n answer.decision !== 'accept' ||\n request?.mode !== 'form' ||\n !request.approval?.allowSession)\n )\n fail('\u6B64\u8BF7\u6C42\u4E0D\u652F\u6301\u6240\u9009\u6388\u6743\u8303\u56F4');\n if (answer.decision !== 'accept') {\n if (has(answer, 'content')) fail('\u62D2\u7EDD\u6216\u53D6\u6D88\u65F6\u4E0D\u80FD\u63D0\u4EA4\u8868\u5355\u5185\u5BB9');\n return null;\n }\n if (!request || request.schemaError) fail(request?.schemaError ?? '\u4EA4\u4E92\u8BF7\u6C42\u7F3A\u5C11\u8868\u5355\u4FE1\u606F');\n const elicitation = request as ElicitationRequest;\n if (elicitation.approval) {\n if (has(answer, 'content')) fail('\u5DE5\u5177\u5BA1\u6279\u4E0D\u80FD\u63D0\u4EA4\u8868\u5355\u5185\u5BB9');\n return null;\n }\n if (elicitation.mode === 'url') {\n const checked = normalizeElicitationRequest({\n mode: 'url',\n serverName: elicitation.serverName,\n url: elicitation.url,\n });\n if (checked.schemaError) fail(checked.schemaError);\n if (has(answer, 'content')) fail('\u94FE\u63A5\u786E\u8BA4\u4E0D\u80FD\u63D0\u4EA4\u8868\u5355\u5185\u5BB9');\n return null;\n }\n if (!record(answer.content)) fail('\u8BF7\u63D0\u4EA4\u7ED3\u6784\u5316\u7684\u8868\u5355\u56DE\u7B54');\n const content = answer.content as Record<string, ElicitationValue>;\n if (!Array.isArray(elicitation.fields)) fail('\u4EA4\u4E92\u8BF7\u6C42\u7F3A\u5C11\u8868\u5355\u5B57\u6BB5');\n const fields = elicitation.fields!;\n if (Object.keys(content).some((name) => !fields.some((field) => field.name === name)))\n fail('\u56DE\u7B54\u5305\u542B\u672A\u77E5\u5B57\u6BB5');\n for (const field of fields) {\n if (!has(content, field.name)) {\n if (field.required) fail(`\u8BF7\u586B\u5199\u201C${field.title}\u201D`);\n } else validateElicitationFieldValue(field, content[field.name]);\n }\n return structuredClone(content);\n}\n\nexport function validatePermissionResolution(\n resolution: ActionResolution,\n): 'accept' | 'acceptForSession' | 'decline' {\n if (!record(resolution)) fail('\u8BF7\u63D0\u4EA4\u6709\u6548\u7684\u6743\u9650\u51B3\u5B9A');\n onlyKeys(resolution as Record<string, unknown>, ['decision'], '\u6743\u9650\u56DE\u7B54');\n if (\n !('decision' in resolution) ||\n !['accept', 'acceptForSession', 'decline'].includes(resolution.decision)\n )\n fail('\u8BF7\u9009\u62E9\u5F53\u524D\u4EFB\u52A1\u5141\u8BB8\u3001\u4F1A\u8BDD\u5141\u8BB8\u6216\u62D2\u7EDD');\n return (resolution as { decision: 'accept' | 'acceptForSession' | 'decline' }).decision;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,24 @@
1
+ class AppError extends Error {
2
+ constructor(code, message, status = 400, details) {
3
+ super(message);
4
+ this.code = code;
5
+ this.status = status;
6
+ this.details = details;
7
+ this.name = "AppError";
8
+ }
9
+ code;
10
+ status;
11
+ details;
12
+ toJSON(clientOperationId) {
13
+ return {
14
+ code: this.code,
15
+ message: this.message,
16
+ ...clientOperationId ? { clientOperationId } : {},
17
+ ...this.details === void 0 ? {} : { details: this.details }
18
+ };
19
+ }
20
+ }
21
+ export {
22
+ AppError
23
+ };
24
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shared/errors.ts"],
4
+ "sourcesContent": ["import type { ApiError } from './types.js';\nexport class AppError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly status = 400,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = 'AppError';\n }\n toJSON(clientOperationId?: string): ApiError {\n return {\n code: this.code,\n message: this.message,\n ...(clientOperationId ? { clientOperationId } : {}),\n ...(this.details === undefined ? {} : { details: this.details }),\n };\n }\n}\n"],
5
+ "mappings": "AACO,MAAM,iBAAiB,MAAM;AAAA,EAClC,YACkB,MAChB,SACgB,SAAS,KACT,SAChB;AACA,UAAM,OAAO;AALG;AAEA;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA,EAPkB;AAAA,EAEA;AAAA,EACA;AAAA,EAKlB,OAAO,mBAAsC;AAC3C,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,GAAI,oBAAoB,EAAE,kBAAkB,IAAI,CAAC;AAAA,MACjD,GAAI,KAAK,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,KAAK,QAAQ;AAAA,IAChE;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=gateway-config.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,21 @@
1
+ const MAX_IMAGE_BYTES = 2 * 1024 * 1024;
2
+ const MAX_IMAGES = 4;
3
+ const IMAGE_REQUEST_BYTES = 4 * 1024 * 1024;
4
+ const IMAGE_TYPES = ["image/png", "image/jpeg", "image/webp", "image/gif"];
5
+ function imageDataBytes(value) {
6
+ if (value.length > Math.ceil(MAX_IMAGE_BYTES / 3) * 4 + 32) return;
7
+ const comma = value.indexOf(",");
8
+ if (!/^data:image\/(png|jpeg|webp|gif);base64$/.test(value.slice(0, comma))) return;
9
+ const data = value.slice(comma + 1);
10
+ if (!data.length || data.length % 4 !== 0 || !/^[A-Za-z0-9+/]+={0,2}$/.test(data)) return;
11
+ const bytes = data.length / 4 * 3 - (data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0);
12
+ return bytes <= MAX_IMAGE_BYTES ? bytes : void 0;
13
+ }
14
+ export {
15
+ IMAGE_REQUEST_BYTES,
16
+ IMAGE_TYPES,
17
+ MAX_IMAGES,
18
+ MAX_IMAGE_BYTES,
19
+ imageDataBytes
20
+ };
21
+ //# sourceMappingURL=images.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shared/images.ts"],
4
+ "sourcesContent": ["/** Kept below the Codex stdin budget, including base64 and the maximum task text. */\nexport const MAX_IMAGE_BYTES = 2 * 1024 * 1024;\nexport const MAX_IMAGES = 4;\nexport const IMAGE_REQUEST_BYTES = 4 * 1024 * 1024;\nexport const IMAGE_TYPES = ['image/png', 'image/jpeg', 'image/webp', 'image/gif'];\n\n/** Accept only bounded inline raster images; never fetch URLs or read server paths. */\nexport function imageDataBytes(value: string): number | undefined {\n if (value.length > Math.ceil(MAX_IMAGE_BYTES / 3) * 4 + 32) return;\n const comma = value.indexOf(',');\n if (!/^data:image\\/(png|jpeg|webp|gif);base64$/.test(value.slice(0, comma))) return;\n const data = value.slice(comma + 1);\n if (!data.length || data.length % 4 !== 0 || !/^[A-Za-z0-9+/]+={0,2}$/.test(data)) return;\n const bytes = (data.length / 4) * 3 - (data.endsWith('==') ? 2 : data.endsWith('=') ? 1 : 0);\n return bytes <= MAX_IMAGE_BYTES ? bytes : undefined;\n}\n"],
5
+ "mappings": "AACO,MAAM,kBAAkB,IAAI,OAAO;AACnC,MAAM,aAAa;AACnB,MAAM,sBAAsB,IAAI,OAAO;AACvC,MAAM,cAAc,CAAC,aAAa,cAAc,cAAc,WAAW;AAGzE,SAAS,eAAe,OAAmC;AAChE,MAAI,MAAM,SAAS,KAAK,KAAK,kBAAkB,CAAC,IAAI,IAAI,GAAI;AAC5D,QAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,MAAI,CAAC,2CAA2C,KAAK,MAAM,MAAM,GAAG,KAAK,CAAC,EAAG;AAC7E,QAAM,OAAO,MAAM,MAAM,QAAQ,CAAC;AAClC,MAAI,CAAC,KAAK,UAAU,KAAK,SAAS,MAAM,KAAK,CAAC,yBAAyB,KAAK,IAAI,EAAG;AACnF,QAAM,QAAS,KAAK,SAAS,IAAK,KAAK,KAAK,SAAS,IAAI,IAAI,IAAI,KAAK,SAAS,GAAG,IAAI,IAAI;AAC1F,SAAO,SAAS,kBAAkB,QAAQ;AAC5C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,5 @@
1
+ const npmPackageName = "@covro/covro";
2
+ export {
3
+ npmPackageName
4
+ };
5
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shared/package.ts"],
4
+ "sourcesContent": ["/** Public npm identity; the product and executable are still named Covro / covro. */\nexport const npmPackageName = '@covro/covro';\n"],
5
+ "mappings": "AACO,MAAM,iBAAiB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,63 @@
1
+ const permissionModes = {
2
+ ask: {
3
+ label: "\u8BF7\u6C42\u6279\u51C6",
4
+ description: "\u53EF\u5728\u9879\u76EE\u5185\u8BFB\u5199\u548C\u8FD0\u884C\u547D\u4EE4\uFF0C\u8054\u7F51\u6216\u8D8A\u754C\u64CD\u4F5C\u7531\u4F60\u6279\u51C6\u3002",
5
+ profile: ":workspace",
6
+ sandbox: "workspace-write",
7
+ approvalPolicy: "on-request",
8
+ approvalReviewer: "user"
9
+ },
10
+ "auto-review": {
11
+ label: "\u5E2E\u6211\u6279\u51C6",
12
+ description: "\u4E0E\u8BF7\u6C42\u6279\u51C6\u7684\u6743\u9650\u76F8\u540C\uFF0C\u7B26\u5408\u6761\u4EF6\u7684\u7533\u8BF7\u7531\u81EA\u52A8\u5BA1\u6838\u5904\u7406\u3002",
13
+ profile: ":workspace",
14
+ sandbox: "workspace-write",
15
+ approvalPolicy: "on-request",
16
+ approvalReviewer: "auto_review"
17
+ },
18
+ "full-access": {
19
+ label: "\u5B8C\u5168\u8BBF\u95EE",
20
+ description: "\u53EF\u8BBF\u95EE\u9879\u76EE\u5916\u6587\u4EF6\u548C\u7F51\u7EDC\uFF0C\u65E0 Codex \u6C99\u7BB1\u9650\u5236\uFF0C\u65E0\u9700\u5BA1\u6279\u3002",
21
+ profile: ":danger-full-access",
22
+ sandbox: "danger-full-access",
23
+ approvalPolicy: "never",
24
+ approvalReviewer: "user"
25
+ },
26
+ "read-only": {
27
+ label: "\u53EA\u8BFB",
28
+ description: "\u53EF\u8BFB\u53D6\u6587\u4EF6\uFF0C\u5199\u5165\u6216\u8054\u7F51\u9700\u8981\u4F60\u6279\u51C6\u3002",
29
+ profile: ":read-only",
30
+ sandbox: "read-only",
31
+ approvalPolicy: "on-request",
32
+ approvalReviewer: "user"
33
+ }
34
+ };
35
+ function permissionModeUnavailable(mode, capabilities, model) {
36
+ if (!capabilities) return "\u5C1A\u672A\u8BFB\u53D6\u6743\u9650\u6A21\u5F0F\u7684\u53EF\u7528\u6761\u4EF6";
37
+ if (capabilities.unavailableReason) return capabilities.unavailableReason;
38
+ const preset = permissionModes[mode];
39
+ if (capabilities.allowedProfiles && !capabilities.allowedProfiles.includes(preset.profile))
40
+ return "\u53D7\u7BA1\u8981\u6C42\u4E0D\u5141\u8BB8\u6B64\u6743\u9650 profile";
41
+ if (capabilities.allowedSandboxModes && !capabilities.allowedSandboxModes.includes(preset.sandbox))
42
+ return "\u53D7\u7BA1\u8981\u6C42\u4E0D\u5141\u8BB8\u6B64\u6743\u9650\u8303\u56F4";
43
+ if (capabilities.allowedApprovalPolicies && !capabilities.allowedApprovalPolicies.includes(preset.approvalPolicy))
44
+ return "\u53D7\u7BA1\u8981\u6C42\u4E0D\u5141\u8BB8\u6B64\u5BA1\u6279\u7B56\u7565";
45
+ return permissionReviewerUnavailable(preset.approvalReviewer, capabilities, model);
46
+ }
47
+ function permissionReviewerUnavailable(reviewer, capabilities, model) {
48
+ if (!capabilities) return "\u5C1A\u672A\u8BFB\u53D6\u5BA1\u6838\u65B9\u7684\u53EF\u7528\u6761\u4EF6";
49
+ if (capabilities.unavailableReason) return capabilities.unavailableReason;
50
+ if (capabilities.allowedReviewers && !capabilities.allowedReviewers.includes(reviewer))
51
+ return "\u53D7\u7BA1\u8981\u6C42\u4E0D\u5141\u8BB8\u6B64\u5BA1\u6838\u65B9";
52
+ if (reviewer === "auto_review" && !capabilities.autoReview)
53
+ return "\u5F53\u524D Codex \u672A\u542F\u7528\u81EA\u52A8\u5BA1\u6838\uFF08guardian_approval\uFF09";
54
+ if (model && capabilities.autoReviewRequiredModels.includes(model) && reviewer !== "auto_review")
55
+ return "\u53D7\u7BA1\u8981\u6C42\u89C4\u5B9A\u6B64\u6A21\u578B\u5FC5\u987B\u4F7F\u7528\u81EA\u52A8\u5BA1\u6838";
56
+ return void 0;
57
+ }
58
+ export {
59
+ permissionModeUnavailable,
60
+ permissionModes,
61
+ permissionReviewerUnavailable
62
+ };
63
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shared/permissions.ts"],
4
+ "sourcesContent": ["import type { PermissionCapabilities, PermissionMode } from './types.js';\n\n/** Verified against Codex 0.163.0's built-in profiles and permissions menu. */\nexport const permissionModes = {\n ask: {\n label: '\u8BF7\u6C42\u6279\u51C6',\n description: '\u53EF\u5728\u9879\u76EE\u5185\u8BFB\u5199\u548C\u8FD0\u884C\u547D\u4EE4\uFF0C\u8054\u7F51\u6216\u8D8A\u754C\u64CD\u4F5C\u7531\u4F60\u6279\u51C6\u3002',\n profile: ':workspace',\n sandbox: 'workspace-write',\n approvalPolicy: 'on-request',\n approvalReviewer: 'user',\n },\n 'auto-review': {\n label: '\u5E2E\u6211\u6279\u51C6',\n description: '\u4E0E\u8BF7\u6C42\u6279\u51C6\u7684\u6743\u9650\u76F8\u540C\uFF0C\u7B26\u5408\u6761\u4EF6\u7684\u7533\u8BF7\u7531\u81EA\u52A8\u5BA1\u6838\u5904\u7406\u3002',\n profile: ':workspace',\n sandbox: 'workspace-write',\n approvalPolicy: 'on-request',\n approvalReviewer: 'auto_review',\n },\n 'full-access': {\n label: '\u5B8C\u5168\u8BBF\u95EE',\n description: '\u53EF\u8BBF\u95EE\u9879\u76EE\u5916\u6587\u4EF6\u548C\u7F51\u7EDC\uFF0C\u65E0 Codex \u6C99\u7BB1\u9650\u5236\uFF0C\u65E0\u9700\u5BA1\u6279\u3002',\n profile: ':danger-full-access',\n sandbox: 'danger-full-access',\n approvalPolicy: 'never',\n approvalReviewer: 'user',\n },\n 'read-only': {\n label: '\u53EA\u8BFB',\n description: '\u53EF\u8BFB\u53D6\u6587\u4EF6\uFF0C\u5199\u5165\u6216\u8054\u7F51\u9700\u8981\u4F60\u6279\u51C6\u3002',\n profile: ':read-only',\n sandbox: 'read-only',\n approvalPolicy: 'on-request',\n approvalReviewer: 'user',\n },\n} as const;\n\nexport function permissionModeUnavailable(\n mode: PermissionMode,\n capabilities?: PermissionCapabilities,\n model?: string | null,\n): string | undefined {\n if (!capabilities) return '\u5C1A\u672A\u8BFB\u53D6\u6743\u9650\u6A21\u5F0F\u7684\u53EF\u7528\u6761\u4EF6';\n if (capabilities.unavailableReason) return capabilities.unavailableReason;\n const preset = permissionModes[mode];\n if (capabilities.allowedProfiles && !capabilities.allowedProfiles.includes(preset.profile))\n return '\u53D7\u7BA1\u8981\u6C42\u4E0D\u5141\u8BB8\u6B64\u6743\u9650 profile';\n if (\n capabilities.allowedSandboxModes &&\n !capabilities.allowedSandboxModes.includes(preset.sandbox)\n )\n return '\u53D7\u7BA1\u8981\u6C42\u4E0D\u5141\u8BB8\u6B64\u6743\u9650\u8303\u56F4';\n if (\n capabilities.allowedApprovalPolicies &&\n !capabilities.allowedApprovalPolicies.includes(preset.approvalPolicy)\n )\n return '\u53D7\u7BA1\u8981\u6C42\u4E0D\u5141\u8BB8\u6B64\u5BA1\u6279\u7B56\u7565';\n return permissionReviewerUnavailable(preset.approvalReviewer, capabilities, model);\n}\n\nexport function permissionReviewerUnavailable(\n reviewer: 'user' | 'auto_review',\n capabilities?: PermissionCapabilities,\n model?: string | null,\n): string | undefined {\n if (!capabilities) return '\u5C1A\u672A\u8BFB\u53D6\u5BA1\u6838\u65B9\u7684\u53EF\u7528\u6761\u4EF6';\n if (capabilities.unavailableReason) return capabilities.unavailableReason;\n if (capabilities.allowedReviewers && !capabilities.allowedReviewers.includes(reviewer))\n return '\u53D7\u7BA1\u8981\u6C42\u4E0D\u5141\u8BB8\u6B64\u5BA1\u6838\u65B9';\n if (reviewer === 'auto_review' && !capabilities.autoReview)\n return '\u5F53\u524D Codex \u672A\u542F\u7528\u81EA\u52A8\u5BA1\u6838\uFF08guardian_approval\uFF09';\n if (model && capabilities.autoReviewRequiredModels.includes(model) && reviewer !== 'auto_review')\n return '\u53D7\u7BA1\u8981\u6C42\u89C4\u5B9A\u6B64\u6A21\u578B\u5FC5\u987B\u4F7F\u7528\u81EA\u52A8\u5BA1\u6838';\n return undefined;\n}\n"],
5
+ "mappings": "AAGO,MAAM,kBAAkB;AAAA,EAC7B,KAAK;AAAA,IACH,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AACF;AAEO,SAAS,0BACd,MACA,cACA,OACoB;AACpB,MAAI,CAAC,aAAc,QAAO;AAC1B,MAAI,aAAa,kBAAmB,QAAO,aAAa;AACxD,QAAM,SAAS,gBAAgB,IAAI;AACnC,MAAI,aAAa,mBAAmB,CAAC,aAAa,gBAAgB,SAAS,OAAO,OAAO;AACvF,WAAO;AACT,MACE,aAAa,uBACb,CAAC,aAAa,oBAAoB,SAAS,OAAO,OAAO;AAEzD,WAAO;AACT,MACE,aAAa,2BACb,CAAC,aAAa,wBAAwB,SAAS,OAAO,cAAc;AAEpE,WAAO;AACT,SAAO,8BAA8B,OAAO,kBAAkB,cAAc,KAAK;AACnF;AAEO,SAAS,8BACd,UACA,cACA,OACoB;AACpB,MAAI,CAAC,aAAc,QAAO;AAC1B,MAAI,aAAa,kBAAmB,QAAO,aAAa;AACxD,MAAI,aAAa,oBAAoB,CAAC,aAAa,iBAAiB,SAAS,QAAQ;AACnF,WAAO;AACT,MAAI,aAAa,iBAAiB,CAAC,aAAa;AAC9C,WAAO;AACT,MAAI,SAAS,aAAa,yBAAyB,SAAS,KAAK,KAAK,aAAa;AACjF,WAAO;AACT,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ const MAX_THREAD_NAME_CHARACTERS = 100;
2
+ function threadNameError(name) {
3
+ if (!name.trim()) return "\u8BF7\u8F93\u5165\u4F1A\u8BDD\u540D\u79F0\u3002\u7528\u6CD5\uFF1A/rename <\u540D\u79F0>";
4
+ if (/[\u0000-\u001f\u007f-\u009f\u2028\u2029]/u.test(name))
5
+ return "\u4F1A\u8BDD\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u6362\u884C\u6216\u63A7\u5236\u5B57\u7B26\u3002";
6
+ if ([...name.trim()].length > MAX_THREAD_NAME_CHARACTERS)
7
+ return `\u4F1A\u8BDD\u540D\u79F0\u6700\u591A ${MAX_THREAD_NAME_CHARACTERS} \u4E2A\u5B57\u7B26\u3002`;
8
+ return void 0;
9
+ }
10
+ export {
11
+ MAX_THREAD_NAME_CHARACTERS,
12
+ threadNameError
13
+ };
14
+ //# sourceMappingURL=thread-name.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shared/thread-name.ts"],
4
+ "sourcesContent": ["/** Human-chosen names have their own bound; generated titles retain their shorter policy. */\nexport const MAX_THREAD_NAME_CHARACTERS = 100;\n\nexport function threadNameError(name: string): string | undefined {\n if (!name.trim()) return '\u8BF7\u8F93\u5165\u4F1A\u8BDD\u540D\u79F0\u3002\u7528\u6CD5\uFF1A/rename <\u540D\u79F0>';\n // Control characters are intentionally rejected from a display name.\n // eslint-disable-next-line no-control-regex\n if (/[\\u0000-\\u001f\\u007f-\\u009f\\u2028\\u2029]/u.test(name))\n return '\u4F1A\u8BDD\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u6362\u884C\u6216\u63A7\u5236\u5B57\u7B26\u3002';\n if ([...name.trim()].length > MAX_THREAD_NAME_CHARACTERS)\n return `\u4F1A\u8BDD\u540D\u79F0\u6700\u591A ${MAX_THREAD_NAME_CHARACTERS} \u4E2A\u5B57\u7B26\u3002`;\n return undefined;\n}\n"],
5
+ "mappings": "AACO,MAAM,6BAA6B;AAEnC,SAAS,gBAAgB,MAAkC;AAChE,MAAI,CAAC,KAAK,KAAK,EAAG,QAAO;AAGzB,MAAI,4CAA4C,KAAK,IAAI;AACvD,WAAO;AACT,MAAI,CAAC,GAAG,KAAK,KAAK,CAAC,EAAE,SAAS;AAC5B,WAAO,wCAAU,0BAA0B;AAC7C,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,24 @@
1
+ function toThreadSummary(thread) {
2
+ const lastTurn = thread.turns.at(-1);
3
+ return {
4
+ id: thread.id,
5
+ ...thread.archived === void 0 ? {} : { archived: thread.archived },
6
+ ...thread.forkedFromId === void 0 ? {} : { forkedFromId: thread.forkedFromId },
7
+ projectId: thread.projectId,
8
+ source: thread.source,
9
+ originator: thread.originator ?? null,
10
+ title: thread.title,
11
+ status: thread.status,
12
+ managed: thread.managed,
13
+ ...thread.historyVisible === void 0 ? {} : { historyVisible: thread.historyVisible },
14
+ ...thread.updatedAt === void 0 ? {} : { updatedAt: thread.updatedAt },
15
+ pendingActionCount: thread.actions.filter(
16
+ (action) => action.status === "pending" || action.status === "responding"
17
+ ).length,
18
+ ...lastTurn === void 0 ? {} : { lastTurnId: lastTurn.id, lastTurnStatus: lastTurn.status }
19
+ };
20
+ }
21
+ export {
22
+ toThreadSummary
23
+ };
24
+ //# sourceMappingURL=thread-summary.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shared/thread-summary.ts"],
4
+ "sourcesContent": ["import type { ThreadSummary, ThreadView } from './types.js';\n\n/** Overview messages deliberately omit conversation content and control payloads. */\nexport function toThreadSummary(thread: ThreadView): ThreadSummary {\n const lastTurn = thread.turns.at(-1);\n return {\n id: thread.id,\n ...(thread.archived === undefined ? {} : { archived: thread.archived }),\n ...(thread.forkedFromId === undefined ? {} : { forkedFromId: thread.forkedFromId }),\n projectId: thread.projectId,\n source: thread.source,\n originator: thread.originator ?? null,\n title: thread.title,\n status: thread.status,\n managed: thread.managed,\n ...(thread.historyVisible === undefined ? {} : { historyVisible: thread.historyVisible }),\n ...(thread.updatedAt === undefined ? {} : { updatedAt: thread.updatedAt }),\n pendingActionCount: thread.actions.filter(\n (action) => action.status === 'pending' || action.status === 'responding',\n ).length,\n ...(lastTurn === undefined ? {} : { lastTurnId: lastTurn.id, lastTurnStatus: lastTurn.status }),\n };\n}\n"],
5
+ "mappings": "AAGO,SAAS,gBAAgB,QAAmC;AACjE,QAAM,WAAW,OAAO,MAAM,GAAG,EAAE;AACnC,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,GAAI,OAAO,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,OAAO,SAAS;AAAA,IACrE,GAAI,OAAO,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,OAAO,aAAa;AAAA,IACjF,WAAW,OAAO;AAAA,IAClB,QAAQ,OAAO;AAAA,IACf,YAAY,OAAO,cAAc;AAAA,IACjC,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,SAAS,OAAO;AAAA,IAChB,GAAI,OAAO,mBAAmB,SAAY,CAAC,IAAI,EAAE,gBAAgB,OAAO,eAAe;AAAA,IACvF,GAAI,OAAO,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,OAAO,UAAU;AAAA,IACxE,oBAAoB,OAAO,QAAQ;AAAA,MACjC,CAAC,WAAW,OAAO,WAAW,aAAa,OAAO,WAAW;AAAA,IAC/D,EAAE;AAAA,IACF,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,YAAY,SAAS,IAAI,gBAAgB,SAAS,OAAO;AAAA,EAC/F;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ const releaseChannels = ["stable", "beta", "dev"];
2
+ const updateActive = (run) => Boolean(run && ["installing", "waiting", "stopping", "verifying"].includes(run.phase));
3
+ export {
4
+ releaseChannels,
5
+ updateActive
6
+ };
7
+ //# sourceMappingURL=updates.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shared/updates.ts"],
4
+ "sourcesContent": ["import type {\n CodexCompatibility,\n CodexCompatibilityManifest,\n CodexUpdateConfirmation,\n} from './codex-compatibility.js';\nexport const releaseChannels = ['stable', 'beta', 'dev'] as const;\nexport type ReleaseChannel = (typeof releaseChannels)[number];\nexport interface UpdateSettings {\n channel: ReleaseChannel;\n automatic: boolean;\n}\nexport type UpdatePhase =\n 'installing' | 'waiting' | 'stopping' | 'verifying' | 'succeeded' | 'rolledBack' | 'failed';\nexport interface UpdateRun {\n id: string;\n from: string;\n target: string;\n channel: ReleaseChannel;\n phase: UpdatePhase;\n message: string;\n startedAt: number;\n updatedAt: number;\n committed?: boolean;\n codex?: { version: string; manifest: CodexCompatibilityManifest; confirmedUnverified: boolean };\n}\nexport interface UpdateStatus {\n version: string;\n commit?: string;\n source: 'npm';\n codex: CodexCompatibility;\n settings: UpdateSettings;\n available?: {\n version: string;\n channel: ReleaseChannel;\n commit?: string;\n downgrade: boolean;\n codex: CodexCompatibility;\n };\n checkedAt?: number;\n checkError?: string;\n supported: boolean;\n unsupportedReason?: string;\n run?: UpdateRun;\n}\nexport const updateActive = (run?: UpdateRun) =>\n Boolean(run && ['installing', 'waiting', 'stopping', 'verifying'].includes(run.phase));\nexport interface UpdateController {\n status(): Promise<UpdateStatus>;\n check(channel?: ReleaseChannel): Promise<UpdateStatus>;\n configure(settings: UpdateSettings): Promise<UpdateStatus>;\n start(input: {\n clientOperationId: string;\n channel?: ReleaseChannel;\n allowDowngrade?: boolean;\n codexConfirmation?: CodexUpdateConfirmation;\n }): Promise<UpdateStatus>;\n close(): void;\n}\n"],
5
+ "mappings": "AAKO,MAAM,kBAAkB,CAAC,UAAU,QAAQ,KAAK;AAuChD,MAAM,eAAe,CAAC,QAC3B,QAAQ,OAAO,CAAC,cAAc,WAAW,YAAY,WAAW,EAAE,SAAS,IAAI,KAAK,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,116 @@
1
+ import { z } from "zod";
2
+ import { imageDataBytes, MAX_IMAGE_BYTES, MAX_IMAGES } from "./images.js";
3
+ import { threadNameError } from "./thread-name.js";
4
+ const cursorSchema = z.string().min(1).max(4096);
5
+ const idSchema = z.string().min(1).max(256);
6
+ const projectNameSchema = z.string().trim().min(1).max(100);
7
+ const createProjectSchema = z.object({ path: z.string().trim().min(1).max(4096), name: projectNameSchema.optional() }).strict();
8
+ const renameProjectSchema = z.object({ name: projectNameSchema }).strict();
9
+ const removeProjectSchema = z.object({}).strict();
10
+ const settingsSchema = z.object({
11
+ model: z.string().min(1).max(200).optional(),
12
+ reasoningEffort: z.string().min(1).max(40).optional(),
13
+ serviceTier: z.literal("fast").nullable().optional(),
14
+ permissionMode: z.enum(["ask", "auto-review", "full-access", "read-only"]).optional(),
15
+ approvalPolicy: z.enum(["untrusted", "on-request", "never"]).optional(),
16
+ approvalReviewer: z.enum(["user", "auto_review"]).optional(),
17
+ sandbox: z.enum(["read-only", "workspace-write", "danger-full-access"]).optional()
18
+ }).strict().refine(
19
+ (settings) => settings.permissionMode === void 0 || settings.sandbox === void 0 && settings.approvalPolicy === void 0 && settings.approvalReviewer === void 0,
20
+ "\u6743\u9650\u6A21\u5F0F\u4E0D\u80FD\u4E0E\u72EC\u7ACB\u7684\u6743\u9650\u3001\u5BA1\u6279\u7B56\u7565\u6216\u5BA1\u6838\u65B9\u540C\u65F6\u8BBE\u7F6E"
21
+ );
22
+ const operationSchema = z.object({ clientOperationId: z.string().uuid() }).strict();
23
+ const saveModelDefaultsSchema = operationSchema.extend({
24
+ settings: z.object({
25
+ model: z.string().min(1).max(200),
26
+ reasoningEffort: z.string().min(1).max(40).nullable()
27
+ }).strict()
28
+ });
29
+ const startReviewSchema = operationSchema;
30
+ const confirmCompatibilitySchema = operationSchema.extend({
31
+ codexEpoch: idSchema,
32
+ codexVersion: z.string().min(1).max(200),
33
+ verifiedVersion: z.string().min(1).max(200),
34
+ confirm: z.literal(true)
35
+ });
36
+ const createThreadSchema = operationSchema.extend({ settings: settingsSchema.optional() });
37
+ const forkThreadSchema = createThreadSchema;
38
+ const renameThreadSchema = operationSchema.extend({
39
+ name: z.string().superRefine((name, context) => {
40
+ const message = threadNameError(name);
41
+ if (message) context.addIssue({ code: "custom", message });
42
+ }).transform((name) => name.trim())
43
+ });
44
+ const resumeThreadSchema = createThreadSchema.extend({
45
+ confirmExternalStopped: z.boolean().optional()
46
+ });
47
+ const taskFields = {
48
+ text: z.string().max(1e5),
49
+ images: z.array(z.string().refine((value) => imageDataBytes(value) !== void 0, "Invalid image")).max(MAX_IMAGES).refine(
50
+ (images) => images.reduce((sum, image) => sum + (imageDataBytes(image) ?? Infinity), 0) <= MAX_IMAGE_BYTES,
51
+ "Images exceed size limit"
52
+ ).optional()
53
+ };
54
+ const hasContent = (input) => Boolean(input.text.trim() || input.images?.length);
55
+ const startTurnSchema = createThreadSchema.extend({
56
+ ...taskFields
57
+ }).refine(hasContent, "Text or an image is required");
58
+ const steerSchema = operationSchema.extend({
59
+ expectedTurnId: idSchema,
60
+ ...taskFields
61
+ }).refine(hasContent, "Text or an image is required");
62
+ const interruptSchema = operationSchema.extend({ expectedTurnId: idSchema });
63
+ const elicitationValueSchema = z.union([
64
+ z.string().max(1e4),
65
+ z.number().finite(),
66
+ z.boolean(),
67
+ z.array(z.string().max(1e4)).max(500)
68
+ ]);
69
+ const resolveActionSchema = operationSchema.extend({
70
+ resolution: z.union([
71
+ z.object({
72
+ decision: z.string().min(1).max(200),
73
+ content: z.record(z.string().max(1e3), elicitationValueSchema).optional(),
74
+ persist: z.literal("session").optional()
75
+ }).strict(),
76
+ z.object({ answers: z.record(z.string(), z.array(z.string().max(1e4)).max(50)) }).strict()
77
+ ])
78
+ });
79
+ const reconcileSchema = operationSchema.extend({ confirmEnded: z.literal(true) });
80
+ const subscribeSchema = z.object({
81
+ type: z.literal("subscribe"),
82
+ threadId: idSchema,
83
+ after: z.object({ serverEpoch: idSchema, seq: z.number().int().nonnegative() }).strict().optional()
84
+ }).strict();
85
+ const socketMessageSchema = z.discriminatedUnion("type", [
86
+ subscribeSchema,
87
+ z.object({ type: z.literal("unsubscribe") }).strict()
88
+ ]);
89
+ const archiveThreadSchema = operationSchema.extend({ archived: z.boolean() });
90
+ const archivedQuerySchema = z.enum(["true", "false"]).optional().transform((value) => value === "true");
91
+ export {
92
+ archiveThreadSchema,
93
+ archivedQuerySchema,
94
+ confirmCompatibilitySchema,
95
+ createProjectSchema,
96
+ createThreadSchema,
97
+ cursorSchema,
98
+ forkThreadSchema,
99
+ idSchema,
100
+ interruptSchema,
101
+ operationSchema,
102
+ reconcileSchema,
103
+ removeProjectSchema,
104
+ renameProjectSchema,
105
+ renameThreadSchema,
106
+ resolveActionSchema,
107
+ resumeThreadSchema,
108
+ saveModelDefaultsSchema,
109
+ settingsSchema,
110
+ socketMessageSchema,
111
+ startReviewSchema,
112
+ startTurnSchema,
113
+ steerSchema,
114
+ subscribeSchema
115
+ };
116
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shared/validation.ts"],
4
+ "sourcesContent": ["import { z } from 'zod';\nimport { imageDataBytes, MAX_IMAGE_BYTES, MAX_IMAGES } from './images.js';\nimport type { TaskMessage } from './types.js';\nimport { threadNameError } from './thread-name.js';\nexport const cursorSchema = z.string().min(1).max(4096);\nexport const idSchema = z.string().min(1).max(256);\nconst projectNameSchema = z.string().trim().min(1).max(100);\nexport const createProjectSchema = z\n .object({ path: z.string().trim().min(1).max(4096), name: projectNameSchema.optional() })\n .strict();\nexport const renameProjectSchema = z.object({ name: projectNameSchema }).strict();\nexport const removeProjectSchema = z.object({}).strict();\nexport const settingsSchema = z\n .object({\n model: z.string().min(1).max(200).optional(),\n reasoningEffort: z.string().min(1).max(40).optional(),\n serviceTier: z.literal('fast').nullable().optional(),\n permissionMode: z.enum(['ask', 'auto-review', 'full-access', 'read-only']).optional(),\n approvalPolicy: z.enum(['untrusted', 'on-request', 'never']).optional(),\n approvalReviewer: z.enum(['user', 'auto_review']).optional(),\n sandbox: z.enum(['read-only', 'workspace-write', 'danger-full-access']).optional(),\n })\n .strict()\n .refine(\n (settings) =>\n settings.permissionMode === undefined ||\n (settings.sandbox === undefined &&\n settings.approvalPolicy === undefined &&\n settings.approvalReviewer === undefined),\n '\u6743\u9650\u6A21\u5F0F\u4E0D\u80FD\u4E0E\u72EC\u7ACB\u7684\u6743\u9650\u3001\u5BA1\u6279\u7B56\u7565\u6216\u5BA1\u6838\u65B9\u540C\u65F6\u8BBE\u7F6E',\n );\nexport const operationSchema = z.object({ clientOperationId: z.string().uuid() }).strict();\nexport const saveModelDefaultsSchema = operationSchema.extend({\n settings: z\n .object({\n model: z.string().min(1).max(200),\n reasoningEffort: z.string().min(1).max(40).nullable(),\n })\n .strict(),\n});\nexport const startReviewSchema = operationSchema;\nexport const confirmCompatibilitySchema = operationSchema.extend({\n codexEpoch: idSchema,\n codexVersion: z.string().min(1).max(200),\n verifiedVersion: z.string().min(1).max(200),\n confirm: z.literal(true),\n});\nexport const createThreadSchema = operationSchema.extend({ settings: settingsSchema.optional() });\nexport const forkThreadSchema = createThreadSchema;\nexport const renameThreadSchema = operationSchema.extend({\n name: z\n .string()\n .superRefine((name, context) => {\n const message = threadNameError(name);\n if (message) context.addIssue({ code: 'custom', message });\n })\n .transform((name) => name.trim()),\n});\nexport const resumeThreadSchema = createThreadSchema.extend({\n confirmExternalStopped: z.boolean().optional(),\n});\nconst taskFields = {\n text: z.string().max(100_000),\n images: z\n .array(z.string().refine((value) => imageDataBytes(value) !== undefined, 'Invalid image'))\n .max(MAX_IMAGES)\n .refine(\n (images) =>\n images.reduce((sum, image) => sum + (imageDataBytes(image) ?? Infinity), 0) <=\n MAX_IMAGE_BYTES,\n 'Images exceed size limit',\n )\n .optional(),\n};\nconst hasContent = (input: TaskMessage) => Boolean(input.text.trim() || input.images?.length);\nexport const startTurnSchema = createThreadSchema\n .extend({\n ...taskFields,\n })\n .refine(hasContent, 'Text or an image is required');\nexport const steerSchema = operationSchema\n .extend({\n expectedTurnId: idSchema,\n ...taskFields,\n })\n .refine(hasContent, 'Text or an image is required');\nexport const interruptSchema = operationSchema.extend({ expectedTurnId: idSchema });\nconst elicitationValueSchema = z.union([\n z.string().max(10_000),\n z.number().finite(),\n z.boolean(),\n z.array(z.string().max(10_000)).max(500),\n]);\nexport const resolveActionSchema = operationSchema.extend({\n resolution: z.union([\n z\n .object({\n decision: z.string().min(1).max(200),\n content: z.record(z.string().max(1000), elicitationValueSchema).optional(),\n persist: z.literal('session').optional(),\n })\n .strict(),\n z.object({ answers: z.record(z.string(), z.array(z.string().max(10_000)).max(50)) }).strict(),\n ]),\n});\nexport const reconcileSchema = operationSchema.extend({ confirmEnded: z.literal(true) });\nexport const subscribeSchema = z\n .object({\n type: z.literal('subscribe'),\n threadId: idSchema,\n after: z\n .object({ serverEpoch: idSchema, seq: z.number().int().nonnegative() })\n .strict()\n .optional(),\n })\n .strict();\nexport const socketMessageSchema = z.discriminatedUnion('type', [\n subscribeSchema,\n z.object({ type: z.literal('unsubscribe') }).strict(),\n]);\n\nexport const archiveThreadSchema = operationSchema.extend({ archived: z.boolean() });\nexport const archivedQuerySchema = z\n .enum(['true', 'false'])\n .optional()\n .transform((value) => value === 'true');\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,36 @@
1
+ const versionPattern = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
2
+ function validVersion(version) {
3
+ const match = versionPattern.exec(version);
4
+ return Boolean(
5
+ match && (!match[4] || match[4].split(".").every((part) => !/^\d+$/.test(part) || part === "0" || !part.startsWith("0")))
6
+ );
7
+ }
8
+ function compareVersions(left, right) {
9
+ if (!validVersion(left) || !validVersion(right)) throw new Error("Invalid release version");
10
+ const a = versionPattern.exec(left);
11
+ const b = versionPattern.exec(right);
12
+ for (let i = 1; i <= 3; i++) {
13
+ const difference = BigInt(a[i]) - BigInt(b[i]);
14
+ if (difference) return difference > 0 ? 1 : -1;
15
+ }
16
+ if (!a[4] || !b[4]) return a[4] === b[4] ? 0 : a[4] ? -1 : 1;
17
+ const ap = a[4].split(".");
18
+ const bp = b[4].split(".");
19
+ for (let i = 0; i < Math.max(ap.length, bp.length); i++) {
20
+ const x = ap[i];
21
+ const y = bp[i];
22
+ if (x === y) continue;
23
+ if (x === void 0 || y === void 0) return x === void 0 ? -1 : 1;
24
+ const xn = /^\d+$/.test(x);
25
+ const yn = /^\d+$/.test(y);
26
+ if (xn && yn) return BigInt(x) > BigInt(y) ? 1 : -1;
27
+ if (xn !== yn) return xn ? -1 : 1;
28
+ return x > y ? 1 : -1;
29
+ }
30
+ return 0;
31
+ }
32
+ export {
33
+ compareVersions,
34
+ validVersion
35
+ };
36
+ //# sourceMappingURL=versions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shared/versions.ts"],
4
+ "sourcesContent": ["const versionPattern =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\nexport function validVersion(version: string) {\n const match = versionPattern.exec(version);\n return Boolean(\n match &&\n (!match[4] ||\n match[4]\n .split('.')\n .every((part) => !/^\\d+$/.test(part) || part === '0' || !part.startsWith('0'))),\n );\n}\nexport function compareVersions(left: string, right: string): number {\n if (!validVersion(left) || !validVersion(right)) throw new Error('Invalid release version');\n const a = versionPattern.exec(left)!;\n const b = versionPattern.exec(right)!;\n for (let i = 1; i <= 3; i++) {\n const difference = BigInt(a[i]!) - BigInt(b[i]!);\n if (difference) return difference > 0 ? 1 : -1;\n }\n if (!a[4] || !b[4]) return a[4] === b[4] ? 0 : a[4] ? -1 : 1;\n const ap = a[4].split('.');\n const bp = b[4].split('.');\n for (let i = 0; i < Math.max(ap.length, bp.length); i++) {\n const x = ap[i];\n const y = bp[i];\n if (x === y) continue;\n if (x === undefined || y === undefined) return x === undefined ? -1 : 1;\n const xn = /^\\d+$/.test(x);\n const yn = /^\\d+$/.test(y);\n if (xn && yn) return BigInt(x) > BigInt(y) ? 1 : -1;\n if (xn !== yn) return xn ? -1 : 1;\n return x > y ? 1 : -1;\n }\n return 0;\n}\n"],
5
+ "mappings": "AAAA,MAAM,iBACJ;AACK,SAAS,aAAa,SAAiB;AAC5C,QAAM,QAAQ,eAAe,KAAK,OAAO;AACzC,SAAO;AAAA,IACL,UACC,CAAC,MAAM,CAAC,KACP,MAAM,CAAC,EACJ,MAAM,GAAG,EACT,MAAM,CAAC,SAAS,CAAC,QAAQ,KAAK,IAAI,KAAK,SAAS,OAAO,CAAC,KAAK,WAAW,GAAG,CAAC;AAAA,EACnF;AACF;AACO,SAAS,gBAAgB,MAAc,OAAuB;AACnE,MAAI,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,KAAK,EAAG,OAAM,IAAI,MAAM,yBAAyB;AAC1F,QAAM,IAAI,eAAe,KAAK,IAAI;AAClC,QAAM,IAAI,eAAe,KAAK,KAAK;AACnC,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,UAAM,aAAa,OAAO,EAAE,CAAC,CAAE,IAAI,OAAO,EAAE,CAAC,CAAE;AAC/C,QAAI,WAAY,QAAO,aAAa,IAAI,IAAI;AAAA,EAC9C;AACA,MAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAG,QAAO,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,KAAK;AAC3D,QAAM,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG;AACzB,QAAM,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG;AACzB,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK;AACvD,UAAM,IAAI,GAAG,CAAC;AACd,UAAM,IAAI,GAAG,CAAC;AACd,QAAI,MAAM,EAAG;AACb,QAAI,MAAM,UAAa,MAAM,OAAW,QAAO,MAAM,SAAY,KAAK;AACtE,UAAM,KAAK,QAAQ,KAAK,CAAC;AACzB,UAAM,KAAK,QAAQ,KAAK,CAAC;AACzB,QAAI,MAAM,GAAI,QAAO,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI;AACjD,QAAI,OAAO,GAAI,QAAO,KAAK,KAAK;AAChC,WAAO,IAAI,IAAI,IAAI;AAAA,EACrB;AACA,SAAO;AACT;",
6
+ "names": []
7
+ }