@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.
- package/LICENSE +21 -0
- package/README.md +173 -2
- package/README.zh-CN.md +174 -0
- package/bin/covro.mjs +8 -0
- package/dist/cli/control.js +66 -0
- package/dist/cli/control.js.map +7 -0
- package/dist/cli/daemon.js +118 -0
- package/dist/cli/daemon.js.map +7 -0
- package/dist/cli/main.js +152 -0
- package/dist/cli/main.js.map +7 -0
- package/dist/cli/paths.js +60 -0
- package/dist/cli/paths.js.map +7 -0
- package/dist/cli/service.js +87 -0
- package/dist/cli/service.js.map +7 -0
- package/dist/codex/adapter.js +1195 -0
- package/dist/codex/adapter.js.map +7 -0
- package/dist/codex/auto-review.js +102 -0
- package/dist/codex/auto-review.js.map +7 -0
- package/dist/codex/compatibility.js +7 -0
- package/dist/codex/compatibility.js.map +7 -0
- package/dist/codex/mapping.js +210 -0
- package/dist/codex/mapping.js.map +7 -0
- package/dist/codex/permissions.js +51 -0
- package/dist/codex/permissions.js.map +7 -0
- package/dist/codex/thread-title-policy.js +52 -0
- package/dist/codex/thread-title-policy.js.map +7 -0
- package/dist/codex/thread-titles.js +259 -0
- package/dist/codex/thread-titles.js.map +7 -0
- package/dist/codex/transport.js +236 -0
- package/dist/codex/transport.js.map +7 -0
- package/dist/codex/turn-token-usage.js +46 -0
- package/dist/codex/turn-token-usage.js.map +7 -0
- package/dist/codex/types.js +1 -0
- package/dist/codex/types.js.map +7 -0
- package/dist/drizzle/0000_past_wildside.sql +45 -0
- package/dist/drizzle/0001_shocking_ender_wiggin.sql +2 -0
- package/dist/drizzle/0002_allow_parallel_threads.sql +1 -0
- package/dist/drizzle/0003_project_registrations.sql +11 -0
- package/dist/drizzle/0004_turn_usage.sql +6 -0
- package/dist/drizzle/meta/0000_snapshot.json +309 -0
- package/dist/drizzle/meta/0001_snapshot.json +323 -0
- package/dist/drizzle/meta/0002_snapshot.json +315 -0
- package/dist/drizzle/meta/0003_snapshot.json +381 -0
- package/dist/drizzle/meta/0004_snapshot.json +420 -0
- package/dist/drizzle/meta/_journal.json +41 -0
- package/dist/server/auth.js +47 -0
- package/dist/server/auth.js.map +7 -0
- package/dist/server/compaction.js +40 -0
- package/dist/server/compaction.js.map +7 -0
- package/dist/server/config-store.js +147 -0
- package/dist/server/config-store.js.map +7 -0
- package/dist/server/config.js +124 -0
- package/dist/server/config.js.map +7 -0
- package/dist/server/db/index.js +21 -0
- package/dist/server/db/index.js.map +7 -0
- package/dist/server/db/migrate.js +26 -0
- package/dist/server/db/migrate.js.map +7 -0
- package/dist/server/db/operations.js +201 -0
- package/dist/server/db/operations.js.map +7 -0
- package/dist/server/db/schema.js +99 -0
- package/dist/server/db/schema.js.map +7 -0
- package/dist/server/db/turn-usage.js +31 -0
- package/dist/server/db/turn-usage.js.map +7 -0
- package/dist/server/events.js +123 -0
- package/dist/server/events.js.map +7 -0
- package/dist/server/http.js +305 -0
- package/dist/server/http.js.map +7 -0
- package/dist/server/images.js +49 -0
- package/dist/server/images.js.map +7 -0
- package/dist/server/instance-lock.js +25 -0
- package/dist/server/instance-lock.js.map +7 -0
- package/dist/server/local-files.js +100 -0
- package/dist/server/local-files.js.map +7 -0
- package/dist/server/main.js +125 -0
- package/dist/server/main.js.map +7 -0
- package/dist/server/markdown.js +28 -0
- package/dist/server/markdown.js.map +7 -0
- package/dist/server/projection.js +348 -0
- package/dist/server/projection.js.map +7 -0
- package/dist/server/projects.js +230 -0
- package/dist/server/projects.js.map +7 -0
- package/dist/server/service.js +1221 -0
- package/dist/server/service.js.map +7 -0
- package/dist/server/snapshot.js +98 -0
- package/dist/server/snapshot.js.map +7 -0
- package/dist/server/thread-export.js +97 -0
- package/dist/server/thread-export.js.map +7 -0
- package/dist/server/websocket.js +126 -0
- package/dist/server/websocket.js.map +7 -0
- package/dist/shared/async-questions.js +39 -0
- package/dist/shared/async-questions.js.map +7 -0
- package/dist/shared/codex-compatibility.js +56 -0
- package/dist/shared/codex-compatibility.js.map +7 -0
- package/dist/shared/elicitation.js +314 -0
- package/dist/shared/elicitation.js.map +7 -0
- package/dist/shared/errors.js +24 -0
- package/dist/shared/errors.js.map +7 -0
- package/dist/shared/gateway-config.js +1 -0
- package/dist/shared/gateway-config.js.map +7 -0
- package/dist/shared/images.js +21 -0
- package/dist/shared/images.js.map +7 -0
- package/dist/shared/package.js +5 -0
- package/dist/shared/package.js.map +7 -0
- package/dist/shared/permissions.js +63 -0
- package/dist/shared/permissions.js.map +7 -0
- package/dist/shared/thread-name.js +14 -0
- package/dist/shared/thread-name.js.map +7 -0
- package/dist/shared/thread-summary.js +24 -0
- package/dist/shared/thread-summary.js.map +7 -0
- package/dist/shared/types.js +1 -0
- package/dist/shared/types.js.map +7 -0
- package/dist/shared/updates.js +7 -0
- package/dist/shared/updates.js.map +7 -0
- package/dist/shared/validation.js +116 -0
- package/dist/shared/validation.js.map +7 -0
- package/dist/shared/versions.js +36 -0
- package/dist/shared/versions.js.map +7 -0
- package/dist/update-worker.cjs +21968 -0
- package/dist/updates/files.js +54 -0
- package/dist/updates/files.js.map +7 -0
- package/dist/updates/manager.js +315 -0
- package/dist/updates/manager.js.map +7 -0
- package/dist/updates/registry.js +71 -0
- package/dist/updates/registry.js.map +7 -0
- package/dist/updates/transaction.js +96 -0
- package/dist/updates/transaction.js.map +7 -0
- package/dist/updates/worker.js +345 -0
- package/dist/updates/worker.js.map +7 -0
- package/dist/web/assets/index-BW9afH_Y.js +83 -0
- package/dist/web/assets/index-L3S1ZiO0.css +1 -0
- package/dist/web/covro.svg +6 -0
- package/dist/web/index.html +15 -0
- 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,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,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": ["../../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
|
+
}
|