@goondocks/myco 0.12.10 → 0.14.0
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/README.md +6 -0
- package/dist/{agent-run-GUHXRNZB.js → agent-run-3WLMSLMJ.js} +8 -7
- package/dist/{agent-run-GUHXRNZB.js.map → agent-run-3WLMSLMJ.js.map} +1 -1
- package/dist/{agent-tasks-GWZI5WSB.js → agent-tasks-BQE2GEVS.js} +8 -7
- package/dist/{agent-tasks-GWZI5WSB.js.map → agent-tasks-BQE2GEVS.js.map} +1 -1
- package/dist/{chunk-PW5QVY44.js → chunk-4VF6KQ2Z.js} +371 -6
- package/dist/chunk-4VF6KQ2Z.js.map +1 -0
- package/dist/{chunk-QL2RBFIC.js → chunk-5YQ6VOFZ.js} +2 -2
- package/dist/{chunk-MCARJFBA.js → chunk-745SWTQX.js} +4 -4
- package/dist/{chunk-D4M2AV65.js → chunk-DTE3SHYK.js} +46 -3
- package/dist/chunk-DTE3SHYK.js.map +1 -0
- package/dist/{chunk-HLGPGHT7.js → chunk-EVPG26CR.js} +3 -3
- package/dist/{chunk-YRUJ5KGV.js → chunk-GDCSPMH4.js} +3 -3
- package/dist/{chunk-LUQBT2Y4.js → chunk-HHZ3RTEI.js} +2 -2
- package/dist/{chunk-TCGOSLW6.js → chunk-JJXVDCEX.js} +613 -98
- package/dist/chunk-JJXVDCEX.js.map +1 -0
- package/dist/{chunk-D4ESHOOJ.js → chunk-KNTJOMWY.js} +3 -3
- package/dist/{chunk-JHLALJPB.js → chunk-LD6U3L6O.js} +8 -8
- package/dist/{chunk-7NBDELZB.js → chunk-NVCGF2DS.js} +26 -8
- package/dist/{chunk-7NBDELZB.js.map → chunk-NVCGF2DS.js.map} +1 -1
- package/dist/{chunk-SW62AX75.js → chunk-OKCSSDFC.js} +2 -2
- package/dist/{chunk-RR75ZKEV.js → chunk-OQVKLTQY.js} +4 -4
- package/dist/{chunk-OAGY5APE.js → chunk-PSYLKCWQ.js} +83 -7
- package/dist/chunk-PSYLKCWQ.js.map +1 -0
- package/dist/{chunk-Q2AYS2QE.js → chunk-PX5KIOKY.js} +5 -7
- package/dist/chunk-PX5KIOKY.js.map +1 -0
- package/dist/chunk-QLCD77AN.js +93 -0
- package/dist/chunk-QLCD77AN.js.map +1 -0
- package/dist/{chunk-J3L2RTYK.js → chunk-RBFECYNA.js} +2 -2
- package/dist/{chunk-4VSNNMEU.js → chunk-S66YG6QK.js} +26 -3
- package/dist/{chunk-4VSNNMEU.js.map → chunk-S66YG6QK.js.map} +1 -1
- package/dist/chunk-SBVDG5JP.js +112 -0
- package/dist/chunk-SBVDG5JP.js.map +1 -0
- package/dist/{chunk-M5XWW7UI.js → chunk-SODRR3HE.js} +8 -1
- package/dist/chunk-SODRR3HE.js.map +1 -0
- package/dist/{chunk-SFC4GXEN.js → chunk-TNCBMGWB.js} +39 -104
- package/dist/chunk-TNCBMGWB.js.map +1 -0
- package/dist/{chunk-PIRWYDOH.js → chunk-TRA3R4EC.js} +7 -1
- package/dist/chunk-TRA3R4EC.js.map +1 -0
- package/dist/{chunk-LGPBVBFY.js → chunk-TVV6PZOC.js} +5 -7
- package/dist/chunk-TVV6PZOC.js.map +1 -0
- package/dist/{chunk-SVQAPEYH.js → chunk-UWXJCLCK.js} +22 -5
- package/dist/chunk-UWXJCLCK.js.map +1 -0
- package/dist/{chunk-JROOQQH6.js → chunk-X34OFKYU.js} +12 -7
- package/dist/chunk-X34OFKYU.js.map +1 -0
- package/dist/{chunk-FYGFMIS6.js → chunk-ZKXW46HZ.js} +2 -2
- package/dist/{cli-CFOIDXOY.js → cli-SKCINMJI.js} +41 -40
- package/dist/{cli-CFOIDXOY.js.map → cli-SKCINMJI.js.map} +1 -1
- package/dist/{client-ZBCGODTS.js → client-KZGZHHXT.js} +5 -5
- package/dist/{config-6RQ7FAEV.js → config-H657SF6B.js} +5 -3
- package/dist/{config-6RQ7FAEV.js.map → config-H657SF6B.js.map} +1 -1
- package/dist/{detect-providers-JFE3QLJI.js → detect-providers-PAVE2X6O.js} +4 -4
- package/dist/{doctor-W3I7RVU4.js → doctor-6FKSHJRU.js} +13 -11
- package/dist/{doctor-W3I7RVU4.js.map → doctor-6FKSHJRU.js.map} +1 -1
- package/dist/{executor-LKDWMGC7.js → executor-W5MKZH7B.js} +407 -46
- package/dist/executor-W5MKZH7B.js.map +1 -0
- package/dist/{init-M3HYJGHE.js → init-5QHCXBLF.js} +16 -15
- package/dist/{init-M3HYJGHE.js.map → init-5QHCXBLF.js.map} +1 -1
- package/dist/{init-wizard-C4WQA47U.js → init-wizard-HEY4HMG3.js} +12 -12
- package/dist/installer-25TSX4SR.js +13 -0
- package/dist/{llm-O46QYWEM.js → llm-T3QVHC3Y.js} +7 -7
- package/dist/{loader-4FMGOVWF.js → loader-JQLO6K44.js} +4 -2
- package/dist/{loader-BQ4X4K3F.js → loader-WQKVWL5D.js} +4 -4
- package/dist/{main-CMWNMCW2.js → main-IZ277SHB.js} +689 -124
- package/dist/main-IZ277SHB.js.map +1 -0
- package/dist/{open-4N7T37XV.js → open-S7YUWON4.js} +8 -7
- package/dist/{open-4N7T37XV.js.map → open-S7YUWON4.js.map} +1 -1
- package/dist/{openai-embeddings-HWAKOGUM.js → openai-embeddings-5T5ZP7LO.js} +4 -4
- package/dist/{openrouter-GXZK7JXR.js → openrouter-RD2COFC7.js} +4 -4
- package/dist/{post-compact-BPICHUPV.js → post-compact-EFKFT7TM.js} +7 -7
- package/dist/{post-tool-use-OHJ2EH7I.js → post-tool-use-624YC6ZH.js} +7 -7
- package/dist/{post-tool-use-failure-CBPY2TSN.js → post-tool-use-failure-QCHZAWQH.js} +7 -7
- package/dist/{pre-compact-ULAA4XIB.js → pre-compact-7DWH2EM3.js} +7 -7
- package/dist/{provider-check-CKZW3GQX.js → provider-check-QN7OGXZA.js} +4 -4
- package/dist/{registry-ZHUVXGPO.js → registry-2XQMCPA6.js} +5 -5
- package/dist/{remove-52PTVOCJ.js → remove-ESVIET5C.js} +10 -8
- package/dist/{remove-52PTVOCJ.js.map → remove-ESVIET5C.js.map} +1 -1
- package/dist/{resolution-events-WZHPQQMN.js → resolution-events-5EVUEWHS.js} +4 -4
- package/dist/{restart-O37BUPLH.js → restart-AZHV6OKM.js} +9 -8
- package/dist/{restart-O37BUPLH.js.map → restart-AZHV6OKM.js.map} +1 -1
- package/dist/{search-52YK2ZWU.js → search-JS4HXYGS.js} +9 -8
- package/dist/{search-52YK2ZWU.js.map → search-JS4HXYGS.js.map} +1 -1
- package/dist/{server-7OKRAJCM.js → server-KT5GW333.js} +115 -14
- package/dist/server-KT5GW333.js.map +1 -0
- package/dist/{session-57IAZYRK.js → session-JSI67FEM.js} +10 -9
- package/dist/{session-57IAZYRK.js.map → session-JSI67FEM.js.map} +1 -1
- package/dist/{session-end-WRKDJEWM.js → session-end-4CM462MC.js} +6 -6
- package/dist/{session-start-7VWGEVOX.js → session-start-ZGF7F6DE.js} +12 -12
- package/dist/{setup-llm-IDQPX22O.js → setup-llm-S2UYJYIS.js} +10 -9
- package/dist/{setup-llm-IDQPX22O.js.map → setup-llm-S2UYJYIS.js.map} +1 -1
- package/dist/src/agent/definitions/agent.yaml +2 -0
- package/dist/src/agent/definitions/tasks/digest-only.yaml +1 -0
- package/dist/src/agent/definitions/tasks/extract-only.yaml +1 -0
- package/dist/src/agent/definitions/tasks/full-intelligence.yaml +8 -0
- package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +1 -0
- package/dist/src/agent/definitions/tasks/review-session.yaml +1 -0
- package/dist/src/agent/definitions/tasks/skill-evolve.yaml +155 -0
- package/dist/src/agent/definitions/tasks/skill-generate.yaml +210 -0
- package/dist/src/agent/definitions/tasks/skill-survey.yaml +149 -0
- package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +1 -0
- package/dist/src/agent/definitions/tasks/title-summary.yaml +1 -0
- package/dist/src/agent/prompts/agent.md +29 -0
- package/dist/src/cli.js +1 -1
- package/dist/src/daemon/main.js +1 -1
- package/dist/src/hooks/post-tool-use.js +1 -1
- package/dist/src/hooks/session-end.js +1 -1
- package/dist/src/hooks/session-start.js +1 -1
- package/dist/src/hooks/stop.js +1 -1
- package/dist/src/hooks/user-prompt-submit.js +1 -1
- package/dist/src/mcp/server.js +1 -1
- package/dist/src/worker/src/index.ts +3 -0
- package/dist/src/worker/src/schema.ts +56 -0
- package/dist/{stats-D7U5HQ3L.js → stats-D2FM6ZXO.js} +10 -9
- package/dist/{stats-D7U5HQ3L.js.map → stats-D2FM6ZXO.js.map} +1 -1
- package/dist/{stop-VJU4AAOQ.js → stop-DQEKVNST.js} +6 -6
- package/dist/{stop-failure-ILPHO26U.js → stop-failure-EHH7AN5E.js} +7 -7
- package/dist/{subagent-start-77MY4UMP.js → subagent-start-6R52PAFA.js} +7 -7
- package/dist/{subagent-stop-DABERMXZ.js → subagent-stop-CLDFJKYQ.js} +7 -7
- package/dist/{task-completed-TBWBOAJ6.js → task-completed-V47JA3OV.js} +7 -7
- package/dist/{team-K6H4B3ZD.js → team-SJPDXELY.js} +45 -19
- package/dist/team-SJPDXELY.js.map +1 -0
- package/dist/turns-3ZQAF6HF.js +16 -0
- package/dist/turns-3ZQAF6HF.js.map +1 -0
- package/dist/ui/assets/index-BmsHIwjl.css +1 -0
- package/dist/ui/assets/index-Cn6cQwJy.js +842 -0
- package/dist/ui/index.html +2 -2
- package/dist/{update-GW774ZMW.js → update-ZNIYDQHJ.js} +8 -7
- package/dist/{update-GW774ZMW.js.map → update-ZNIYDQHJ.js.map} +1 -1
- package/dist/{user-prompt-submit-C47Y5Y5I.js → user-prompt-submit-6TX6VECI.js} +6 -6
- package/dist/{verify-MQAANTUR.js → verify-JHIMXTY5.js} +8 -8
- package/dist/{version-42DQW43N.js → version-UMEN7OJU.js} +2 -2
- package/dist/version-UMEN7OJU.js.map +1 -0
- package/package.json +6 -6
- package/dist/chunk-D4M2AV65.js.map +0 -1
- package/dist/chunk-JROOQQH6.js.map +0 -1
- package/dist/chunk-LGPBVBFY.js.map +0 -1
- package/dist/chunk-M5XWW7UI.js.map +0 -1
- package/dist/chunk-OAGY5APE.js.map +0 -1
- package/dist/chunk-PIRWYDOH.js.map +0 -1
- package/dist/chunk-PW5QVY44.js.map +0 -1
- package/dist/chunk-Q2AYS2QE.js.map +0 -1
- package/dist/chunk-SFC4GXEN.js.map +0 -1
- package/dist/chunk-SVQAPEYH.js.map +0 -1
- package/dist/chunk-TCGOSLW6.js.map +0 -1
- package/dist/executor-LKDWMGC7.js.map +0 -1
- package/dist/main-CMWNMCW2.js.map +0 -1
- package/dist/server-7OKRAJCM.js.map +0 -1
- package/dist/team-K6H4B3ZD.js.map +0 -1
- package/dist/ui/assets/index-BGbil7f1.css +0 -1
- package/dist/ui/assets/index-ZSGlKT25.js +0 -804
- /package/dist/{chunk-QL2RBFIC.js.map → chunk-5YQ6VOFZ.js.map} +0 -0
- /package/dist/{chunk-MCARJFBA.js.map → chunk-745SWTQX.js.map} +0 -0
- /package/dist/{chunk-HLGPGHT7.js.map → chunk-EVPG26CR.js.map} +0 -0
- /package/dist/{chunk-YRUJ5KGV.js.map → chunk-GDCSPMH4.js.map} +0 -0
- /package/dist/{chunk-LUQBT2Y4.js.map → chunk-HHZ3RTEI.js.map} +0 -0
- /package/dist/{chunk-D4ESHOOJ.js.map → chunk-KNTJOMWY.js.map} +0 -0
- /package/dist/{chunk-JHLALJPB.js.map → chunk-LD6U3L6O.js.map} +0 -0
- /package/dist/{chunk-SW62AX75.js.map → chunk-OKCSSDFC.js.map} +0 -0
- /package/dist/{chunk-RR75ZKEV.js.map → chunk-OQVKLTQY.js.map} +0 -0
- /package/dist/{chunk-J3L2RTYK.js.map → chunk-RBFECYNA.js.map} +0 -0
- /package/dist/{chunk-FYGFMIS6.js.map → chunk-ZKXW46HZ.js.map} +0 -0
- /package/dist/{client-ZBCGODTS.js.map → client-KZGZHHXT.js.map} +0 -0
- /package/dist/{detect-providers-JFE3QLJI.js.map → detect-providers-PAVE2X6O.js.map} +0 -0
- /package/dist/{init-wizard-C4WQA47U.js.map → init-wizard-HEY4HMG3.js.map} +0 -0
- /package/dist/{llm-O46QYWEM.js.map → installer-25TSX4SR.js.map} +0 -0
- /package/dist/{loader-4FMGOVWF.js.map → llm-T3QVHC3Y.js.map} +0 -0
- /package/dist/{loader-BQ4X4K3F.js.map → loader-JQLO6K44.js.map} +0 -0
- /package/dist/{openai-embeddings-HWAKOGUM.js.map → loader-WQKVWL5D.js.map} +0 -0
- /package/dist/{openrouter-GXZK7JXR.js.map → openai-embeddings-5T5ZP7LO.js.map} +0 -0
- /package/dist/{provider-check-CKZW3GQX.js.map → openrouter-RD2COFC7.js.map} +0 -0
- /package/dist/{post-compact-BPICHUPV.js.map → post-compact-EFKFT7TM.js.map} +0 -0
- /package/dist/{post-tool-use-OHJ2EH7I.js.map → post-tool-use-624YC6ZH.js.map} +0 -0
- /package/dist/{post-tool-use-failure-CBPY2TSN.js.map → post-tool-use-failure-QCHZAWQH.js.map} +0 -0
- /package/dist/{pre-compact-ULAA4XIB.js.map → pre-compact-7DWH2EM3.js.map} +0 -0
- /package/dist/{registry-ZHUVXGPO.js.map → provider-check-QN7OGXZA.js.map} +0 -0
- /package/dist/{resolution-events-WZHPQQMN.js.map → registry-2XQMCPA6.js.map} +0 -0
- /package/dist/{version-42DQW43N.js.map → resolution-events-5EVUEWHS.js.map} +0 -0
- /package/dist/{session-end-WRKDJEWM.js.map → session-end-4CM462MC.js.map} +0 -0
- /package/dist/{session-start-7VWGEVOX.js.map → session-start-ZGF7F6DE.js.map} +0 -0
- /package/dist/{stop-VJU4AAOQ.js.map → stop-DQEKVNST.js.map} +0 -0
- /package/dist/{stop-failure-ILPHO26U.js.map → stop-failure-EHH7AN5E.js.map} +0 -0
- /package/dist/{subagent-start-77MY4UMP.js.map → subagent-start-6R52PAFA.js.map} +0 -0
- /package/dist/{subagent-stop-DABERMXZ.js.map → subagent-stop-CLDFJKYQ.js.map} +0 -0
- /package/dist/{task-completed-TBWBOAJ6.js.map → task-completed-V47JA3OV.js.map} +0 -0
- /package/dist/{user-prompt-submit-C47Y5Y5I.js.map → user-prompt-submit-6TX6VECI.js.map} +0 -0
- /package/dist/{verify-MQAANTUR.js.map → verify-JHIMXTY5.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent/loader.ts","../src/db/queries/agents.ts","../src/db/queries/tasks.ts","../src/agent/schemas.ts"],"sourcesContent":["/**\n * Agent definition and task YAML loader.\n *\n * Reads agent.yaml and tasks/*.yaml from the definitions directory,\n * validates their shape, and provides helpers for merging built-in\n * definitions with database overrides into an EffectiveConfig.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { findPackageRoot } from '@myco/utils/find-package-root.js';\nimport { parse as parseYaml } from 'yaml';\nimport { epochSeconds, DEFAULT_AGENT_ID, BUILT_IN_SOURCE, USER_TASK_SOURCE } from '@myco/constants.js';\nimport { getDatabase } from '@myco/db/client.js';\nimport { registerAgent } from '@myco/db/queries/agents.js';\nimport { upsertTask } from '@myco/db/queries/tasks.js';\nimport type { AgentRow } from '@myco/db/queries/agents.js';\nimport type { AgentDefinition, AgentTask, EffectiveConfig } from './types.js';\nimport { AgentDefinitionSchema, AgentTaskSchema } from './schemas.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Filename for the built-in agent definition. */\nconst AGENT_DEFINITION_FILE = 'agent.yaml';\n\n/** Subdirectory containing task YAML files. */\nconst TASKS_SUBDIRECTORY = 'tasks';\n\n// Package root resolution uses shared findPackageRoot from @myco/utils\n\n// BUILT_IN_SOURCE imported from @myco/constants.js\n\n// ---------------------------------------------------------------------------\n// Definitions directory resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the definitions directory at runtime.\n *\n * Strategy (same pattern as `src/prompts/index.ts`):\n * 1. Walk up from `import.meta.url` looking for `package.json`.\n * 2. From package root, try `dist/src/agent/definitions/` (tsup output).\n * 3. Fall back to `src/agent/definitions/` (dev mode / tsc output).\n * 4. Also check if the current file's directory already contains agent.yaml.\n */\nexport function resolveDefinitionsDir(): string {\n const scriptDir = path.dirname(fileURLToPath(import.meta.url));\n\n // Check if we're already adjacent to the definitions (tsc output or dev mode)\n const adjacentDefs = path.join(scriptDir, 'definitions');\n if (fs.existsSync(path.join(adjacentDefs, AGENT_DEFINITION_FILE))) {\n return adjacentDefs;\n }\n\n // Walk up to package root using shared utility\n const root = findPackageRoot(scriptDir);\n if (root) {\n // Try dist path first (tsup bundled output)\n const distPath = path.join(root, 'dist', 'src', 'agent', 'definitions');\n if (fs.existsSync(path.join(distPath, AGENT_DEFINITION_FILE))) {\n return distPath;\n }\n // Fall back to src path (dev mode)\n const srcPath = path.join(root, 'src', 'agent', 'definitions');\n if (fs.existsSync(path.join(srcPath, AGENT_DEFINITION_FILE))) {\n return srcPath;\n }\n }\n\n // Final fallback: adjacent to current file\n return adjacentDefs;\n}\n\n// ---------------------------------------------------------------------------\n// YAML loaders\n// ---------------------------------------------------------------------------\n\n/**\n * Load and parse the built-in agent definition from `agent.yaml`.\n *\n * @param definitionsDir — path to the definitions directory.\n * @returns the parsed AgentDefinition.\n * @throws if the file is missing or malformed.\n */\nexport function loadAgentDefinition(definitionsDir: string): AgentDefinition {\n const filePath = path.join(definitionsDir, AGENT_DEFINITION_FILE);\n const raw = fs.readFileSync(filePath, 'utf-8');\n const parsed = AgentDefinitionSchema.parse(parseYaml(raw));\n\n return {\n name: parsed.name,\n displayName: parsed.displayName,\n description: parsed.description.trim(),\n model: parsed.model,\n maxTurns: parsed.maxTurns,\n timeoutSeconds: parsed.timeoutSeconds,\n systemPromptPath: parsed.systemPromptPath,\n tools: parsed.tools,\n };\n}\n\n/**\n * Load and parse all task YAML files from `tasks/`.\n *\n * @param definitionsDir — path to the definitions directory.\n * @returns array of parsed AgentTask objects.\n */\nexport function loadAgentTasks(definitionsDir: string): AgentTask[] {\n const tasksDir = path.join(definitionsDir, TASKS_SUBDIRECTORY);\n if (!fs.existsSync(tasksDir)) return [];\n\n const files = fs.readdirSync(tasksDir).filter((f) => f.endsWith('.yaml'));\n return files.map((file) => {\n const raw = fs.readFileSync(path.join(tasksDir, file), 'utf-8');\n const parsed = AgentTaskSchema.parse(parseYaml(raw));\n\n return taskFromParsed(parsed);\n });\n}\n\n/**\n * Convert a Zod-parsed task schema result to an AgentTask object.\n *\n * Shared by loadAgentTasks (built-in) and registry (user tasks) to ensure\n * all optional fields are consistently spread. Adding a new optional field\n * to AgentTaskSchema only requires updating this one function.\n */\nexport function taskFromParsed(parsed: AgentTask): AgentTask {\n return {\n name: parsed.name,\n displayName: parsed.displayName,\n description: parsed.description.trim(),\n agent: parsed.agent,\n prompt: parsed.prompt.trim(),\n isDefault: parsed.isDefault,\n ...(parsed.toolOverrides ? { toolOverrides: parsed.toolOverrides } : {}),\n ...(parsed.model ? { model: parsed.model } : {}),\n ...(parsed.maxTurns ? { maxTurns: parsed.maxTurns } : {}),\n ...(parsed.timeoutSeconds ? { timeoutSeconds: parsed.timeoutSeconds } : {}),\n ...(parsed.phases ? { phases: parsed.phases } : {}),\n ...(parsed.orchestrator ? { orchestrator: parsed.orchestrator } : {}),\n ...(parsed.contextQueries ? { contextQueries: parsed.contextQueries } : {}),\n ...(parsed.execution ? { execution: parsed.execution } : {}),\n ...(parsed.schemaVersion ? { schemaVersion: parsed.schemaVersion } : {}),\n };\n}\n\n/**\n * Load a system prompt markdown file.\n *\n * @param definitionsDir — path to the definitions directory.\n * @param relativePath — path relative to definitionsDir (from AgentDefinition.systemPromptPath).\n * @returns the prompt file content as a string.\n */\nexport function loadSystemPrompt(definitionsDir: string, relativePath: string): string {\n const filePath = path.resolve(definitionsDir, relativePath);\n return fs.readFileSync(filePath, 'utf-8').trim();\n}\n\n// ---------------------------------------------------------------------------\n// Config resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Merge a built-in AgentDefinition with optional database overrides and\n * task-specific configuration to produce the effective runtime config.\n *\n * Priority (highest wins):\n * 1. Task toolOverrides (replaces tool list entirely if present)\n * 2. AgentRow database overrides (model, maxTurns, timeoutSeconds, tool_access)\n * 3. Built-in AgentDefinition defaults\n *\n * @param definition — the built-in agent definition from YAML.\n * @param agentOverrides — optional database row with user-applied overrides.\n * @param taskOverrides — optional task definition (determines prompt and may override tools).\n * @returns the merged EffectiveConfig.\n */\nexport function resolveEffectiveConfig(\n definition: AgentDefinition,\n agentOverrides?: AgentRow | null,\n taskOverrides?: AgentTask,\n): EffectiveConfig {\n // Start with definition defaults\n let model = definition.model;\n let maxTurns = definition.maxTurns;\n let timeoutSeconds = definition.timeoutSeconds;\n let tools = [...definition.tools];\n const agentId = agentOverrides?.id ?? DEFAULT_AGENT_ID;\n\n // Apply agent DB overrides\n if (agentOverrides) {\n if (agentOverrides.model) model = agentOverrides.model;\n if (agentOverrides.max_turns !== null) maxTurns = agentOverrides.max_turns;\n if (agentOverrides.timeout_seconds !== null) timeoutSeconds = agentOverrides.timeout_seconds;\n if (agentOverrides.tool_access) {\n try {\n const parsed = JSON.parse(agentOverrides.tool_access);\n if (Array.isArray(parsed)) tools = parsed as string[];\n } catch {\n // Invalid JSON in tool_access — keep definition defaults\n }\n }\n }\n\n // Apply task overrides (model, turns, timeout, tool list)\n if (taskOverrides?.model) model = taskOverrides.model;\n if (taskOverrides?.maxTurns) maxTurns = taskOverrides.maxTurns;\n if (taskOverrides?.timeoutSeconds) timeoutSeconds = taskOverrides.timeoutSeconds;\n if (taskOverrides?.toolOverrides) {\n tools = [...taskOverrides.toolOverrides];\n }\n\n // Apply execution config overrides (highest priority)\n // Precedence: execution.model > task.model > agent.model\n if (taskOverrides?.execution) {\n if (taskOverrides.execution.model) model = taskOverrides.execution.model;\n if (taskOverrides.execution.maxTurns) maxTurns = taskOverrides.execution.maxTurns;\n if (taskOverrides.execution.timeoutSeconds) timeoutSeconds = taskOverrides.execution.timeoutSeconds;\n }\n\n // Task prompt and display info (fall back to a generic prompt)\n const taskName = taskOverrides?.name ?? 'full-intelligence';\n const taskDisplayName = taskOverrides?.displayName ?? 'Full Intelligence';\n const taskPrompt = taskOverrides?.prompt ?? '';\n\n return {\n agentId,\n model,\n maxTurns,\n timeoutSeconds,\n systemPromptPath: definition.systemPromptPath,\n tools,\n taskName,\n taskDisplayName,\n taskPrompt,\n ...(taskOverrides?.phases ? { phases: taskOverrides.phases } : {}),\n ...(taskOverrides?.orchestrator ? { orchestrator: taskOverrides.orchestrator } : {}),\n ...(taskOverrides?.contextQueries ? { contextQueries: taskOverrides.contextQueries } : {}),\n ...(taskOverrides?.execution ? { execution: taskOverrides.execution } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Database registration\n// ---------------------------------------------------------------------------\n\n/**\n * Register the built-in agent and all built-in tasks into the database.\n *\n * Idempotent: uses upsert (ON CONFLICT DO UPDATE) for both agent and tasks.\n * Safe to call on every daemon startup.\n *\n * @param definitionsDir — path to the definitions directory.\n */\nexport async function registerBuiltInAgentsAndTasks(definitionsDir: string, vaultDir?: string): Promise<void> {\n const definition = loadAgentDefinition(definitionsDir);\n const tasks = loadAgentTasks(definitionsDir);\n const now = epochSeconds();\n\n // Upsert the built-in agent\n registerAgent({\n id: definition.name,\n name: definition.displayName,\n model: definition.model,\n source: BUILT_IN_SOURCE,\n max_turns: definition.maxTurns,\n timeout_seconds: definition.timeoutSeconds,\n tool_access: JSON.stringify(definition.tools),\n created_at: now,\n updated_at: now,\n });\n\n // Upsert all built-in tasks\n for (const task of tasks) {\n upsertTask({\n id: task.name,\n agent_id: definition.name,\n source: BUILT_IN_SOURCE,\n display_name: task.displayName,\n description: task.description,\n prompt: task.prompt,\n is_default: task.isDefault ? 1 : 0,\n tool_overrides: task.toolOverrides ? JSON.stringify(task.toolOverrides) : null,\n config: JSON.stringify({\n phases: task.phases ?? null,\n execution: task.execution ?? null,\n contextQueries: task.contextQueries ?? null,\n schemaVersion: task.schemaVersion ?? 1,\n }),\n created_at: now,\n updated_at: now,\n });\n }\n\n // Remove built-in tasks that no longer have YAML definitions\n const validTaskIds = tasks.map(t => t.name);\n if (validTaskIds.length > 0) {\n const db = getDatabase();\n const placeholders = validTaskIds.map(() => '?').join(', ');\n db.prepare(\n `DELETE FROM agent_tasks\n WHERE source = ? AND agent_id = ? AND id NOT IN (${placeholders})`,\n ).run(BUILT_IN_SOURCE, definition.name, ...validTaskIds);\n }\n\n // Register user tasks from the vault (if vault dir provided)\n if (vaultDir) {\n const { loadAllTasks } = await import('./registry.js');\n const allTasks = loadAllTasks(definitionsDir, vaultDir);\n for (const [name, task] of allTasks) {\n if (task.source === USER_TASK_SOURCE) {\n upsertTask({\n id: name,\n agent_id: task.agent ?? definition.name,\n source: USER_TASK_SOURCE,\n display_name: task.displayName,\n description: task.description,\n prompt: task.prompt,\n is_default: task.isDefault ? 1 : 0,\n tool_overrides: task.toolOverrides ? JSON.stringify(task.toolOverrides) : null,\n config: JSON.stringify({\n phases: task.phases ?? null,\n execution: task.execution ?? null,\n contextQueries: task.contextQueries ?? null,\n schemaVersion: task.schemaVersion ?? 1,\n }),\n created_at: now,\n updated_at: now,\n });\n }\n }\n }\n}\n","/**\n * Agent CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when registering an agent. */\nexport interface AgentInsert {\n id: string;\n name: string;\n created_at: number;\n provider?: string | null;\n model?: string | null;\n system_prompt_hash?: string | null;\n config?: string | null;\n source?: string;\n system_prompt?: string | null;\n max_turns?: number | null;\n timeout_seconds?: number | null;\n tool_access?: string | null;\n enabled?: number;\n updated_at?: number | null;\n}\n\n/** Row shape returned from agent queries (all columns). */\nexport interface AgentRow {\n id: string;\n name: string;\n provider: string | null;\n model: string | null;\n system_prompt_hash: string | null;\n config: string | null;\n source: string;\n system_prompt: string | null;\n max_turns: number | null;\n timeout_seconds: number | null;\n tool_access: string | null;\n enabled: number;\n created_at: number;\n updated_at: number | null;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default agent source for new agents. */\nconst DEFAULT_SOURCE = 'built-in';\n\n/** Default enabled flag for new agents. */\nconst DEFAULT_ENABLED = 1;\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst AGENT_COLUMNS = [\n 'id',\n 'name',\n 'provider',\n 'model',\n 'system_prompt_hash',\n 'config',\n 'source',\n 'system_prompt',\n 'max_turns',\n 'timeout_seconds',\n 'tool_access',\n 'enabled',\n 'created_at',\n 'updated_at',\n] as const;\n\nconst SELECT_COLUMNS = AGENT_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed AgentRow. */\nfunction toAgentRow(row: Record<string, unknown>): AgentRow {\n return {\n id: row.id as string,\n name: row.name as string,\n provider: (row.provider as string) ?? null,\n model: (row.model as string) ?? null,\n system_prompt_hash: (row.system_prompt_hash as string) ?? null,\n config: (row.config as string) ?? null,\n source: (row.source as string) ?? DEFAULT_SOURCE,\n system_prompt: (row.system_prompt as string) ?? null,\n max_turns: (row.max_turns as number) ?? null,\n timeout_seconds: (row.timeout_seconds as number) ?? null,\n tool_access: (row.tool_access as string) ?? null,\n enabled: (row.enabled as number) ?? DEFAULT_ENABLED,\n created_at: row.created_at as number,\n updated_at: (row.updated_at as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Register an agent or update it if the id already exists.\n *\n * On conflict the row is updated with the values from `data`.\n * This is the idempotent upsert — calling twice with the same data\n * produces the same result.\n */\nexport function registerAgent(data: AgentInsert): AgentRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO agents (\n id, name, provider, model, system_prompt_hash, config,\n source, system_prompt, max_turns, timeout_seconds, tool_access,\n enabled, created_at, updated_at\n ) VALUES (\n ?, ?, ?, ?, ?, ?,\n ?, ?, ?, ?, ?,\n ?, ?, ?\n )\n ON CONFLICT (id) DO UPDATE SET\n name = EXCLUDED.name,\n provider = EXCLUDED.provider,\n model = EXCLUDED.model,\n system_prompt_hash = EXCLUDED.system_prompt_hash,\n config = EXCLUDED.config,\n source = EXCLUDED.source,\n system_prompt = EXCLUDED.system_prompt,\n max_turns = EXCLUDED.max_turns,\n timeout_seconds = EXCLUDED.timeout_seconds,\n tool_access = EXCLUDED.tool_access,\n enabled = EXCLUDED.enabled,\n updated_at = EXCLUDED.updated_at`,\n ).run(\n data.id,\n data.name,\n data.provider ?? null,\n data.model ?? null,\n data.system_prompt_hash ?? null,\n data.config ?? null,\n data.source ?? DEFAULT_SOURCE,\n data.system_prompt ?? null,\n data.max_turns ?? null,\n data.timeout_seconds ?? null,\n data.tool_access ?? null,\n data.enabled ?? DEFAULT_ENABLED,\n data.created_at,\n data.updated_at ?? null,\n );\n\n return toAgentRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM agents WHERE id = ?`).get(data.id) as Record<string, unknown>,\n );\n}\n\n/**\n * Retrieve a single agent by id.\n *\n * @returns the agent row, or null if not found.\n */\nexport function getAgent(id: string): AgentRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM agents WHERE id = ?`,\n ).get(id) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toAgentRow(row);\n}\n\n/**\n * List all agents, ordered by created_at ASC.\n */\nexport function listAgents(): AgentRow[] {\n const db = getDatabase();\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agents\n ORDER BY created_at ASC`,\n ).all() as Record<string, unknown>[];\n\n return rows.map(toAgentRow);\n}\n","/**\n * Agent task CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { BUILT_IN_SOURCE } from '@myco/constants.js';\nimport type { TaskConfig } from '@myco/agent/types.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default number of tasks returned by listTasks when no limit given. */\nconst DEFAULT_LIST_LIMIT = 100;\n\n/** Default task source for new tasks. */\nconst DEFAULT_SOURCE = BUILT_IN_SOURCE;\n\n/** Default is_default flag for new tasks. */\nconst DEFAULT_IS_DEFAULT = 0;\n\n/** Value indicating a task is the default for its agent. */\nconst IS_DEFAULT_TRUE = 1;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when upserting a task. */\nexport interface TaskInsert {\n id: string;\n agent_id: string;\n prompt: string;\n created_at: number;\n source?: string;\n display_name?: string | null;\n description?: string | null;\n is_default?: number;\n tool_overrides?: string | null;\n model?: string | null;\n config?: string | null;\n updated_at?: number | null;\n}\n\n/** Row shape returned from agent_tasks queries (all columns). */\nexport interface TaskRow {\n id: string;\n agent_id: string;\n source: string;\n display_name: string | null;\n description: string | null;\n prompt: string;\n is_default: number;\n tool_overrides: string | null;\n model: string | null;\n config: string | null;\n created_at: number;\n updated_at: number | null;\n}\n\n/** Filter options for `listTasks`. */\nexport interface ListTasksOptions {\n limit?: number;\n agent_id?: string;\n source?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst TASK_COLUMNS = [\n 'id',\n 'agent_id',\n 'source',\n 'display_name',\n 'description',\n 'prompt',\n 'is_default',\n 'tool_overrides',\n 'model',\n 'config',\n 'created_at',\n 'updated_at',\n] as const;\n\nconst SELECT_COLUMNS = TASK_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed TaskRow. */\nfunction toTaskRow(row: Record<string, unknown>): TaskRow {\n return {\n id: row.id as string,\n agent_id: row.agent_id as string,\n source: (row.source as string) ?? DEFAULT_SOURCE,\n display_name: (row.display_name as string) ?? null,\n description: (row.description as string) ?? null,\n prompt: row.prompt as string,\n is_default: (row.is_default as number) ?? DEFAULT_IS_DEFAULT,\n tool_overrides: (row.tool_overrides as string) ?? null,\n model: (row.model as string) ?? null,\n config: (row.config as string) ?? null,\n created_at: row.created_at as number,\n updated_at: (row.updated_at as number) ?? null,\n };\n}\n\n/** Serialize a TaskConfig to a JSON string for storage. */\nexport function serializeConfig(config: TaskConfig | null): string | null {\n if (!config) return null;\n return JSON.stringify(config);\n}\n\n/** Deserialize a TaskConfig from a stored JSON string. Returns null on failure. */\nexport function deserializeConfig(raw: string | null): TaskConfig | null {\n if (!raw) return null;\n try {\n return JSON.parse(raw) as TaskConfig;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Upsert a task — insert or update on conflict.\n *\n * On conflict the row is updated with the values from `data`.\n * This is the idempotent upsert — calling twice with the same data\n * produces the same result.\n */\nexport function upsertTask(data: TaskInsert): TaskRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO agent_tasks (\n id, agent_id, source, display_name, description,\n prompt, is_default, tool_overrides, model, config,\n created_at, updated_at\n ) VALUES (\n ?, ?, ?, ?, ?,\n ?, ?, ?, ?, ?,\n ?, ?\n )\n ON CONFLICT (id) DO UPDATE SET\n agent_id = EXCLUDED.agent_id,\n source = EXCLUDED.source,\n display_name = EXCLUDED.display_name,\n description = EXCLUDED.description,\n prompt = EXCLUDED.prompt,\n is_default = EXCLUDED.is_default,\n tool_overrides = EXCLUDED.tool_overrides,\n model = EXCLUDED.model,\n config = EXCLUDED.config,\n updated_at = EXCLUDED.updated_at`,\n ).run(\n data.id,\n data.agent_id,\n data.source ?? DEFAULT_SOURCE,\n data.display_name ?? null,\n data.description ?? null,\n data.prompt,\n data.is_default ?? DEFAULT_IS_DEFAULT,\n data.tool_overrides ?? null,\n data.model ?? null,\n data.config ?? null,\n data.created_at,\n data.updated_at ?? null,\n );\n\n return toTaskRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM agent_tasks WHERE id = ?`).get(data.id) as Record<string, unknown>,\n );\n}\n\n/**\n * Retrieve a single task by id.\n *\n * @returns the task row, or null if not found.\n */\nexport function getTask(id: string): TaskRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM agent_tasks WHERE id = ?`,\n ).get(id) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toTaskRow(row);\n}\n\n/**\n * List tasks with optional filters, ordered by created_at ASC.\n */\nexport function listTasks(\n options: ListTasksOptions = {},\n): TaskRow[] {\n const db = getDatabase();\n\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (options.agent_id !== undefined) {\n conditions.push(`agent_id = ?`);\n params.push(options.agent_id);\n }\n\n if (options.source !== undefined) {\n conditions.push(`source = ?`);\n params.push(options.source);\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const limit = options.limit ?? DEFAULT_LIST_LIMIT;\n\n params.push(limit);\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agent_tasks\n ${where}\n ORDER BY created_at ASC\n LIMIT ?`,\n ).all(...params) as Record<string, unknown>[];\n\n return rows.map(toTaskRow);\n}\n\n/**\n * Get the default task for an agent.\n *\n * @returns the default task row, or null if no default exists.\n */\nexport function getDefaultTask(\n agentId: string,\n): TaskRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agent_tasks\n WHERE agent_id = ? AND is_default = ?\n LIMIT 1`,\n ).get(agentId, IS_DEFAULT_TRUE) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toTaskRow(row);\n}\n\n/**\n * List all tasks for an agent, ordered by display_name ASC.\n *\n * Rows with a null display_name sort before named tasks.\n */\nexport function listTasksByAgent(\n agentId: string,\n): TaskRow[] {\n const db = getDatabase();\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agent_tasks\n WHERE agent_id = ?\n ORDER BY display_name ASC`,\n ).all(agentId) as Record<string, unknown>[];\n\n return rows.map(toTaskRow);\n}\n\n/**\n * Delete a task by id.\n *\n * Built-in tasks (source = 'built-in') are protected and cannot be deleted.\n *\n * @returns true if the task was deleted, false if not found or protected.\n */\nexport function deleteTask(id: string): boolean {\n const db = getDatabase();\n const info = db.prepare(\n `DELETE FROM agent_tasks WHERE id = ? AND source != ?`,\n ).run(id, BUILT_IN_SOURCE);\n return info.changes > 0;\n}\n","/**\n * Zod schemas for agent definition and task YAML validation.\n *\n * These schemas are shared between the loader (which validates YAML files)\n * and any other code that needs to parse or validate task/agent config.\n */\n\nimport { z } from 'zod/v4';\n\n// ---------------------------------------------------------------------------\n// Schema version\n// ---------------------------------------------------------------------------\n\n/** Current schema version for task config structures. */\nexport const CURRENT_TASK_SCHEMA_VERSION = 1;\n\n// ---------------------------------------------------------------------------\n// Shared sub-schemas\n// ---------------------------------------------------------------------------\n\n/** Schema for API provider configuration. */\nexport const ProviderConfigSchema = z.object({\n type: z.enum(['cloud', 'ollama', 'lmstudio']),\n baseUrl: z.string().optional(),\n apiKey: z.string().optional(),\n model: z.string().optional(),\n});\n\n/** Schema for execution configuration overrides. */\nexport const ExecutionConfigSchema = z.object({\n model: z.string().optional(),\n maxTurns: z.number().optional(),\n timeoutSeconds: z.number().optional(),\n provider: ProviderConfigSchema.optional(),\n});\n\n/** Schema for a single context query entry. */\nexport const ContextQuerySchema = z.object({\n tool: z.string(),\n queryTemplate: z.string(),\n limit: z.number(),\n purpose: z.string(),\n required: z.boolean(),\n});\n\n// ---------------------------------------------------------------------------\n// Agent definition schema\n// ---------------------------------------------------------------------------\n\n/** Schema for agent.yaml agent definition files. */\nexport const AgentDefinitionSchema = z.object({\n name: z.string(),\n displayName: z.string(),\n description: z.string(),\n model: z.string(),\n maxTurns: z.number(),\n timeoutSeconds: z.number(),\n systemPromptPath: z.string(),\n tools: z.array(z.string()),\n});\n\n// ---------------------------------------------------------------------------\n// Task schemas\n// ---------------------------------------------------------------------------\n\n/** Schema for orchestrator configuration on a task definition. */\nexport const OrchestratorConfigSchema = z.object({\n enabled: z.boolean(),\n model: z.string().optional(),\n maxTurns: z.number().optional(),\n});\n\n/** Schema for a single phase within a phased task pipeline. */\nexport const PhaseDefinitionSchema = z.object({\n name: z.string(),\n prompt: z.string(),\n tools: z.array(z.string()),\n maxTurns: z.number(),\n model: z.string().optional(),\n required: z.boolean(),\n dependsOn: z.array(z.string()).optional(),\n provider: ProviderConfigSchema.optional(),\n skipPriorContext: z.boolean().optional(),\n});\n\n/** Schema for task YAML files in tasks/. */\nexport const AgentTaskSchema = z.object({\n name: z.string(),\n displayName: z.string(),\n description: z.string(),\n agent: z.string(),\n prompt: z.string(),\n isDefault: z.boolean(),\n toolOverrides: z.array(z.string()).optional(),\n model: z.string().optional(),\n maxTurns: z.number().optional(),\n timeoutSeconds: z.number().optional(),\n phases: z.array(PhaseDefinitionSchema).optional(),\n execution: ExecutionConfigSchema.optional(),\n contextQueries: z.record(z.string(), z.array(ContextQuerySchema)).optional(),\n schemaVersion: z.number().optional(),\n orchestrator: OrchestratorConfigSchema.optional(),\n});\n"],"mappings":"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","names":["DEFAULT_SOURCE","SELECT_COLUMNS","DEFAULT_SOURCE","SELECT_COLUMNS","SELECT_COLUMNS","parseYaml"]}
|
|
1
|
+
{"version":3,"sources":["../src/agent/loader.ts","../src/db/queries/agents.ts","../src/db/queries/tasks.ts","../src/agent/schemas.ts"],"sourcesContent":["/**\n * Agent definition and task YAML loader.\n *\n * Reads agent.yaml and tasks/*.yaml from the definitions directory,\n * validates their shape, and provides helpers for merging built-in\n * definitions with database overrides into an EffectiveConfig.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { findPackageRoot } from '@myco/utils/find-package-root.js';\nimport { parse as parseYaml } from 'yaml';\nimport { epochSeconds, DEFAULT_AGENT_ID, BUILT_IN_SOURCE, USER_TASK_SOURCE } from '@myco/constants.js';\nimport { getDatabase } from '@myco/db/client.js';\nimport { registerAgent } from '@myco/db/queries/agents.js';\nimport { upsertTask } from '@myco/db/queries/tasks.js';\nimport type { AgentRow } from '@myco/db/queries/agents.js';\nimport type { AgentDefinition, AgentTask, EffectiveConfig } from './types.js';\nimport { AgentDefinitionSchema, AgentTaskSchema } from './schemas.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Filename for the built-in agent definition. */\nconst AGENT_DEFINITION_FILE = 'agent.yaml';\n\n/** Subdirectory containing task YAML files. */\nconst TASKS_SUBDIRECTORY = 'tasks';\n\n// Package root resolution uses shared findPackageRoot from @myco/utils\n\n// BUILT_IN_SOURCE imported from @myco/constants.js\n\n// ---------------------------------------------------------------------------\n// Definitions directory resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the definitions directory at runtime.\n *\n * Strategy (same pattern as `src/prompts/index.ts`):\n * 1. Walk up from `import.meta.url` looking for `package.json`.\n * 2. From package root, try `dist/src/agent/definitions/` (tsup output).\n * 3. Fall back to `src/agent/definitions/` (dev mode / tsc output).\n * 4. Also check if the current file's directory already contains agent.yaml.\n */\nexport function resolveDefinitionsDir(): string {\n const scriptDir = path.dirname(fileURLToPath(import.meta.url));\n\n // Check if we're already adjacent to the definitions (tsc output or dev mode)\n const adjacentDefs = path.join(scriptDir, 'definitions');\n if (fs.existsSync(path.join(adjacentDefs, AGENT_DEFINITION_FILE))) {\n return adjacentDefs;\n }\n\n // Walk up to package root using shared utility\n const root = findPackageRoot(scriptDir);\n if (root) {\n // Try dist path first (tsup bundled output)\n const distPath = path.join(root, 'dist', 'src', 'agent', 'definitions');\n if (fs.existsSync(path.join(distPath, AGENT_DEFINITION_FILE))) {\n return distPath;\n }\n // Fall back to src path (dev mode)\n const srcPath = path.join(root, 'src', 'agent', 'definitions');\n if (fs.existsSync(path.join(srcPath, AGENT_DEFINITION_FILE))) {\n return srcPath;\n }\n }\n\n // Final fallback: adjacent to current file\n return adjacentDefs;\n}\n\n// ---------------------------------------------------------------------------\n// YAML loaders\n// ---------------------------------------------------------------------------\n\n/**\n * Load and parse the built-in agent definition from `agent.yaml`.\n *\n * @param definitionsDir — path to the definitions directory.\n * @returns the parsed AgentDefinition.\n * @throws if the file is missing or malformed.\n */\nexport function loadAgentDefinition(definitionsDir: string): AgentDefinition {\n const filePath = path.join(definitionsDir, AGENT_DEFINITION_FILE);\n const raw = fs.readFileSync(filePath, 'utf-8');\n const parsed = AgentDefinitionSchema.parse(parseYaml(raw));\n\n return {\n name: parsed.name,\n displayName: parsed.displayName,\n description: parsed.description.trim(),\n model: parsed.model,\n maxTurns: parsed.maxTurns,\n timeoutSeconds: parsed.timeoutSeconds,\n systemPromptPath: parsed.systemPromptPath,\n tools: parsed.tools,\n };\n}\n\n/**\n * Load and parse all task YAML files from `tasks/`.\n *\n * @param definitionsDir — path to the definitions directory.\n * @returns array of parsed AgentTask objects.\n */\nexport function loadAgentTasks(definitionsDir: string): AgentTask[] {\n const tasksDir = path.join(definitionsDir, TASKS_SUBDIRECTORY);\n if (!fs.existsSync(tasksDir)) return [];\n\n const files = fs.readdirSync(tasksDir).filter((f) => f.endsWith('.yaml'));\n return files.map((file) => {\n const raw = fs.readFileSync(path.join(tasksDir, file), 'utf-8');\n const parsed = AgentTaskSchema.parse(parseYaml(raw));\n\n return taskFromParsed(parsed);\n });\n}\n\n/**\n * Convert a Zod-parsed task schema result to an AgentTask object.\n *\n * Shared by loadAgentTasks (built-in) and registry (user tasks) to ensure\n * all optional fields are consistently spread. Adding a new optional field\n * to AgentTaskSchema only requires updating this one function.\n */\nexport function taskFromParsed(parsed: AgentTask): AgentTask {\n return {\n name: parsed.name,\n displayName: parsed.displayName,\n description: parsed.description.trim(),\n agent: parsed.agent,\n prompt: parsed.prompt.trim(),\n isDefault: parsed.isDefault,\n ...(parsed.toolOverrides ? { toolOverrides: parsed.toolOverrides } : {}),\n ...(parsed.model ? { model: parsed.model } : {}),\n ...(parsed.maxTurns ? { maxTurns: parsed.maxTurns } : {}),\n ...(parsed.timeoutSeconds ? { timeoutSeconds: parsed.timeoutSeconds } : {}),\n ...(parsed.phases ? { phases: parsed.phases } : {}),\n ...(parsed.orchestrator ? { orchestrator: parsed.orchestrator } : {}),\n ...(parsed.contextQueries ? { contextQueries: parsed.contextQueries } : {}),\n ...(parsed.execution ? { execution: parsed.execution } : {}),\n ...(parsed.schemaVersion ? { schemaVersion: parsed.schemaVersion } : {}),\n ...(parsed.schedule ? { schedule: parsed.schedule } : {}),\n };\n}\n\n/**\n * Load a system prompt markdown file.\n *\n * @param definitionsDir — path to the definitions directory.\n * @param relativePath — path relative to definitionsDir (from AgentDefinition.systemPromptPath).\n * @returns the prompt file content as a string.\n */\nexport function loadSystemPrompt(definitionsDir: string, relativePath: string): string {\n const filePath = path.resolve(definitionsDir, relativePath);\n return fs.readFileSync(filePath, 'utf-8').trim();\n}\n\n// ---------------------------------------------------------------------------\n// Config resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Merge a built-in AgentDefinition with optional database overrides and\n * task-specific configuration to produce the effective runtime config.\n *\n * Priority (highest wins):\n * 1. Task toolOverrides (replaces tool list entirely if present)\n * 2. AgentRow database overrides (model, maxTurns, timeoutSeconds, tool_access)\n * 3. Built-in AgentDefinition defaults\n *\n * @param definition — the built-in agent definition from YAML.\n * @param agentOverrides — optional database row with user-applied overrides.\n * @param taskOverrides — optional task definition (determines prompt and may override tools).\n * @returns the merged EffectiveConfig.\n */\nexport function resolveEffectiveConfig(\n definition: AgentDefinition,\n agentOverrides?: AgentRow | null,\n taskOverrides?: AgentTask,\n): EffectiveConfig {\n // Start with definition defaults\n let model = definition.model;\n let maxTurns = definition.maxTurns;\n let timeoutSeconds = definition.timeoutSeconds;\n let tools = [...definition.tools];\n const agentId = agentOverrides?.id ?? DEFAULT_AGENT_ID;\n\n // Apply agent DB overrides\n if (agentOverrides) {\n if (agentOverrides.model) model = agentOverrides.model;\n if (agentOverrides.max_turns !== null) maxTurns = agentOverrides.max_turns;\n if (agentOverrides.timeout_seconds !== null) timeoutSeconds = agentOverrides.timeout_seconds;\n if (agentOverrides.tool_access) {\n try {\n const parsed = JSON.parse(agentOverrides.tool_access);\n if (Array.isArray(parsed)) tools = parsed as string[];\n } catch {\n // Invalid JSON in tool_access — keep definition defaults\n }\n }\n }\n\n // Apply task overrides (model, turns, timeout, tool list)\n if (taskOverrides?.model) model = taskOverrides.model;\n if (taskOverrides?.maxTurns) maxTurns = taskOverrides.maxTurns;\n if (taskOverrides?.timeoutSeconds) timeoutSeconds = taskOverrides.timeoutSeconds;\n if (taskOverrides?.toolOverrides) {\n tools = [...taskOverrides.toolOverrides];\n }\n\n // Apply execution config overrides (highest priority)\n // Precedence: execution.model > task.model > agent.model\n if (taskOverrides?.execution) {\n if (taskOverrides.execution.model) model = taskOverrides.execution.model;\n if (taskOverrides.execution.maxTurns) maxTurns = taskOverrides.execution.maxTurns;\n if (taskOverrides.execution.timeoutSeconds) timeoutSeconds = taskOverrides.execution.timeoutSeconds;\n }\n\n // Task prompt and display info (fall back to a generic prompt)\n const taskName = taskOverrides?.name ?? 'full-intelligence';\n const taskDisplayName = taskOverrides?.displayName ?? 'Full Intelligence';\n const taskPrompt = taskOverrides?.prompt ?? '';\n\n return {\n agentId,\n model,\n maxTurns,\n timeoutSeconds,\n systemPromptPath: definition.systemPromptPath,\n tools,\n taskName,\n taskDisplayName,\n taskPrompt,\n ...(taskOverrides?.phases ? { phases: taskOverrides.phases } : {}),\n ...(taskOverrides?.orchestrator ? { orchestrator: taskOverrides.orchestrator } : {}),\n ...(taskOverrides?.contextQueries ? { contextQueries: taskOverrides.contextQueries } : {}),\n ...(taskOverrides?.execution ? { execution: taskOverrides.execution } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Database registration\n// ---------------------------------------------------------------------------\n\n/**\n * Register the built-in agent and all built-in tasks into the database.\n *\n * Idempotent: uses upsert (ON CONFLICT DO UPDATE) for both agent and tasks.\n * Safe to call on every daemon startup.\n *\n * @param definitionsDir — path to the definitions directory.\n */\nexport async function registerBuiltInAgentsAndTasks(definitionsDir: string, vaultDir?: string): Promise<void> {\n const definition = loadAgentDefinition(definitionsDir);\n const tasks = loadAgentTasks(definitionsDir);\n const now = epochSeconds();\n\n // Upsert the built-in agent\n registerAgent({\n id: definition.name,\n name: definition.displayName,\n model: definition.model,\n source: BUILT_IN_SOURCE,\n max_turns: definition.maxTurns,\n timeout_seconds: definition.timeoutSeconds,\n tool_access: JSON.stringify(definition.tools),\n created_at: now,\n updated_at: now,\n });\n\n // Upsert all built-in tasks\n for (const task of tasks) {\n upsertTask({\n id: task.name,\n agent_id: definition.name,\n source: BUILT_IN_SOURCE,\n display_name: task.displayName,\n description: task.description,\n prompt: task.prompt,\n is_default: task.isDefault ? 1 : 0,\n tool_overrides: task.toolOverrides ? JSON.stringify(task.toolOverrides) : null,\n config: JSON.stringify({\n phases: task.phases ?? null,\n execution: task.execution ?? null,\n contextQueries: task.contextQueries ?? null,\n schemaVersion: task.schemaVersion ?? 1,\n }),\n created_at: now,\n updated_at: now,\n });\n }\n\n // Remove built-in tasks that no longer have YAML definitions\n const validTaskIds = tasks.map(t => t.name);\n if (validTaskIds.length > 0) {\n const db = getDatabase();\n const placeholders = validTaskIds.map(() => '?').join(', ');\n db.prepare(\n `DELETE FROM agent_tasks\n WHERE source = ? AND agent_id = ? AND id NOT IN (${placeholders})`,\n ).run(BUILT_IN_SOURCE, definition.name, ...validTaskIds);\n }\n\n // Register user tasks from the vault (if vault dir provided)\n if (vaultDir) {\n const { loadAllTasks } = await import('./registry.js');\n const allTasks = loadAllTasks(definitionsDir, vaultDir);\n for (const [name, task] of allTasks) {\n if (task.source === USER_TASK_SOURCE) {\n upsertTask({\n id: name,\n agent_id: task.agent ?? definition.name,\n source: USER_TASK_SOURCE,\n display_name: task.displayName,\n description: task.description,\n prompt: task.prompt,\n is_default: task.isDefault ? 1 : 0,\n tool_overrides: task.toolOverrides ? JSON.stringify(task.toolOverrides) : null,\n config: JSON.stringify({\n phases: task.phases ?? null,\n execution: task.execution ?? null,\n contextQueries: task.contextQueries ?? null,\n schemaVersion: task.schemaVersion ?? 1,\n }),\n created_at: now,\n updated_at: now,\n });\n }\n }\n }\n}\n","/**\n * Agent CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when registering an agent. */\nexport interface AgentInsert {\n id: string;\n name: string;\n created_at: number;\n provider?: string | null;\n model?: string | null;\n system_prompt_hash?: string | null;\n config?: string | null;\n source?: string;\n system_prompt?: string | null;\n max_turns?: number | null;\n timeout_seconds?: number | null;\n tool_access?: string | null;\n enabled?: number;\n updated_at?: number | null;\n}\n\n/** Row shape returned from agent queries (all columns). */\nexport interface AgentRow {\n id: string;\n name: string;\n provider: string | null;\n model: string | null;\n system_prompt_hash: string | null;\n config: string | null;\n source: string;\n system_prompt: string | null;\n max_turns: number | null;\n timeout_seconds: number | null;\n tool_access: string | null;\n enabled: number;\n created_at: number;\n updated_at: number | null;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default agent source for new agents. */\nconst DEFAULT_SOURCE = 'built-in';\n\n/** Default enabled flag for new agents. */\nconst DEFAULT_ENABLED = 1;\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst AGENT_COLUMNS = [\n 'id',\n 'name',\n 'provider',\n 'model',\n 'system_prompt_hash',\n 'config',\n 'source',\n 'system_prompt',\n 'max_turns',\n 'timeout_seconds',\n 'tool_access',\n 'enabled',\n 'created_at',\n 'updated_at',\n] as const;\n\nconst SELECT_COLUMNS = AGENT_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed AgentRow. */\nfunction toAgentRow(row: Record<string, unknown>): AgentRow {\n return {\n id: row.id as string,\n name: row.name as string,\n provider: (row.provider as string) ?? null,\n model: (row.model as string) ?? null,\n system_prompt_hash: (row.system_prompt_hash as string) ?? null,\n config: (row.config as string) ?? null,\n source: (row.source as string) ?? DEFAULT_SOURCE,\n system_prompt: (row.system_prompt as string) ?? null,\n max_turns: (row.max_turns as number) ?? null,\n timeout_seconds: (row.timeout_seconds as number) ?? null,\n tool_access: (row.tool_access as string) ?? null,\n enabled: (row.enabled as number) ?? DEFAULT_ENABLED,\n created_at: row.created_at as number,\n updated_at: (row.updated_at as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Register an agent or update it if the id already exists.\n *\n * On conflict the row is updated with the values from `data`.\n * This is the idempotent upsert — calling twice with the same data\n * produces the same result.\n */\nexport function registerAgent(data: AgentInsert): AgentRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO agents (\n id, name, provider, model, system_prompt_hash, config,\n source, system_prompt, max_turns, timeout_seconds, tool_access,\n enabled, created_at, updated_at\n ) VALUES (\n ?, ?, ?, ?, ?, ?,\n ?, ?, ?, ?, ?,\n ?, ?, ?\n )\n ON CONFLICT (id) DO UPDATE SET\n name = EXCLUDED.name,\n provider = EXCLUDED.provider,\n model = EXCLUDED.model,\n system_prompt_hash = EXCLUDED.system_prompt_hash,\n config = EXCLUDED.config,\n source = EXCLUDED.source,\n system_prompt = EXCLUDED.system_prompt,\n max_turns = EXCLUDED.max_turns,\n timeout_seconds = EXCLUDED.timeout_seconds,\n tool_access = EXCLUDED.tool_access,\n enabled = EXCLUDED.enabled,\n updated_at = EXCLUDED.updated_at`,\n ).run(\n data.id,\n data.name,\n data.provider ?? null,\n data.model ?? null,\n data.system_prompt_hash ?? null,\n data.config ?? null,\n data.source ?? DEFAULT_SOURCE,\n data.system_prompt ?? null,\n data.max_turns ?? null,\n data.timeout_seconds ?? null,\n data.tool_access ?? null,\n data.enabled ?? DEFAULT_ENABLED,\n data.created_at,\n data.updated_at ?? null,\n );\n\n return toAgentRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM agents WHERE id = ?`).get(data.id) as Record<string, unknown>,\n );\n}\n\n/**\n * Retrieve a single agent by id.\n *\n * @returns the agent row, or null if not found.\n */\nexport function getAgent(id: string): AgentRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM agents WHERE id = ?`,\n ).get(id) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toAgentRow(row);\n}\n\n/**\n * List all agents, ordered by created_at ASC.\n */\nexport function listAgents(): AgentRow[] {\n const db = getDatabase();\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agents\n ORDER BY created_at ASC`,\n ).all() as Record<string, unknown>[];\n\n return rows.map(toAgentRow);\n}\n","/**\n * Agent task CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { BUILT_IN_SOURCE } from '@myco/constants.js';\nimport type { TaskConfig } from '@myco/agent/types.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default number of tasks returned by listTasks when no limit given. */\nconst DEFAULT_LIST_LIMIT = 100;\n\n/** Default task source for new tasks. */\nconst DEFAULT_SOURCE = BUILT_IN_SOURCE;\n\n/** Default is_default flag for new tasks. */\nconst DEFAULT_IS_DEFAULT = 0;\n\n/** Value indicating a task is the default for its agent. */\nconst IS_DEFAULT_TRUE = 1;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when upserting a task. */\nexport interface TaskInsert {\n id: string;\n agent_id: string;\n prompt: string;\n created_at: number;\n source?: string;\n display_name?: string | null;\n description?: string | null;\n is_default?: number;\n tool_overrides?: string | null;\n model?: string | null;\n config?: string | null;\n updated_at?: number | null;\n}\n\n/** Row shape returned from agent_tasks queries (all columns). */\nexport interface TaskRow {\n id: string;\n agent_id: string;\n source: string;\n display_name: string | null;\n description: string | null;\n prompt: string;\n is_default: number;\n tool_overrides: string | null;\n model: string | null;\n config: string | null;\n created_at: number;\n updated_at: number | null;\n}\n\n/** Filter options for `listTasks`. */\nexport interface ListTasksOptions {\n limit?: number;\n agent_id?: string;\n source?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst TASK_COLUMNS = [\n 'id',\n 'agent_id',\n 'source',\n 'display_name',\n 'description',\n 'prompt',\n 'is_default',\n 'tool_overrides',\n 'model',\n 'config',\n 'created_at',\n 'updated_at',\n] as const;\n\nconst SELECT_COLUMNS = TASK_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed TaskRow. */\nfunction toTaskRow(row: Record<string, unknown>): TaskRow {\n return {\n id: row.id as string,\n agent_id: row.agent_id as string,\n source: (row.source as string) ?? DEFAULT_SOURCE,\n display_name: (row.display_name as string) ?? null,\n description: (row.description as string) ?? null,\n prompt: row.prompt as string,\n is_default: (row.is_default as number) ?? DEFAULT_IS_DEFAULT,\n tool_overrides: (row.tool_overrides as string) ?? null,\n model: (row.model as string) ?? null,\n config: (row.config as string) ?? null,\n created_at: row.created_at as number,\n updated_at: (row.updated_at as number) ?? null,\n };\n}\n\n/** Serialize a TaskConfig to a JSON string for storage. */\nexport function serializeConfig(config: TaskConfig | null): string | null {\n if (!config) return null;\n return JSON.stringify(config);\n}\n\n/** Deserialize a TaskConfig from a stored JSON string. Returns null on failure. */\nexport function deserializeConfig(raw: string | null): TaskConfig | null {\n if (!raw) return null;\n try {\n return JSON.parse(raw) as TaskConfig;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Upsert a task — insert or update on conflict.\n *\n * On conflict the row is updated with the values from `data`.\n * This is the idempotent upsert — calling twice with the same data\n * produces the same result.\n */\nexport function upsertTask(data: TaskInsert): TaskRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO agent_tasks (\n id, agent_id, source, display_name, description,\n prompt, is_default, tool_overrides, model, config,\n created_at, updated_at\n ) VALUES (\n ?, ?, ?, ?, ?,\n ?, ?, ?, ?, ?,\n ?, ?\n )\n ON CONFLICT (id) DO UPDATE SET\n agent_id = EXCLUDED.agent_id,\n source = EXCLUDED.source,\n display_name = EXCLUDED.display_name,\n description = EXCLUDED.description,\n prompt = EXCLUDED.prompt,\n is_default = EXCLUDED.is_default,\n tool_overrides = EXCLUDED.tool_overrides,\n model = EXCLUDED.model,\n config = EXCLUDED.config,\n updated_at = EXCLUDED.updated_at`,\n ).run(\n data.id,\n data.agent_id,\n data.source ?? DEFAULT_SOURCE,\n data.display_name ?? null,\n data.description ?? null,\n data.prompt,\n data.is_default ?? DEFAULT_IS_DEFAULT,\n data.tool_overrides ?? null,\n data.model ?? null,\n data.config ?? null,\n data.created_at,\n data.updated_at ?? null,\n );\n\n return toTaskRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM agent_tasks WHERE id = ?`).get(data.id) as Record<string, unknown>,\n );\n}\n\n/**\n * Retrieve a single task by id.\n *\n * @returns the task row, or null if not found.\n */\nexport function getTask(id: string): TaskRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM agent_tasks WHERE id = ?`,\n ).get(id) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toTaskRow(row);\n}\n\n/**\n * List tasks with optional filters, ordered by created_at ASC.\n */\nexport function listTasks(\n options: ListTasksOptions = {},\n): TaskRow[] {\n const db = getDatabase();\n\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (options.agent_id !== undefined) {\n conditions.push(`agent_id = ?`);\n params.push(options.agent_id);\n }\n\n if (options.source !== undefined) {\n conditions.push(`source = ?`);\n params.push(options.source);\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const limit = options.limit ?? DEFAULT_LIST_LIMIT;\n\n params.push(limit);\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agent_tasks\n ${where}\n ORDER BY created_at ASC\n LIMIT ?`,\n ).all(...params) as Record<string, unknown>[];\n\n return rows.map(toTaskRow);\n}\n\n/**\n * Get the default task for an agent.\n *\n * @returns the default task row, or null if no default exists.\n */\nexport function getDefaultTask(\n agentId: string,\n): TaskRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agent_tasks\n WHERE agent_id = ? AND is_default = ?\n LIMIT 1`,\n ).get(agentId, IS_DEFAULT_TRUE) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toTaskRow(row);\n}\n\n/**\n * List all tasks for an agent, ordered by display_name ASC.\n *\n * Rows with a null display_name sort before named tasks.\n */\nexport function listTasksByAgent(\n agentId: string,\n): TaskRow[] {\n const db = getDatabase();\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agent_tasks\n WHERE agent_id = ?\n ORDER BY display_name ASC`,\n ).all(agentId) as Record<string, unknown>[];\n\n return rows.map(toTaskRow);\n}\n\n/**\n * Delete a task by id.\n *\n * Built-in tasks (source = 'built-in') are protected and cannot be deleted.\n *\n * @returns true if the task was deleted, false if not found or protected.\n */\nexport function deleteTask(id: string): boolean {\n const db = getDatabase();\n const info = db.prepare(\n `DELETE FROM agent_tasks WHERE id = ? AND source != ?`,\n ).run(id, BUILT_IN_SOURCE);\n return info.changes > 0;\n}\n","/**\n * Zod schemas for agent definition and task YAML validation.\n *\n * These schemas are shared between the loader (which validates YAML files)\n * and any other code that needs to parse or validate task/agent config.\n */\n\nimport { z } from 'zod/v4';\nimport { SCHEDULABLE_POWER_STATES } from '@myco/constants.js';\n\n// ---------------------------------------------------------------------------\n// Schema version\n// ---------------------------------------------------------------------------\n\n/** Current schema version for task config structures. */\nexport const CURRENT_TASK_SCHEMA_VERSION = 1;\n\n// ---------------------------------------------------------------------------\n// Shared sub-schemas\n// ---------------------------------------------------------------------------\n\n/** Schema for API provider configuration. */\nexport const ProviderConfigSchema = z.object({\n type: z.enum(['cloud', 'ollama', 'lmstudio']),\n baseUrl: z.string().optional(),\n apiKey: z.string().optional(),\n model: z.string().optional(),\n});\n\n/** Schema for execution configuration overrides. */\nexport const ExecutionConfigSchema = z.object({\n model: z.string().optional(),\n maxTurns: z.number().optional(),\n timeoutSeconds: z.number().optional(),\n provider: ProviderConfigSchema.optional(),\n});\n\n/** Schema for a single context query entry. */\nexport const ContextQuerySchema = z.object({\n tool: z.string(),\n queryTemplate: z.string(),\n limit: z.number(),\n purpose: z.string(),\n required: z.boolean(),\n});\n\n// ---------------------------------------------------------------------------\n// Agent definition schema\n// ---------------------------------------------------------------------------\n\n/** Schema for agent.yaml agent definition files. */\nexport const AgentDefinitionSchema = z.object({\n name: z.string(),\n displayName: z.string(),\n description: z.string(),\n model: z.string(),\n maxTurns: z.number(),\n timeoutSeconds: z.number(),\n systemPromptPath: z.string(),\n tools: z.array(z.string()),\n});\n\n// ---------------------------------------------------------------------------\n// Task schemas\n// ---------------------------------------------------------------------------\n\n/** Schema for orchestrator configuration on a task definition. */\nexport const OrchestratorConfigSchema = z.object({\n enabled: z.boolean(),\n model: z.string().optional(),\n maxTurns: z.number().optional(),\n});\n\n/** Pre-condition identifiers for scheduled task auto-runs. */\nconst PreConditionSchema = z.enum([\n 'has-unprocessed-batches',\n 'has-active-skills',\n 'has-approved-candidates',\n]);\n\n/** Schedule configuration for automatic task execution via PowerManager. */\nexport const TaskScheduleSchema = z.object({\n /** Whether auto-run is enabled for this task. */\n enabled: z.boolean().default(false),\n /** Seconds between runs. */\n intervalSeconds: z.number().int().positive(),\n /** PowerManager states where this task runs. */\n runIn: z.array(z.enum([...SCHEDULABLE_POWER_STATES])).min(1),\n /** Optional pre-condition check before running. */\n preCondition: PreConditionSchema.optional(),\n});\n\n/** Schema for a single phase within a phased task pipeline. */\nexport const PhaseDefinitionSchema = z.object({\n name: z.string(),\n prompt: z.string(),\n tools: z.array(z.string()),\n maxTurns: z.number(),\n model: z.string().optional(),\n required: z.boolean(),\n dependsOn: z.array(z.string()).optional(),\n provider: ProviderConfigSchema.optional(),\n skipPriorContext: z.boolean().optional(),\n});\n\n/** Schema for task YAML files in tasks/. */\nexport const AgentTaskSchema = z.object({\n name: z.string(),\n displayName: z.string(),\n description: z.string(),\n agent: z.string(),\n prompt: z.string(),\n isDefault: z.boolean(),\n toolOverrides: z.array(z.string()).optional(),\n model: z.string().optional(),\n maxTurns: z.number().optional(),\n timeoutSeconds: z.number().optional(),\n phases: z.array(PhaseDefinitionSchema).optional(),\n execution: ExecutionConfigSchema.optional(),\n contextQueries: z.record(z.string(), z.array(ContextQuerySchema)).optional(),\n schemaVersion: z.number().optional(),\n orchestrator: OrchestratorConfigSchema.optional(),\n schedule: TaskScheduleSchema.optional(),\n});\n"],"mappings":"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","names":["DEFAULT_SOURCE","SELECT_COLUMNS","DEFAULT_SOURCE","SELECT_COLUMNS","SELECT_COLUMNS","parseYaml"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
CloudEmbeddingBase
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-5YQ6VOFZ.js";
|
|
5
5
|
|
|
6
6
|
// src/cli/providers/openai-embeddings.ts
|
|
7
7
|
var OPENAI_API_KEY_ENV = "MYCO_OPENAI_API_KEY";
|
|
@@ -23,4 +23,4 @@ export {
|
|
|
23
23
|
OPENAI_API_KEY_ENV,
|
|
24
24
|
OpenAIEmbeddingProvider
|
|
25
25
|
};
|
|
26
|
-
//# sourceMappingURL=chunk-
|
|
26
|
+
//# sourceMappingURL=chunk-OKCSSDFC.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
STDIN_TIMEOUT_MS
|
|
4
|
-
} from "./chunk-PIRWYDOH.js";
|
|
5
2
|
import {
|
|
6
3
|
loadManifests
|
|
7
4
|
} from "./chunk-QFMBZ72S.js";
|
|
5
|
+
import {
|
|
6
|
+
STDIN_TIMEOUT_MS
|
|
7
|
+
} from "./chunk-TRA3R4EC.js";
|
|
8
8
|
|
|
9
9
|
// src/hooks/read-stdin.ts
|
|
10
10
|
function readStdin() {
|
|
@@ -80,4 +80,4 @@ export {
|
|
|
80
80
|
readStdin,
|
|
81
81
|
normalizeHookInput
|
|
82
82
|
};
|
|
83
|
-
//# sourceMappingURL=chunk-
|
|
83
|
+
//# sourceMappingURL=chunk-OQVKLTQY.js.map
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
SCHEDULABLE_POWER_STATES
|
|
4
|
+
} from "./chunk-TRA3R4EC.js";
|
|
2
5
|
import {
|
|
3
6
|
require_dist
|
|
4
7
|
} from "./chunk-D7TYRPRM.js";
|
|
@@ -43,12 +46,19 @@ var PhaseOverrideSchema = external_exports.object({
|
|
|
43
46
|
model: external_exports.string().optional(),
|
|
44
47
|
maxTurns: external_exports.number().int().positive().optional()
|
|
45
48
|
});
|
|
49
|
+
var ScheduleOverrideSchema = external_exports.object({
|
|
50
|
+
enabled: external_exports.boolean().optional(),
|
|
51
|
+
intervalSeconds: external_exports.number().int().positive().optional(),
|
|
52
|
+
runIn: external_exports.array(external_exports.enum([...SCHEDULABLE_POWER_STATES])).optional(),
|
|
53
|
+
preCondition: external_exports.enum(["has-unprocessed-batches", "has-active-skills", "has-approved-candidates"]).optional()
|
|
54
|
+
}).optional();
|
|
46
55
|
var TaskProviderOverrideSchema = external_exports.object({
|
|
47
56
|
provider: ProviderOverrideSchema.optional(),
|
|
48
57
|
model: external_exports.string().optional(),
|
|
49
58
|
maxTurns: external_exports.number().int().positive().optional(),
|
|
50
59
|
timeoutSeconds: external_exports.number().int().positive().optional(),
|
|
51
|
-
phases: external_exports.record(external_exports.string(), PhaseOverrideSchema).optional()
|
|
60
|
+
phases: external_exports.record(external_exports.string(), PhaseOverrideSchema).optional(),
|
|
61
|
+
schedule: ScheduleOverrideSchema
|
|
52
62
|
});
|
|
53
63
|
var ContextSchema = external_exports.object({
|
|
54
64
|
/** Which digest tier to inject at session start. */
|
|
@@ -59,10 +69,6 @@ var ContextSchema = external_exports.object({
|
|
|
59
69
|
prompt_max_spores: external_exports.number().int().min(0).max(10).default(3)
|
|
60
70
|
});
|
|
61
71
|
var AgentSchema = external_exports.object({
|
|
62
|
-
/** Whether the daemon automatically runs the agent on unprocessed batches. */
|
|
63
|
-
auto_run: external_exports.boolean().default(true),
|
|
64
|
-
/** Seconds between agent timer checks. */
|
|
65
|
-
interval_seconds: external_exports.number().int().positive().default(300),
|
|
66
72
|
/** Number of batches between event-driven summary triggers (0 to disable). */
|
|
67
73
|
summary_batch_interval: external_exports.number().int().min(0).default(5),
|
|
68
74
|
/** Global default provider — applies to all tasks unless overridden per-task. */
|
|
@@ -86,6 +92,26 @@ var TeamSchema = external_exports.object({
|
|
|
86
92
|
/** Sync interval in minutes. */
|
|
87
93
|
interval_minutes: external_exports.number().int().min(1).max(1440).default(15)
|
|
88
94
|
});
|
|
95
|
+
var SkillsSchema = external_exports.object({
|
|
96
|
+
/** Auto-generate candidates above this confidence score. */
|
|
97
|
+
confidence_threshold: external_exports.number().min(0).max(1).default(0.7),
|
|
98
|
+
/** Flag unused skills after this many days. */
|
|
99
|
+
usage_stale_days: external_exports.number().int().positive().default(30)
|
|
100
|
+
});
|
|
101
|
+
var NotificationsSchema = external_exports.object({
|
|
102
|
+
/** Master switch — disables all notifications when false. */
|
|
103
|
+
enabled: external_exports.boolean().default(true),
|
|
104
|
+
/** Allow browser system notifications (Notification API). */
|
|
105
|
+
system_notifications: external_exports.boolean().default(false),
|
|
106
|
+
/** Default display mode for new notification types. */
|
|
107
|
+
default_mode: external_exports.enum(["banner", "summary"]).default("banner"),
|
|
108
|
+
/** Per-domain settings. Keys are domain names from the registry. */
|
|
109
|
+
domains: external_exports.record(external_exports.string(), external_exports.object({
|
|
110
|
+
enabled: external_exports.boolean().default(true),
|
|
111
|
+
/** Override display mode for this domain. Omit to use global default_mode. */
|
|
112
|
+
mode: external_exports.enum(["banner", "summary"]).optional()
|
|
113
|
+
})).default({})
|
|
114
|
+
});
|
|
89
115
|
var MycoConfigSchema = external_exports.preprocess(
|
|
90
116
|
(raw) => {
|
|
91
117
|
if (raw && typeof raw === "object" && "curation" in raw && !("agent" in raw)) {
|
|
@@ -103,7 +129,9 @@ var MycoConfigSchema = external_exports.preprocess(
|
|
|
103
129
|
agent: AgentSchema.default(() => AgentSchema.parse({})),
|
|
104
130
|
context: ContextSchema.default(() => ContextSchema.parse({})),
|
|
105
131
|
backup: BackupSchema.default(() => BackupSchema.parse({})),
|
|
106
|
-
team: TeamSchema.default(() => TeamSchema.parse({}))
|
|
132
|
+
team: TeamSchema.default(() => TeamSchema.parse({})),
|
|
133
|
+
skills: SkillsSchema.default(() => SkillsSchema.parse({})),
|
|
134
|
+
notifications: NotificationsSchema.default(() => NotificationsSchema.parse({}))
|
|
107
135
|
})
|
|
108
136
|
);
|
|
109
137
|
|
|
@@ -188,6 +216,54 @@ var MIGRATIONS = [
|
|
|
188
216
|
digest.consolidation = { enabled: consolidation, max_tokens: 2048 };
|
|
189
217
|
}
|
|
190
218
|
}
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
version: 3,
|
|
222
|
+
name: "schedule-to-task-level",
|
|
223
|
+
migrate(doc, _vaultDir) {
|
|
224
|
+
const agent = doc.agent ?? {};
|
|
225
|
+
const skills = doc.skills ?? {};
|
|
226
|
+
const tasks = agent.tasks ?? {};
|
|
227
|
+
const DEFAULT_INTELLIGENCE_INTERVAL_SECONDS = 300;
|
|
228
|
+
const VALID_SCHEDULE_STATES = ["active", "idle", "sleep"];
|
|
229
|
+
if ("auto_run" in agent || "interval_seconds" in agent) {
|
|
230
|
+
const fiTask = tasks["full-intelligence"] ?? {};
|
|
231
|
+
fiTask.schedule = {
|
|
232
|
+
enabled: agent.auto_run ?? true,
|
|
233
|
+
intervalSeconds: agent.interval_seconds ?? DEFAULT_INTELLIGENCE_INTERVAL_SECONDS
|
|
234
|
+
};
|
|
235
|
+
tasks["full-intelligence"] = fiTask;
|
|
236
|
+
delete agent.auto_run;
|
|
237
|
+
delete agent.interval_seconds;
|
|
238
|
+
}
|
|
239
|
+
if ("auto_survey" in skills) {
|
|
240
|
+
const ssTask = tasks["skill-survey"] ?? {};
|
|
241
|
+
ssTask.schedule = {
|
|
242
|
+
enabled: skills.auto_survey ?? false
|
|
243
|
+
};
|
|
244
|
+
tasks["skill-survey"] = ssTask;
|
|
245
|
+
delete skills.auto_survey;
|
|
246
|
+
}
|
|
247
|
+
if ("auto_evolve" in skills || "evolve_cadence" in skills) {
|
|
248
|
+
const seTask = tasks["skill-evolve"] ?? {};
|
|
249
|
+
const schedule = {
|
|
250
|
+
enabled: skills.auto_evolve ?? false
|
|
251
|
+
};
|
|
252
|
+
if ("evolve_cadence" in skills) {
|
|
253
|
+
const cadence = String(skills.evolve_cadence);
|
|
254
|
+
schedule.runIn = VALID_SCHEDULE_STATES.includes(cadence) ? [cadence] : ["idle"];
|
|
255
|
+
}
|
|
256
|
+
seTask.schedule = schedule;
|
|
257
|
+
tasks["skill-evolve"] = seTask;
|
|
258
|
+
delete skills.auto_evolve;
|
|
259
|
+
delete skills.evolve_cadence;
|
|
260
|
+
}
|
|
261
|
+
if (Object.keys(tasks).length > 0) {
|
|
262
|
+
agent.tasks = tasks;
|
|
263
|
+
}
|
|
264
|
+
doc.agent = agent;
|
|
265
|
+
doc.skills = skills;
|
|
266
|
+
}
|
|
191
267
|
}
|
|
192
268
|
];
|
|
193
269
|
var CURRENT_MIGRATION_VERSION = MIGRATIONS[MIGRATIONS.length - 1]?.version ?? 0;
|
|
@@ -302,4 +378,4 @@ export {
|
|
|
302
378
|
updateBackupConfig,
|
|
303
379
|
updateTeamConfig
|
|
304
380
|
};
|
|
305
|
-
//# sourceMappingURL=chunk-
|
|
381
|
+
//# sourceMappingURL=chunk-PSYLKCWQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/loader.ts","../src/config/schema.ts","../src/config/migrations.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { MycoConfigSchema, type MycoConfig, type BackupConfig, type TeamConfig } from './schema.js';\nimport { runMigrations, CURRENT_MIGRATION_VERSION } from './migrations.js';\n\nexport const CONFIG_FILENAME = 'myco.yaml';\n\nexport function loadConfig(vaultDir: string): MycoConfig {\n const configPath = path.join(vaultDir, CONFIG_FILENAME);\n\n if (!fs.existsSync(configPath)) {\n throw new Error(`myco.yaml not found in ${vaultDir}`);\n }\n\n const raw = fs.readFileSync(configPath, 'utf-8');\n const parsed = YAML.parse(raw) as Record<string, unknown>;\n\n // Detect v1 config and guide migration\n if (parsed.version === 1 || (parsed.intelligence as Record<string, unknown>)?.backend) {\n throw new Error(\n 'Myco config uses v1 format. Run /myco:setup-llm to reconfigure for v2.',\n );\n }\n\n // --- v2 → v3 migration ---\n let v2Migrated = false;\n if (parsed.version === 2) {\n // Extract intelligence.embedding to top-level embedding\n const intel = parsed.intelligence as Record<string, unknown> | undefined;\n const embeddingConfig = intel?.embedding as Record<string, unknown> | undefined;\n if (embeddingConfig && !parsed.embedding) {\n // Map v2 'lm-studio' to v3 'openai-compatible' for embedding provider\n if (embeddingConfig.provider === 'lm-studio') {\n embeddingConfig.provider = 'openai-compatible';\n }\n parsed.embedding = embeddingConfig;\n }\n\n // Keep daemon.port and daemon.log_level, drop grace_period and max_log_size\n const daemon = parsed.daemon as Record<string, unknown> | undefined;\n if (daemon) {\n const { port, log_level } = daemon;\n parsed.daemon = { port: port ?? null, log_level: log_level ?? 'info' };\n }\n\n // Keep capture basics, drop token-related fields; migrate artifact_watch → plan_dirs\n const capture = parsed.capture as Record<string, unknown> | undefined;\n if (capture) {\n const { transcript_paths, artifact_watch, plan_dirs, artifact_extensions, buffer_max_events } = capture;\n parsed.capture = {\n transcript_paths,\n plan_dirs: plan_dirs ?? artifact_watch,\n artifact_extensions,\n buffer_max_events,\n };\n }\n\n // Drop removed top-level sections\n delete parsed.intelligence;\n delete parsed.context;\n delete parsed.team;\n delete parsed.digest;\n delete parsed.pipeline;\n\n // Set version to 3\n parsed.version = 3;\n v2Migrated = true;\n\n process.stderr.write('[myco migration] Migrated config from v2 to v3\\n');\n }\n\n // Run numbered migrations (for v3+ forward migrations)\n const migrationsRan = runMigrations(parsed, vaultDir, (msg) => {\n process.stderr.write(`[myco migration] ${msg}\\n`);\n });\n\n // Parse with Zod to fill in defaults for new config sections\n const config = MycoConfigSchema.parse(parsed);\n\n // Write back if v2→v3 migration ran, numbered migrations ran, or new defaults were added\n const needsWrite = v2Migrated\n || migrationsRan\n || (parsed.config_version as number ?? 0) < CURRENT_MIGRATION_VERSION\n || parsed.version !== config.version;\n\n if (needsWrite) {\n const fullConfig = JSON.parse(JSON.stringify(config)) as Record<string, unknown>;\n fs.writeFileSync(configPath, YAML.stringify(fullConfig), 'utf-8');\n }\n\n return config;\n}\n\nexport function saveConfig(vaultDir: string, config: MycoConfig): void {\n // Validate before writing — OAK lesson: validate on write, not just read\n const validated = MycoConfigSchema.parse(config);\n\n const configPath = path.join(vaultDir, CONFIG_FILENAME);\n fs.mkdirSync(vaultDir, { recursive: true });\n fs.writeFileSync(configPath, YAML.stringify(validated), 'utf-8');\n}\n\nexport function updateConfig(\n vaultDir: string,\n fn: (config: MycoConfig) => MycoConfig,\n): MycoConfig {\n const current = loadConfig(vaultDir);\n const updated = fn(current);\n saveConfig(vaultDir, updated);\n return updated;\n}\n\nexport function updateBackupConfig(\n vaultDir: string,\n backup: Partial<BackupConfig>,\n): MycoConfig {\n return updateConfig(vaultDir, (config) => ({\n ...config,\n backup: { ...config.backup, ...backup },\n }));\n}\n\nexport function updateTeamConfig(\n vaultDir: string,\n team: Partial<TeamConfig>,\n): MycoConfig {\n return updateConfig(vaultDir, (config) => ({\n ...config,\n team: { ...config.team, ...team },\n }));\n}\n","import { z } from 'zod';\nimport { SCHEDULABLE_POWER_STATES } from '@myco/constants.js';\n\nconst EmbeddingProviderSchema = z.object({\n provider: z.enum(['ollama', 'openai-compatible', 'openrouter', 'openai']).default('ollama'),\n model: z.string().default('bge-m3'),\n base_url: z.string().url().optional(),\n});\n\nconst DaemonSchema = z.object({\n port: z.number().int().min(1024).max(65535).nullable().default(null),\n log_level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n log_retention_days: z.number().int().min(1).max(365).default(30),\n});\n\nconst CaptureSchema = z.object({\n transcript_paths: z.array(z.string()).default([]),\n plan_dirs: z.array(z.string()).default([]),\n artifact_extensions: z.array(z.string()).default(['.md']),\n buffer_max_events: z.number().int().positive().default(500),\n});\n\n/** Provider config shape used in both task-level and phase-level overrides. */\nconst ProviderOverrideSchema = z.object({\n type: z.enum(['cloud', 'ollama', 'lmstudio']),\n base_url: z.string().optional(),\n model: z.string().optional(),\n /** Context window size for local models (Ollama num_ctx, LM Studio context_length). */\n context_length: z.number().int().positive().optional(),\n});\n\n/** Per-phase overrides within a task — keyed by phase name. */\nconst PhaseOverrideSchema = z.object({\n provider: ProviderOverrideSchema.optional(),\n model: z.string().optional(),\n maxTurns: z.number().int().positive().optional(),\n});\n\n/** Per-task schedule override — partial, merges with YAML defaults. */\nconst ScheduleOverrideSchema = z.object({\n enabled: z.boolean().optional(),\n intervalSeconds: z.number().int().positive().optional(),\n runIn: z.array(z.enum([...SCHEDULABLE_POWER_STATES])).optional(),\n preCondition: z.enum(['has-unprocessed-batches', 'has-active-skills', 'has-approved-candidates']).optional(),\n}).optional();\n\n/** Per-task config override — stored in myco.yaml under agent.tasks. */\nconst TaskProviderOverrideSchema = z.object({\n provider: ProviderOverrideSchema.optional(),\n model: z.string().optional(),\n maxTurns: z.number().int().positive().optional(),\n timeoutSeconds: z.number().int().positive().optional(),\n phases: z.record(z.string(), PhaseOverrideSchema).optional(),\n schedule: ScheduleOverrideSchema,\n});\n\nconst ContextSchema = z.object({\n /** Which digest tier to inject at session start. */\n digest_tier: z.number().int().default(5000),\n /** Enable semantic spore search on each user prompt. */\n prompt_search: z.boolean().default(true),\n /** Max spores to inject per prompt (0-10). */\n prompt_max_spores: z.number().int().min(0).max(10).default(3),\n});\n\nconst AgentSchema = z.object({\n /** Number of batches between event-driven summary triggers (0 to disable). */\n summary_batch_interval: z.number().int().min(0).default(5),\n /** Global default provider — applies to all tasks unless overridden per-task. */\n provider: ProviderOverrideSchema.optional(),\n /** Global default model — applies to all tasks unless overridden per-task. */\n model: z.string().optional(),\n /** Per-task overrides keyed by task name. */\n tasks: z.record(z.string(), TaskProviderOverrideSchema).optional(),\n});\n\nconst BackupSchema = z.object({\n /** Override directory for backup files. Supports ~ for home directory. When unset, defaults to .myco/backups. */\n dir: z.string().optional(),\n});\n\nconst TeamSchema = z.object({\n /** Whether team sync is enabled. */\n enabled: z.boolean().default(false),\n /** Cloudflare Worker URL for team sync. */\n worker_url: z.string().url().optional(),\n /** Team identifier for sync grouping. */\n team_id: z.string().optional(),\n /** Sync interval in minutes. */\n interval_minutes: z.number().int().min(1).max(1440).default(15),\n});\n\nconst SkillsSchema = z.object({\n /** Auto-generate candidates above this confidence score. */\n confidence_threshold: z.number().min(0).max(1).default(0.7),\n /** Flag unused skills after this many days. */\n usage_stale_days: z.number().int().positive().default(30),\n});\n\nconst NotificationsSchema = z.object({\n /** Master switch — disables all notifications when false. */\n enabled: z.boolean().default(true),\n /** Allow browser system notifications (Notification API). */\n system_notifications: z.boolean().default(false),\n /** Default display mode for new notification types. */\n default_mode: z.enum(['banner', 'summary']).default('banner'),\n /** Per-domain settings. Keys are domain names from the registry. */\n domains: z.record(z.string(), z.object({\n enabled: z.boolean().default(true),\n /** Override display mode for this domain. Omit to use global default_mode. */\n mode: z.enum(['banner', 'summary']).optional(),\n })).default({}),\n});\n\nexport const MycoConfigSchema = z.preprocess(\n (raw: unknown) => {\n if (raw && typeof raw === 'object' && 'curation' in raw && !('agent' in raw)) {\n const { curation, ...rest } = raw as Record<string, unknown>;\n return { ...rest, agent: curation };\n }\n return raw;\n },\n z.object({\n version: z.literal(3),\n config_version: z.number().int().nonnegative().default(0),\n embedding: EmbeddingProviderSchema.default(() => EmbeddingProviderSchema.parse({})),\n daemon: DaemonSchema.default(() => DaemonSchema.parse({})),\n capture: CaptureSchema.default(() => CaptureSchema.parse({})),\n agent: AgentSchema.default(() => AgentSchema.parse({})),\n context: ContextSchema.default(() => ContextSchema.parse({})),\n backup: BackupSchema.default(() => BackupSchema.parse({})),\n team: TeamSchema.default(() => TeamSchema.parse({})),\n skills: SkillsSchema.default(() => SkillsSchema.parse({})),\n notifications: NotificationsSchema.default(() => NotificationsSchema.parse({})),\n }),\n);\n\nexport type MycoConfig = z.output<typeof MycoConfigSchema>;\nexport type EmbeddingProviderConfig = z.infer<typeof EmbeddingProviderSchema>;\nexport type TaskProviderOverride = z.infer<typeof TaskProviderOverrideSchema>;\nexport type PhaseOverride = z.infer<typeof PhaseOverrideSchema>;\nexport type ScheduleOverride = z.infer<typeof ScheduleOverrideSchema>;\nexport type ContextConfig = z.infer<typeof ContextSchema>;\nexport type BackupConfig = z.infer<typeof BackupSchema>;\nexport type TeamConfig = z.infer<typeof TeamSchema>;\nexport type SkillsConfig = z.infer<typeof SkillsSchema>;\nexport type NotificationsConfig = z.infer<typeof NotificationsSchema>;\n","/**\n * Config and vault migrations — run once per version, tracked by config_version.\n *\n * Each migration has a version number, a name, and a function that receives\n * the raw parsed YAML doc and the vault directory. Migrations run in order\n * and are skipped if config_version is already past them.\n *\n * To add a new migration:\n * 1. Add an entry to MIGRATIONS with the next version number\n * 2. Write the migrate function — it receives the mutable doc and vaultDir\n * 3. The framework handles version tracking and writing the config back\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface Migration {\n version: number;\n name: string;\n migrate: (doc: Record<string, unknown>, vaultDir: string) => void;\n}\n\n/** Regex matching both quoted and unquoted YAML: type: memory, type: \"memory\", type: 'memory' */\nconst MEMORY_TYPE_PATTERN = /type:\\s*[\"']?memory[\"']?/g;\n\nexport const MIGRATIONS: Migration[] = [\n {\n version: 1,\n name: 'rename-memories-to-spores',\n migrate: (doc, vaultDir) => {\n // Config: rename context.layers.memories → context.layers.spores\n const context = doc.context as Record<string, unknown> | undefined;\n const layers = context?.layers as Record<string, unknown> | undefined;\n if (layers && 'memories' in layers && !('spores' in layers)) {\n layers.spores = layers.memories;\n delete layers.memories;\n }\n\n // Vault: rename memories/ directory → spores/\n const memoriesDir = path.join(vaultDir, 'memories');\n const sporesDir = path.join(vaultDir, 'spores');\n\n if (!fs.existsSync(memoriesDir)) return;\n\n if (fs.existsSync(sporesDir)) {\n // Both exist (interrupted migration) — merge remaining files\n const moveRemaining = (srcDir: string, destDir: string): void => {\n for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {\n const srcPath = path.join(srcDir, entry.name);\n const destPath = path.join(destDir, entry.name);\n if (entry.isDirectory()) {\n if (!fs.existsSync(destPath)) fs.mkdirSync(destPath, { recursive: true });\n moveRemaining(srcPath, destPath);\n } else if (!fs.existsSync(destPath)) {\n fs.renameSync(srcPath, destPath);\n }\n }\n };\n moveRemaining(memoriesDir, sporesDir);\n fs.rmSync(memoriesDir, { recursive: true, force: true });\n } else {\n fs.renameSync(memoriesDir, sporesDir);\n }\n\n // Update frontmatter type: memory → type: spore (handles quoted and unquoted)\n const walkUpdate = (dir: string): void => {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) { walkUpdate(fullPath); continue; }\n if (!entry.name.endsWith('.md')) continue;\n const content = fs.readFileSync(fullPath, 'utf-8');\n MEMORY_TYPE_PATTERN.lastIndex = 0;\n if (MEMORY_TYPE_PATTERN.test(content)) {\n MEMORY_TYPE_PATTERN.lastIndex = 0;\n fs.writeFileSync(fullPath, content.replace(MEMORY_TYPE_PATTERN, 'type: spore'));\n }\n }\n };\n walkUpdate(sporesDir);\n\n // Legacy: update wikilink references in Markdown files (pre-SQLite migration): [[memories/...]] → [[spores/...]]\n const walkLinks = (dir: string): void => {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) { walkLinks(fullPath); continue; }\n if (!entry.name.endsWith('.md')) continue;\n const content = fs.readFileSync(fullPath, 'utf-8');\n if (content.includes('memories/')) {\n fs.writeFileSync(fullPath, content.replace(/memories\\//g, 'spores/'));\n }\n }\n };\n walkLinks(vaultDir);\n },\n },\n {\n version: 2,\n name: 'consolidation-boolean-to-object',\n migrate: (doc) => {\n const digest = doc.digest as Record<string, unknown> | undefined;\n if (!digest) return;\n\n const consolidation = digest.consolidation;\n if (typeof consolidation === 'boolean') {\n digest.consolidation = { enabled: consolidation, max_tokens: 2048 };\n }\n },\n },\n {\n version: 3,\n name: 'schedule-to-task-level',\n migrate(doc: Record<string, unknown>, _vaultDir: string): void {\n const agent = (doc.agent ?? {}) as Record<string, unknown>;\n const skills = (doc.skills ?? {}) as Record<string, unknown>;\n const tasks = ((agent.tasks ?? {}) as Record<string, Record<string, unknown>>);\n\n /** Default interval for full-intelligence task (5 minutes). */\n const DEFAULT_INTELLIGENCE_INTERVAL_SECONDS = 300;\n\n const VALID_SCHEDULE_STATES = ['active', 'idle', 'sleep'] as const;\n\n // Migrate agent.auto_run + interval_seconds → full-intelligence schedule\n if ('auto_run' in agent || 'interval_seconds' in agent) {\n const fiTask = tasks['full-intelligence'] ?? {};\n fiTask.schedule = {\n enabled: agent.auto_run ?? true,\n intervalSeconds: agent.interval_seconds ?? DEFAULT_INTELLIGENCE_INTERVAL_SECONDS,\n };\n tasks['full-intelligence'] = fiTask;\n delete agent.auto_run;\n delete agent.interval_seconds;\n }\n\n // Migrate skills.auto_survey → skill-survey schedule\n if ('auto_survey' in skills) {\n const ssTask = tasks['skill-survey'] ?? {};\n ssTask.schedule = {\n enabled: skills.auto_survey ?? false,\n };\n tasks['skill-survey'] = ssTask;\n delete skills.auto_survey;\n }\n\n // Migrate skills.auto_evolve + evolve_cadence → skill-evolve schedule\n if ('auto_evolve' in skills || 'evolve_cadence' in skills) {\n const seTask = tasks['skill-evolve'] ?? {};\n const schedule: Record<string, unknown> = {\n enabled: skills.auto_evolve ?? false,\n };\n if ('evolve_cadence' in skills) {\n const cadence = String(skills.evolve_cadence);\n schedule.runIn = VALID_SCHEDULE_STATES.includes(cadence as typeof VALID_SCHEDULE_STATES[number])\n ? [cadence]\n : ['idle']; // fallback to safe default\n }\n seTask.schedule = schedule;\n tasks['skill-evolve'] = seTask;\n delete skills.auto_evolve;\n delete skills.evolve_cadence;\n }\n\n // Write back tasks if any were created\n if (Object.keys(tasks).length > 0) {\n agent.tasks = tasks;\n }\n doc.agent = agent;\n doc.skills = skills;\n },\n },\n];\n\n/** Current migration version — the highest version in MIGRATIONS. */\nexport const CURRENT_MIGRATION_VERSION = MIGRATIONS[MIGRATIONS.length - 1]?.version ?? 0;\n\n/**\n * Run all pending migrations on the raw config doc.\n * Returns true if any migrations ran (caller should reindex).\n */\nexport function runMigrations(\n doc: Record<string, unknown>,\n vaultDir: string,\n log?: (message: string) => void,\n): boolean {\n const currentVersion = (doc.config_version as number) ?? 0;\n let ran = false;\n\n for (const migration of MIGRATIONS) {\n if (migration.version <= currentVersion) continue;\n\n migration.migrate(doc, vaultDir);\n doc.config_version = migration.version;\n ran = true;\n }\n\n if (ran) {\n const from = currentVersion;\n const to = (doc.config_version as number) ?? 0;\n log?.(`Migrated config from v${from} to v${to}`);\n }\n\n return ran;\n}\n"],"mappings":"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","names":["fs","path","path","fs","YAML"]}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
|
+
getTeamMachineId,
|
|
3
4
|
syncRow
|
|
4
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-S66YG6QK.js";
|
|
5
6
|
import {
|
|
6
7
|
getDatabase
|
|
7
8
|
} from "./chunk-MYX5NCRH.js";
|
|
8
|
-
import {
|
|
9
|
-
DEFAULT_MACHINE_ID
|
|
10
|
-
} from "./chunk-PIRWYDOH.js";
|
|
11
9
|
|
|
12
10
|
// src/db/queries/spores.ts
|
|
13
11
|
var DEFAULT_LIST_LIMIT = 100;
|
|
@@ -52,7 +50,7 @@ function toSporeRow(row) {
|
|
|
52
50
|
embedded: row.embedded ?? 0,
|
|
53
51
|
created_at: row.created_at,
|
|
54
52
|
updated_at: row.updated_at ?? null,
|
|
55
|
-
machine_id: row.machine_id ??
|
|
53
|
+
machine_id: row.machine_id ?? "local",
|
|
56
54
|
synced_at: row.synced_at ?? null
|
|
57
55
|
};
|
|
58
56
|
}
|
|
@@ -86,7 +84,7 @@ function insertSpore(data) {
|
|
|
86
84
|
data.properties ?? null,
|
|
87
85
|
data.created_at,
|
|
88
86
|
data.updated_at ?? null,
|
|
89
|
-
data.machine_id ??
|
|
87
|
+
data.machine_id ?? getTeamMachineId()
|
|
90
88
|
);
|
|
91
89
|
const row = toSporeRow(
|
|
92
90
|
db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(data.id)
|
|
@@ -177,4 +175,4 @@ export {
|
|
|
177
175
|
countSpores,
|
|
178
176
|
updateSporeStatus
|
|
179
177
|
};
|
|
180
|
-
//# sourceMappingURL=chunk-
|
|
178
|
+
//# sourceMappingURL=chunk-PX5KIOKY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/db/queries/spores.ts"],"sourcesContent":["/**\n * Spore CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { getTeamMachineId } from '@myco/daemon/team-context.js';\nimport { syncRow } from '@myco/db/queries/team-outbox.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default number of spores returned by listSpores when no limit given. */\nconst DEFAULT_LIST_LIMIT = 100;\n\n/** Default spore status for new spores. */\nconst DEFAULT_STATUS = 'active';\n\n/** Default importance score for new spores. */\nexport const DEFAULT_IMPORTANCE = 5;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when inserting a spore. */\nexport interface SporeInsert {\n id: string;\n agent_id: string;\n observation_type: string;\n content: string;\n created_at: number;\n session_id?: string | null;\n prompt_batch_id?: number | null;\n status?: string;\n context?: string | null;\n importance?: number;\n file_path?: string | null;\n tags?: string | null;\n content_hash?: string | null;\n properties?: string | null;\n updated_at?: number | null;\n machine_id?: string;\n}\n\n/** Row shape returned from spore queries (all columns). */\nexport interface SporeRow {\n id: string;\n agent_id: string;\n session_id: string | null;\n prompt_batch_id: number | null;\n observation_type: string;\n status: string;\n content: string;\n context: string | null;\n importance: number;\n file_path: string | null;\n tags: string | null;\n content_hash: string | null;\n properties: string | null;\n embedded: number;\n created_at: number;\n updated_at: number | null;\n machine_id: string;\n synced_at: number | null;\n}\n\n/** Filter options for `listSpores`. */\nexport interface ListSporesOptions {\n agent_id?: string;\n observation_type?: string;\n status?: string;\n session_id?: string;\n search?: string;\n limit?: number;\n offset?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst SPORE_COLUMNS = [\n 'id',\n 'agent_id',\n 'session_id',\n 'prompt_batch_id',\n 'observation_type',\n 'status',\n 'content',\n 'context',\n 'importance',\n 'file_path',\n 'tags',\n 'content_hash',\n 'properties',\n 'embedded',\n 'created_at',\n 'updated_at',\n 'machine_id',\n 'synced_at',\n] as const;\n\nconst SELECT_COLUMNS = SPORE_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed SporeRow. */\nfunction toSporeRow(row: Record<string, unknown>): SporeRow {\n return {\n id: row.id as string,\n agent_id: row.agent_id as string,\n session_id: (row.session_id as string) ?? null,\n prompt_batch_id: (row.prompt_batch_id as number) ?? null,\n observation_type: row.observation_type as string,\n status: row.status as string,\n content: row.content as string,\n context: (row.context as string) ?? null,\n importance: row.importance as number,\n file_path: (row.file_path as string) ?? null,\n tags: (row.tags as string) ?? null,\n content_hash: (row.content_hash as string) ?? null,\n properties: (row.properties as string) ?? null,\n embedded: (row.embedded as number) ?? 0,\n created_at: row.created_at as number,\n updated_at: (row.updated_at as number) ?? null,\n machine_id: (row.machine_id as string) ?? 'local',\n synced_at: (row.synced_at as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Insert a new spore.\n *\n * Requires a valid `agent_id` (foreign key to agents table).\n */\nexport function insertSpore(data: SporeInsert): SporeRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO spores (\n id, agent_id, session_id, prompt_batch_id,\n observation_type, status, content, context,\n importance, file_path, tags, content_hash,\n properties, created_at, updated_at, machine_id\n ) VALUES (\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?\n )`,\n ).run(\n data.id,\n data.agent_id,\n data.session_id ?? null,\n data.prompt_batch_id ?? null,\n data.observation_type,\n data.status ?? DEFAULT_STATUS,\n data.content,\n data.context ?? null,\n data.importance ?? DEFAULT_IMPORTANCE,\n data.file_path ?? null,\n data.tags ?? null,\n data.content_hash ?? null,\n data.properties ?? null,\n data.created_at,\n data.updated_at ?? null,\n data.machine_id ?? getTeamMachineId(),\n );\n\n const row = toSporeRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(data.id) as Record<string, unknown>,\n );\n\n syncRow('spores', row);\n\n return row;\n}\n\n/**\n * Retrieve a single spore by id.\n *\n * @returns the spore row, or null if not found.\n */\nexport function getSpore(id: string): SporeRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`,\n ).get(id) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toSporeRow(row);\n}\n\n/**\n * List spores with optional filters, ordered by created_at DESC.\n */\n/** Build WHERE clause and bound params from spore filter options. */\nfunction buildSporeWhere(\n options: Omit<ListSporesOptions, 'limit' | 'offset'>,\n): { where: string; params: unknown[] } {\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (options.agent_id !== undefined) {\n conditions.push(`agent_id = ?`);\n params.push(options.agent_id);\n }\n if (options.observation_type !== undefined) {\n conditions.push(`observation_type = ?`);\n params.push(options.observation_type);\n }\n if (options.status !== undefined) {\n conditions.push(`status = ?`);\n params.push(options.status);\n }\n if (options.session_id !== undefined) {\n conditions.push(`session_id = ?`);\n params.push(options.session_id);\n }\n if (options.search !== undefined && options.search.length > 0) {\n conditions.push(`(content LIKE ? OR observation_type LIKE ?)`);\n const pattern = `%${options.search}%`;\n params.push(pattern, pattern);\n }\n\n return {\n where: conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '',\n params,\n };\n}\n\n/**\n * List spores with optional filters, ordered by created_at DESC.\n */\nexport function listSpores(\n options: ListSporesOptions = {},\n): SporeRow[] {\n const db = getDatabase();\n const { where, params } = buildSporeWhere(options);\n const limit = options.limit ?? DEFAULT_LIST_LIMIT;\n const offset = options.offset ?? 0;\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM spores\n ${where}\n ORDER BY created_at DESC\n LIMIT ?\n OFFSET ?`,\n ).all(...params, limit, offset) as Record<string, unknown>[];\n\n return rows.map(toSporeRow);\n}\n\n/**\n * Count spores matching optional filters (for pagination totals).\n */\nexport function countSpores(\n options: Omit<ListSporesOptions, 'limit' | 'offset'> = {},\n): number {\n const db = getDatabase();\n const { where, params } = buildSporeWhere(options);\n\n const row = db.prepare(\n `SELECT COUNT(*) as count FROM spores ${where}`,\n ).get(...params) as { count: number };\n\n return row.count;\n}\n\n/**\n * Update the status and updated_at timestamp of a spore.\n *\n * @returns the updated row, or null if the spore does not exist.\n */\nexport function updateSporeStatus(\n id: string,\n status: string,\n updatedAt: number,\n): SporeRow | null {\n const db = getDatabase();\n\n const info = db.prepare(\n `UPDATE spores\n SET status = ?, updated_at = ?\n WHERE id = ?`,\n ).run(status, updatedAt, id);\n\n if (info.changes === 0) return null;\n\n const row = toSporeRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(id) as Record<string, unknown>,\n );\n\n syncRow('spores', row);\n\n return row;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
getDatabase
|
|
4
|
+
} from "./chunk-MYX5NCRH.js";
|
|
5
|
+
|
|
6
|
+
// src/db/queries/turns.ts
|
|
7
|
+
var TURN_COLUMNS = [
|
|
8
|
+
"id",
|
|
9
|
+
"run_id",
|
|
10
|
+
"agent_id",
|
|
11
|
+
"turn_number",
|
|
12
|
+
"tool_name",
|
|
13
|
+
"tool_input",
|
|
14
|
+
"tool_output_summary",
|
|
15
|
+
"started_at",
|
|
16
|
+
"completed_at"
|
|
17
|
+
];
|
|
18
|
+
var SELECT_COLUMNS = TURN_COLUMNS.join(", ");
|
|
19
|
+
function toTurnRow(row) {
|
|
20
|
+
return {
|
|
21
|
+
id: row.id,
|
|
22
|
+
run_id: row.run_id,
|
|
23
|
+
agent_id: row.agent_id,
|
|
24
|
+
turn_number: row.turn_number,
|
|
25
|
+
tool_name: row.tool_name,
|
|
26
|
+
tool_input: row.tool_input ?? null,
|
|
27
|
+
tool_output_summary: row.tool_output_summary ?? null,
|
|
28
|
+
started_at: row.started_at ?? null,
|
|
29
|
+
completed_at: row.completed_at ?? null
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function insertTurn(data) {
|
|
33
|
+
const db = getDatabase();
|
|
34
|
+
const info = db.prepare(
|
|
35
|
+
`INSERT INTO agent_turns (
|
|
36
|
+
run_id, agent_id, turn_number, tool_name,
|
|
37
|
+
tool_input, tool_output_summary, started_at, completed_at
|
|
38
|
+
) VALUES (
|
|
39
|
+
?, ?, ?, ?,
|
|
40
|
+
?, ?, ?, ?
|
|
41
|
+
)`
|
|
42
|
+
).run(
|
|
43
|
+
data.run_id,
|
|
44
|
+
data.agent_id,
|
|
45
|
+
data.turn_number,
|
|
46
|
+
data.tool_name,
|
|
47
|
+
data.tool_input ?? null,
|
|
48
|
+
data.tool_output_summary ?? null,
|
|
49
|
+
data.started_at ?? null,
|
|
50
|
+
data.completed_at ?? null
|
|
51
|
+
);
|
|
52
|
+
const turnId = Number(info.lastInsertRowid);
|
|
53
|
+
return toTurnRow(
|
|
54
|
+
db.prepare(`SELECT ${SELECT_COLUMNS} FROM agent_turns WHERE id = ?`).get(turnId)
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
function listTurns(runId) {
|
|
58
|
+
const db = getDatabase();
|
|
59
|
+
const rows = db.prepare(
|
|
60
|
+
`SELECT ${SELECT_COLUMNS}
|
|
61
|
+
FROM agent_turns
|
|
62
|
+
WHERE run_id = ?
|
|
63
|
+
ORDER BY turn_number ASC`
|
|
64
|
+
).all(runId);
|
|
65
|
+
return rows.map(toTurnRow);
|
|
66
|
+
}
|
|
67
|
+
function listTurnsByRun(runId) {
|
|
68
|
+
return listTurns(runId);
|
|
69
|
+
}
|
|
70
|
+
function countToolCallsByRun(runId, toolNames) {
|
|
71
|
+
if (toolNames.length === 0) return {};
|
|
72
|
+
const db = getDatabase();
|
|
73
|
+
const placeholders = toolNames.map(() => "?").join(", ");
|
|
74
|
+
const rows = db.prepare(
|
|
75
|
+
`SELECT tool_name, COUNT(*) as count
|
|
76
|
+
FROM agent_turns
|
|
77
|
+
WHERE run_id = ? AND tool_name IN (${placeholders})
|
|
78
|
+
GROUP BY tool_name`
|
|
79
|
+
).all(runId, ...toolNames);
|
|
80
|
+
const result = {};
|
|
81
|
+
for (const row of rows) {
|
|
82
|
+
result[row.tool_name] = row.count;
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export {
|
|
88
|
+
insertTurn,
|
|
89
|
+
listTurns,
|
|
90
|
+
listTurnsByRun,
|
|
91
|
+
countToolCallsByRun
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=chunk-QLCD77AN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/db/queries/turns.ts"],"sourcesContent":["/**\n * Agent turn CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when inserting a turn. */\nexport interface TurnInsert {\n run_id: string;\n agent_id: string;\n turn_number: number;\n tool_name: string;\n tool_input?: string | null;\n tool_output_summary?: string | null;\n started_at?: number | null;\n completed_at?: number | null;\n}\n\n/** Row shape returned from agent_turns queries (all columns). */\nexport interface TurnRow {\n id: number;\n run_id: string;\n agent_id: string;\n turn_number: number;\n tool_name: string;\n tool_input: string | null;\n tool_output_summary: string | null;\n started_at: number | null;\n completed_at: number | null;\n}\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst TURN_COLUMNS = [\n 'id',\n 'run_id',\n 'agent_id',\n 'turn_number',\n 'tool_name',\n 'tool_input',\n 'tool_output_summary',\n 'started_at',\n 'completed_at',\n] as const;\n\nconst SELECT_COLUMNS = TURN_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed TurnRow. */\nfunction toTurnRow(row: Record<string, unknown>): TurnRow {\n return {\n id: row.id as number,\n run_id: row.run_id as string,\n agent_id: row.agent_id as string,\n turn_number: row.turn_number as number,\n tool_name: row.tool_name as string,\n tool_input: (row.tool_input as string) ?? null,\n tool_output_summary: (row.tool_output_summary as string) ?? null,\n started_at: (row.started_at as number) ?? null,\n completed_at: (row.completed_at as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Insert a new agent turn.\n *\n * The `id` is auto-generated by the INTEGER PRIMARY KEY (AUTOINCREMENT).\n */\nexport function insertTurn(data: TurnInsert): TurnRow {\n const db = getDatabase();\n\n const info = db.prepare(\n `INSERT INTO agent_turns (\n run_id, agent_id, turn_number, tool_name,\n tool_input, tool_output_summary, started_at, completed_at\n ) VALUES (\n ?, ?, ?, ?,\n ?, ?, ?, ?\n )`,\n ).run(\n data.run_id,\n data.agent_id,\n data.turn_number,\n data.tool_name,\n data.tool_input ?? null,\n data.tool_output_summary ?? null,\n data.started_at ?? null,\n data.completed_at ?? null,\n );\n\n const turnId = Number(info.lastInsertRowid);\n\n return toTurnRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM agent_turns WHERE id = ?`).get(turnId) as Record<string, unknown>,\n );\n}\n\n/**\n * List all turns for a specific run, ordered by turn_number ASC.\n */\nexport function listTurns(runId: string): TurnRow[] {\n const db = getDatabase();\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agent_turns\n WHERE run_id = ?\n ORDER BY turn_number ASC`,\n ).all(runId) as Record<string, unknown>[];\n\n return rows.map(toTurnRow);\n}\n\n/**\n * List all agent turns for a run, ordered by turn_number ASC.\n *\n * Alias for `listTurns` with an explicit \"by run\" naming convention used\n * by the dashboard API layer.\n */\nexport function listTurnsByRun(runId: string): TurnRow[] {\n return listTurns(runId);\n}\n\n/** Count tool calls by name for a specific run. */\nexport function countToolCallsByRun(\n runId: string,\n toolNames: string[],\n): Record<string, number> {\n if (toolNames.length === 0) return {};\n const db = getDatabase();\n const placeholders = toolNames.map(() => '?').join(', ');\n const rows = db.prepare(\n `SELECT tool_name, COUNT(*) as count\n FROM agent_turns\n WHERE run_id = ? AND tool_name IN (${placeholders})\n GROUP BY tool_name`,\n ).all(runId, ...toolNames) as Array<{ tool_name: string; count: number }>;\n\n const result: Record<string, number> = {};\n for (const row of rows) {\n result[row.tool_name] = row.count;\n }\n return result;\n}\n"],"mappings":";;;;;;AA0CA,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAiB,aAAa,KAAK,IAAI;AAO7C,SAAS,UAAU,KAAuC;AACxD,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,QAAQ,IAAI;AAAA,IACZ,UAAU,IAAI;AAAA,IACd,aAAa,IAAI;AAAA,IACjB,WAAW,IAAI;AAAA,IACf,YAAa,IAAI,cAAyB;AAAA,IAC1C,qBAAsB,IAAI,uBAAkC;AAAA,IAC5D,YAAa,IAAI,cAAyB;AAAA,IAC1C,cAAe,IAAI,gBAA2B;AAAA,EAChD;AACF;AAWO,SAAS,WAAW,MAA2B;AACpD,QAAM,KAAK,YAAY;AAEvB,QAAM,OAAO,GAAG;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,EAAE;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,cAAc;AAAA,IACnB,KAAK,uBAAuB;AAAA,IAC5B,KAAK,cAAc;AAAA,IACnB,KAAK,gBAAgB;AAAA,EACvB;AAEA,QAAM,SAAS,OAAO,KAAK,eAAe;AAE1C,SAAO;AAAA,IACL,GAAG,QAAQ,UAAU,cAAc,gCAAgC,EAAE,IAAI,MAAM;AAAA,EACjF;AACF;AAKO,SAAS,UAAU,OAA0B;AAClD,QAAM,KAAK,YAAY;AAEvB,QAAM,OAAO,GAAG;AAAA,IACd,UAAU,cAAc;AAAA;AAAA;AAAA;AAAA,EAI1B,EAAE,IAAI,KAAK;AAEX,SAAO,KAAK,IAAI,SAAS;AAC3B;AAQO,SAAS,eAAe,OAA0B;AACvD,SAAO,UAAU,KAAK;AACxB;AAGO,SAAS,oBACd,OACA,WACwB;AACxB,MAAI,UAAU,WAAW,EAAG,QAAO,CAAC;AACpC,QAAM,KAAK,YAAY;AACvB,QAAM,eAAe,UAAU,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI;AACvD,QAAM,OAAO,GAAG;AAAA,IACd;AAAA;AAAA,0CAEsC,YAAY;AAAA;AAAA,EAEpD,EAAE,IAAI,OAAO,GAAG,SAAS;AAEzB,QAAM,SAAiC,CAAC;AACxC,aAAW,OAAO,MAAM;AACtB,WAAO,IAAI,SAAS,IAAI,IAAI;AAAA,EAC9B;AACA,SAAO;AACT;","names":[]}
|