@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.
- package/CHANGELOG.md +27 -6
- package/LICENSE +22 -0
- package/README.md +14 -16
- package/dist/bundle/chunks/{chunk-H6S6DQTM.js → chunk-6AEKWHDP.js} +1 -1
- package/dist/bundle/chunks/{chunk-3QND5D7W.js → chunk-7ZBTLURV.js} +1 -1
- package/dist/bundle/chunks/{chunk-WMTXXI7H.js → chunk-FUPU6X73.js} +1 -1
- package/dist/bundle/chunks/{chunk-XDAWU2J5.js → chunk-IDUCLYG3.js} +1 -1
- package/dist/bundle/chunks/{chunk-XSLAMYCK.js → chunk-LVFZRSZQ.js} +556 -62
- package/dist/bundle/chunks/{chunk-ISNO4JTR.js → chunk-PJWDW5WR.js} +2 -2
- package/dist/bundle/chunks/{chunk-3XNI2SB6.js → chunk-TZ2ZVU7E.js} +1 -1
- package/dist/bundle/chunks/{chunk-MP5FU7MG.js → chunk-UVFWV6YH.js} +1 -1
- package/dist/bundle/chunks/{chunk-PTRF7IZB.js → chunk-WU7MEKPF.js} +1 -1
- package/dist/bundle/chunks/{cli-K4CNHWOI.js → cli-2LN4J4IN.js} +1 -1
- package/dist/bundle/chunks/{easter-egg-3d-TGRCIHA4.js → easter-egg-3d-URCOHV3B.js} +1 -1
- package/dist/bundle/chunks/{execute-6E5DA2QI.js → execute-JAHDBPR2.js} +1 -1
- package/dist/bundle/chunks/{runtime-O5HLCH3V.js → runtime-TTSK6Y5T.js} +1 -1
- package/dist/bundle/chunks/{virtual-modules-FNVEVB65.js → virtual-modules-2G2P7CK2.js} +1 -1
- package/dist/bundle/cli-runtime.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/settings-manager.d.ts +5 -3
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/extensions/laya/assessment.d.ts +7 -1
- package/dist/extensions/laya/assessment.d.ts.map +1 -1
- package/dist/extensions/laya/assessment.js +21 -1
- package/dist/extensions/laya/assessment.js.map +1 -1
- package/dist/extensions/laya/docker.d.ts +19 -0
- package/dist/extensions/laya/docker.d.ts.map +1 -0
- package/dist/extensions/laya/docker.js +44 -0
- package/dist/extensions/laya/docker.js.map +1 -0
- package/dist/extensions/laya/index.d.ts +12 -3
- package/dist/extensions/laya/index.d.ts.map +1 -1
- package/dist/extensions/laya/index.js +331 -67
- package/dist/extensions/laya/index.js.map +1 -1
- package/dist/extensions/laya/learn.d.ts +67 -0
- package/dist/extensions/laya/learn.d.ts.map +1 -0
- package/dist/extensions/laya/learn.js +263 -0
- package/dist/extensions/laya/learn.js.map +1 -0
- package/dist/extensions/laya/memory.d.ts +48 -0
- package/dist/extensions/laya/memory.d.ts.map +1 -0
- package/dist/extensions/laya/memory.js +107 -0
- package/dist/extensions/laya/memory.js.map +1 -0
- package/dist/extensions/laya/model-manifest.d.ts +1 -1
- package/dist/extensions/laya/model-manifest.js +1 -1
- package/dist/extensions/laya/model-manifest.js.map +1 -1
- package/dist/extensions/laya/routers.d.ts +8 -0
- package/dist/extensions/laya/routers.d.ts.map +1 -1
- package/dist/extensions/laya/routers.js +2 -0
- package/dist/extensions/laya/routers.js.map +1 -1
- package/dist/extensions/laya/runtime.d.ts +39 -49
- package/dist/extensions/laya/runtime.d.ts.map +1 -1
- package/dist/extensions/laya/runtime.js +93 -145
- package/dist/extensions/laya/runtime.js.map +1 -1
- package/dist/extensions/laya/server.d.ts +39 -15
- package/dist/extensions/laya/server.d.ts.map +1 -1
- package/dist/extensions/laya/server.js +219 -78
- package/dist/extensions/laya/server.js.map +1 -1
- package/dist/extensions/laya/train-script.d.ts +8 -0
- package/dist/extensions/laya/train-script.d.ts.map +1 -0
- package/dist/extensions/laya/train-script.js +422 -0
- package/dist/extensions/laya/train-script.js.map +1 -0
- package/dist/extensions/laya/training.d.ts +176 -0
- package/dist/extensions/laya/training.d.ts.map +1 -0
- package/dist/extensions/laya/training.js +337 -0
- package/dist/extensions/laya/training.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +3 -2
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +4 -4
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +9 -9
- package/dist/modes/interactive/theme/light.json +9 -9
- package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/system-theme.js +11 -10
- package/dist/modes/interactive/theme/system-theme.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +10 -6
- package/dist/utils/version-check.js.map +1 -1
- package/docs/laya.md +59 -19
- package/docs/quickstart.md +19 -6
- package/docs/settings.md +4 -3
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +15 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/laya/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport {\n\ttype Api,\n\ttype ClassifierModel,\n\tcreateProvider,\n\ttype Message,\n\ttype Model,\n\ttype ModelThinkingLevel,\n\ttype Provider,\n} from \"@relay-harness/ai\";\nimport { typesafeSystemOneApi } from \"@relay-harness/ai/api/typesafe-system-one.lazy\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport type { LayaSettings } from \"../../core/settings-manager.ts\";\nimport type { ModelRoute, ModelRouteRequest } from \"../../core/virtual-models.ts\";\nimport { assessmentFromAnswers, heuristicAssessment, type TaskAssessment } from \"./assessment.ts\";\nimport { LAYA_MODEL_MANIFEST } from \"./model-manifest.ts\";\nimport {\n\tapplyPolicy,\n\ttype Candidate,\n\tDEFAULT_MODEL_REGISTRY,\n\ttype EscalationReason,\n\tnextTier,\n\tPerformanceHistory,\n\tPOLICY_PROFILES,\n\ttype PolicyDecision,\n\ttype PolicyProfile,\n\tparseModelRef,\n\tQuotaManager,\n\trankCandidates,\n\ttype ScoredCandidate,\n\ttaskKey,\n} from \"./policy.ts\";\nimport { CAPABILITY_TIERS, type CapabilityTier, LAYA_QUESTIONS, layaDecisionsFile } from \"./questions.ts\";\nimport { renderPlanMessage, selectSkills, unneededTools } from \"./routers.ts\";\nimport { layaPaths, setupLayaRuntime } from \"./runtime.ts\";\nimport { generateSeed } from \"./seed.ts\";\nimport { isLocalUrl, LayaServer } from \"./server.ts\";\nimport {\n\tdatasetFromTelemetry,\n\tHARNESS_MESSAGE,\n\thistoryFromTelemetry,\n\tsummarizeRun,\n\tTelemetryStore,\n\ttruncateRequest,\n} from \"./telemetry.ts\";\n\nexport const LAYA_PROVIDER_ID = \"laya\";\nexport const LAYA_CLASSIFIER_ID = \"execution-intelligence\";\nexport const LAYA_VIRTUAL_MODEL_ID = \"auto\";\nexport const DEFAULT_LAYA_BASE_URL = \"http://127.0.0.1:8000/v1\";\nexport const LAYA_PLAN_MESSAGE = \"laya.plan\";\n\nconst DEFAULT_TIMEOUT_MS = 5000;\nconst DEFAULT_MIN_CONFIDENCE = 0.5;\nconst DEFAULT_ESCALATE_AFTER_FAILURES = 3;\n/** After a failed classifier call, keyword rules answer for this long before Laya is tried again. */\nconst LAYA_RETRY_AFTER_MS = 60_000;\nconst QUOTA_ERROR = /rate.?limit|\\b429\\b|overload|\\b529\\b|quota|capacity|too many requests|usage limit/i;\n\n/** Router state stored on the session branch. */\nexport interface LayaRouterState {\n\ttaskId: string;\n\trequest: string;\n\tassessment: TaskAssessment;\n\tpolicy: PolicyDecision;\n\tprofile: PolicyProfile;\n\t/** Tier and model currently handling the task. */\n\ttier: CapabilityTier;\n\tmodel: string;\n\tthinkingLevel: ModelThinkingLevel;\n\t/** Failed tool calls of the turn already answered by an escalation. */\n\tfailuresAtEscalation: number;\n\tescalations: Array<{ reason: EscalationReason; from: CapabilityTier; to: CapabilityTier }>;\n\tattempts: number;\n\t/** Top-ranked alternatives at selection time, for `/laya`. */\n\talternatives: string[];\n}\n\nconst layaClassifier: ClassifierModel<\"typesafe-system-one\"> = {\n\ttype: \"classifier\",\n\tid: LAYA_CLASSIFIER_ID,\n\tname: \"Laya Execution Intelligence\",\n\tapi: \"typesafe-system-one\",\n\tprovider: LAYA_PROVIDER_ID,\n\tbaseUrl: DEFAULT_LAYA_BASE_URL,\n\tinput: [\"text\"],\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\tcontextWindow: 1024,\n};\n\n/**\n * The local Laya server speaks TypeSafe's System One protocol, so the built-in implementation serves\n * it. It needs no key; `LAYA_API_KEY` is sent when set, for servers that require one.\n */\nfunction createLayaProvider(baseUrl: () => string | undefined): Provider {\n\treturn createProvider({\n\t\tid: LAYA_PROVIDER_ID,\n\t\tname: \"Laya\",\n\t\tauth: {\n\t\t\tapiKey: {\n\t\t\t\tname: \"Laya\",\n\t\t\t\tresolve: async ({ ctx, credential }) => ({\n\t\t\t\t\tauth: {\n\t\t\t\t\t\tapiKey: credential?.key ?? (await ctx.env(\"LAYA_API_KEY\")) ?? \"local\",\n\t\t\t\t\t\tbaseUrl: baseUrl() ?? (await ctx.env(\"LAYA_BASE_URL\")) ?? DEFAULT_LAYA_BASE_URL,\n\t\t\t\t\t},\n\t\t\t\t\tsource: \"Laya server\",\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\tmodels: [layaClassifier],\n\t\tclassifiers: { \"typesafe-system-one\": typesafeSystemOneApi() },\n\t});\n}\n\nfunction messageText(message: Message): string {\n\tif (message.role !== \"user\") return \"\";\n\tconst content = message.content;\n\tif (typeof content === \"string\") return content;\n\treturn content.flatMap((block) => (block.type === \"text\" ? [block.text] : [])).join(\"\\n\");\n}\n\n/** Index of the latest message the user wrote; harness and plan messages do not count. */\nfunction lastUserIndex(messages: readonly Message[]): number {\n\treturn messages.findLastIndex((message) => message.role === \"user\" && !HARNESS_MESSAGE.test(messageText(message)));\n}\n\n/** Failed tool calls and harness verification requests since the user's latest message. */\nfunction failuresThisTurn(messages: readonly Message[]): { count: number; evidence: boolean } {\n\tlet count = 0;\n\tlet evidence = false;\n\tfor (const message of messages.slice(lastUserIndex(messages) + 1)) {\n\t\tif (message.role === \"toolResult\" && message.isError) count++;\n\t\tif (message.role === \"user\" && messageText(message).startsWith(\"[harness:evidence]\")) {\n\t\t\tcount++;\n\t\t\tevidence = true;\n\t\t}\n\t}\n\treturn { count, evidence };\n}\n\nexport default function layaExtension(relay: ExtensionAPI): void {\n\tconst quota = new QuotaManager();\n\tconst layaHome = join(getAgentDir(), \"laya\");\n\tconst store = new TelemetryStore(join(layaHome, \"telemetry.jsonl\"));\n\tconst server = new LayaServer({\n\t\tpaths: layaPaths(layaHome, LAYA_MODEL_MANIFEST),\n\t\tmanifest: LAYA_MODEL_MANIFEST,\n\t\tbaseUrl: () => settings.baseUrl ?? process.env.LAYA_BASE_URL ?? DEFAULT_LAYA_BASE_URL,\n\t});\n\tlet setupOffered = false;\n\tlet setupRunning: Promise<void> | undefined;\n\tlet history = new PerformanceHistory();\n\tlet settings: LayaSettings = {};\n\tlet profileOverride: PolicyProfile | undefined;\n\tlet layaUnavailableUntil = 0;\n\tlet lastClassifierError: string | undefined;\n\t/** Plan computed in before_agent_start for the prompt about to be sent. */\n\tlet pending: { request: string; assessment: TaskAssessment } | undefined;\n\t/** Latest state returned by the router, and the run it belongs to. */\n\tlet current: LayaRouterState | undefined;\n\tlet run: { taskId: string; startedAt: number } | undefined;\n\t/** Tools active before enforced tool routing changed them. */\n\tlet toolBaseline: { tools: string[]; applied: string[] } | undefined;\n\n\tconst refreshSettings = () => {\n\t\tsettings = relay.getSettings().laya ?? {};\n\t\tquota.configure(settings.quota);\n\t};\n\tconst profile = (): PolicyProfile => {\n\t\tconst flag = relay.getFlag(\"laya-policy\");\n\t\tconst fromFlag = POLICY_PROFILES.find((name) => name === flag);\n\t\treturn profileOverride ?? fromFlag ?? settings.policy ?? \"balanced\";\n\t};\n\tconst isSelected = (ctx: ExtensionContext) =>\n\t\tctx.model?.provider === LAYA_PROVIDER_ID && ctx.model.id === LAYA_VIRTUAL_MODEL_ID;\n\n\trelay.registerFlag(\"laya-policy\", {\n\t\ttype: \"string\",\n\t\tdescription: \"Cost profile of the laya/auto router: economy, balanced, quality or critical\",\n\t});\n\trelay.registerProvider(createLayaProvider(() => settings.baseUrl));\n\n\t/** System 1: Laya's answers, or keyword rules when the server cannot answer. */\n\tasync function assess(request: string, ctx: ExtensionContext, signal?: AbortSignal): Promise<TaskAssessment> {\n\t\tconst classifier = ctx.modelRegistry.findOfType(\"classifier\", LAYA_PROVIDER_ID, LAYA_CLASSIFIER_ID);\n\t\tif (!classifier || Date.now() < layaUnavailableUntil) return heuristicAssessment(request);\n\t\t// Starts the local server when the runtime is installed; a failed start falls through to the\n\t\t// classifier call, which fails fast and lands on the keyword rules.\n\t\tif (settings.autostart !== false) await server.ensureRunning(signal);\n\t\tconst result = await ctx.modelRegistry.classify(\n\t\t\tclassifier,\n\t\t\t{ state: { request: truncateRequest(request) }, questions: LAYA_QUESTIONS },\n\t\t\t{ signal, timeoutMs: settings.timeoutMs ?? DEFAULT_TIMEOUT_MS, maxRetries: 0 },\n\t\t);\n\t\ttry {\n\t\t\tif (result.stopReason !== \"stop\") throw new Error(result.errorMessage ?? \"Laya did not answer\");\n\t\t\tconst assessment = assessmentFromAnswers(result.answers);\n\t\t\tlastClassifierError = undefined;\n\t\t\treturn assessment;\n\t\t} catch (error) {\n\t\t\tif (signal?.aborted) throw error;\n\t\t\tlastClassifierError = error instanceof Error ? error.message : String(error);\n\t\t\tlayaUnavailableUntil = Date.now() + LAYA_RETRY_AFTER_MS;\n\t\t\treturn heuristicAssessment(request);\n\t\t}\n\t}\n\n\t/** Model registry: configured models whose provider has credentials. */\n\tfunction candidates(ctx: ExtensionContext): Array<Candidate & { model: Model<Api> }> {\n\t\tconst registry = { ...DEFAULT_MODEL_REGISTRY, ...settings.models };\n\t\tconst result: Array<Candidate & { model: Model<Api> }> = [];\n\t\tfor (const tier of CAPABILITY_TIERS) {\n\t\t\tfor (const ref of registry[tier] ?? []) {\n\t\t\t\tconst parsed = parseModelRef(ref);\n\t\t\t\tconst model = parsed && ctx.modelRegistry.find(parsed.provider, parsed.id);\n\t\t\t\tif (!model || model.provider === LAYA_PROVIDER_ID || !ctx.modelRegistry.hasConfiguredAuth(model)) continue;\n\t\t\t\tresult.push({ ref, provider: model.provider, tier, order: result.length, model });\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction rank(\n\t\tctx: ExtensionContext,\n\t\tinput: { assessment: TaskAssessment; requiredTier: CapabilityTier; minTier: CapabilityTier },\n\t): Array<ScoredCandidate & { model: Model<Api> }> {\n\t\tconst available = candidates(ctx);\n\t\tif (available.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t\"laya/auto: no model of the Laya model registry has credentials. Log in to a provider or set laya.models.\",\n\t\t\t);\n\t\t}\n\t\tconst byRef = new Map(available.map((candidate) => [candidate.ref, candidate.model]));\n\t\tconst ranked = rankCandidates(available, {\n\t\t\trequiredTier: input.requiredTier,\n\t\t\tminTier: input.minTier,\n\t\t\trisk: input.assessment.task.risk,\n\t\t\tprofile: profile(),\n\t\t\ttaskKey: taskKey(input.assessment),\n\t\t\thistory,\n\t\t\tquota,\n\t\t});\n\t\t// Every candidate is below the floor or out of quota: take the strongest one available.\n\t\tconst fallback = [...available].sort(\n\t\t\t(a, b) => CAPABILITY_TIERS.indexOf(b.tier) - CAPABILITY_TIERS.indexOf(a.tier),\n\t\t);\n\t\tconst list =\n\t\t\tranked.length > 0\n\t\t\t\t? ranked\n\t\t\t\t: fallback.map((candidate) => ({\n\t\t\t\t\t\t...candidate,\n\t\t\t\t\t\tsuccess: 0,\n\t\t\t\t\t\tcost: 0,\n\t\t\t\t\t\tlatency: 0,\n\t\t\t\t\t\tutility: 0,\n\t\t\t\t\t\teligible: false,\n\t\t\t\t\t}));\n\t\treturn list.map((candidate) => ({ ...candidate, model: byRef.get(candidate.ref)! }));\n\t}\n\n\tfunction select(\n\t\tctx: ExtensionContext,\n\t\tbase: Omit<LayaRouterState, \"tier\" | \"model\" | \"thinkingLevel\" | \"alternatives\">,\n\t\tminTier: CapabilityTier,\n\t\trequiredTier: CapabilityTier,\n\t): { route: ModelRoute<LayaRouterState>; state: LayaRouterState } {\n\t\tconst ranked = rank(ctx, { assessment: base.assessment, requiredTier, minTier });\n\t\tconst chosen = ranked[0];\n\t\tconst state: LayaRouterState = {\n\t\t\t...base,\n\t\t\ttier: chosen.tier,\n\t\t\tmodel: chosen.ref,\n\t\t\tthinkingLevel: base.policy.thinkingLevel,\n\t\t\talternatives: ranked.slice(1, 4).map((candidate) => candidate.ref),\n\t\t};\n\t\tcurrent = state;\n\t\tctx.ui.setStatus(\n\t\t\t\"laya\",\n\t\t\t`laya ${profile()}: ${base.assessment.task.type} → ${chosen.tier} ${chosen.model.id} • ${state.thinkingLevel}${\n\t\t\t\tbase.assessment.source === \"heuristic\" ? \" (rules)\" : \"\"\n\t\t\t}`,\n\t\t);\n\t\treturn { route: { model: chosen.model, thinkingLevel: state.thinkingLevel, state }, state };\n\t}\n\n\tasync function planTask(\n\t\trequest: ModelRouteRequest<LayaRouterState>,\n\t\tctx: ExtensionContext,\n\t): Promise<ModelRoute<LayaRouterState>> {\n\t\tconst index = lastUserIndex(request.messages);\n\t\tconst text = index >= 0 ? messageText(request.messages[index]) : \"\";\n\t\tconst assessment =\n\t\t\tpending && pending.request === text ? pending.assessment : await assess(text, ctx, request.signal);\n\t\tpending = undefined;\n\t\tconst policy = applyPolicy(assessment, text, {\n\t\t\tminConfidence: settings.minConfidence ?? DEFAULT_MIN_CONFIDENCE,\n\t\t});\n\t\tconst taskId = randomUUID();\n\t\trun = { taskId, startedAt: run?.startedAt ?? Date.now() };\n\t\tconst escalations = policy.escalations.map((reason) => ({\n\t\t\treason,\n\t\t\tfrom: policy.recommendedTier,\n\t\t\tto: policy.requiredTier,\n\t\t}));\n\t\treturn select(\n\t\t\tctx,\n\t\t\t{\n\t\t\t\ttaskId,\n\t\t\t\trequest: truncateRequest(text),\n\t\t\t\tassessment,\n\t\t\t\tpolicy,\n\t\t\t\tprofile: profile(),\n\t\t\t\tfailuresAtEscalation: 0,\n\t\t\t\tescalations,\n\t\t\t\tattempts: 1,\n\t\t\t},\n\t\t\tpolicy.minTier,\n\t\t\tpolicy.requiredTier,\n\t\t).route;\n\t}\n\n\t/** Moves the task one tier up, or to an equivalent model when the provider is out of quota. */\n\tfunction escalate(\n\t\tctx: ExtensionContext,\n\t\tstate: LayaRouterState,\n\t\treason: EscalationReason,\n\t\tfailures: number,\n\t): ModelRoute<LayaRouterState> | undefined {\n\t\tconst sameTier = reason === \"provider_unavailable\";\n\t\tconst target = sameTier ? state.tier : nextTier(state.tier);\n\t\tif (!target) return undefined;\n\t\tconst { route } = select(\n\t\t\tctx,\n\t\t\t{\n\t\t\t\t...state,\n\t\t\t\tfailuresAtEscalation: failures,\n\t\t\t\tescalations: [...state.escalations, { reason, from: state.tier, to: target }],\n\t\t\t\tattempts: state.attempts + 1,\n\t\t\t},\n\t\t\ttarget,\n\t\t\ttarget,\n\t\t);\n\t\treturn route;\n\t}\n\n\tfunction sticky(ctx: ExtensionContext, state: LayaRouterState): ModelRoute<LayaRouterState> {\n\t\tconst parsed = parseModelRef(state.model);\n\t\tconst model = parsed && ctx.modelRegistry.find(parsed.provider, parsed.id);\n\t\tif (!model) throw new Error(`laya/auto: routed model ${state.model} is no longer in the catalog`);\n\t\tcurrent = state;\n\t\treturn { model, thinkingLevel: state.thinkingLevel };\n\t}\n\n\tasync function route(\n\t\trequest: ModelRouteRequest<LayaRouterState>,\n\t\tctx: ExtensionContext,\n\t): Promise<ModelRoute<LayaRouterState>> {\n\t\tconst state = request.state;\n\t\tif (request.reason === \"direct\") {\n\t\t\t// Compaction summaries and extension calls: a balanced model without heavy reasoning.\n\t\t\tconst ranked = rank(ctx, { assessment: heuristicAssessment(\"\"), requiredTier: \"balanced\", minTier: \"fast\" });\n\t\t\treturn { model: ranked[0].model, thinkingLevel: \"low\" };\n\t\t}\n\t\tif (request.reason === \"user\" || !state) return planTask(request, ctx);\n\n\t\tif (request.reason === \"retry\" && request.failed) {\n\t\t\tif (QUOTA_ERROR.test(request.failed.message.errorMessage ?? \"\")) {\n\t\t\t\tquota.recordPressure(request.failed.model.provider);\n\t\t\t\tconst route = escalate(ctx, state, \"provider_unavailable\", state.failuresAtEscalation);\n\t\t\t\tif (route) return route;\n\t\t\t}\n\t\t\treturn sticky(ctx, state);\n\t\t}\n\n\t\tconst threshold = settings.escalateAfterFailures ?? DEFAULT_ESCALATE_AFTER_FAILURES;\n\t\tconst failures = failuresThisTurn(request.messages);\n\t\tif (threshold > 0 && failures.count - state.failuresAtEscalation >= threshold) {\n\t\t\tconst route = escalate(ctx, state, failures.evidence ? \"test_failure\" : \"repeated_failure\", failures.count);\n\t\t\tif (route) return route;\n\t\t}\n\t\treturn sticky(ctx, state);\n\t}\n\n\trelay.registerVirtualModel<LayaRouterState>({\n\t\tprovider: LAYA_PROVIDER_ID,\n\t\tid: LAYA_VIRTUAL_MODEL_ID,\n\t\tname: \"Auto (Laya)\",\n\t\troute,\n\t});\n\n\t/** Installs the Python environment and downloads the trained model. Concurrent calls share one run. */\n\tfunction setupRuntime(ctx: ExtensionContext): Promise<void> {\n\t\tsetupRunning ??= (async () => {\n\t\t\ttry {\n\t\t\t\tawait setupLayaRuntime({\n\t\t\t\t\texec: (command, args, options) => relay.exec(command, args, options),\n\t\t\t\t\thome: layaHome,\n\t\t\t\t\tmanifest: LAYA_MODEL_MANIFEST,\n\t\t\t\t\tpython: settings.python,\n\t\t\t\t\tsignal: ctx.signal,\n\t\t\t\t\treport: (message) => ctx.ui.setStatus(\"laya-setup\", `laya setup: ${message}`),\n\t\t\t\t});\n\t\t\t\tctx.ui.notify(\"Laya is installed. Starting the server on the next request.\");\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(`Laya setup failed: ${error instanceof Error ? error.message : String(error)}`, \"error\");\n\t\t\t} finally {\n\t\t\t\tctx.ui.setStatus(\"laya-setup\", undefined);\n\t\t\t\tsetupRunning = undefined;\n\t\t\t}\n\t\t})();\n\t\treturn setupRunning;\n\t}\n\n\trelay.on(\"session_start\", () => {\n\t\trefreshSettings();\n\t\thistory = settings.telemetry === false ? new PerformanceHistory() : historyFromTelemetry(store.read());\n\t});\n\n\t/** The user's own tool set: the active tools, or the set enforcement replaced while it is unchanged. */\n\tconst userTools = (): string[] => {\n\t\tconst active = relay.getActiveTools();\n\t\tconst applied = toolBaseline?.applied;\n\t\tconst unchanged = applied && active.length === applied.length && active.every((name, i) => name === applied[i]);\n\t\treturn unchanged && toolBaseline ? toolBaseline.tools : active;\n\t};\n\n\trelay.on(\"before_agent_start\", async (event, ctx) => {\n\t\trefreshSettings();\n\t\tconst enforce = isSelected(ctx) && settings.toolRouting === \"enforce\";\n\t\t// Enforcement is off or another model is selected: give the user's tools back.\n\t\tif (toolBaseline && !enforce) {\n\t\t\trelay.setActiveTools(userTools());\n\t\t\ttoolBaseline = undefined;\n\t\t}\n\t\tif (!isSelected(ctx)) return;\n\t\t// First use: offer to install the trained Laya once per session. Without it, keyword rules route.\n\t\tif (\n\t\t\tsettings.autostart !== false &&\n\t\t\t!setupOffered &&\n\t\t\tctx.hasUI &&\n\t\t\tserver.status() !== \"ready\" &&\n\t\t\tisLocalUrl(settings.baseUrl ?? process.env.LAYA_BASE_URL ?? DEFAULT_LAYA_BASE_URL) &&\n\t\t\t!(await server.isUp())\n\t\t) {\n\t\t\tsetupOffered = true;\n\t\t\tconst accepted = await ctx.ui.confirm(\n\t\t\t\t\"Install Laya?\",\n\t\t\t\t\"laya/auto routes with a trained Laya model. This downloads about 680 MB of model and a Python environment (a few GB, including torch) into ~/.relay/agent/laya. Until then, keyword rules route requests.\",\n\t\t\t);\n\t\t\tif (accepted) await setupRuntime(ctx);\n\t\t}\n\t\tconst assessment = await assess(event.prompt, ctx, ctx.signal);\n\t\tpending = { request: event.prompt, assessment };\n\t\tconst policy = applyPolicy(assessment, event.prompt, {\n\t\t\tminConfidence: settings.minConfidence ?? DEFAULT_MIN_CONFIDENCE,\n\t\t});\n\t\tconst skills = selectSkills(event.systemPromptOptions.skills, assessment.agent, event.prompt);\n\n\t\tlet deactivated: string[] = [];\n\t\tif (enforce) {\n\t\t\tconst baseline = userTools();\n\t\t\tdeactivated = unneededTools(baseline, assessment.tools);\n\t\t\tconst applied = baseline.filter((name) => !deactivated.includes(name));\n\t\t\ttoolBaseline = { tools: baseline, applied };\n\t\t\trelay.setActiveTools(applied);\n\t\t}\n\t\treturn {\n\t\t\tmessage: {\n\t\t\t\tcustomType: LAYA_PLAN_MESSAGE,\n\t\t\t\tcontent: renderPlanMessage(assessment, policy, skills, deactivated),\n\t\t\t\tdisplay: false,\n\t\t\t\tdetails: { assessment, policy, skills, deactivated },\n\t\t\t},\n\t\t};\n\t});\n\n\trelay.on(\"session_shutdown\", () => {\n\t\tserver.stop();\n\t});\n\n\trelay.on(\"agent_start\", () => {\n\t\trun = undefined;\n\t});\n\n\trelay.on(\"agent_end\", (event, ctx) => {\n\t\tconst state = current;\n\t\tif (!isSelected(ctx) || !state || !run || run.taskId !== state.taskId) return;\n\t\tconst summary = summarizeRun(event.messages);\n\t\tconst success = summary.outcome === \"completed\" && summary.testsPassed !== false;\n\t\tconst [provider, ...rest] = state.model.split(\"/\");\n\t\tif (summary.outcome !== \"aborted\") history.record(taskKey(state.assessment), state.model, success);\n\t\tif (settings.telemetry === false) return;\n\t\ttry {\n\t\t\tstore.append({\n\t\t\t\ttask_id: state.taskId,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\trequest: state.request,\n\t\t\t\tclassification: {\n\t\t\t\t\tsource: state.assessment.source,\n\t\t\t\t\t...state.assessment.task,\n\t\t\t\t\tagent: state.assessment.agent,\n\t\t\t\t\tvalidation: state.assessment.validation,\n\t\t\t\t\tconfidence: Number(state.assessment.confidence.toFixed(3)),\n\t\t\t\t\trecommended_tier: state.assessment.recommendation.tier,\n\t\t\t\t\trecommended_effort: state.assessment.recommendation.effort,\n\t\t\t\t},\n\t\t\t\tpolicy: { profile: state.profile, required_tier: state.policy.requiredTier, rules: state.policy.rules },\n\t\t\t\tselected: { provider, model: rest.join(\"/\"), tier: state.tier, thinking_level: state.thinkingLevel },\n\t\t\t\tresult: {\n\t\t\t\t\tsuccess,\n\t\t\t\t\toutcome: summary.outcome,\n\t\t\t\t\tattempts: state.attempts,\n\t\t\t\t\tescalations: state.escalations,\n\t\t\t\t\ttests_passed: summary.testsPassed,\n\t\t\t\t\ttool_failures: summary.toolFailures,\n\t\t\t\t},\n\t\t\t\tusage: {\n\t\t\t\t\ttokens: summary.tokens,\n\t\t\t\t\tcost: Number(summary.cost.toFixed(6)),\n\t\t\t\t\tduration_ms: Date.now() - run.startedAt,\n\t\t\t\t\tmodels: summary.models,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Laya telemetry not written: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\t});\n\n\tconst writeJson = (path: string, content: string) => {\n\t\tmkdirSync(dirname(path), { recursive: true });\n\t\twriteFileSync(path, content, \"utf8\");\n\t};\n\n\trelay.registerCommand(\"laya\", {\n\t\tdescription: \"Laya execution router: status, policy, decisions, seed, export\",\n\t\tgetArgumentCompletions: (prefix) =>\n\t\t\t[\"status\", \"setup\", \"start\", \"stop\", \"policy \", \"decisions\", \"seed\", \"export\"]\n\t\t\t\t.filter((item) => item.startsWith(prefix))\n\t\t\t\t.map((item) => ({ value: item, label: item.trim() })),\n\t\thandler: async (args, ctx) => {\n\t\t\trefreshSettings();\n\t\t\tconst [subcommand = \"status\", ...rest] = args.trim().split(/\\s+/).filter(Boolean);\n\t\t\tconst layaDir = resolve(ctx.cwd, \".laya\");\n\t\t\tswitch (subcommand) {\n\t\t\t\tcase \"policy\": {\n\t\t\t\t\tconst name = POLICY_PROFILES.find((value) => value === rest[0]);\n\t\t\t\t\tif (!name) {\n\t\t\t\t\t\tctx.ui.notify(`Usage: /laya policy ${POLICY_PROFILES.join(\"|\")} (current: ${profile()})`, \"warning\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tprofileOverride = name;\n\t\t\t\t\tctx.ui.notify(`Laya cost profile for this session: ${name}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"decisions\": {\n\t\t\t\t\tconst path = resolve(ctx.cwd, rest[0] ?? join(layaDir, \"decisions.json\"));\n\t\t\t\t\twriteJson(path, `${JSON.stringify(layaDecisionsFile(), null, 2)}\\n`);\n\t\t\t\t\tctx.ui.notify(`Wrote the Laya questions to ${path}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"seed\": {\n\t\t\t\t\tconst count = Number(rest[0] ?? 1100);\n\t\t\t\t\tif (!Number.isInteger(count) || count <= 0) {\n\t\t\t\t\t\tctx.ui.notify(\"Usage: /laya seed [count] [path]\", \"warning\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst path = resolve(ctx.cwd, rest[1] ?? join(layaDir, \"data\", \"relay-seed.jsonl\"));\n\t\t\t\t\tconst rows = generateSeed(count);\n\t\t\t\t\twriteJson(path, rows.map((row) => `${JSON.stringify(row)}\\n`).join(\"\"));\n\t\t\t\t\tctx.ui.notify(`Wrote ${rows.length} synthetic exercises to ${path}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"export\": {\n\t\t\t\t\tconst path = resolve(ctx.cwd, rest[0] ?? join(layaDir, \"data\", \"relay-telemetry.jsonl\"));\n\t\t\t\t\tconst rows = datasetFromTelemetry(store.read(Number.MAX_SAFE_INTEGER));\n\t\t\t\t\twriteJson(path, rows.map((row) => `${JSON.stringify(row)}\\n`).join(\"\"));\n\t\t\t\t\tctx.ui.notify(`Exported ${rows.length} evidence-labeled exercises to ${path}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"setup\": {\n\t\t\t\t\tawait setupRuntime(ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"start\": {\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t(await server.ensureRunning(ctx.signal))\n\t\t\t\t\t\t\t? \"Laya server is running\"\n\t\t\t\t\t\t\t: \"Laya server did not start (see /laya status)\",\n\t\t\t\t\t\t\"info\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"stop\": {\n\t\t\t\t\tserver.stop();\n\t\t\t\t\tctx.ui.notify(\"Stopped the Laya server this session started\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"status\": {\n\t\t\t\t\tconst providers = new Set(candidates(ctx).map((candidate) => candidate.provider));\n\t\t\t\t\tconst lines = [\n\t\t\t\t\t\t`Profile: ${profile()}${isSelected(ctx) ? \"\" : \" (select laya/auto to route with Laya)\"}`,\n\t\t\t\t\t\t`Laya runtime: ${server.status()}${server.status() === \"ready\" ? \"\" : \" (run /laya setup)\"}; server ${(await server.isUp()) ? \"answering\" : \"not answering\"}`,\n\t\t\t\t\t\t`Laya server: ${lastClassifierError ? `unavailable, using keyword rules (${lastClassifierError})` : \"ok or not yet asked\"}`,\n\t\t\t\t\t\t`Models with credentials: ${\n\t\t\t\t\t\t\tcandidates(ctx)\n\t\t\t\t\t\t\t\t.map((candidate) => `${candidate.tier}:${candidate.ref}`)\n\t\t\t\t\t\t\t\t.join(\", \") || \"none\"\n\t\t\t\t\t\t}`,\n\t\t\t\t\t\t`Quota: ${\n\t\t\t\t\t\t\tObject.entries(quota.snapshot(providers))\n\t\t\t\t\t\t\t\t.map(([name, value]) => `${name} ${value}`)\n\t\t\t\t\t\t\t\t.join(\", \") || \"none\"\n\t\t\t\t\t\t}`,\n\t\t\t\t\t\t`Telemetry: ${settings.telemetry === false ? \"off\" : store.path}`,\n\t\t\t\t\t];\n\t\t\t\t\tif (current) {\n\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\t`Last plan: ${current.assessment.task.type} (${current.assessment.source}, confidence ${current.assessment.confidence.toFixed(2)}), recommended ${current.policy.recommendedTier}/${current.assessment.recommendation.effort}, routed ${current.tier} ${current.model} • ${current.thinkingLevel}`,\n\t\t\t\t\t\t\t`Alternatives: ${current.alternatives.join(\", \") || \"none\"}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (current.escalations.length > 0) {\n\t\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\t\t`Escalations: ${current.escalations.map((e) => `${e.reason} ${e.from}→${e.to}`).join(\", \")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tctx.ui.notify(lines.join(\"\\n\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\"Usage: /laya [status|setup|start|stop|policy <profile>|decisions [path]|seed [count] [path]|export [path]]\",\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/laya/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { existsSync, mkdirSync, rmSync, statSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport {\n\ttype Api,\n\ttype ClassifierModel,\n\tcreateProvider,\n\ttype Message,\n\ttype Model,\n\ttype ModelThinkingLevel,\n\ttype Provider,\n} from \"@relay-harness/ai\";\nimport { typesafeSystemOneApi } from \"@relay-harness/ai/api/typesafe-system-one.lazy\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport type { LayaSettings } from \"../../core/settings-manager.ts\";\nimport type { ModelRoute, ModelRouteRequest } from \"../../core/virtual-models.ts\";\nimport { assessmentFromAnswers, assessmentFromLabels, heuristicAssessment, type TaskAssessment } from \"./assessment.ts\";\nimport { type DockerRun, spawnDocker } from \"./docker.ts\";\nimport {\n\tbuildLearnPrompt,\n\texercisesToRows,\n\tLEARN_TOOL_NAME,\n\tlearnToolSchema,\n\trenderQuestions,\n\trenderTask,\n\ttype SessionTask,\n\tsessionTasks,\n} from \"./learn.ts\";\nimport { LAYA_LESSONS_MESSAGE, LESSON_SIMILARITY, ROUTE_SIMILARITY, renderLessons, TaskMemory } from \"./memory.ts\";\nimport { LAYA_MODEL_MANIFEST } from \"./model-manifest.ts\";\nimport {\n\tapplyPolicy,\n\ttype Candidate,\n\tDEFAULT_MODEL_REGISTRY,\n\ttype EscalationReason,\n\tnextTier,\n\tPerformanceHistory,\n\tPOLICY_PROFILES,\n\ttype PolicyDecision,\n\ttype PolicyProfile,\n\tparseModelRef,\n\tQuotaManager,\n\trankCandidates,\n\ttype ScoredCandidate,\n\ttaskKey,\n} from \"./policy.ts\";\nimport { CAPABILITY_TIERS, type CapabilityTier, LAYA_QUESTIONS, layaDecisionsFile } from \"./questions.ts\";\nimport { LAYA_PLAN_MESSAGE, renderPlanMessage, selectSkills, unneededTools } from \"./routers.ts\";\nimport { type LayaImageVariant, layaImage } from \"./runtime.ts\";\nimport { generateSeed } from \"./seed.ts\";\nimport { isLocalUrl, LayaServer } from \"./server.ts\";\nimport {\n\tdatasetFromTelemetry,\n\tHARNESS_MESSAGE,\n\thistoryFromTelemetry,\n\tsummarizeRun,\n\tTelemetryStore,\n\ttruncateRequest,\n} from \"./telemetry.ts\";\nimport {\n\taccuracy,\n\tdescribeProgress,\n\tdockerHasGpu,\n\treadRegistry,\n\treadRows,\n\ttype Score,\n\tSESSION_SOURCE,\n\tsharedTrainer,\n\ttype TrainingListener,\n\ttype TrainingOutcome,\n} from \"./training.ts\";\n\nexport { LAYA_PLAN_MESSAGE } from \"./routers.ts\";\n\nexport const LAYA_PROVIDER_ID = \"laya\";\nexport const LAYA_CLASSIFIER_ID = \"execution-intelligence\";\nexport const LAYA_VIRTUAL_MODEL_ID = \"auto\";\n/** Not 8000, the port laya-trainer's own server and many development servers use. */\nexport const DEFAULT_LAYA_BASE_URL = \"http://127.0.0.1:8737/v1\";\n\nconst DEFAULT_TIMEOUT_MS = 5000;\nconst DEFAULT_MIN_CONFIDENCE = 0.5;\nconst DEFAULT_ESCALATE_AFTER_FAILURES = 3;\n/** After a failed classifier call, keyword rules answer for this long before Laya is tried again. */\nconst LAYA_RETRY_AFTER_MS = 60_000;\nconst QUOTA_ERROR = /rate.?limit|\\b429\\b|overload|\\b529\\b|quota|capacity|too many requests|usage limit/i;\n\n/** Router state stored on the session branch. */\nexport interface LayaRouterState {\n\ttaskId: string;\n\trequest: string;\n\tassessment: TaskAssessment;\n\tpolicy: PolicyDecision;\n\tprofile: PolicyProfile;\n\t/** Tier and model currently handling the task. */\n\ttier: CapabilityTier;\n\tmodel: string;\n\tthinkingLevel: ModelThinkingLevel;\n\t/** Failed tool calls of the turn already answered by an escalation. */\n\tfailuresAtEscalation: number;\n\tescalations: Array<{ reason: EscalationReason; from: CapabilityTier; to: CapabilityTier }>;\n\tattempts: number;\n\t/** Top-ranked alternatives at selection time, for `/laya`. */\n\talternatives: string[];\n}\n\nconst layaClassifier: ClassifierModel<\"typesafe-system-one\"> = {\n\ttype: \"classifier\",\n\tid: LAYA_CLASSIFIER_ID,\n\tname: \"Laya Execution Intelligence\",\n\tapi: \"typesafe-system-one\",\n\tprovider: LAYA_PROVIDER_ID,\n\tbaseUrl: DEFAULT_LAYA_BASE_URL,\n\tinput: [\"text\"],\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\tcontextWindow: 1024,\n};\n\n/**\n * The local Laya server speaks TypeSafe's System One protocol, so the built-in implementation serves\n * it. It needs no key; `LAYA_API_KEY` is sent when set, for servers that require one.\n */\nfunction createLayaProvider(baseUrl: () => string | undefined): Provider {\n\treturn createProvider({\n\t\tid: LAYA_PROVIDER_ID,\n\t\tname: \"Laya\",\n\t\tauth: {\n\t\t\tapiKey: {\n\t\t\t\tname: \"Laya\",\n\t\t\t\tresolve: async ({ ctx, credential }) => ({\n\t\t\t\t\tauth: {\n\t\t\t\t\t\tapiKey: credential?.key ?? (await ctx.env(\"LAYA_API_KEY\")) ?? \"local\",\n\t\t\t\t\t\tbaseUrl: baseUrl() ?? (await ctx.env(\"LAYA_BASE_URL\")) ?? DEFAULT_LAYA_BASE_URL,\n\t\t\t\t\t},\n\t\t\t\t\tsource: \"Laya server\",\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\tmodels: [layaClassifier],\n\t\tclassifiers: { \"typesafe-system-one\": typesafeSystemOneApi() },\n\t});\n}\n\nfunction messageText(message: Message): string {\n\tif (message.role !== \"user\") return \"\";\n\tconst content = message.content;\n\tif (typeof content === \"string\") return content;\n\treturn content.flatMap((block) => (block.type === \"text\" ? [block.text] : [])).join(\"\\n\");\n}\n\n/** Index of the latest message the user wrote; harness and plan messages do not count. */\nfunction lastUserIndex(messages: readonly Message[]): number {\n\treturn messages.findLastIndex((message) => message.role === \"user\" && !HARNESS_MESSAGE.test(messageText(message)));\n}\n\n/** Failed tool calls and harness verification requests since the user's latest message. */\nfunction failuresThisTurn(messages: readonly Message[]): { count: number; evidence: boolean } {\n\tlet count = 0;\n\tlet evidence = false;\n\tfor (const message of messages.slice(lastUserIndex(messages) + 1)) {\n\t\tif (message.role === \"toolResult\" && message.isError) count++;\n\t\tif (message.role === \"user\" && messageText(message).startsWith(\"[harness:evidence]\")) {\n\t\t\tcount++;\n\t\t\tevidence = true;\n\t\t}\n\t}\n\treturn { count, evidence };\n}\n\nconst percent = (score: Score) => `${(accuracy(score) * 100).toFixed(1)}%`;\n\n/** What a finished training changed, for the user. */\nexport function describeTrainingOutcome({ model, activated, previous }: TrainingOutcome): string {\n\tconst session = `${model.session.candidate.correct} of ${model.session.candidate.n} answers on the session tasks right (${previous}: ${model.session.current.correct})`;\n\tconst minutes = Math.max(1, Math.round(model.seconds / 60));\n\treturn activated\n\t\t? `Laya learned ${model.sessionTasks} session tasks in about ${minutes} min: ${model.name} now routes requests. It gets ${session}; test ${percent(model.test.candidate)} (${previous}: ${percent(model.test.current)}).`\n\t\t: `Laya trained ${model.name}, but ${previous} keeps routing: the test score fell from ${percent(model.test.current)} to ${percent(model.test.candidate)}. It gets ${session}. /laya use ${model.name} activates it anyway.`;\n}\n\nexport interface LayaExtensionOptions {\n\t/** Docker CLI runner. Default: the `docker` command. */\n\tdocker?: DockerRun;\n}\n\n/** Files of the Python runtime Relay used to install on the host, before Laya moved to Docker. */\nconst HOST_RUNTIME_LEFTOVERS = [\"venv\", \"models\", \"serve.py\", \"train.py\", \"server.log\"];\n\nexport default function layaExtension(relay: ExtensionAPI, options: LayaExtensionOptions = {}): void {\n\tconst quota = new QuotaManager();\n\tconst docker = options.docker ?? spawnDocker;\n\tconst layaHome = join(getAgentDir(), \"laya\");\n\tconst store = new TelemetryStore(join(layaHome, \"telemetry.jsonl\"));\n\tconst baseUrl = () => settings.baseUrl ?? process.env.LAYA_BASE_URL ?? DEFAULT_LAYA_BASE_URL;\n\tlet variant: Promise<LayaImageVariant> | undefined;\n\tlet gpu: Promise<boolean> | undefined;\n\t/** The CUDA image where an NVIDIA GPU exists, the smaller CPU image otherwise. */\n\tconst hostVariant = async (): Promise<LayaImageVariant> => {\n\t\tif (process.platform === \"darwin\") return \"cpu\";\n\t\ttry {\n\t\t\treturn (await relay.exec(\"nvidia-smi\", [\"-L\"], { timeout: 10_000 })).code === 0 ? \"cuda\" : \"cpu\";\n\t\t} catch {\n\t\t\treturn \"cpu\";\n\t\t}\n\t};\n\tconst imageVariant = () => {\n\t\tvariant ??= hostVariant();\n\t\treturn variant;\n\t};\n\tconst image = async () => settings.image ?? layaImage(LAYA_MODEL_MANIFEST, await imageVariant());\n\tconst trainingGpu = () => {\n\t\tgpu ??= (async () => (await imageVariant()) === \"cuda\" && dockerHasGpu(docker, await image()))();\n\t\treturn gpu;\n\t};\n\tconst trainer = sharedTrainer({ home: layaHome, manifest: LAYA_MODEL_MANIFEST, docker, image, gpu: trainingGpu });\n\tconst server = new LayaServer({ docker, baseUrl, image, model: () => trainer.activeModel().dir });\n\t/** Server problem last reported, so a failing Docker is not reported on every start. */\n\tlet reportedProblem: string | undefined;\n\tlet history = new PerformanceHistory();\n\tlet settings: LayaSettings = {};\n\tlet profileOverride: PolicyProfile | undefined;\n\tlet layaUnavailableUntil = 0;\n\tlet lastClassifierError: string | undefined;\n\t/** Plan computed in before_agent_start for the prompt about to be sent. */\n\tlet pending: { request: string; assessment: TaskAssessment } | undefined;\n\t/** Latest state returned by the router, and the run it belongs to. */\n\tlet current: LayaRouterState | undefined;\n\tlet run: { taskId: string; startedAt: number } | undefined;\n\t/** Tools active before enforced tool routing changed them. */\n\tlet toolBaseline: { tools: string[]; applied: string[] } | undefined;\n\t/** Tasks `/laya learn` listed for the agent to label, numbered as the agent saw them. */\n\tlet learnTasks: { tasks: SessionTask[]; session: string } | undefined;\n\t/** This runtime's training listener, while it is the latest one. */\n\tlet listener: TrainingListener | undefined;\n\tlet memoryCache: { version: string; memory: TaskMemory } | undefined;\n\n\tconst refreshSettings = () => {\n\t\tsettings = relay.getSettings().laya ?? {};\n\t\tquota.configure(settings.quota);\n\t};\n\tconst profile = (): PolicyProfile => {\n\t\tconst flag = relay.getFlag(\"laya-policy\");\n\t\tconst fromFlag = POLICY_PROFILES.find((name) => name === flag);\n\t\treturn profileOverride ?? fromFlag ?? settings.policy ?? \"balanced\";\n\t};\n\tconst isSelected = (ctx: ExtensionContext) =>\n\t\tctx.model?.provider === LAYA_PROVIDER_ID && ctx.model.id === LAYA_VIRTUAL_MODEL_ID;\n\n\trelay.registerFlag(\"laya-policy\", {\n\t\ttype: \"string\",\n\t\tdescription: \"Cost profile of the laya/auto router: economy, balanced, quality or critical\",\n\t});\n\trelay.registerProvider(createLayaProvider(() => settings.baseUrl));\n\n\t/** System 1: Laya's answers, or keyword rules when the server cannot answer. */\n\t/** Learned tasks, reloaded when the training dataset changes. Undefined when off or empty. */\n\tfunction memory(): TaskMemory | undefined {\n\t\tif (settings.memory === false) return undefined;\n\t\tlet version: string;\n\t\ttry {\n\t\t\tconst stat = statSync(trainer.workspace.dataset);\n\t\t\tversion = `${stat.mtimeMs}:${stat.size}`;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (memoryCache?.version !== version) {\n\t\t\tmemoryCache = { version, memory: TaskMemory.fromRows(readRows(trainer.workspace.dataset)) };\n\t\t}\n\t\treturn memoryCache.memory.size > 0 ? memoryCache.memory : undefined;\n\t}\n\n\t/** Lessons of learned tasks similar to a request; none for harness messages such as /laya learn's. */\n\tconst lessonsFor = (request: string) =>\n\t\tHARNESS_MESSAGE.test(request.trimStart())\n\t\t\t? undefined\n\t\t\t: renderLessons(memory()?.search(request, LESSON_SIMILARITY) ?? []);\n\n\t/** The labels of a learned task close to the request, then Laya's answers, then keyword rules. */\n\tasync function assess(request: string, ctx: ExtensionContext, signal?: AbortSignal): Promise<TaskAssessment> {\n\t\tconst learned = memory()?.search(request, ROUTE_SIMILARITY, 1)[0];\n\t\tif (learned) {\n\t\t\ttry {\n\t\t\t\treturn {\n\t\t\t\t\t...assessmentFromLabels(learned.task.expected),\n\t\t\t\t\tsource: \"memory\",\n\t\t\t\t\tconfidence: learned.similarity,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\t// Labeled against questions that have changed since; Laya answers instead.\n\t\t\t}\n\t\t}\n\t\tconst classifier = ctx.modelRegistry.findOfType(\"classifier\", LAYA_PROVIDER_ID, LAYA_CLASSIFIER_ID);\n\t\t// While the container installs, or without Docker, the classifier call would only fail.\n\t\tif (!classifier || Date.now() < layaUnavailableUntil || server.state === \"installing\") {\n\t\t\treturn heuristicAssessment(request);\n\t\t}\n\t\tconst result = await ctx.modelRegistry.classify(\n\t\t\tclassifier,\n\t\t\t{ state: { request: truncateRequest(request) }, questions: LAYA_QUESTIONS },\n\t\t\t{ signal, timeoutMs: settings.timeoutMs ?? DEFAULT_TIMEOUT_MS, maxRetries: 0 },\n\t\t);\n\t\ttry {\n\t\t\tif (result.stopReason !== \"stop\") throw new Error(result.errorMessage ?? \"Laya did not answer\");\n\t\t\tconst assessment = assessmentFromAnswers(result.answers);\n\t\t\tlastClassifierError = undefined;\n\t\t\treturn assessment;\n\t\t} catch (error) {\n\t\t\tif (signal?.aborted) throw error;\n\t\t\tlastClassifierError = error instanceof Error ? error.message : String(error);\n\t\t\tlayaUnavailableUntil = Date.now() + LAYA_RETRY_AFTER_MS;\n\t\t\treturn heuristicAssessment(request);\n\t\t}\n\t}\n\n\t/** Model registry: configured models whose provider has credentials. */\n\tfunction candidates(ctx: ExtensionContext): Array<Candidate & { model: Model<Api> }> {\n\t\tconst registry = { ...DEFAULT_MODEL_REGISTRY, ...settings.models };\n\t\tconst result: Array<Candidate & { model: Model<Api> }> = [];\n\t\tfor (const tier of CAPABILITY_TIERS) {\n\t\t\tfor (const ref of registry[tier] ?? []) {\n\t\t\t\tconst parsed = parseModelRef(ref);\n\t\t\t\tconst model = parsed && ctx.modelRegistry.find(parsed.provider, parsed.id);\n\t\t\t\tif (!model || model.provider === LAYA_PROVIDER_ID || !ctx.modelRegistry.hasConfiguredAuth(model)) continue;\n\t\t\t\tresult.push({ ref, provider: model.provider, tier, order: result.length, model });\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction rank(\n\t\tctx: ExtensionContext,\n\t\tinput: { assessment: TaskAssessment; requiredTier: CapabilityTier; minTier: CapabilityTier },\n\t): Array<ScoredCandidate & { model: Model<Api> }> {\n\t\tconst available = candidates(ctx);\n\t\tif (available.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t\"laya/auto: no model of the Laya model registry has credentials. Log in to a provider or set laya.models.\",\n\t\t\t);\n\t\t}\n\t\tconst byRef = new Map(available.map((candidate) => [candidate.ref, candidate.model]));\n\t\tconst ranked = rankCandidates(available, {\n\t\t\trequiredTier: input.requiredTier,\n\t\t\tminTier: input.minTier,\n\t\t\trisk: input.assessment.task.risk,\n\t\t\tprofile: profile(),\n\t\t\ttaskKey: taskKey(input.assessment),\n\t\t\thistory,\n\t\t\tquota,\n\t\t});\n\t\t// Every candidate is below the floor or out of quota: take the strongest one available.\n\t\tconst fallback = [...available].sort(\n\t\t\t(a, b) => CAPABILITY_TIERS.indexOf(b.tier) - CAPABILITY_TIERS.indexOf(a.tier),\n\t\t);\n\t\tconst list =\n\t\t\tranked.length > 0\n\t\t\t\t? ranked\n\t\t\t\t: fallback.map((candidate) => ({\n\t\t\t\t\t\t...candidate,\n\t\t\t\t\t\tsuccess: 0,\n\t\t\t\t\t\tcost: 0,\n\t\t\t\t\t\tlatency: 0,\n\t\t\t\t\t\tutility: 0,\n\t\t\t\t\t\teligible: false,\n\t\t\t\t\t}));\n\t\treturn list.map((candidate) => ({ ...candidate, model: byRef.get(candidate.ref)! }));\n\t}\n\n\tfunction select(\n\t\tctx: ExtensionContext,\n\t\tbase: Omit<LayaRouterState, \"tier\" | \"model\" | \"thinkingLevel\" | \"alternatives\">,\n\t\tminTier: CapabilityTier,\n\t\trequiredTier: CapabilityTier,\n\t): { route: ModelRoute<LayaRouterState>; state: LayaRouterState } {\n\t\tconst ranked = rank(ctx, { assessment: base.assessment, requiredTier, minTier });\n\t\tconst chosen = ranked[0];\n\t\tconst state: LayaRouterState = {\n\t\t\t...base,\n\t\t\ttier: chosen.tier,\n\t\t\tmodel: chosen.ref,\n\t\t\tthinkingLevel: base.policy.thinkingLevel,\n\t\t\talternatives: ranked.slice(1, 4).map((candidate) => candidate.ref),\n\t\t};\n\t\tcurrent = state;\n\t\tctx.ui.setStatus(\n\t\t\t\"laya\",\n\t\t\t`laya ${profile()}: ${base.assessment.task.type} → ${chosen.tier} ${chosen.model.id} • ${state.thinkingLevel}${\n\t\t\t\t{ laya: \"\", memory: \" (memory)\", heuristic: \" (rules)\" }[base.assessment.source]\n\t\t\t}`,\n\t\t);\n\t\treturn { route: { model: chosen.model, thinkingLevel: state.thinkingLevel, state }, state };\n\t}\n\n\tasync function planTask(\n\t\trequest: ModelRouteRequest<LayaRouterState>,\n\t\tctx: ExtensionContext,\n\t): Promise<ModelRoute<LayaRouterState>> {\n\t\tconst index = lastUserIndex(request.messages);\n\t\tconst text = index >= 0 ? messageText(request.messages[index]) : \"\";\n\t\tconst assessment =\n\t\t\tpending && pending.request === text ? pending.assessment : await assess(text, ctx, request.signal);\n\t\tpending = undefined;\n\t\tconst policy = applyPolicy(assessment, text, {\n\t\t\tminConfidence: settings.minConfidence ?? DEFAULT_MIN_CONFIDENCE,\n\t\t});\n\t\tconst taskId = randomUUID();\n\t\trun = { taskId, startedAt: run?.startedAt ?? Date.now() };\n\t\tconst escalations = policy.escalations.map((reason) => ({\n\t\t\treason,\n\t\t\tfrom: policy.recommendedTier,\n\t\t\tto: policy.requiredTier,\n\t\t}));\n\t\treturn select(\n\t\t\tctx,\n\t\t\t{\n\t\t\t\ttaskId,\n\t\t\t\trequest: truncateRequest(text),\n\t\t\t\tassessment,\n\t\t\t\tpolicy,\n\t\t\t\tprofile: profile(),\n\t\t\t\tfailuresAtEscalation: 0,\n\t\t\t\tescalations,\n\t\t\t\tattempts: 1,\n\t\t\t},\n\t\t\tpolicy.minTier,\n\t\t\tpolicy.requiredTier,\n\t\t).route;\n\t}\n\n\t/** Moves the task one tier up, or to an equivalent model when the provider is out of quota. */\n\tfunction escalate(\n\t\tctx: ExtensionContext,\n\t\tstate: LayaRouterState,\n\t\treason: EscalationReason,\n\t\tfailures: number,\n\t): ModelRoute<LayaRouterState> | undefined {\n\t\tconst sameTier = reason === \"provider_unavailable\";\n\t\tconst target = sameTier ? state.tier : nextTier(state.tier);\n\t\tif (!target) return undefined;\n\t\tconst { route } = select(\n\t\t\tctx,\n\t\t\t{\n\t\t\t\t...state,\n\t\t\t\tfailuresAtEscalation: failures,\n\t\t\t\tescalations: [...state.escalations, { reason, from: state.tier, to: target }],\n\t\t\t\tattempts: state.attempts + 1,\n\t\t\t},\n\t\t\ttarget,\n\t\t\ttarget,\n\t\t);\n\t\treturn route;\n\t}\n\n\tfunction sticky(ctx: ExtensionContext, state: LayaRouterState): ModelRoute<LayaRouterState> {\n\t\tconst parsed = parseModelRef(state.model);\n\t\tconst model = parsed && ctx.modelRegistry.find(parsed.provider, parsed.id);\n\t\tif (!model) throw new Error(`laya/auto: routed model ${state.model} is no longer in the catalog`);\n\t\tcurrent = state;\n\t\treturn { model, thinkingLevel: state.thinkingLevel };\n\t}\n\n\tasync function route(\n\t\trequest: ModelRouteRequest<LayaRouterState>,\n\t\tctx: ExtensionContext,\n\t): Promise<ModelRoute<LayaRouterState>> {\n\t\tconst state = request.state;\n\t\tif (request.reason === \"direct\") {\n\t\t\t// Compaction summaries and extension calls: a balanced model without heavy reasoning.\n\t\t\tconst ranked = rank(ctx, { assessment: heuristicAssessment(\"\"), requiredTier: \"balanced\", minTier: \"fast\" });\n\t\t\treturn { model: ranked[0].model, thinkingLevel: \"low\" };\n\t\t}\n\t\tif (request.reason === \"user\" || !state) return planTask(request, ctx);\n\n\t\tif (request.reason === \"retry\" && request.failed) {\n\t\t\tif (QUOTA_ERROR.test(request.failed.message.errorMessage ?? \"\")) {\n\t\t\t\tquota.recordPressure(request.failed.model.provider);\n\t\t\t\tconst route = escalate(ctx, state, \"provider_unavailable\", state.failuresAtEscalation);\n\t\t\t\tif (route) return route;\n\t\t\t}\n\t\t\treturn sticky(ctx, state);\n\t\t}\n\n\t\tconst threshold = settings.escalateAfterFailures ?? DEFAULT_ESCALATE_AFTER_FAILURES;\n\t\tconst failures = failuresThisTurn(request.messages);\n\t\tif (threshold > 0 && failures.count - state.failuresAtEscalation >= threshold) {\n\t\t\tconst route = escalate(ctx, state, failures.evidence ? \"test_failure\" : \"repeated_failure\", failures.count);\n\t\t\tif (route) return route;\n\t\t}\n\t\treturn sticky(ctx, state);\n\t}\n\n\trelay.registerVirtualModel<LayaRouterState>({\n\t\tprovider: LAYA_PROVIDER_ID,\n\t\tid: LAYA_VIRTUAL_MODEL_ID,\n\t\tname: \"Auto (Laya)\",\n\t\troute,\n\t});\n\n\t/**\n\t * Pulls the image and starts or updates the server container, with progress in the status line.\n\t * `explicit` is a user command: it always reports the result. Otherwise only a finished\n\t * installation and a new problem are reported.\n\t */\n\tasync function install(ctx: ExtensionContext, explicit = false): Promise<boolean> {\n\t\tlet worked = false;\n\t\tconst ok = await server.install((message) => {\n\t\t\tworked = true;\n\t\t\tctx.ui.setStatus(\"laya-setup\", `laya: ${message}`);\n\t\t});\n\t\tctx.ui.setStatus(\"laya-setup\", undefined);\n\t\tif (ok) {\n\t\t\tlayaUnavailableUntil = 0;\n\t\t\tlastClassifierError = undefined;\n\t\t\treportedProblem = undefined;\n\t\t\tif (explicit || worked) ctx.ui.notify(`Laya is ${server.describe()}; it routes laya/auto requests.`);\n\t\t\treturn true;\n\t\t}\n\t\tconst problem = server.describe();\n\t\tif (explicit || problem !== reportedProblem) {\n\t\t\treportedProblem = problem;\n\t\t\tctx.ui.notify(`Laya ${problem}. Keyword rules route laya/auto requests until it runs.`, \"warning\");\n\t\t}\n\t\treturn false;\n\t}\n\n\t/** Deletes the Python environment and model that Relay installed on the host before Laya moved to Docker. */\n\tfunction removeHostRuntime(): void {\n\t\tfor (const name of HOST_RUNTIME_LEFTOVERS) {\n\t\t\ttry {\n\t\t\t\trmSync(join(layaHome, name), { recursive: true, force: true });\n\t\t\t} catch {\n\t\t\t\t// In use or not ours to delete; it does no harm.\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Capability tier of a `provider/model` in the Laya model registry. */\n\tconst tierOf = (ref: string): CapabilityTier | undefined => {\n\t\tconst registry = { ...DEFAULT_MODEL_REGISTRY, ...settings.models };\n\t\treturn CAPABILITY_TIERS.find((tier) => registry[tier]?.includes(ref));\n\t};\n\n\t/**\n\t * Starts training on the collected exercises. It runs in the background in interactive modes and\n\t * reports through the listener; print and JSON mode wait for it, since the process ends with the turn.\n\t */\n\tasync function startTraining(ctx: ExtensionContext): Promise<string> {\n\t\tif (trainer.running) return \"Laya is already training; run /laya train after it ends to include these tasks.\";\n\t\tif (server.state !== \"ready\" && !(await server.install())) {\n\t\t\treturn `Laya ${server.describe()}, so it cannot train yet. Run /laya setup, then /laya train.`;\n\t\t}\n\t\tif (!(await trainingGpu())) {\n\t\t\tconst accepted =\n\t\t\t\t!ctx.hasUI ||\n\t\t\t\t(await ctx.ui.confirm(\n\t\t\t\t\t\"Train Laya on the CPU?\",\n\t\t\t\t\t\"Docker gives Laya no GPU on this computer. Training still works, but can take an hour or more. Laya keeps routing requests meanwhile.\",\n\t\t\t\t));\n\t\t\tif (!accepted) return \"Training was not started. Run /laya train when you want it.\";\n\t\t}\n\t\t// The server runs on the CPU, so it keeps routing while the training container has the GPU.\n\t\tconst job = trainer.train();\n\t\tif (ctx.mode === \"print\" || ctx.mode === \"json\") {\n\t\t\ttry {\n\t\t\t\treturn describeTrainingOutcome(await job);\n\t\t\t} catch (error) {\n\t\t\t\treturn `Laya training failed: ${error instanceof Error ? error.message : String(error)}`;\n\t\t\t}\n\t\t}\n\t\t// The listener reports the result.\n\t\tjob.catch(() => {});\n\t\treturn \"Laya is training in a Docker container (a few minutes with a GPU). The current model keeps routing until it ends; then the new model routes requests if it passes the test.\";\n\t}\n\n\trelay.on(\"session_start\", (_event, ctx) => {\n\t\trefreshSettings();\n\t\thistory = settings.telemetry === false ? new PerformanceHistory() : historyFromTelemetry(store.read());\n\t\tremoveHostRuntime();\n\t\t// Install right away in the background: pull the image on first use, then keep the container\n\t\t// running. Sessions without a UI (print mode, SDK, tests) leave Docker alone.\n\t\tif (settings.autostart !== false && ctx.hasUI && isLocalUrl(baseUrl())) void install(ctx);\n\t\tlistener = {\n\t\t\tprogress: (progress) => ctx.ui.setStatus(\"laya-train\", `laya training: ${describeProgress(progress)}`),\n\t\t\tfinished: (result) => {\n\t\t\t\tctx.ui.setStatus(\"laya-train\", undefined);\n\t\t\t\tif (\"error\" in result) {\n\t\t\t\t\tctx.ui.notify(`Laya training failed: ${result.error.message}`, \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tctx.ui.notify(describeTrainingOutcome(result.outcome), result.outcome.activated ? \"info\" : \"warning\");\n\t\t\t\t// The server container is replaced by one serving the new model.\n\t\t\t\tif (result.outcome.activated) void install(ctx);\n\t\t\t},\n\t\t};\n\t\ttrainer.listener = listener;\n\t});\n\n\trelay.registerTool<typeof learnToolSchema, { added: number; updated: number; training?: string }>({\n\t\tname: LEARN_TOOL_NAME,\n\t\tlabel: \"Laya learn\",\n\t\tdescription:\n\t\t\t\"Save labeled tasks of this session as training exercises for Laya, Relay's routing model, and train it so similar requests get the right model, effort and tools. Use after /laya learn lists the tasks, or when the user asks Relay to learn from this session or conversation.\",\n\t\tparameters: learnToolSchema,\n\t\t// Loaded by /laya learn, or found by tool search when the user asks in their own words.\n\t\texposure: \"deferred\",\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n\t\t\tif (!learnTasks) {\n\t\t\t\t// Called without /laya learn: number this session's tasks and ask for labels against them.\n\t\t\t\tconst tasks = sessionTasks(ctx.sessionManager.getBranch(), tierOf);\n\t\t\t\tlearnTasks = { tasks, session: ctx.sessionManager.getSessionId() };\n\t\t\t\tthrow new Error(\n\t\t\t\t\t[\n\t\t\t\t\t\t`Nothing was saved: label these tasks of the session by their numbers, then call ${LEARN_TOOL_NAME} again. Leave out entries that are not coding tasks, such as this request to learn.`,\n\t\t\t\t\t\t`Questions:\\n${renderQuestions()}`,\n\t\t\t\t\t\t...tasks.map(renderTask),\n\t\t\t\t\t].join(\"\\n\\n\"),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst rows = exercisesToRows(learnTasks.tasks, params.exercises, {\n\t\t\t\tsession: learnTasks.session,\n\t\t\t\tcreated: new Date().toISOString(),\n\t\t\t});\n\t\t\tconst { added, updated } = trainer.addExercises(rows);\n\t\t\tlearnTasks = undefined;\n\t\t\tconst sessionRows = trainer.counts()[SESSION_SOURCE] ?? 0;\n\t\t\tconst saved = `Saved ${rows.length} exercises (${added} new, ${updated} updated); ${sessionRows} session tasks in total, in ${trainer.workspace.dataset}. Requests similar to these tasks use their labels and lessons from the next one.`;\n\t\t\tconst training =\n\t\t\t\tparams.train === false ? \"Training was not started (run /laya train).\" : await startTraining(ctx);\n\t\t\treturn { content: [{ type: \"text\", text: `${saved} ${training}` }], details: { added, updated, training } };\n\t\t},\n\t});\n\n\t/** The user's own tool set: the active tools, or the set enforcement replaced while it is unchanged. */\n\tconst userTools = (): string[] => {\n\t\tconst active = relay.getActiveTools();\n\t\tconst applied = toolBaseline?.applied;\n\t\tconst unchanged = applied && active.length === applied.length && active.every((name, i) => name === applied[i]);\n\t\treturn unchanged && toolBaseline ? toolBaseline.tools : active;\n\t};\n\n\trelay.on(\"before_agent_start\", async (event, ctx) => {\n\t\trefreshSettings();\n\t\tconst enforce = isSelected(ctx) && settings.toolRouting === \"enforce\";\n\t\t// Enforcement is off or another model is selected: give the user's tools back.\n\t\tif (toolBaseline && !enforce) {\n\t\t\trelay.setActiveTools(userTools());\n\t\t\ttoolBaseline = undefined;\n\t\t}\n\t\tif (!isSelected(ctx)) {\n\t\t\t// Lessons help whichever model runs the request.\n\t\t\tconst lessons = lessonsFor(event.prompt);\n\t\t\tif (!lessons) return;\n\t\t\treturn {\n\t\t\t\tmessage: {\n\t\t\t\t\tcustomType: LAYA_LESSONS_MESSAGE,\n\t\t\t\t\tcontent: `[laya:lessons] ${lessons}`,\n\t\t\t\t\tdisplay: false,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconst assessment = await assess(event.prompt, ctx, ctx.signal);\n\t\tpending = { request: event.prompt, assessment };\n\t\tconst policy = applyPolicy(assessment, event.prompt, {\n\t\t\tminConfidence: settings.minConfidence ?? DEFAULT_MIN_CONFIDENCE,\n\t\t});\n\t\tconst skills = selectSkills(event.systemPromptOptions.skills, assessment.agent, event.prompt);\n\n\t\tlet deactivated: string[] = [];\n\t\tif (enforce) {\n\t\t\tconst baseline = userTools();\n\t\t\tdeactivated = unneededTools(baseline, assessment.tools);\n\t\t\tconst applied = baseline.filter((name) => !deactivated.includes(name));\n\t\t\ttoolBaseline = { tools: baseline, applied };\n\t\t\trelay.setActiveTools(applied);\n\t\t}\n\t\tconst lessons = lessonsFor(event.prompt);\n\t\tconst plan = renderPlanMessage(assessment, policy, skills, deactivated);\n\t\treturn {\n\t\t\tmessage: {\n\t\t\t\tcustomType: LAYA_PLAN_MESSAGE,\n\t\t\t\tcontent: lessons ? `${plan}\\n- ${lessons}` : plan,\n\t\t\t\tdisplay: false,\n\t\t\t\tdetails: { assessment, policy, skills, deactivated },\n\t\t\t},\n\t\t};\n\t});\n\n\trelay.on(\"session_shutdown\", (event) => {\n\t\t// The server container keeps running for the next session.\n\t\tif (trainer.listener === listener) trainer.listener = undefined;\n\t\t// Training belongs to the process: it goes on into the next session, and stops when Relay quits.\n\t\tif (event.reason === \"quit\") trainer.stop();\n\t});\n\n\trelay.on(\"agent_start\", () => {\n\t\trun = undefined;\n\t});\n\n\trelay.on(\"agent_end\", (event, ctx) => {\n\t\tconst state = current;\n\t\tif (!isSelected(ctx) || !state || !run || run.taskId !== state.taskId) return;\n\t\tconst summary = summarizeRun(event.messages);\n\t\tconst success = summary.outcome === \"completed\" && summary.testsPassed !== false;\n\t\tconst [provider, ...rest] = state.model.split(\"/\");\n\t\tif (summary.outcome !== \"aborted\") history.record(taskKey(state.assessment), state.model, success);\n\t\tif (settings.telemetry === false) return;\n\t\ttry {\n\t\t\tstore.append({\n\t\t\t\ttask_id: state.taskId,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\trequest: state.request,\n\t\t\t\tclassification: {\n\t\t\t\t\tsource: state.assessment.source,\n\t\t\t\t\t...state.assessment.task,\n\t\t\t\t\tagent: state.assessment.agent,\n\t\t\t\t\tvalidation: state.assessment.validation,\n\t\t\t\t\tconfidence: Number(state.assessment.confidence.toFixed(3)),\n\t\t\t\t\trecommended_tier: state.assessment.recommendation.tier,\n\t\t\t\t\trecommended_effort: state.assessment.recommendation.effort,\n\t\t\t\t},\n\t\t\t\tpolicy: { profile: state.profile, required_tier: state.policy.requiredTier, rules: state.policy.rules },\n\t\t\t\tselected: { provider, model: rest.join(\"/\"), tier: state.tier, thinking_level: state.thinkingLevel },\n\t\t\t\tresult: {\n\t\t\t\t\tsuccess,\n\t\t\t\t\toutcome: summary.outcome,\n\t\t\t\t\tattempts: state.attempts,\n\t\t\t\t\tescalations: state.escalations,\n\t\t\t\t\ttests_passed: summary.testsPassed,\n\t\t\t\t\ttool_failures: summary.toolFailures,\n\t\t\t\t},\n\t\t\t\tusage: {\n\t\t\t\t\ttokens: summary.tokens,\n\t\t\t\t\tcost: Number(summary.cost.toFixed(6)),\n\t\t\t\t\tduration_ms: Date.now() - run.startedAt,\n\t\t\t\t\tmodels: summary.models,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Laya telemetry not written: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\t});\n\n\tconst writeJson = (path: string, content: string) => {\n\t\tmkdirSync(dirname(path), { recursive: true });\n\t\twriteFileSync(path, content, \"utf8\");\n\t};\n\n\trelay.registerCommand(\"laya\", {\n\t\tdescription: \"Laya execution router: status, setup, learn from sessions, train, models, policy\",\n\t\tgetArgumentCompletions: (prefix) =>\n\t\t\t[\n\t\t\t\t\"status\",\n\t\t\t\t\"setup\",\n\t\t\t\t\"start\",\n\t\t\t\t\"stop\",\n\t\t\t\t\"learn\",\n\t\t\t\t\"train\",\n\t\t\t\t\"models\",\n\t\t\t\t\"use \",\n\t\t\t\t\"policy \",\n\t\t\t\t\"decisions\",\n\t\t\t\t\"seed\",\n\t\t\t\t\"export\",\n\t\t\t]\n\t\t\t\t.filter((item) => item.startsWith(prefix))\n\t\t\t\t.map((item) => ({ value: item, label: item.trim() })),\n\t\thandler: async (args, ctx) => {\n\t\t\trefreshSettings();\n\t\t\tconst [subcommand = \"status\", ...rest] = args.trim().split(/\\s+/).filter(Boolean);\n\t\t\tconst layaDir = resolve(ctx.cwd, \".laya\");\n\t\t\tswitch (subcommand) {\n\t\t\t\tcase \"policy\": {\n\t\t\t\t\tconst name = POLICY_PROFILES.find((value) => value === rest[0]);\n\t\t\t\t\tif (!name) {\n\t\t\t\t\t\tctx.ui.notify(`Usage: /laya policy ${POLICY_PROFILES.join(\"|\")} (current: ${profile()})`, \"warning\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tprofileOverride = name;\n\t\t\t\t\tctx.ui.notify(`Laya cost profile for this session: ${name}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"decisions\": {\n\t\t\t\t\tconst path = resolve(ctx.cwd, rest[0] ?? join(layaDir, \"decisions.json\"));\n\t\t\t\t\twriteJson(path, `${JSON.stringify(layaDecisionsFile(), null, 2)}\\n`);\n\t\t\t\t\tctx.ui.notify(`Wrote the Laya questions to ${path}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"seed\": {\n\t\t\t\t\tconst count = Number(rest[0] ?? 1100);\n\t\t\t\t\tif (!Number.isInteger(count) || count <= 0) {\n\t\t\t\t\t\tctx.ui.notify(\"Usage: /laya seed [count] [path]\", \"warning\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst path = resolve(ctx.cwd, rest[1] ?? join(layaDir, \"data\", \"relay-seed.jsonl\"));\n\t\t\t\t\tconst rows = generateSeed(count);\n\t\t\t\t\twriteJson(path, rows.map((row) => `${JSON.stringify(row)}\\n`).join(\"\"));\n\t\t\t\t\tctx.ui.notify(`Wrote ${rows.length} synthetic exercises to ${path}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"export\": {\n\t\t\t\t\tconst path = resolve(ctx.cwd, rest[0] ?? join(layaDir, \"data\", \"relay-telemetry.jsonl\"));\n\t\t\t\t\tconst rows = datasetFromTelemetry(store.read(Number.MAX_SAFE_INTEGER));\n\t\t\t\t\twriteJson(path, rows.map((row) => `${JSON.stringify(row)}\\n`).join(\"\"));\n\t\t\t\t\tctx.ui.notify(`Exported ${rows.length} evidence-labeled exercises to ${path}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"learn\": {\n\t\t\t\t\tconst file = rest.join(\" \");\n\t\t\t\t\tlet entries = ctx.sessionManager.getBranch();\n\t\t\t\t\tlet session = ctx.sessionManager.getSessionId();\n\t\t\t\t\tif (file) {\n\t\t\t\t\t\tconst path = resolve(ctx.cwd, file);\n\t\t\t\t\t\tif (!existsSync(path)) {\n\t\t\t\t\t\t\tctx.ui.notify(`No session file at ${path}`, \"warning\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst manager = SessionManager.open(path);\n\t\t\t\t\t\tentries = manager.getBranch();\n\t\t\t\t\t\tsession = manager.getSessionId();\n\t\t\t\t\t}\n\t\t\t\t\tconst tasks = sessionTasks(entries, tierOf);\n\t\t\t\t\tif (tasks.length === 0) {\n\t\t\t\t\t\tctx.ui.notify(\"The session has no requests to learn from yet.\", \"warning\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlearnTasks = { tasks, session };\n\t\t\t\t\tconst active = relay.getActiveTools();\n\t\t\t\t\tif (!active.includes(LEARN_TOOL_NAME)) relay.setActiveTools([...active, LEARN_TOOL_NAME]);\n\t\t\t\t\tconst prompt = buildLearnPrompt(tasks, { source: file ? resolve(ctx.cwd, file) : undefined });\n\t\t\t\t\tif (ctx.isIdle()) relay.sendUserMessage(prompt);\n\t\t\t\t\telse relay.sendUserMessage(prompt, { deliverAs: \"followUp\" });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"train\": {\n\t\t\t\t\tctx.ui.notify(await startTraining(ctx));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"models\": {\n\t\t\t\t\tconst active = trainer.activeModel().name;\n\t\t\t\t\tconst registry = readRegistry(trainer.workspace);\n\t\t\t\t\tconst mark = (name: string) => (name === active ? \" (routing)\" : \"\");\n\t\t\t\t\tconst lines = [`${LAYA_MODEL_MANIFEST.version}: shipped with Relay${mark(LAYA_MODEL_MANIFEST.version)}`];\n\t\t\t\t\tfor (const model of registry.models) {\n\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\t`${model.name}: ${model.createdAt.slice(0, 16).replace(\"T\", \" \")}, from ${model.basedOn}, ${model.sessionTasks} session tasks, test ${percent(model.test.candidate)} (${model.basedOn}: ${percent(model.test.current)}), session answers ${model.session.candidate.correct}/${model.session.candidate.n}${mark(model.name)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst counts = trainer.counts();\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\t`Exercises: ${\n\t\t\t\t\t\t\tObject.entries(counts)\n\t\t\t\t\t\t\t\t.map(([source, count]) => `${count} ${source}`)\n\t\t\t\t\t\t\t\t.join(\", \") || \"none yet\"\n\t\t\t\t\t\t} (${trainer.workspace.dataset})`,\n\t\t\t\t\t);\n\t\t\t\t\tif (trainer.running) {\n\t\t\t\t\t\tlines.push(`Training: ${trainer.progress ? describeProgress(trainer.progress) : \"starting\"}`);\n\t\t\t\t\t}\n\t\t\t\t\tctx.ui.notify(lines.join(\"\\n\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"use\": {\n\t\t\t\t\tconst name = rest[0];\n\t\t\t\t\tif (!name) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t`Usage: /laya use <model> (current: ${trainer.activeModel().name}; see /laya models)`,\n\t\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\ttrainer.use(name);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"warning\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tctx.ui.notify(`${trainer.activeModel().name} routes requests once the Laya container restarts with it`);\n\t\t\t\t\t// Replaces the server container with one serving the selected model.\n\t\t\t\t\tawait install(ctx, true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"setup\":\n\t\t\t\tcase \"start\": {\n\t\t\t\t\tawait install(ctx, true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"stop\": {\n\t\t\t\t\tawait server.stop();\n\t\t\t\t\tctx.ui.notify(\"Stopped the Laya container; /laya start or the next Relay start runs it again\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"status\": {\n\t\t\t\t\tconst providers = new Set(candidates(ctx).map((candidate) => candidate.provider));\n\t\t\t\t\tconst lines = [\n\t\t\t\t\t\t`Profile: ${profile()}${isSelected(ctx) ? \"\" : \" (select laya/auto to route with Laya)\"}`,\n\t\t\t\t\t\t`Laya container: ${server.describe()}; server ${(await server.isUp()) ? \"answering\" : \"not answering\"} at ${baseUrl()}`,\n\t\t\t\t\t\t`Laya server: ${lastClassifierError ? `unavailable, using keyword rules (${lastClassifierError})` : \"ok or not yet asked\"}`,\n\t\t\t\t\t\t`Models with credentials: ${\n\t\t\t\t\t\t\tcandidates(ctx)\n\t\t\t\t\t\t\t\t.map((candidate) => `${candidate.tier}:${candidate.ref}`)\n\t\t\t\t\t\t\t\t.join(\", \") || \"none\"\n\t\t\t\t\t\t}`,\n\t\t\t\t\t\t`Quota: ${\n\t\t\t\t\t\t\tObject.entries(quota.snapshot(providers))\n\t\t\t\t\t\t\t\t.map(([name, value]) => `${name} ${value}`)\n\t\t\t\t\t\t\t\t.join(\", \") || \"none\"\n\t\t\t\t\t\t}`,\n\t\t\t\t\t\t`Routing model: ${trainer.activeModel().name}${\n\t\t\t\t\t\t\ttrainer.running\n\t\t\t\t\t\t\t\t? `; training ${trainer.progress ? describeProgress(trainer.progress) : \"starting\"}`\n\t\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t\t}`,\n\t\t\t\t\t\t`Memory: ${settings.memory === false ? \"off\" : `${memory()?.size ?? 0} learned tasks route similar requests and share their lessons`}`,\n\t\t\t\t\t\t`Telemetry: ${settings.telemetry === false ? \"off\" : store.path}`,\n\t\t\t\t\t];\n\t\t\t\t\tif (current) {\n\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\t`Last plan: ${current.assessment.task.type} (${current.assessment.source}, confidence ${current.assessment.confidence.toFixed(2)}), recommended ${current.policy.recommendedTier}/${current.assessment.recommendation.effort}, routed ${current.tier} ${current.model} • ${current.thinkingLevel}`,\n\t\t\t\t\t\t\t`Alternatives: ${current.alternatives.join(\", \") || \"none\"}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (current.escalations.length > 0) {\n\t\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\t\t`Escalations: ${current.escalations.map((e) => `${e.reason} ${e.from}→${e.to}`).join(\", \")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tctx.ui.notify(lines.join(\"\\n\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\"Usage: /laya [status|setup|start|stop|learn [session file]|train|models|use <model>|policy <profile>|decisions [path]|seed [count] [path]|export [path]]\",\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { type Static, type TSchema, Type } from "typebox";
|
|
2
|
+
import type { SessionEntry } from "../../core/session-manager.ts";
|
|
3
|
+
import { type CapabilityTier } from "./questions.ts";
|
|
4
|
+
import { type TrainingRow } from "./training.ts";
|
|
5
|
+
/**
|
|
6
|
+
* `/laya learn`: turns the tasks of a session into training exercises. Relay extracts each request
|
|
7
|
+
* with the evidence of how it went (tools, files, commands, failures, checks, the model that ran
|
|
8
|
+
* it, the user's next message); the agent answers Laya's questions for each one from that evidence
|
|
9
|
+
* and saves them with the `laya_learn` tool.
|
|
10
|
+
*/
|
|
11
|
+
export declare const LEARN_TOOL_NAME = "laya_learn";
|
|
12
|
+
/** Starts the agent's turn of `/laya learn`. It is harness text, never a task itself. */
|
|
13
|
+
export declare const LEARN_MESSAGE_PREFIX = "[laya:learn]";
|
|
14
|
+
export interface SessionTask {
|
|
15
|
+
/** 1-based number the agent refers to. */
|
|
16
|
+
number: number;
|
|
17
|
+
request: string;
|
|
18
|
+
/** Tool name to number of calls. */
|
|
19
|
+
tools: Record<string, number>;
|
|
20
|
+
files: string[];
|
|
21
|
+
commands: string[];
|
|
22
|
+
toolFailures: number;
|
|
23
|
+
/** First line of the first failed tool results. */
|
|
24
|
+
errors: string[];
|
|
25
|
+
/** Outcome of the last test, type check, build or lint run, or null when none ran. */
|
|
26
|
+
testsPassed: boolean | null;
|
|
27
|
+
outcome: "completed" | "error" | "aborted";
|
|
28
|
+
/** `provider/model • thinking`, with the capability tier when the Laya registry lists the model. */
|
|
29
|
+
models: string[];
|
|
30
|
+
/** The laya/auto plan, when it routed the task. */
|
|
31
|
+
planned?: {
|
|
32
|
+
type: string;
|
|
33
|
+
tier: string;
|
|
34
|
+
effort: string;
|
|
35
|
+
source: string;
|
|
36
|
+
};
|
|
37
|
+
/** The end of the agent's last reply. */
|
|
38
|
+
reply: string;
|
|
39
|
+
/** The user's next request: a correction there means the task was not done right. */
|
|
40
|
+
next?: string;
|
|
41
|
+
}
|
|
42
|
+
/** Requests of a session branch and the evidence of how each one went. */
|
|
43
|
+
export declare function sessionTasks(entries: readonly SessionEntry[], tierOf?: (ref: string) => CapabilityTier | undefined): SessionTask[];
|
|
44
|
+
export declare function renderTask(task: SessionTask): string;
|
|
45
|
+
/** Laya's questions with their answer options, for the agent that labels. */
|
|
46
|
+
export declare function renderQuestions(): string;
|
|
47
|
+
export declare function buildLearnPrompt(tasks: readonly SessionTask[], options?: {
|
|
48
|
+
source?: string;
|
|
49
|
+
}): string;
|
|
50
|
+
export declare const learnToolSchema: Type.TObject<{
|
|
51
|
+
exercises: Type.TArray<Type.TObject<{
|
|
52
|
+
task: Type.TInteger;
|
|
53
|
+
labels: TSchema;
|
|
54
|
+
note: Type.TOptional<Type.TString>;
|
|
55
|
+
lesson: Type.TOptional<Type.TString>;
|
|
56
|
+
}>>;
|
|
57
|
+
train: Type.TOptional<Type.TBoolean>;
|
|
58
|
+
}>;
|
|
59
|
+
export type LearnToolParams = Static<typeof learnToolSchema>;
|
|
60
|
+
/** Checks that every question has a valid answer; the schema already does, this guards raw calls. */
|
|
61
|
+
export declare function labelProblems(labels: Record<string, unknown>): string[];
|
|
62
|
+
/** Training rows for the labeled tasks. Unknown task numbers and invalid labels are errors. */
|
|
63
|
+
export declare function exercisesToRows(tasks: readonly SessionTask[], exercises: LearnToolParams["exercises"], meta: {
|
|
64
|
+
session: string;
|
|
65
|
+
created: string;
|
|
66
|
+
}): Array<Omit<TrainingRow, "id">>;
|
|
67
|
+
//# sourceMappingURL=learn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learn.d.ts","sourceRoot":"","sources":["../../../src/extensions/laya/learn.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,gBAAgB,CAAC;AAGrE,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjE;;;;;GAKG;AAEH,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,yFAAyF;AACzF,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAOnD,MAAM,WAAW,WAAW;IAC3B,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sFAAsF;IACtF,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;IAC3C,oGAAoG;IACpG,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAmBD,0EAA0E;AAC1E,wBAAgB,YAAY,CAC3B,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,MAAM,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,cAAc,GAAG,SAA2B,GACnE,WAAW,EAAE,CA2Ef;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAwBpD;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,IAAI,MAAM,CAcxC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAyBzG;AAuBD,eAAO,MAAM,eAAe;;;;;;;;EAmB1B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAE7D,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAavE;AAED,+FAA+F;AAC/F,wBAAgB,eAAe,CAC9B,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,SAAS,EAAE,eAAe,CAAC,WAAW,CAAC,EACvC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAkChC"}
|