@relay-harness/coding-agent 1.0.2 → 1.0.4

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 (93) hide show
  1. package/CHANGELOG.md +27 -6
  2. package/LICENSE +22 -0
  3. package/README.md +14 -16
  4. package/dist/bundle/chunks/{chunk-H6S6DQTM.js → chunk-6AEKWHDP.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-3QND5D7W.js → chunk-7ZBTLURV.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-WMTXXI7H.js → chunk-FUPU6X73.js} +1 -1
  7. package/dist/bundle/chunks/{chunk-XDAWU2J5.js → chunk-IDUCLYG3.js} +1 -1
  8. package/dist/bundle/chunks/{chunk-XSLAMYCK.js → chunk-LVFZRSZQ.js} +556 -62
  9. package/dist/bundle/chunks/{chunk-ISNO4JTR.js → chunk-PJWDW5WR.js} +2 -2
  10. package/dist/bundle/chunks/{chunk-3XNI2SB6.js → chunk-TZ2ZVU7E.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-MP5FU7MG.js → chunk-UVFWV6YH.js} +1 -1
  12. package/dist/bundle/chunks/{chunk-PTRF7IZB.js → chunk-WU7MEKPF.js} +1 -1
  13. package/dist/bundle/chunks/{cli-K4CNHWOI.js → cli-2LN4J4IN.js} +1 -1
  14. package/dist/bundle/chunks/{easter-egg-3d-TGRCIHA4.js → easter-egg-3d-URCOHV3B.js} +1 -1
  15. package/dist/bundle/chunks/{execute-6E5DA2QI.js → execute-JAHDBPR2.js} +1 -1
  16. package/dist/bundle/chunks/{runtime-O5HLCH3V.js → runtime-TTSK6Y5T.js} +1 -1
  17. package/dist/bundle/chunks/{virtual-modules-FNVEVB65.js → virtual-modules-2G2P7CK2.js} +1 -1
  18. package/dist/bundle/cli-runtime.js +1 -1
  19. package/dist/bundle/index.js +1 -1
  20. package/dist/bundle/rpc-entry.js +1 -1
  21. package/dist/core/settings-manager.d.ts +5 -3
  22. package/dist/core/settings-manager.d.ts.map +1 -1
  23. package/dist/core/settings-manager.js.map +1 -1
  24. package/dist/extensions/laya/assessment.d.ts +7 -1
  25. package/dist/extensions/laya/assessment.d.ts.map +1 -1
  26. package/dist/extensions/laya/assessment.js +21 -1
  27. package/dist/extensions/laya/assessment.js.map +1 -1
  28. package/dist/extensions/laya/docker.d.ts +19 -0
  29. package/dist/extensions/laya/docker.d.ts.map +1 -0
  30. package/dist/extensions/laya/docker.js +44 -0
  31. package/dist/extensions/laya/docker.js.map +1 -0
  32. package/dist/extensions/laya/index.d.ts +12 -3
  33. package/dist/extensions/laya/index.d.ts.map +1 -1
  34. package/dist/extensions/laya/index.js +331 -67
  35. package/dist/extensions/laya/index.js.map +1 -1
  36. package/dist/extensions/laya/learn.d.ts +67 -0
  37. package/dist/extensions/laya/learn.d.ts.map +1 -0
  38. package/dist/extensions/laya/learn.js +263 -0
  39. package/dist/extensions/laya/learn.js.map +1 -0
  40. package/dist/extensions/laya/memory.d.ts +48 -0
  41. package/dist/extensions/laya/memory.d.ts.map +1 -0
  42. package/dist/extensions/laya/memory.js +107 -0
  43. package/dist/extensions/laya/memory.js.map +1 -0
  44. package/dist/extensions/laya/model-manifest.d.ts +1 -1
  45. package/dist/extensions/laya/model-manifest.js +1 -1
  46. package/dist/extensions/laya/model-manifest.js.map +1 -1
  47. package/dist/extensions/laya/routers.d.ts +8 -0
  48. package/dist/extensions/laya/routers.d.ts.map +1 -1
  49. package/dist/extensions/laya/routers.js +2 -0
  50. package/dist/extensions/laya/routers.js.map +1 -1
  51. package/dist/extensions/laya/runtime.d.ts +39 -49
  52. package/dist/extensions/laya/runtime.d.ts.map +1 -1
  53. package/dist/extensions/laya/runtime.js +93 -145
  54. package/dist/extensions/laya/runtime.js.map +1 -1
  55. package/dist/extensions/laya/server.d.ts +39 -15
  56. package/dist/extensions/laya/server.d.ts.map +1 -1
  57. package/dist/extensions/laya/server.js +219 -78
  58. package/dist/extensions/laya/server.js.map +1 -1
  59. package/dist/extensions/laya/train-script.d.ts +8 -0
  60. package/dist/extensions/laya/train-script.d.ts.map +1 -0
  61. package/dist/extensions/laya/train-script.js +422 -0
  62. package/dist/extensions/laya/train-script.js.map +1 -0
  63. package/dist/extensions/laya/training.d.ts +176 -0
  64. package/dist/extensions/laya/training.d.ts.map +1 -0
  65. package/dist/extensions/laya/training.js +337 -0
  66. package/dist/extensions/laya/training.js.map +1 -0
  67. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  68. package/dist/modes/interactive/components/config-selector.js +3 -2
  69. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  70. package/dist/modes/interactive/components/custom-message.js +1 -1
  71. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  72. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  73. package/dist/modes/interactive/interactive-mode.js +4 -4
  74. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  75. package/dist/modes/interactive/theme/dark.json +9 -9
  76. package/dist/modes/interactive/theme/light.json +9 -9
  77. package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -1
  78. package/dist/modes/interactive/theme/system-theme.js +11 -10
  79. package/dist/modes/interactive/theme/system-theme.js.map +1 -1
  80. package/dist/utils/version-check.d.ts.map +1 -1
  81. package/dist/utils/version-check.js +10 -6
  82. package/dist/utils/version-check.js.map +1 -1
  83. package/docs/laya.md +59 -19
  84. package/docs/quickstart.md +19 -6
  85. package/docs/settings.md +4 -3
  86. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  87. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  88. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  89. package/examples/extensions/sandbox/package-lock.json +2 -2
  90. package/examples/extensions/sandbox/package.json +1 -1
  91. package/examples/extensions/with-deps/package-lock.json +2 -2
  92. package/examples/extensions/with-deps/package.json +1 -1
  93. package/package.json +15 -11
@@ -1,4 +1,4 @@
1
- import { AGENT_IDS, AMBIGUITY_LEVELS, CAPABILITY_TIERS, COMPLEXITY_LEVELS, REASONING_EFFORTS, REASONING_LEVELS, RISK_LEVELS, TASK_SCOPES, TASK_TYPES, TOOL_REQUIREMENT_IDS, VALIDATION_LEVELS, } from "./questions.js";
1
+ import { AGENT_IDS, AMBIGUITY_LEVELS, CAPABILITY_TIERS, COMPLEXITY_LEVELS, LAYA_QUESTIONS, REASONING_EFFORTS, REASONING_LEVELS, RISK_LEVELS, TASK_SCOPES, TASK_TYPES, TOOL_REQUIREMENT_IDS, VALIDATION_LEVELS, } from "./questions.js";
2
2
  function choice(answers, id, options) {
3
3
  const answer = answers[id];
4
4
  if (answer?.type !== "choice" || !options.includes(answer.choice)) {
@@ -41,6 +41,26 @@ export function assessmentFromAnswers(answers) {
41
41
  confidence: Math.min(type.confidence, tier.confidence, effort.confidence),
42
42
  };
43
43
  }
44
+ /**
45
+ * The assessment a labeled exercise describes, read as answers given with full certainty. Throws when
46
+ * a label is missing or not an option.
47
+ */
48
+ export function assessmentFromLabels(labels) {
49
+ const answers = {};
50
+ for (const [id, question] of Object.entries(LAYA_QUESTIONS)) {
51
+ const value = labels[id];
52
+ if (question.type === "choice" && typeof value === "string") {
53
+ answers[id] = { type: "choice", choice: value, probabilities: { [value]: 1 }, confidence: 1 };
54
+ }
55
+ else if (question.type === "score" && typeof value === "number") {
56
+ answers[id] = { type: "score", score: value, confidence: 1 };
57
+ }
58
+ else if (question.type === "bool" && typeof value === "boolean") {
59
+ answers[id] = { type: "bool", probability: value ? 1 : 0 };
60
+ }
61
+ }
62
+ return assessmentFromAnswers(answers);
63
+ }
44
64
  const has = (pattern, text) => pattern.test(text);
45
65
  /** Ordered: the first matching rule decides the task type. English and Portuguese keywords. */
46
66
  const TYPE_RULES = [
@@ -1 +1 @@
1
- {"version":3,"file":"assessment.js","sourceRoot":"","sources":["../../../src/extensions/laya/assessment.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ClassifierAnswer } from \"@relay-harness/ai\";\nimport {\n\tAGENT_IDS,\n\ttype AgentId,\n\tAMBIGUITY_LEVELS,\n\tCAPABILITY_TIERS,\n\ttype CapabilityTier,\n\tCOMPLEXITY_LEVELS,\n\tREASONING_EFFORTS,\n\tREASONING_LEVELS,\n\ttype ReasoningEffort,\n\tRISK_LEVELS,\n\tTASK_SCOPES,\n\tTASK_TYPES,\n\ttype TaskScope,\n\ttype TaskType,\n\tTOOL_REQUIREMENT_IDS,\n\ttype ToolRequirement,\n\tVALIDATION_LEVELS,\n\ttype ValidationLevel,\n} from \"./questions.ts\";\n\n/** Laya's System 1 answer about one request: what the task is and how it recommends running it. */\nexport interface TaskAssessment {\n\tsource: \"laya\" | \"heuristic\";\n\ttask: {\n\t\ttype: TaskType;\n\t\t/** Scores normalized to 0..1. */\n\t\tcomplexity: number;\n\t\trisk: number;\n\t\tambiguity: number;\n\t\treasoning: number;\n\t\tscope: TaskScope;\n\t};\n\trecommendation: { tier: CapabilityTier; effort: ReasoningEffort };\n\tagent: AgentId;\n\tvalidation: ValidationLevel;\n\ttools: Record<ToolRequirement, boolean>;\n\tsecuritySensitive: boolean;\n\t/** Lowest confidence among the answers that drive routing: task type, tier and effort. */\n\tconfidence: number;\n}\n\nfunction choice<T extends string>(answers: Record<string, ClassifierAnswer>, id: string, options: readonly T[]) {\n\tconst answer = answers[id];\n\tif (answer?.type !== \"choice\" || !options.includes(answer.choice as T)) {\n\t\tthrow new Error(`Laya returned no valid answer for ${id}`);\n\t}\n\treturn { value: answer.choice as T, confidence: answer.probabilities[answer.choice] ?? answer.confidence };\n}\n\nfunction score(answers: Record<string, ClassifierAnswer>, id: string, levels: readonly string[]): number {\n\tconst answer = answers[id];\n\tif (answer?.type !== \"score\") throw new Error(`Laya returned no valid answer for ${id}`);\n\treturn Math.min(1, Math.max(0, answer.score / (levels.length - 1)));\n}\n\nfunction yes(answers: Record<string, ClassifierAnswer>, id: string): boolean {\n\tconst answer = answers[id];\n\tif (answer?.type !== \"bool\") throw new Error(`Laya returned no valid answer for ${id}`);\n\treturn answer.probability >= 0.5;\n}\n\n/** Reads a classifier result for `LAYA_QUESTIONS`. Throws when an answer is missing or unknown. */\nexport function assessmentFromAnswers(answers: Record<string, ClassifierAnswer>): TaskAssessment {\n\tconst type = choice(answers, \"task_type\", TASK_TYPES);\n\tconst tier = choice(answers, \"capability_tier\", CAPABILITY_TIERS);\n\tconst effort = choice(answers, \"reasoning_effort\", REASONING_EFFORTS);\n\treturn {\n\t\tsource: \"laya\",\n\t\ttask: {\n\t\t\ttype: type.value,\n\t\t\tcomplexity: score(answers, \"complexity\", COMPLEXITY_LEVELS),\n\t\t\trisk: score(answers, \"risk\", RISK_LEVELS),\n\t\t\tambiguity: score(answers, \"ambiguity\", AMBIGUITY_LEVELS),\n\t\t\treasoning: score(answers, \"reasoning_requirement\", REASONING_LEVELS),\n\t\t\tscope: choice(answers, \"scope\", TASK_SCOPES).value,\n\t\t},\n\t\trecommendation: { tier: tier.value, effort: effort.value },\n\t\tagent: choice(answers, \"agent\", AGENT_IDS).value,\n\t\tvalidation: choice(answers, \"validation_level\", VALIDATION_LEVELS).value,\n\t\ttools: Object.fromEntries(TOOL_REQUIREMENT_IDS.map((id) => [id, yes(answers, id)])) as Record<\n\t\t\tToolRequirement,\n\t\t\tboolean\n\t\t>,\n\t\tsecuritySensitive: yes(answers, \"security_sensitive\"),\n\t\tconfidence: Math.min(type.confidence, tier.confidence, effort.confidence),\n\t};\n}\n\nconst has = (pattern: RegExp, text: string) => pattern.test(text);\n\n/** Ordered: the first matching rule decides the task type. English and Portuguese keywords. */\nconst TYPE_RULES: Array<[TaskType, RegExp]> = [\n\t[\"security\", /vulnerab|inje[cç]|xss|csrf|exploit|secur|seguran[cç]a|oauth|password|senha|secret|segredo/],\n\t[\"architecture\", /architect|arquitet|system design|microservi|microsservi|\\badr\\b|desenhe uma|design a /],\n\t[\n\t\t\"debugging\",\n\t\t/investigat|investig|root cause|causa raiz|deadlock|intermittent|intermitente|hangs|trava|why .*fail|por que .*falh/,\n\t],\n\t[\"test\", /\\btests?\\b|\\btestes?\\b|coverage|cobertura|flaky|type ?check|checagem/],\n\t[\"bug_fix\", /\\bfix\\b|\\bbug|corrij|conserte|arrume|broken|quebr|crash|\\berro|\\berror|wrong|errad|returns? 500/],\n\t[\n\t\t\"refactor\",\n\t\t/refactor|refator|extract|extraia|\\bsplit\\b|divida|rename|renomei|migrate .* to|migre|convert|converta/,\n\t],\n\t[\"documentation\", /readme|\\bdocs?\\b|document|changelog|comment|coment[aá]rio/],\n\t[\"research\", /compare|pesquis|research|map every|mapeie|list the|liste os/],\n\t[\n\t\t\"feature\",\n\t\t/\\badd\\b|adicion|implement|create|crie|\\bbuild\\b|support|suporte|endpoint|integrat|integre|deploy|pipeline/,\n\t],\n];\n\nconst QUESTION_START =\n\t/^(what|how|why|where|which|when|is |are |can |does |o que|como|por que|onde|qual|quando|isso|d[aá] )/;\n\nconst DEFAULT_COMPLEXITY: Record<TaskType, number> = {\n\tquestion: 1,\n\tcode_edit: 1,\n\tbug_fix: 2,\n\trefactor: 2,\n\tfeature: 2,\n\ttest: 1,\n\tarchitecture: 3,\n\tdebugging: 3,\n\tsecurity: 3,\n\tresearch: 1,\n\tdocumentation: 1,\n};\n\nconst AGENT_RULES: Array<[AgentId, RegExp]> = [\n\t[\"mobile-engineer\", /android|\\bios\\b|mobile|flutter|react native|swift|kotlin/],\n\t[\"devops-engineer\", /docker|\\bci\\b|pipeline|deploy|kubernetes|\\bk8s\\b|release|workflow|terraform/],\n\t[\"database-engineer\", /\\bsql\\b|database|banco de dados|\\bindex|[ií]ndice|migration|query|consulta|schema/],\n\t[\n\t\t\"frontend-engineer\",\n\t\t/\\bcss\\b|\\bui\\b|button|bot[aã]o|component|p[aá]gina|\\bpage\\b|modal|dropdown|react|html|dark mode|layout/,\n\t],\n\t[\"backend-engineer\", /\\bapi\\b|endpoint|servi[cç]|service|queue|fila|worker|server|backend/],\n];\n\nconst SECURITY_SENSITIVE =\n\t/auth|login|oauth|token|password|senha|secret|segredo|credential|credencia|permiss|payment|pagamento|stripe|vulnerab|inje[cç]|production (database|db|data)|banco de produ|produ[cç][aã]o.*(migra|banco)|(migra|banco).*produ[cç]/;\n\n/**\n * Keyword fallback used when the Laya server is unreachable or returns invalid answers, so routing\n * keeps working. It follows the same tier rule as the synthetic training data and reports a\n * confidence of 0.5: neither trusted nor escalated.\n */\nexport function heuristicAssessment(request: string): TaskAssessment {\n\tconst text = request.toLowerCase();\n\tlet type: TaskType =\n\t\tTYPE_RULES.find(([, pattern]) => has(pattern, text))?.[0] ??\n\t\t(text.trim().endsWith(\"?\") || QUESTION_START.test(text.trim()) ? \"question\" : \"code_edit\");\n\tif (type !== \"question\" && text.trim().endsWith(\"?\") && QUESTION_START.test(text.trim())) type = \"question\";\n\n\tlet complexity = DEFAULT_COMPLEXITY[type];\n\tif (has(/typo|digita[cç][aã]o|rename|renomei|texto|\\btext\\b|bump|vers[aã]o do/, text)) complexity = 0;\n\tif (\n\t\thas(\n\t\t\t/race condition|condi[cç][aã]o de corrida|concurren|concorr[eê]n|memory leak|vazamento|multi-tenant|zero downtime|sem downtime/,\n\t\t\ttext,\n\t\t)\n\t)\n\t\tcomplexity = 3;\n\tif (has(/distribut|distribu[ií]d|crdt|corrup|plugin system|sistema de plugins|deadlock|monorepo/, text))\n\t\tcomplexity = 4;\n\n\tconst security = has(SECURITY_SENSITIVE, text) || type === \"security\";\n\tlet risk = complexity >= 3 ? 2 : complexity >= 2 ? 1 : 0;\n\tif (security || has(/produ[cç]|production|\\bdrop\\b|delete|apag/, text)) risk = 3;\n\n\tconst scope: TaskScope = has(/\\btypo|digita|button|bot[aã]o|\\bline\\b|linha/, text)\n\t\t? \"single_line\"\n\t\t: has(/monorepo|repository|reposit[oó]rio|whole|inteiro|all (the )?packages|todos os pacotes/, text)\n\t\t\t? \"repository\"\n\t\t\t: has(/services|servi[cç]os|across|between|entre|packages|pacotes/, text)\n\t\t\t\t? \"multi_module\"\n\t\t\t\t: has(/\\.[a-z]{1,5}\\b/, text)\n\t\t\t\t\t? \"single_file\"\n\t\t\t\t\t: \"module\";\n\n\tconst ambiguity =\n\t\ttext.length < 30 ? 2 : has(/investig|find out|descubra|evaluate|avalie|propose|proponha/, text) ? 1 : 0;\n\tconst tierIndex = Math.max(complexity <= 1 ? 0 : complexity - 1, risk >= 2 || security ? 2 : 0);\n\n\tconst agent: AgentId =\n\t\ttype === \"security\"\n\t\t\t? \"security-engineer\"\n\t\t\t: type === \"architecture\" || complexity >= 4\n\t\t\t\t? \"software-architect\"\n\t\t\t\t: type === \"test\"\n\t\t\t\t\t? \"qa-engineer\"\n\t\t\t\t\t: type === \"question\" || type === \"research\"\n\t\t\t\t\t\t? \"researcher\"\n\t\t\t\t\t\t: (AGENT_RULES.find(([, pattern]) => has(pattern, text))?.[0] ?? \"software-engineer\");\n\n\tconst validation: ValidationLevel =\n\t\ttype === \"question\" || type === \"research\"\n\t\t\t? \"none\"\n\t\t\t: type === \"documentation\"\n\t\t\t\t? \"syntax\"\n\t\t\t\t: type === \"code_edit\"\n\t\t\t\t\t? \"compile\"\n\t\t\t\t\t: type === \"architecture\" || security\n\t\t\t\t\t\t? \"review\"\n\t\t\t\t\t\t: complexity >= 3\n\t\t\t\t\t\t\t? \"integration_test\"\n\t\t\t\t\t\t\t: \"unit_test\";\n\n\tconst readOnly = type === \"question\" || type === \"research\" || type === \"architecture\";\n\treturn {\n\t\tsource: \"heuristic\",\n\t\ttask: {\n\t\t\ttype,\n\t\t\tcomplexity: complexity / 4,\n\t\t\trisk: risk / 3,\n\t\t\tambiguity: ambiguity / 2,\n\t\t\treasoning: complexity / 4,\n\t\t\tscope,\n\t\t},\n\t\trecommendation: { tier: CAPABILITY_TIERS[Math.min(tierIndex, 3)], effort: REASONING_EFFORTS[complexity] },\n\t\tagent,\n\t\tvalidation,\n\t\ttools: {\n\t\t\trequires_write: !readOnly && !has(/^(run|rode) /, text.trim()),\n\t\t\trequires_shell: agent === \"devops-engineer\" || type === \"debugging\",\n\t\t\trequires_tests: validation === \"compile\" || validation === \"unit_test\" || validation === \"integration_test\",\n\t\t\trequires_web: has(\n\t\t\t\t/official doc|documenta[cç][aã]o oficial|latest version|[uú]ltima vers|search the web|pesquis/,\n\t\t\t\ttext,\n\t\t\t),\n\t\t\trequires_browser: agent === \"frontend-engineer\" && has(/browser|navegador|mobile|celular|focus|foco/, text),\n\t\t\trequires_database: agent === \"database-engineer\" || has(/\\bsql\\b|database|banco/, text),\n\t\t\trequires_git: has(/\\bgit\\b|commit|branch|\\bpush\\b|merge|rebase/, text),\n\t\t},\n\t\tsecuritySensitive: security,\n\t\tconfidence: 0.5,\n\t};\n}\n"]}
1
+ {"version":3,"file":"assessment.js","sourceRoot":"","sources":["../../../src/extensions/laya/assessment.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ClassifierAnswer } from \"@relay-harness/ai\";\nimport {\n\tAGENT_IDS,\n\ttype AgentId,\n\tAMBIGUITY_LEVELS,\n\tCAPABILITY_TIERS,\n\ttype CapabilityTier,\n\tCOMPLEXITY_LEVELS,\n\tLAYA_QUESTIONS,\n\tREASONING_EFFORTS,\n\tREASONING_LEVELS,\n\ttype ReasoningEffort,\n\tRISK_LEVELS,\n\tTASK_SCOPES,\n\tTASK_TYPES,\n\ttype TaskScope,\n\ttype TaskType,\n\tTOOL_REQUIREMENT_IDS,\n\ttype ToolRequirement,\n\tVALIDATION_LEVELS,\n\ttype ValidationLevel,\n} from \"./questions.ts\";\n\n/** Laya's System 1 answer about one request: what the task is and how it recommends running it. */\nexport interface TaskAssessment {\n\t/** Laya's answers, the labels of a similar learned task, or keyword rules. */\n\tsource: \"laya\" | \"memory\" | \"heuristic\";\n\ttask: {\n\t\ttype: TaskType;\n\t\t/** Scores normalized to 0..1. */\n\t\tcomplexity: number;\n\t\trisk: number;\n\t\tambiguity: number;\n\t\treasoning: number;\n\t\tscope: TaskScope;\n\t};\n\trecommendation: { tier: CapabilityTier; effort: ReasoningEffort };\n\tagent: AgentId;\n\tvalidation: ValidationLevel;\n\ttools: Record<ToolRequirement, boolean>;\n\tsecuritySensitive: boolean;\n\t/** Lowest confidence among the answers that drive routing: task type, tier and effort. */\n\tconfidence: number;\n}\n\nfunction choice<T extends string>(answers: Record<string, ClassifierAnswer>, id: string, options: readonly T[]) {\n\tconst answer = answers[id];\n\tif (answer?.type !== \"choice\" || !options.includes(answer.choice as T)) {\n\t\tthrow new Error(`Laya returned no valid answer for ${id}`);\n\t}\n\treturn { value: answer.choice as T, confidence: answer.probabilities[answer.choice] ?? answer.confidence };\n}\n\nfunction score(answers: Record<string, ClassifierAnswer>, id: string, levels: readonly string[]): number {\n\tconst answer = answers[id];\n\tif (answer?.type !== \"score\") throw new Error(`Laya returned no valid answer for ${id}`);\n\treturn Math.min(1, Math.max(0, answer.score / (levels.length - 1)));\n}\n\nfunction yes(answers: Record<string, ClassifierAnswer>, id: string): boolean {\n\tconst answer = answers[id];\n\tif (answer?.type !== \"bool\") throw new Error(`Laya returned no valid answer for ${id}`);\n\treturn answer.probability >= 0.5;\n}\n\n/** Reads a classifier result for `LAYA_QUESTIONS`. Throws when an answer is missing or unknown. */\nexport function assessmentFromAnswers(answers: Record<string, ClassifierAnswer>): TaskAssessment {\n\tconst type = choice(answers, \"task_type\", TASK_TYPES);\n\tconst tier = choice(answers, \"capability_tier\", CAPABILITY_TIERS);\n\tconst effort = choice(answers, \"reasoning_effort\", REASONING_EFFORTS);\n\treturn {\n\t\tsource: \"laya\",\n\t\ttask: {\n\t\t\ttype: type.value,\n\t\t\tcomplexity: score(answers, \"complexity\", COMPLEXITY_LEVELS),\n\t\t\trisk: score(answers, \"risk\", RISK_LEVELS),\n\t\t\tambiguity: score(answers, \"ambiguity\", AMBIGUITY_LEVELS),\n\t\t\treasoning: score(answers, \"reasoning_requirement\", REASONING_LEVELS),\n\t\t\tscope: choice(answers, \"scope\", TASK_SCOPES).value,\n\t\t},\n\t\trecommendation: { tier: tier.value, effort: effort.value },\n\t\tagent: choice(answers, \"agent\", AGENT_IDS).value,\n\t\tvalidation: choice(answers, \"validation_level\", VALIDATION_LEVELS).value,\n\t\ttools: Object.fromEntries(TOOL_REQUIREMENT_IDS.map((id) => [id, yes(answers, id)])) as Record<\n\t\t\tToolRequirement,\n\t\t\tboolean\n\t\t>,\n\t\tsecuritySensitive: yes(answers, \"security_sensitive\"),\n\t\tconfidence: Math.min(type.confidence, tier.confidence, effort.confidence),\n\t};\n}\n\n/**\n * The assessment a labeled exercise describes, read as answers given with full certainty. Throws when\n * a label is missing or not an option.\n */\nexport function assessmentFromLabels(labels: Readonly<Record<string, string | number | boolean>>): TaskAssessment {\n\tconst answers: Record<string, ClassifierAnswer> = {};\n\tfor (const [id, question] of Object.entries(LAYA_QUESTIONS)) {\n\t\tconst value = labels[id];\n\t\tif (question.type === \"choice\" && typeof value === \"string\") {\n\t\t\tanswers[id] = { type: \"choice\", choice: value, probabilities: { [value]: 1 }, confidence: 1 };\n\t\t} else if (question.type === \"score\" && typeof value === \"number\") {\n\t\t\tanswers[id] = { type: \"score\", score: value, confidence: 1 };\n\t\t} else if (question.type === \"bool\" && typeof value === \"boolean\") {\n\t\t\tanswers[id] = { type: \"bool\", probability: value ? 1 : 0 };\n\t\t}\n\t}\n\treturn assessmentFromAnswers(answers);\n}\n\nconst has = (pattern: RegExp, text: string) => pattern.test(text);\n\n/** Ordered: the first matching rule decides the task type. English and Portuguese keywords. */\nconst TYPE_RULES: Array<[TaskType, RegExp]> = [\n\t[\"security\", /vulnerab|inje[cç]|xss|csrf|exploit|secur|seguran[cç]a|oauth|password|senha|secret|segredo/],\n\t[\"architecture\", /architect|arquitet|system design|microservi|microsservi|\\badr\\b|desenhe uma|design a /],\n\t[\n\t\t\"debugging\",\n\t\t/investigat|investig|root cause|causa raiz|deadlock|intermittent|intermitente|hangs|trava|why .*fail|por que .*falh/,\n\t],\n\t[\"test\", /\\btests?\\b|\\btestes?\\b|coverage|cobertura|flaky|type ?check|checagem/],\n\t[\"bug_fix\", /\\bfix\\b|\\bbug|corrij|conserte|arrume|broken|quebr|crash|\\berro|\\berror|wrong|errad|returns? 500/],\n\t[\n\t\t\"refactor\",\n\t\t/refactor|refator|extract|extraia|\\bsplit\\b|divida|rename|renomei|migrate .* to|migre|convert|converta/,\n\t],\n\t[\"documentation\", /readme|\\bdocs?\\b|document|changelog|comment|coment[aá]rio/],\n\t[\"research\", /compare|pesquis|research|map every|mapeie|list the|liste os/],\n\t[\n\t\t\"feature\",\n\t\t/\\badd\\b|adicion|implement|create|crie|\\bbuild\\b|support|suporte|endpoint|integrat|integre|deploy|pipeline/,\n\t],\n];\n\nconst QUESTION_START =\n\t/^(what|how|why|where|which|when|is |are |can |does |o que|como|por que|onde|qual|quando|isso|d[aá] )/;\n\nconst DEFAULT_COMPLEXITY: Record<TaskType, number> = {\n\tquestion: 1,\n\tcode_edit: 1,\n\tbug_fix: 2,\n\trefactor: 2,\n\tfeature: 2,\n\ttest: 1,\n\tarchitecture: 3,\n\tdebugging: 3,\n\tsecurity: 3,\n\tresearch: 1,\n\tdocumentation: 1,\n};\n\nconst AGENT_RULES: Array<[AgentId, RegExp]> = [\n\t[\"mobile-engineer\", /android|\\bios\\b|mobile|flutter|react native|swift|kotlin/],\n\t[\"devops-engineer\", /docker|\\bci\\b|pipeline|deploy|kubernetes|\\bk8s\\b|release|workflow|terraform/],\n\t[\"database-engineer\", /\\bsql\\b|database|banco de dados|\\bindex|[ií]ndice|migration|query|consulta|schema/],\n\t[\n\t\t\"frontend-engineer\",\n\t\t/\\bcss\\b|\\bui\\b|button|bot[aã]o|component|p[aá]gina|\\bpage\\b|modal|dropdown|react|html|dark mode|layout/,\n\t],\n\t[\"backend-engineer\", /\\bapi\\b|endpoint|servi[cç]|service|queue|fila|worker|server|backend/],\n];\n\nconst SECURITY_SENSITIVE =\n\t/auth|login|oauth|token|password|senha|secret|segredo|credential|credencia|permiss|payment|pagamento|stripe|vulnerab|inje[cç]|production (database|db|data)|banco de produ|produ[cç][aã]o.*(migra|banco)|(migra|banco).*produ[cç]/;\n\n/**\n * Keyword fallback used when the Laya server is unreachable or returns invalid answers, so routing\n * keeps working. It follows the same tier rule as the synthetic training data and reports a\n * confidence of 0.5: neither trusted nor escalated.\n */\nexport function heuristicAssessment(request: string): TaskAssessment {\n\tconst text = request.toLowerCase();\n\tlet type: TaskType =\n\t\tTYPE_RULES.find(([, pattern]) => has(pattern, text))?.[0] ??\n\t\t(text.trim().endsWith(\"?\") || QUESTION_START.test(text.trim()) ? \"question\" : \"code_edit\");\n\tif (type !== \"question\" && text.trim().endsWith(\"?\") && QUESTION_START.test(text.trim())) type = \"question\";\n\n\tlet complexity = DEFAULT_COMPLEXITY[type];\n\tif (has(/typo|digita[cç][aã]o|rename|renomei|texto|\\btext\\b|bump|vers[aã]o do/, text)) complexity = 0;\n\tif (\n\t\thas(\n\t\t\t/race condition|condi[cç][aã]o de corrida|concurren|concorr[eê]n|memory leak|vazamento|multi-tenant|zero downtime|sem downtime/,\n\t\t\ttext,\n\t\t)\n\t)\n\t\tcomplexity = 3;\n\tif (has(/distribut|distribu[ií]d|crdt|corrup|plugin system|sistema de plugins|deadlock|monorepo/, text))\n\t\tcomplexity = 4;\n\n\tconst security = has(SECURITY_SENSITIVE, text) || type === \"security\";\n\tlet risk = complexity >= 3 ? 2 : complexity >= 2 ? 1 : 0;\n\tif (security || has(/produ[cç]|production|\\bdrop\\b|delete|apag/, text)) risk = 3;\n\n\tconst scope: TaskScope = has(/\\btypo|digita|button|bot[aã]o|\\bline\\b|linha/, text)\n\t\t? \"single_line\"\n\t\t: has(/monorepo|repository|reposit[oó]rio|whole|inteiro|all (the )?packages|todos os pacotes/, text)\n\t\t\t? \"repository\"\n\t\t\t: has(/services|servi[cç]os|across|between|entre|packages|pacotes/, text)\n\t\t\t\t? \"multi_module\"\n\t\t\t\t: has(/\\.[a-z]{1,5}\\b/, text)\n\t\t\t\t\t? \"single_file\"\n\t\t\t\t\t: \"module\";\n\n\tconst ambiguity =\n\t\ttext.length < 30 ? 2 : has(/investig|find out|descubra|evaluate|avalie|propose|proponha/, text) ? 1 : 0;\n\tconst tierIndex = Math.max(complexity <= 1 ? 0 : complexity - 1, risk >= 2 || security ? 2 : 0);\n\n\tconst agent: AgentId =\n\t\ttype === \"security\"\n\t\t\t? \"security-engineer\"\n\t\t\t: type === \"architecture\" || complexity >= 4\n\t\t\t\t? \"software-architect\"\n\t\t\t\t: type === \"test\"\n\t\t\t\t\t? \"qa-engineer\"\n\t\t\t\t\t: type === \"question\" || type === \"research\"\n\t\t\t\t\t\t? \"researcher\"\n\t\t\t\t\t\t: (AGENT_RULES.find(([, pattern]) => has(pattern, text))?.[0] ?? \"software-engineer\");\n\n\tconst validation: ValidationLevel =\n\t\ttype === \"question\" || type === \"research\"\n\t\t\t? \"none\"\n\t\t\t: type === \"documentation\"\n\t\t\t\t? \"syntax\"\n\t\t\t\t: type === \"code_edit\"\n\t\t\t\t\t? \"compile\"\n\t\t\t\t\t: type === \"architecture\" || security\n\t\t\t\t\t\t? \"review\"\n\t\t\t\t\t\t: complexity >= 3\n\t\t\t\t\t\t\t? \"integration_test\"\n\t\t\t\t\t\t\t: \"unit_test\";\n\n\tconst readOnly = type === \"question\" || type === \"research\" || type === \"architecture\";\n\treturn {\n\t\tsource: \"heuristic\",\n\t\ttask: {\n\t\t\ttype,\n\t\t\tcomplexity: complexity / 4,\n\t\t\trisk: risk / 3,\n\t\t\tambiguity: ambiguity / 2,\n\t\t\treasoning: complexity / 4,\n\t\t\tscope,\n\t\t},\n\t\trecommendation: { tier: CAPABILITY_TIERS[Math.min(tierIndex, 3)], effort: REASONING_EFFORTS[complexity] },\n\t\tagent,\n\t\tvalidation,\n\t\ttools: {\n\t\t\trequires_write: !readOnly && !has(/^(run|rode) /, text.trim()),\n\t\t\trequires_shell: agent === \"devops-engineer\" || type === \"debugging\",\n\t\t\trequires_tests: validation === \"compile\" || validation === \"unit_test\" || validation === \"integration_test\",\n\t\t\trequires_web: has(\n\t\t\t\t/official doc|documenta[cç][aã]o oficial|latest version|[uú]ltima vers|search the web|pesquis/,\n\t\t\t\ttext,\n\t\t\t),\n\t\t\trequires_browser: agent === \"frontend-engineer\" && has(/browser|navegador|mobile|celular|focus|foco/, text),\n\t\t\trequires_database: agent === \"database-engineer\" || has(/\\bsql\\b|database|banco/, text),\n\t\t\trequires_git: has(/\\bgit\\b|commit|branch|\\bpush\\b|merge|rebase/, text),\n\t\t},\n\t\tsecuritySensitive: security,\n\t\tconfidence: 0.5,\n\t};\n}\n"]}
@@ -0,0 +1,19 @@
1
+ export interface DockerResult {
2
+ code: number;
3
+ stdout: string;
4
+ stderr: string;
5
+ }
6
+ export interface DockerRunOptions {
7
+ signal?: AbortSignal;
8
+ timeout?: number;
9
+ /** Each output line as it arrives, with the stream it came from. */
10
+ onLine?: (line: string, stream: "stdout" | "stderr") => void;
11
+ }
12
+ /** Runs the Docker CLI. Laya's server and trainer take it as an option, so tests can replace it. */
13
+ export type DockerRun = (args: string[], options?: DockerRunOptions) => Promise<DockerResult>;
14
+ /** Code returned when the `docker` command cannot be started at all. */
15
+ export declare const DOCKER_MISSING = 127;
16
+ export declare const spawnDocker: DockerRun;
17
+ /** The last lines of a failed command, for an error message. */
18
+ export declare function dockerError(result: DockerResult): string;
19
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/extensions/laya/docker.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC;CAC7D;AAED,oGAAoG;AACpG,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAE9F,wEAAwE;AACxE,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,eAAO,MAAM,WAAW,EAAE,SAgCvB,CAAC;AAEJ,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAGxD"}
@@ -0,0 +1,44 @@
1
+ import { spawn } from "node:child_process";
2
+ /** Code returned when the `docker` command cannot be started at all. */
3
+ export const DOCKER_MISSING = 127;
4
+ export const spawnDocker = (args, options = {}) => new Promise((resolve) => {
5
+ const child = spawn("docker", args, {
6
+ windowsHide: true,
7
+ stdio: ["ignore", "pipe", "pipe"],
8
+ signal: options.signal,
9
+ timeout: options.timeout,
10
+ });
11
+ const output = { stdout: "", stderr: "" };
12
+ const pending = { stdout: "", stderr: "" };
13
+ for (const stream of ["stdout", "stderr"]) {
14
+ child[stream].setEncoding("utf8").on("data", (chunk) => {
15
+ output[stream] += chunk;
16
+ if (!options.onLine)
17
+ return;
18
+ const lines = (pending[stream] + chunk).split(/\r?\n/);
19
+ pending[stream] = lines.pop() ?? "";
20
+ for (const line of lines)
21
+ options.onLine(line, stream);
22
+ });
23
+ }
24
+ child.once("error", (error) => {
25
+ resolve({
26
+ code: error.code === "ENOENT" ? DOCKER_MISSING : 1,
27
+ stdout: output.stdout,
28
+ stderr: error.code === "ENOENT" ? "The docker command was not found." : error.message,
29
+ });
30
+ });
31
+ child.once("close", (code) => {
32
+ for (const stream of ["stdout", "stderr"]) {
33
+ if (pending[stream])
34
+ options.onLine?.(pending[stream], stream);
35
+ }
36
+ resolve({ code: code ?? 1, ...output });
37
+ });
38
+ });
39
+ /** The last lines of a failed command, for an error message. */
40
+ export function dockerError(result) {
41
+ const text = (result.stderr || result.stdout).trim();
42
+ return text.split("\n").slice(-3).join(" ").trim() || `docker exited with code ${result.code}`;
43
+ }
44
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/extensions/laya/docker.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\n\nexport interface DockerResult {\n\tcode: number;\n\tstdout: string;\n\tstderr: string;\n}\n\nexport interface DockerRunOptions {\n\tsignal?: AbortSignal;\n\ttimeout?: number;\n\t/** Each output line as it arrives, with the stream it came from. */\n\tonLine?: (line: string, stream: \"stdout\" | \"stderr\") => void;\n}\n\n/** Runs the Docker CLI. Laya's server and trainer take it as an option, so tests can replace it. */\nexport type DockerRun = (args: string[], options?: DockerRunOptions) => Promise<DockerResult>;\n\n/** Code returned when the `docker` command cannot be started at all. */\nexport const DOCKER_MISSING = 127;\n\nexport const spawnDocker: DockerRun = (args, options = {}) =>\n\tnew Promise((resolve) => {\n\t\tconst child = spawn(\"docker\", args, {\n\t\t\twindowsHide: true,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\tsignal: options.signal,\n\t\t\ttimeout: options.timeout,\n\t\t});\n\t\tconst output = { stdout: \"\", stderr: \"\" };\n\t\tconst pending = { stdout: \"\", stderr: \"\" };\n\t\tfor (const stream of [\"stdout\", \"stderr\"] as const) {\n\t\t\tchild[stream].setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n\t\t\t\toutput[stream] += chunk;\n\t\t\t\tif (!options.onLine) return;\n\t\t\t\tconst lines = (pending[stream] + chunk).split(/\\r?\\n/);\n\t\t\t\tpending[stream] = lines.pop() ?? \"\";\n\t\t\t\tfor (const line of lines) options.onLine(line, stream);\n\t\t\t});\n\t\t}\n\t\tchild.once(\"error\", (error: NodeJS.ErrnoException) => {\n\t\t\tresolve({\n\t\t\t\tcode: error.code === \"ENOENT\" ? DOCKER_MISSING : 1,\n\t\t\t\tstdout: output.stdout,\n\t\t\t\tstderr: error.code === \"ENOENT\" ? \"The docker command was not found.\" : error.message,\n\t\t\t});\n\t\t});\n\t\tchild.once(\"close\", (code) => {\n\t\t\tfor (const stream of [\"stdout\", \"stderr\"] as const) {\n\t\t\t\tif (pending[stream]) options.onLine?.(pending[stream], stream);\n\t\t\t}\n\t\t\tresolve({ code: code ?? 1, ...output });\n\t\t});\n\t});\n\n/** The last lines of a failed command, for an error message. */\nexport function dockerError(result: DockerResult): string {\n\tconst text = (result.stderr || result.stdout).trim();\n\treturn text.split(\"\\n\").slice(-3).join(\" \").trim() || `docker exited with code ${result.code}`;\n}\n"]}
@@ -1,13 +1,16 @@
1
1
  import { type ModelThinkingLevel } from "@relay-harness/ai";
2
2
  import type { ExtensionAPI } from "../../core/extensions/types.ts";
3
3
  import { type TaskAssessment } from "./assessment.ts";
4
+ import { type DockerRun } from "./docker.ts";
4
5
  import { type EscalationReason, type PolicyDecision, type PolicyProfile } from "./policy.ts";
5
6
  import { type CapabilityTier } from "./questions.ts";
7
+ import { type TrainingOutcome } from "./training.ts";
8
+ export { LAYA_PLAN_MESSAGE } from "./routers.ts";
6
9
  export declare const LAYA_PROVIDER_ID = "laya";
7
10
  export declare const LAYA_CLASSIFIER_ID = "execution-intelligence";
8
11
  export declare const LAYA_VIRTUAL_MODEL_ID = "auto";
9
- export declare const DEFAULT_LAYA_BASE_URL = "http://127.0.0.1:8000/v1";
10
- export declare const LAYA_PLAN_MESSAGE = "laya.plan";
12
+ /** Not 8000, the port laya-trainer's own server and many development servers use. */
13
+ export declare const DEFAULT_LAYA_BASE_URL = "http://127.0.0.1:8737/v1";
11
14
  /** Router state stored on the session branch. */
12
15
  export interface LayaRouterState {
13
16
  taskId: string;
@@ -30,5 +33,11 @@ export interface LayaRouterState {
30
33
  /** Top-ranked alternatives at selection time, for `/laya`. */
31
34
  alternatives: string[];
32
35
  }
33
- export default function layaExtension(relay: ExtensionAPI): void;
36
+ /** What a finished training changed, for the user. */
37
+ export declare function describeTrainingOutcome({ model, activated, previous }: TrainingOutcome): string;
38
+ export interface LayaExtensionOptions {
39
+ /** Docker CLI runner. Default: the `docker` command. */
40
+ docker?: DockerRun;
41
+ }
42
+ export default function layaExtension(relay: ExtensionAPI, options?: LayaExtensionOptions): void;
34
43
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/laya/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAMN,KAAK,kBAAkB,EAEvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gCAAgC,CAAC;AAGrF,OAAO,EAA8C,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAElG,OAAO,EAIN,KAAK,gBAAgB,EAIrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAMlB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAoB,KAAK,cAAc,EAAqC,MAAM,gBAAgB,CAAC;AAc1G,eAAO,MAAM,gBAAgB,SAAS,CAAC;AACvC,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAC3D,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAC5C,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAChE,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAS7C,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,cAAc,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC;IACvB,kDAAkD;IAClD,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,kBAAkB,CAAC;IAClC,uEAAuE;IACvE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,gBAAgB,CAAC;QAAC,IAAI,EAAE,cAAc,CAAC;QAAC,EAAE,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;IAC3F,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB;AAiED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAof/D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/laya/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAMN,KAAK,kBAAkB,EAEvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gCAAgC,CAAC;AAIrF,OAAO,EAAoE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxH,OAAO,EAAE,KAAK,SAAS,EAAe,MAAM,aAAa,CAAC;AAa1D,OAAO,EAIN,KAAK,gBAAgB,EAIrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAMlB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAoB,KAAK,cAAc,EAAqC,MAAM,gBAAgB,CAAC;AAa1G,OAAO,EAUN,KAAK,eAAe,EACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,eAAO,MAAM,gBAAgB,SAAS,CAAC;AACvC,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAC3D,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAC5C,qFAAqF;AACrF,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAShE,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,cAAc,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC;IACvB,kDAAkD;IAClD,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,kBAAkB,CAAC;IAClC,uEAAuE;IACvE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,gBAAgB,CAAC;QAAC,IAAI,EAAE,cAAc,CAAC;QAAC,EAAE,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;IAC3F,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB;AAmED,sDAAsD;AACtD,wBAAgB,uBAAuB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,eAAe,GAAG,MAAM,CAM/F;AAED,MAAM,WAAW,oBAAoB;IACpC,wDAAwD;IACxD,MAAM,CAAC,EAAE,SAAS,CAAC;CACnB;AAKD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,GAAE,oBAAyB,GAAG,IAAI,CAgvBnG"}