@oxgeneral/orch 1.0.18 → 1.0.20
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/dist/{App-Q7J4JGDF.js → App-63TC4QG3.js} +1 -1
- package/dist/{chunk-NNF3VEVJ.js → chunk-WM64PSY4.js} +11 -5
- package/dist/chunk-WM64PSY4.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/{container-5FLJ4QYD.js → container-LVIBTBG4.js} +3 -3
- package/dist/index.d.ts +4 -4
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/orchestrator-53KIAROT.js +6 -0
- package/dist/{orchestrator-I3CXUOH7.js.map → orchestrator-53KIAROT.js.map} +1 -1
- package/dist/orchestrator-Z6C5OE4A.js +17 -0
- package/dist/{task-TTOAOVM7.js → task-NYQTJHKX.js} +1 -1
- package/dist/tui-DCZOKDPG.js +2 -0
- package/package.json +1 -1
- package/dist/chunk-NNF3VEVJ.js.map +0 -1
- package/dist/orchestrator-I3CXUOH7.js +0 -6
- package/dist/orchestrator-L34ZPKAB.js +0 -17
- package/dist/tui-IWCCSBDD.js +0 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/domain/model-tiers.ts","../src/domain/agent-shop.ts","../src/application/event-bus.ts","../src/application/agent-factory.ts","../src/application/task-service.ts","../src/application/agent-service.ts","../src/application/run-service.ts","../src/infrastructure/clipboard-service.ts","../src/domain/global-config.ts","../src/infrastructure/storage/index-manager.ts","../src/infrastructure/storage/task-store.ts","../src/infrastructure/storage/agent-store.ts","../src/infrastructure/storage/run-store.ts","../src/domain/state.ts","../src/infrastructure/storage/state-store.ts","../src/domain/config.ts","../src/infrastructure/storage/config-store.ts","../src/infrastructure/storage/global-config-store.ts","../src/infrastructure/storage/context-store.ts","../src/infrastructure/storage/message-store.ts","../src/domain/goal.ts","../src/infrastructure/storage/goal-store.ts","../src/infrastructure/storage/team-store.ts","../src/domain/message.ts","../src/application/message-service.ts","../src/application/goal-service.ts","../src/domain/team.ts","../src/application/team-service.ts","../src/container.ts"],"names":["nanoid","execFileCb","path","fs","isExpired","AdapterRegistry","SkillLoader","Orchestrator"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Model tier system — single source of truth for adapter → tier → model resolution.\n *\n * Agent Shop templates reference semantic tiers (capable / balanced / fast)\n * instead of hardcoded model strings. At instantiation time, the actual model\n * is resolved based on the user's chosen adapter.\n */\n\n/** The five supported adapter kinds. */\nexport type AdapterKind = 'claude' | 'opencode' | 'codex' | 'cursor' | 'shell';\n\n/**\n * Semantic capability tiers — adapter-agnostic.\n * capable — most powerful / highest quality (opus, gpt-5.4)\n * balanced — good quality + speed (sonnet, gpt-5.3-codex)\n * fast — cheapest / fastest (haiku, gpt-5-mini)\n */\nexport type ModelTier = 'capable' | 'balanced' | 'fast';\n\n/**\n * Tier → model mapping per adapter.\n *\n * Conventions:\n * - shell: '' for all tiers (model irrelevant)\n * - opencode: '' for balanced (delegate to opencode's own config)\n * - cursor: 'auto' for all tiers (Cursor handles selection)\n */\nexport const MODEL_TIER_MAP: Record<AdapterKind, Record<ModelTier, string>> = {\n claude: {\n capable: 'claude-opus-4-6',\n balanced: 'claude-sonnet-4-6',\n fast: 'claude-haiku-4-6',\n },\n opencode: {\n capable: 'openrouter/anthropic/claude-opus-4.6',\n balanced: '',\n fast: 'openrouter/google/gemini-2.5-flash',\n },\n codex: {\n capable: 'gpt-5.4',\n balanced: 'gpt-5.3-codex',\n fast: 'gpt-5-mini',\n },\n cursor: {\n capable: 'auto',\n balanced: 'auto',\n fast: 'auto',\n },\n shell: {\n capable: '',\n balanced: '',\n fast: '',\n },\n};\n\n/**\n * Resolve a concrete model string from adapter + tier.\n * Returns '' for unknown adapters (let the adapter decide).\n */\nexport function resolveModel(adapter: string, tier: ModelTier): string {\n const adapterMap = MODEL_TIER_MAP[adapter as AdapterKind];\n if (!adapterMap) return '';\n return adapterMap[tier];\n}\n\n/** Returns the default (balanced) model for the adapter. */\nexport function defaultModelForAdapter(adapter: string): string {\n return resolveModel(adapter, 'balanced');\n}\n\n/** Type guard: is a string a valid AdapterKind? */\nexport function isAdapterKind(value: string): value is AdapterKind {\n return value in MODEL_TIER_MAP;\n}\n\n/** Type guard: is a string a valid ModelTier? */\nexport function isModelTier(value: string): value is ModelTier {\n return value === 'capable' || value === 'balanced' || value === 'fast';\n}\n\n/** All supported adapter names in display order. */\nexport const SUPPORTED_ADAPTERS: readonly AdapterKind[] = ['claude', 'opencode', 'codex', 'cursor', 'shell'];\n","/**\n * ORCH Agent Shop — pre-built agent templates.\n *\n * Each template defines a ready-to-use agent with a detailed role prompt,\n * recommended model, skills, and approval policy. Users can browse the shop\n * via `orch shop` and add agents to their project with one command.\n *\n * Role prompts define the agent's identity and high-level approach.\n * Detailed methodology comes from library skills injected at runtime.\n */\n\nimport type { ApprovalPolicy } from './agent.js';\nimport type { ModelTier } from './model-tiers.js';\n\nexport interface AgentShopTemplate {\n key: string;\n name: string;\n description: string;\n tier: ModelTier;\n approval_policy: ApprovalPolicy;\n skills: string[];\n role: string;\n}\n\n// ---------------------------------------------------------------------------\n// Role prompts\n// ---------------------------------------------------------------------------\n\nconst BACKEND_DEV_ROLE = `Backend engineer — builds APIs, services, database layers, and server-side business logic.\n\n## WORKFLOW\n\n1) READ the task description and identify the scope: new endpoint, service refactor, DB migration, etc.\n2) EXPLORE the existing codebase to understand project structure, conventions, and dependencies.\n3) DESIGN the solution — define data models, API contracts, and error handling strategy. For non-trivial changes, outline the plan in a context message before coding.\n4) IMPLEMENT — write production code following the project's patterns (naming, folder structure, error classes).\n5) WRITE TESTS — add unit tests for new logic; ensure edge cases and error paths are covered.\n6) SELF-REVIEW — use the review skill methodology to check your own diff for security issues, N+1 queries, and missing validation.\n7) MARK DONE — commit to your worktree branch and transition the task to review.\n\n## RULES\n\n- Always work inside your assigned git worktree; never modify the main branch directly.\n- Follow existing project conventions for file naming, export style, and error handling.\n- Every public function must have at least one test.\n- Never store secrets or credentials in code — use environment variables.\n- Keep functions under 40 lines; extract helpers when complexity grows.\n- If the task is ambiguous, set context with your questions before coding.`;\n\nconst FRONTEND_DEV_ROLE = `Frontend engineer — builds React UI components, pages, styles, and client-side interactions.\n\n## WORKFLOW\n\n1) READ the task and identify the deliverable: new component, page, style fix, responsive layout, etc.\n2) EXPLORE the component tree and design system to find reusable primitives and naming conventions.\n3) PLAN the component hierarchy — props interface, state management, and data flow.\n4) IMPLEMENT — write components with proper TypeScript types, accessibility attributes, and responsive styles.\n5) STYLE — use the project's CSS approach (modules, Tailwind, styled-components) consistently. Check mobile, tablet, desktop breakpoints.\n6) TEST — add component tests for rendering, user interactions, and edge states (loading, empty, error).\n7) SELF-REVIEW — use the design-review skill to check accessibility, responsiveness, and visual consistency, then transition to review.\n\n## RULES\n\n- Components must be typed — no \\`any\\` props.\n- Always handle loading, error, and empty states explicitly.\n- Use semantic HTML elements (nav, main, section, button) — not div soup.\n- Keep components under 150 lines; extract sub-components when they grow.\n- Never hardcode colors or spacing — use design tokens / theme variables.\n- Ensure keyboard navigation and ARIA labels for interactive elements.`;\n\nconst QA_ENGINEER_ROLE = `QA engineer — writes tests, analyzes coverage, and ensures code quality across the project.\n\nUses the \\`qa\\` library skill for full QA methodology including browser testing, health scoring, bug triage, and fix loops. For report-only mode without auto-fixes, add \\`qa-only\\` skill instead.\n\n## WORKFLOW\n\n1) READ the task — determine what needs testing: new feature, regression, coverage gap, flaky test.\n2) ANALYZE existing coverage to identify untested paths and weak spots.\n3) PLAN the test matrix — list scenarios, edge cases, error paths, and boundary values.\n4) EXECUTE QA — follow the qa skill's phased approach: orient, explore, document, triage, fix, verify.\n5) WRITE TESTS — unit tests for logic, integration tests for services, e2e for critical flows.\n6) RUN the test suite and verify all new tests pass. Fix flaky tests if discovered.\n7) REPORT — generate a QA report with health score, coverage delta, and risks.\n\n## RULES\n\n- Tests must be deterministic — no reliance on timing, network, or random data without seeding.\n- Each test must have a clear description that explains WHAT is tested and WHY.\n- Never test implementation details — test behavior and contracts.\n- Mock external dependencies at the boundary, not deep inside the code.\n- Coverage targets: aim for >80% line coverage on new code, >90% on critical paths.\n- Flag any untestable code as a design smell and suggest refactoring.`;\n\nconst CODE_REVIEWER_ROLE = `Senior code reviewer — performs thorough PR reviews focused on correctness, security, maintainability, and adherence to project standards.\n\nUses the \\`review\\` library skill for structured two-pass review (Critical + Informational), auto-fix workflow, TODOS cross-reference, doc staleness checking, and adversarial review scaled by diff size.\n\n## WORKFLOW\n\n1) READ the task and the diff — understand the intent of the change, not just the code.\n2) EXPLORE context — check how the changed code integrates with the rest of the system.\n3) REVIEW — follow the review skill's multi-step methodology:\n a) Scope drift detection — did they build what was requested?\n b) Two-pass review: Critical issues first, then Informational.\n c) Fix-First approach — auto-fix what you can, batch-ask the rest.\n d) Adversarial review — auto-scaled by diff size (small/medium/large).\n4) WRITE FEEDBACK — be specific, cite line numbers, suggest concrete fixes. Distinguish blockers from nits.\n5) DECIDE — approve, request changes, or flag for architect review.\n\n## RULES\n\n- Always explain WHY something is a problem, not just WHAT to change.\n- Distinguish severity: blocker (must fix), suggestion (should fix), nit (optional).\n- Never approve code with known security issues, even if the task is urgent.\n- Be respectful — critique code, not the author.\n- If the change is too large to review safely, request it be split.\n- Check that tests exist for new logic; flag untested paths.`;\n\nconst ARCHITECT_ROLE = `Software architect and technical leader — makes system-level design decisions, defines architecture, and ensures technical coherence across the project.\n\nUses \\`plan-eng-review\\` for structured engineering review of technical plans, and \\`office-hours\\` for YC-style product thinking before major decisions.\n\n## WORKFLOW\n\n1) READ the task — understand the architectural question: new system, scaling challenge, tech debt, migration.\n2) EXPLORE the full codebase to map dependencies, layers, and boundaries.\n3) THINK — use the office-hours skill to challenge premises and explore alternatives before committing to a direction.\n4) ANALYZE trade-offs — document at least two alternative approaches with pros/cons for each.\n5) DESIGN the solution — define component boundaries, data flow, API contracts, and failure modes.\n6) REVIEW — use plan-eng-review to validate the technical plan against engineering standards.\n7) DOCUMENT the decision — write an ADR explaining the chosen approach and rejected alternatives.\n8) COMMUNICATE — set context for the team explaining the architectural direction and constraints.\n\n## RULES\n\n- Every architectural decision must have a documented rationale.\n- Prefer simple solutions over clever ones — complexity is a liability.\n- Design for failure — every external call can fail, every queue can back up.\n- Enforce layer boundaries — domain must not depend on infrastructure.\n- Never introduce a new technology without evaluating operational cost.\n- Think in interfaces first, implementations second.\n- Flag technical debt explicitly; don't let it accumulate silently.`;\n\nconst DEVOPS_ENGINEER_ROLE = `DevOps engineer — manages CI/CD pipelines, infrastructure, deployment automation, and cloud configuration.\n\nUses \\`ship\\` for automated deployment pipelines and \\`canary\\` for post-deploy monitoring. For production deployment verification, add \\`land-and-deploy\\` skill to the agent when needed.\n\n## WORKFLOW\n\n1) READ the task — identify the scope: pipeline fix, infra provisioning, deployment config, monitoring setup.\n2) EXPLORE current infrastructure and CI/CD config to understand the existing setup.\n3) DESIGN the change — plan the infrastructure or pipeline modification with rollback strategy.\n4) IMPLEMENT — write IaC (Terraform, CloudFormation, Docker, K8s manifests) or pipeline configs (GitHub Actions, GitLab CI).\n5) VALIDATE — dry-run or plan the change; verify no destructive modifications to production resources.\n6) DEPLOY — use the ship skill for structured deployment with health checks.\n7) MONITOR — use canary skill for post-deploy verification.\n8) DOCUMENT — update runbooks, env variable lists, and deployment docs.\n\n## RULES\n\n- Never hardcode credentials — use secret managers or environment injection.\n- Every infrastructure change must be idempotent and reversible.\n- Pipeline changes must be tested in a non-production environment first.\n- Always include health checks and rollback triggers in deployments.\n- Tag all cloud resources with project, environment, and owner.\n- Prefer declarative config over imperative scripts.\n- Monitor cost implications of infrastructure changes.`;\n\nconst BUG_HUNTER_ROLE = `Bug hunter — finds, reproduces, and diagnoses bugs through systematic investigation and proposes minimal fixes.\n\nUses the \\`investigate\\` library skill for structured debugging with root cause methodology, 3-strike hypothesis testing, scope lock, and 5-file blast radius check.\n\n## WORKFLOW\n\n1) READ the bug report — extract symptoms, reproduction steps, and expected behavior.\n2) INVESTIGATE — follow the investigate skill's phased approach:\n a) Collect symptoms and trace the execution path.\n b) Scope lock — freeze edits to the affected module.\n c) Form hypotheses and test them (3-strike rule).\n d) Implement minimal fix with regression test.\n e) Verify with 5-file blast radius check.\n3) REPRODUCE — write a failing test that captures the bug before attempting any fix.\n4) FIX — apply the minimal change that resolves the root cause. Avoid collateral refactoring.\n5) VERIFY — confirm the failing test now passes and no existing tests regress.\n6) REPORT — structured debug report explaining root cause, fix, and related areas.\n\n## RULES\n\n- Always reproduce the bug with a test BEFORE fixing it.\n- Fix the root cause, not the symptom — band-aids create more bugs.\n- Keep fixes minimal and focused — one bug per task, no scope creep.\n- Check for the same bug pattern elsewhere in the codebase.\n- Never suppress errors to hide bugs — surface them properly.\n- If the bug is in a dependency, document the workaround and file upstream.`;\n\nconst TECH_WRITER_ROLE = `Technical writer — creates and maintains documentation, READMEs, API references, guides, and inline code comments.\n\nUses \\`document-release\\` for automated post-ship documentation updates, ensuring docs stay in sync with code changes.\n\n## WORKFLOW\n\n1) READ the task — determine the documentation need: new feature docs, API reference, migration guide, README update.\n2) EXPLORE the codebase to understand the feature, its API surface, configuration options, and edge cases.\n3) OUTLINE the document structure — headings, sections, and key points to cover.\n4) WRITE using clear, concise language:\n - Lead with the most important information (inverted pyramid).\n - Include working code examples for every API or configuration option.\n - Add diagrams or tables where they clarify complex relationships.\n5) REVIEW — check for accuracy against the actual code, test that code examples work.\n6) PUBLISH — commit the documentation and set context for the team.\n\n## RULES\n\n- Documentation must match the current code — outdated docs are worse than no docs.\n- Every public API must have: description, parameters, return type, and at least one example.\n- Use active voice and second person (\"you can configure…\" not \"it can be configured…\").\n- Keep sentences under 25 words; paragraphs under 5 sentences.\n- Code examples must be complete and runnable — no pseudo-code in docs.\n- Never document internal implementation details in user-facing docs.`;\n\nconst MARKETER_ROLE = `Marketing strategist — develops positioning, messaging, copy, and campaign strategies using marketing psychology principles.\n\nUses \\`office-hours\\` for product reframing and premise challenge before crafting positioning.\n\n## WORKFLOW\n\n1) READ the task — identify the marketing objective: positioning, landing page copy, campaign plan, competitor analysis.\n2) THINK — use office-hours to challenge assumptions and reframe the product from the customer's perspective.\n3) RESEARCH the product and market — understand the target audience, pain points, and competitive landscape.\n4) STRATEGIZE — define messaging pillars, value propositions, and differentiation angles.\n5) CREATE the deliverable:\n - Copy: headlines, body text, CTAs — with A/B variants.\n - Strategy: channel plan, funnel stages, KPIs.\n - Analysis: competitive matrix, SWOT, positioning map.\n6) REVIEW — check for clarity, consistency, and alignment with brand voice.\n7) DELIVER — commit artifacts and set context with rationale for the chosen approach.\n\n## RULES\n\n- Always lead with customer benefits, not product features.\n- Every claim must be substantiated — no empty superlatives (\"best\", \"revolutionary\").\n- Include measurable KPIs for every campaign recommendation.\n- Respect brand voice and tone guidelines if they exist.\n- A/B test assumptions — never assume you know what converts.\n- Keep copy scannable: short paragraphs, bullet points, clear hierarchy.`;\n\nconst CONTENT_CREATOR_ROLE = `Content creator — writes blog posts, articles, social media content, and educational materials that drive engagement and authority.\n\n## WORKFLOW\n\n1) READ the task — understand the content goal: thought leadership, tutorial, announcement, social post.\n2) RESEARCH the topic — gather key points, statistics, and angles that resonate with the target audience.\n3) OUTLINE the content structure — hook, key sections, CTA. For long-form, plan 3-5 main sections.\n4) WRITE the first draft:\n - Hook the reader in the first two sentences.\n - Use concrete examples and data points.\n - End with a clear call-to-action.\n5) EDIT — tighten prose, eliminate jargon, ensure logical flow.\n6) DELIVER — commit the content and set context with publishing recommendations.\n\n## RULES\n\n- Every piece must have a clear audience and goal defined upfront.\n- Use the inverted pyramid — most important information first.\n- Paragraphs max 3-4 sentences for readability.\n- Include at least one concrete example or data point per section.\n- Never plagiarize — all content must be original.\n- Optimize for the target platform (blog post ≠ tweet ≠ LinkedIn post).`;\n\nconst GROWTH_HACKER_ROLE = `Growth hacker — designs and implements data-driven growth experiments to improve acquisition, activation, retention, and revenue.\n\n## WORKFLOW\n\n1) READ the task — identify the growth lever: onboarding funnel, activation rate, retention loop, referral mechanism.\n2) ANALYZE current metrics — map the funnel, identify drop-off points, and size opportunities.\n3) HYPOTHESIZE — formulate a testable hypothesis: \"If we [change X], then [metric Y] will improve by [Z%] because [reason].\"\n4) DESIGN the experiment — define the test, control group, success metric, sample size, and duration.\n5) IMPLEMENT — build the experiment (feature flag, A/B test, new flow) if code changes are needed.\n6) REPORT — document the experiment design, expected impact, and measurement plan.\n\n## RULES\n\n- Every experiment must have a written hypothesis BEFORE implementation.\n- Define success metrics and minimum detectable effect upfront.\n- Run one experiment per funnel stage at a time to avoid confounding.\n- Prioritize experiments by ICE score (Impact × Confidence × Ease).\n- Never ship a \"growth hack\" that degrades user experience long-term.\n- Document results of every experiment, including failures — they are data.`;\n\nconst SECURITY_AUDITOR_ROLE = `Security auditor — performs security analysis, identifies vulnerabilities, and recommends hardening measures following OWASP and industry best practices.\n\nUses the \\`review\\` skill for structured code review with security focus, and \\`careful\\`/\\`guard\\` skills for safety guardrails on destructive operations.\n\n## WORKFLOW\n\n1) READ the task — determine the audit scope: full codebase review, specific feature, dependency check, or incident response.\n2) EXPLORE the attack surface — map entry points (APIs, forms, file uploads), auth boundaries, and data flows.\n3) AUDIT systematically:\n a) OWASP Top 10 — injection, broken auth, XSS, CSRF, insecure deserialization.\n b) Dependency vulnerabilities — outdated packages, known CVEs.\n c) Secrets — hardcoded credentials, API keys in code or config.\n d) Access control — missing authorization checks, privilege escalation paths.\n e) Data protection — encryption at rest/transit, PII exposure, logging sensitive data.\n4) CLASSIFY findings by severity: Critical, High, Medium, Low — with CVSS-like scoring.\n5) RECOMMEND fixes — provide specific, actionable remediation steps for each finding.\n6) REPORT — commit the audit report and set context with a prioritized action plan.\n\n## RULES\n\n- Never ignore a vulnerability because \"it's unlikely to be exploited\" — document everything.\n- Always verify findings — no false positive reports. Reproduce or prove the vulnerability.\n- Classify severity honestly — don't inflate or downplay.\n- Check both application code AND configuration (CORS, headers, TLS, CSP).\n- Recommend defense-in-depth — never rely on a single security control.\n- Flag any plaintext secrets immediately as Critical, even in test code.`;\n\nconst PERFORMANCE_ENGINEER_ROLE = `Performance engineer — profiles, benchmarks, and optimizes code for speed, memory efficiency, and scalability.\n\nUses the \\`benchmark\\` library skill for structured performance benchmarking with before/after metrics, regression detection, and reporting.\n\n## WORKFLOW\n\n1) READ the task — identify the performance concern: slow endpoint, high memory usage, scaling bottleneck, build time.\n2) MEASURE first — use the benchmark skill to profile the current state, establish baseline metrics (latency, throughput, memory, CPU).\n3) ANALYZE — identify hotspots, bottlenecks, and inefficient patterns. Look for:\n - O(n^2) or worse algorithms where O(n log n) or O(n) is possible.\n - Unnecessary allocations, memory leaks, missing cleanup.\n - N+1 queries, missing indexes, unoptimized joins.\n - Blocking I/O on the main thread, missing parallelism.\n4) OPTIMIZE — apply targeted fixes. One optimization per commit for clear attribution.\n5) BENCHMARK — use the benchmark skill to measure improvement against baseline. Report absolute numbers and percentage change.\n6) DOCUMENT — set context with before/after metrics and explain the optimization rationale.\n\n## RULES\n\n- Always measure BEFORE and AFTER — no optimization without numbers.\n- Optimize the bottleneck, not the code you like refactoring.\n- Prefer algorithmic improvements over micro-optimizations.\n- Never sacrifice readability for marginal performance gains.\n- Profile in realistic conditions — not with trivial test data.\n- Watch for regressions — optimization in one area can degrade another.`;\n\nconst DATA_ENGINEER_ROLE = `Data engineer — builds data pipelines, ETL processes, analytics queries, and data infrastructure.\n\n## WORKFLOW\n\n1) READ the task — identify the data need: new pipeline, query optimization, schema migration, analytics report.\n2) EXPLORE existing data models and pipelines to understand the current data architecture.\n3) DESIGN the data flow — source, transformation steps, destination, error handling, and idempotency strategy.\n4) IMPLEMENT:\n - Schema changes with migrations (never modify in place).\n - ETL logic with proper error handling and retry.\n - Queries optimized for the target database engine.\n5) TEST — validate with representative data samples; check edge cases (nulls, duplicates, encoding, timezone).\n6) DOCUMENT — schema diagrams, pipeline dependencies, SLA expectations.\n\n## RULES\n\n- Every schema change must have a reversible migration.\n- Pipelines must be idempotent — safe to re-run without duplicating data.\n- Always validate data at ingestion boundaries — never trust upstream data.\n- Handle NULLs, duplicates, and encoding issues explicitly.\n- Log pipeline metrics: rows processed, duration, error count.\n- Never run DELETE or UPDATE without a WHERE clause and a backup plan.`;\n\nconst FULLSTACK_DEV_ROLE = `Full-stack developer — works across the entire stack, from database and API to UI components and styling.\n\nUses \\`review\\` for self-review of diffs before transitioning, and \\`design-review\\` for frontend visual consistency checks.\n\n## WORKFLOW\n\n1) READ the task — identify scope: does it span backend and frontend, or is it a vertical slice of a feature?\n2) EXPLORE both backend and frontend code to understand existing patterns and data flow end-to-end.\n3) PLAN the implementation — define the API contract first (request/response shapes), then plan UI components that consume it.\n4) IMPLEMENT BACKEND:\n - Data model, validation, service logic, API endpoint.\n - Error handling with proper HTTP status codes and messages.\n5) IMPLEMENT FRONTEND:\n - Components, state management, API integration.\n - Loading, error, and empty states.\n - Responsive layout and accessibility.\n6) TEST — backend unit/integration tests + frontend component tests. Verify the full data flow works end-to-end.\n7) SELF-REVIEW — use the review skill to check your own diff holistically before transitioning.\n\n## RULES\n\n- Define the API contract before writing any code — frontend and backend must agree.\n- Never duplicate validation — validate on the backend, display errors on the frontend.\n- Keep frontend and backend changes in the same branch for atomic features.\n- Follow each layer's conventions independently — backend patterns for backend, frontend patterns for frontend.\n- Handle every error state in the UI — users should never see a blank screen.\n- If a task is too large to deliver end-to-end, split it and communicate the dependency.`;\n\n// ---------------------------------------------------------------------------\n// Template catalog\n// ---------------------------------------------------------------------------\n\nexport const AGENT_SHOP_TEMPLATES: AgentShopTemplate[] = [\n {\n key: 'backend-dev',\n name: 'Backend Developer',\n description: 'APIs, databases, backend services',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['review', 'careful', 'feature-dev:feature-dev', 'feature-dev:code-explorer'],\n role: BACKEND_DEV_ROLE,\n },\n {\n key: 'frontend-dev',\n name: 'Frontend Developer',\n description: 'React, UI components, CSS, responsive design',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['design-review', 'review', 'feature-dev:feature-dev', 'feature-dev:code-explorer'],\n role: FRONTEND_DEV_ROLE,\n },\n {\n key: 'qa-engineer',\n name: 'QA Engineer',\n description: 'Test writing, coverage analysis, quality assurance, browser testing',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['qa', 'testing-suite:generate-tests', 'testing-suite:test-coverage'],\n role: QA_ENGINEER_ROLE,\n },\n {\n key: 'code-reviewer',\n name: 'Code Reviewer',\n description: 'PR review with auto-fix, adversarial review, security checks',\n tier: 'capable',\n approval_policy: 'suggest',\n skills: ['review', 'careful', 'feature-dev:code-reviewer', 'feature-dev:code-explorer'],\n role: CODE_REVIEWER_ROLE,\n },\n {\n key: 'architect',\n name: 'Architect',\n description: 'System design, architecture decisions, tech leadership',\n tier: 'capable',\n approval_policy: 'suggest',\n skills: ['plan-eng-review', 'office-hours', 'feature-dev:code-architect', 'feature-dev:code-explorer'],\n role: ARCHITECT_ROLE,\n },\n {\n key: 'devops-engineer',\n name: 'DevOps Engineer',\n description: 'CI/CD, infrastructure, deployment, monitoring',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['ship', 'canary', 'devops-automation:cloud-architect'],\n role: DEVOPS_ENGINEER_ROLE,\n },\n {\n key: 'bug-hunter',\n name: 'Bug Hunter',\n description: 'Systematic debugging, root cause analysis, minimal fixes',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['investigate', 'careful', 'feature-dev:feature-dev', 'feature-dev:code-explorer'],\n role: BUG_HUNTER_ROLE,\n },\n {\n key: 'tech-writer',\n name: 'Technical Writer',\n description: 'Documentation, READMEs, API docs, release notes',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['document-release', 'review', 'feature-dev:code-explorer'],\n role: TECH_WRITER_ROLE,\n },\n {\n key: 'marketer',\n name: 'Marketer',\n description: 'Marketing strategy, positioning, copy, campaigns',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['office-hours'],\n role: MARKETER_ROLE,\n },\n {\n key: 'content-creator',\n name: 'Content Creator',\n description: 'Blog posts, articles, social media content',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['office-hours'],\n role: CONTENT_CREATOR_ROLE,\n },\n {\n key: 'growth-hacker',\n name: 'Growth Hacker',\n description: 'Growth experiments, analytics, user acquisition',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['office-hours', 'feature-dev:feature-dev'],\n role: GROWTH_HACKER_ROLE,\n },\n {\n key: 'security-auditor',\n name: 'Security Auditor',\n description: 'Security scanning, vulnerability analysis, OWASP, guardrails',\n tier: 'capable',\n approval_policy: 'suggest',\n skills: ['review', 'careful', 'guard', 'feature-dev:code-reviewer'],\n role: SECURITY_AUDITOR_ROLE,\n },\n {\n key: 'performance-engineer',\n name: 'Performance Engineer',\n description: 'Optimization, profiling, benchmarks, load testing',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['benchmark', 'investigate', 'feature-dev:feature-dev', 'feature-dev:code-explorer'],\n role: PERFORMANCE_ENGINEER_ROLE,\n },\n {\n key: 'data-engineer',\n name: 'Data Engineer',\n description: 'Data pipelines, ETL, analytics, SQL',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['careful', 'feature-dev:feature-dev', 'feature-dev:code-explorer'],\n role: DATA_ENGINEER_ROLE,\n },\n {\n key: 'fullstack-dev',\n name: 'Full-Stack Developer',\n description: 'End-to-end development, frontend and backend',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['review', 'design-review', 'feature-dev:feature-dev', 'feature-dev:code-explorer'],\n role: FULLSTACK_DEV_ROLE,\n },\n];\n\n/** All known shop template keys. */\nexport type AgentShopKey =\n | 'backend-dev' | 'frontend-dev' | 'qa-engineer' | 'code-reviewer'\n | 'architect' | 'devops-engineer' | 'bug-hunter' | 'tech-writer'\n | 'marketer' | 'content-creator' | 'growth-hacker' | 'security-auditor'\n | 'performance-engineer' | 'data-engineer' | 'fullstack-dev';\n\n/** Look up a shop template by its key. */\nexport function getShopTemplateByKey(key: string): AgentShopTemplate | undefined {\n return AGENT_SHOP_TEMPLATES.find((t) => t.key === key);\n}\n","/**\n * Typed event bus.\n *\n * The single communication channel between all layers.\n * Synchronous emit — handlers run inline.\n * TUI, logger, run store, state all subscribe independently.\n */\n\nimport type {\n OrchestratorEvent,\n OrchestratorEventType,\n EventPayload,\n} from '../domain/events.js';\n\ntype Handler<T> = (event: T) => void;\n\nexport class EventBus {\n private handlers = new Map<string, Set<Handler<any>>>();\n private wildcardHandlers = new Set<Handler<OrchestratorEvent>>();\n private maxListeners: number = 10;\n private warnedTypes = new Set<string>();\n\n /**\n * Set the maximum number of listeners per event type before a warning is emitted.\n * Helps detect memory leaks from repeated subscriptions in watch mode.\n */\n setMaxListeners(n: number): void {\n this.maxListeners = n;\n }\n\n getMaxListeners(): number {\n return this.maxListeners;\n }\n\n /**\n * Get the number of listeners for a specific event type.\n */\n listenerCount(type: OrchestratorEventType): number {\n return this.handlers.get(type)?.size ?? 0;\n }\n\n /**\n * Subscribe to events of a specific type.\n * Returns an unsubscribe function.\n */\n on<T extends OrchestratorEventType>(\n type: T,\n handler: Handler<EventPayload<T>>,\n ): () => void {\n if (!this.handlers.has(type)) {\n this.handlers.set(type, new Set());\n }\n const set = this.handlers.get(type)!;\n set.add(handler);\n\n // Warn once per type when listener count exceeds maxListeners\n if (this.maxListeners > 0 && set.size > this.maxListeners && !this.warnedTypes.has(type)) {\n this.warnedTypes.add(type);\n console.warn(\n `EventBus: possible memory leak detected. ${set.size} listeners added for \"${type}\". ` +\n `Use setMaxListeners() to increase limit if this is intentional.`,\n );\n }\n\n return () => this.off(type, handler);\n }\n\n /**\n * Subscribe to an event type, auto-unsubscribe after first call.\n */\n once<T extends OrchestratorEventType>(\n type: T,\n handler: Handler<EventPayload<T>>,\n ): () => void {\n const wrapper: Handler<EventPayload<T>> = (event) => {\n this.off(type, wrapper);\n handler(event);\n };\n return this.on(type, wrapper);\n }\n\n /**\n * Unsubscribe a handler from an event type.\n */\n off<T extends OrchestratorEventType>(\n type: T,\n handler: Handler<EventPayload<T>>,\n ): void {\n this.handlers.get(type)?.delete(handler);\n }\n\n /**\n * Emit an event synchronously to all subscribed handlers.\n */\n emit(event: OrchestratorEvent): void {\n const typed = this.handlers.get(event.type);\n if (typed) this.dispatchToSet(typed, event, 'handler');\n this.dispatchToSet(this.wildcardHandlers, event, 'wildcard handler');\n }\n\n private dispatchToSet(handlers: Iterable<Handler<any>>, event: OrchestratorEvent, label: string): void {\n for (const handler of handlers) {\n try {\n handler(event);\n } catch (err) {\n console.error(`EventBus ${label} error for \"${event.type}\":`, err);\n }\n }\n }\n\n /**\n * Subscribe to ALL events regardless of type.\n */\n onAny(handler: Handler<OrchestratorEvent>): () => void {\n this.wildcardHandlers.add(handler);\n\n if (\n this.maxListeners > 0 &&\n this.wildcardHandlers.size > this.maxListeners &&\n !this.warnedTypes.has('*')\n ) {\n this.warnedTypes.add('*');\n console.warn(\n `EventBus: possible memory leak detected. ${this.wildcardHandlers.size} wildcard listeners added. ` +\n `Use setMaxListeners() to increase limit if this is intentional.`,\n );\n }\n\n return () => { this.wildcardHandlers.delete(handler); };\n }\n\n /**\n * Remove all handlers.\n */\n clear(): void {\n this.handlers.clear();\n this.wildcardHandlers.clear();\n this.warnedTypes.clear();\n }\n}\n","/**\n * Agent factory — converts shop templates into CreateAgentInput.\n *\n * Resolves adapter-specific model from the template's semantic tier\n * and filters MCP skills (colon-format) for non-Claude adapters.\n */\n\nimport type { AgentShopTemplate } from '../domain/agent-shop.js';\nimport type { CreateAgentInput } from '../domain/agent.js';\nimport { resolveModel } from '../domain/model-tiers.js';\n\n/** MCP skills use colon-separated names (e.g. `package:skill-name`). */\nexport function isMcpSkill(skill: string): boolean {\n return skill.includes(':');\n}\n\n/**\n * Convert a shop template into CreateAgentInput for the given adapter.\n *\n * - Resolves the concrete model string from adapter + tier\n * - Filters out MCP skills for non-Claude adapters (they only work with Claude CLI)\n */\nexport function templateToAgentInput(\n template: AgentShopTemplate,\n adapter: string,\n): CreateAgentInput {\n const model = resolveModel(adapter, template.tier);\n const skills = adapter === 'claude'\n ? template.skills\n : template.skills.filter((s) => !isMcpSkill(s));\n\n return {\n name: template.name,\n adapter,\n model: model || undefined,\n role: template.role,\n skills,\n approval_policy: template.approval_policy,\n };\n}\n","/**\n * Task service — business logic for task lifecycle.\n *\n * Validates state transitions, emits events, manages CRUD.\n * CLI commands call this service, not storage directly.\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { nanoid } from 'nanoid';\nimport type { Task, CreateTaskInput, TaskStatus } from '../domain/task.js';\nimport { canTransition, isTerminal } from '../domain/transitions.js';\nimport {\n TaskNotFoundError,\n InvalidTransitionError,\n InvalidArgumentsError,\n} from '../domain/errors.js';\nimport type { ITaskStore } from '../infrastructure/storage/interfaces.js';\nimport type { Paths } from '../infrastructure/storage/paths.js';\nimport type { OrchestratorConfig } from '../domain/config.js';\nimport type { EventBus } from './event-bus.js';\nimport { ensureDir } from '../infrastructure/storage/fs-utils.js';\n\nexport class TaskService {\n constructor(\n private readonly taskStore: ITaskStore,\n private readonly eventBus: EventBus,\n private readonly config: OrchestratorConfig,\n private readonly paths?: Paths,\n ) {}\n\n async create(input: CreateTaskInput): Promise<Task> {\n if (!input.title.trim()) {\n throw new InvalidArgumentsError('Task title is required');\n }\n\n const priority = input.priority ?? this.config.defaults.task.priority;\n if (!Number.isInteger(priority) || priority < 1 || priority > 4) {\n throw new InvalidArgumentsError('Priority must be an integer between 1 and 4');\n }\n\n if (input.depends_on?.length) {\n const results = await Promise.all(\n input.depends_on.map(async (depId) => ({ depId, exists: !!(await this.taskStore.get(depId)) })),\n );\n const missing = results.filter((r) => !r.exists).map((r) => r.depId);\n if (missing.length > 0) {\n throw new InvalidArgumentsError(\n `Unknown depends_on task ID(s): ${missing.join(', ')}`,\n );\n }\n }\n\n const now = new Date().toISOString();\n const task: Task = {\n id: `tsk_${nanoid(7)}`,\n title: input.title.trim(),\n description: input.description?.trim() ?? '',\n status: 'todo',\n priority,\n assignee: input.assignee,\n labels: input.labels ?? [],\n depends_on: input.depends_on ?? [],\n created_at: now,\n updated_at: now,\n attempts: 0,\n max_attempts: input.max_attempts ?? this.config.defaults.task.max_attempts,\n workspace_mode: input.workspace_mode,\n review_criteria: input.review_criteria,\n scope: input.scope,\n goalId: input.goalId,\n };\n\n if (input.attachments?.length && this.paths) {\n const attachmentNames = await this.copyAttachments(task.id, input.attachments);\n task.attachments = attachmentNames;\n }\n\n await this.taskStore.save(task);\n this.eventBus.emit({ type: 'task:created', task });\n\n return task;\n }\n\n async list(filter?: { status?: TaskStatus; goalId?: string }): Promise<Task[]> {\n return this.taskStore.list(filter);\n }\n\n async get(id: string): Promise<Task> {\n const task = await this.taskStore.get(id);\n if (!task) throw new TaskNotFoundError(id);\n return task;\n }\n\n async updateStatus(id: string, newStatus: TaskStatus): Promise<Task> {\n const task = await this.get(id);\n const oldStatus = task.status;\n\n if (!canTransition(oldStatus, newStatus)) {\n throw new InvalidTransitionError(id, oldStatus, newStatus);\n }\n\n task.status = newStatus;\n task.updated_at = new Date().toISOString();\n await this.taskStore.save(task);\n\n this.eventBus.emit({\n type: 'task:status_changed',\n taskId: id,\n from: oldStatus,\n to: newStatus,\n });\n\n return task;\n }\n\n async assign(taskId: string, agentId: string): Promise<Task> {\n const task = await this.get(taskId);\n task.assignee = agentId;\n task.updated_at = new Date().toISOString();\n await this.taskStore.save(task);\n\n this.eventBus.emit({\n type: 'task:assigned',\n taskId,\n agentId,\n });\n\n return task;\n }\n\n async cancel(id: string): Promise<Task> {\n const task = await this.get(id);\n\n if (isTerminal(task.status)) {\n throw new InvalidTransitionError(id, task.status, 'cancelled');\n }\n\n return this.updateStatus(id, 'cancelled');\n }\n\n async retry(id: string): Promise<Task> {\n const task = await this.get(id);\n\n if (task.status !== 'failed' && task.status !== 'cancelled') {\n throw new InvalidTransitionError(id, task.status, 'todo');\n }\n\n const oldStatus = task.status;\n task.status = 'todo';\n task.attempts = 0;\n task.updated_at = new Date().toISOString();\n await this.taskStore.save(task);\n\n this.eventBus.emit({\n type: 'task:status_changed',\n taskId: id,\n from: oldStatus,\n to: 'todo',\n });\n\n return task;\n }\n\n async reject(id: string, feedback?: string): Promise<Task> {\n const task = await this.get(id);\n\n if (task.status !== 'review') {\n throw new InvalidTransitionError(id, task.status, 'todo');\n }\n\n const oldStatus = task.status;\n task.status = 'todo';\n task.attempts = 0;\n task.feedback = feedback;\n task.updated_at = new Date().toISOString();\n await this.taskStore.save(task);\n\n this.eventBus.emit({\n type: 'task:status_changed',\n taskId: id,\n from: oldStatus,\n to: 'todo',\n });\n\n return task;\n }\n\n async update(id: string, fields: { title?: string; description?: string; priority?: number; labels?: string[]; attachments?: string[] }): Promise<Task> {\n const task = await this.get(id);\n\n if (fields.title !== undefined) {\n if (!fields.title.trim()) throw new InvalidArgumentsError('Task title cannot be empty');\n task.title = fields.title.trim();\n }\n if (fields.description !== undefined) task.description = fields.description.trim();\n if (fields.priority !== undefined) {\n if (!Number.isInteger(fields.priority) || fields.priority < 1 || fields.priority > 4) {\n throw new InvalidArgumentsError('Priority must be an integer between 1 and 4');\n }\n task.priority = fields.priority;\n }\n if (fields.labels !== undefined) task.labels = fields.labels;\n if (fields.attachments?.length && this.paths) {\n const attachmentNames = await this.copyAttachments(id, fields.attachments);\n task.attachments = [...(task.attachments ?? []), ...attachmentNames];\n }\n\n task.updated_at = new Date().toISOString();\n await this.taskStore.save(task);\n return task;\n }\n\n async delete(id: string): Promise<void> {\n const task = await this.get(id);\n if (task.status === 'in_progress') {\n throw new InvalidArgumentsError('Cannot delete a running task. Cancel it first.');\n }\n await this.taskStore.delete(id);\n\n if (this.paths) {\n const dir = this.paths.taskAttachmentsDir(id);\n await fs.rm(dir, { recursive: true, force: true });\n }\n }\n\n getAttachmentPath(taskId: string, filename: string): string {\n if (!this.paths) {\n throw new InvalidArgumentsError('Paths not configured');\n }\n return path.join(this.paths.taskAttachmentsDir(taskId), filename);\n }\n\n private async copyAttachments(taskId: string, sourcePaths: string[]): Promise<string[]> {\n if (!this.paths) return [];\n\n const dir = this.paths.taskAttachmentsDir(taskId);\n await ensureDir(dir);\n\n // Validate all files exist first\n await Promise.all(\n sourcePaths.map(async (srcPath) => {\n try {\n await fs.access(srcPath);\n } catch {\n throw new InvalidArgumentsError(`Attachment file not found: ${srcPath}`);\n }\n }),\n );\n\n // Copy all files in parallel\n const names = await Promise.all(\n sourcePaths.map(async (srcPath) => {\n const basename = path.basename(srcPath);\n await fs.copyFile(srcPath, path.join(dir, basename));\n return basename;\n }),\n );\n\n return names;\n }\n\n async incrementAttempts(id: string): Promise<Task> {\n const task = await this.get(id);\n task.attempts += 1;\n task.updated_at = new Date().toISOString();\n await this.taskStore.save(task);\n return task;\n }\n}\n","/**\n * Agent service — business logic for agent lifecycle.\n *\n * Manages agent CRUD, availability, and task assignment matching.\n */\n\nimport { nanoid } from 'nanoid';\nimport type { Agent, CreateAgentInput, AgentStatus } from '../domain/agent.js';\nimport type { Task } from '../domain/task.js';\nimport { AgentNotFoundError, InvalidArgumentsError } from '../domain/errors.js';\nimport type { IAgentStore, IStateStore } from '../infrastructure/storage/interfaces.js';\nimport type { OrchestratorConfig } from '../domain/config.js';\nimport type { EventBus } from './event-bus.js';\n\nexport class AgentService {\n constructor(\n private readonly agentStore: IAgentStore,\n private readonly stateStore: IStateStore,\n private readonly eventBus: EventBus,\n private readonly config: OrchestratorConfig,\n ) {}\n\n async create(input: CreateAgentInput): Promise<Agent> {\n if (!input.name.trim()) {\n throw new InvalidArgumentsError('Agent name is required');\n }\n\n // Check for duplicate name\n const existing = await this.agentStore.getByName(input.name);\n if (existing) {\n throw new InvalidArgumentsError(`Agent \"${input.name}\" already exists`);\n }\n\n const agent: Agent = {\n id: `agt_${nanoid(7)}`,\n name: input.name.trim(),\n adapter: input.adapter || this.config.defaults.agent.adapter,\n role: input.role,\n config: {\n command: input.command,\n model: input.model,\n effort: input.effort,\n approval_policy: input.approval_policy ?? this.config.defaults.agent.approval_policy,\n max_turns: input.max_turns ?? this.config.defaults.agent.max_turns,\n timeout_ms: input.timeout_ms ?? this.config.defaults.agent.timeout_ms,\n stall_timeout_ms: input.stall_timeout_ms ?? this.config.defaults.agent.stall_timeout_ms,\n env: input.env,\n system_prompt: input.system_prompt,\n workspace_mode: input.workspace_mode,\n skills: input.skills,\n },\n status: 'idle',\n stats: {\n tasks_completed: 0,\n tasks_failed: 0,\n total_runs: 0,\n total_runtime_ms: 0,\n },\n };\n\n await this.agentStore.save(agent);\n return agent;\n }\n\n async list(): Promise<Agent[]> {\n return this.agentStore.list();\n }\n\n async get(id: string): Promise<Agent> {\n const agent = await this.agentStore.get(id);\n if (!agent) throw new AgentNotFoundError(id);\n return agent;\n }\n\n async remove(id: string): Promise<void> {\n const agent = await this.get(id);\n if (agent.status === 'running') {\n // Check if actually running (has entry in state.running)\n const state = await this.stateStore.read();\n const isActuallyRunning = Object.values(state.running).some((e) => e.agent_id === id);\n if (isActuallyRunning) {\n throw new InvalidArgumentsError('Cannot remove a running agent. Stop it first.');\n }\n // Agent stuck in 'running' with no active run — reset and allow delete\n agent.status = 'idle';\n await this.agentStore.save(agent);\n }\n await this.agentStore.delete(id);\n }\n\n async update(id: string, fields: { name?: string; role?: string; model?: string; effort?: Agent['config']['effort']; approval_policy?: Agent['config']['approval_policy'] }): Promise<Agent> {\n const agent = await this.get(id);\n\n if (fields.name !== undefined) {\n if (!fields.name.trim()) throw new InvalidArgumentsError('Agent name cannot be empty');\n // Check for duplicate name (excluding self)\n const existing = await this.agentStore.getByName(fields.name.trim());\n if (existing && existing.id !== id) {\n throw new InvalidArgumentsError(`Agent \"${fields.name}\" already exists`);\n }\n agent.name = fields.name.trim();\n }\n if (fields.role !== undefined) agent.role = fields.role || undefined;\n if (fields.model !== undefined) agent.config.model = fields.model || undefined;\n if (fields.effort !== undefined) agent.config.effort = fields.effort || undefined;\n if (fields.approval_policy !== undefined) agent.config.approval_policy = fields.approval_policy;\n\n await this.agentStore.save(agent);\n return agent;\n }\n\n async disable(id: string): Promise<Agent> {\n return this.setStatus(id, 'disabled');\n }\n\n async enable(id: string): Promise<Agent> {\n return this.setStatus(id, 'idle');\n }\n\n async setAutonomous(id: string, enabled: boolean): Promise<Agent> {\n const agent = await this.get(id);\n agent.autonomous = enabled;\n await this.agentStore.save(agent);\n this.eventBus.emit({ type: 'agent:autonomous_toggled', agentId: id, autonomous: enabled });\n return agent;\n }\n\n async setStatus(id: string, status: AgentStatus): Promise<Agent> {\n const agent = await this.get(id);\n agent.status = status;\n await this.agentStore.save(agent);\n return agent;\n }\n\n async updateStats(\n id: string,\n update: Partial<Agent['stats']>,\n ): Promise<Agent> {\n const agent = await this.get(id);\n Object.assign(agent.stats, update);\n await this.agentStore.save(agent);\n return agent;\n }\n\n /**\n * Find the best available agent for a task using scoring.\n *\n * Scoring:\n * - Explicit assignee match = 100\n * - Skill match with task labels = 50 per match\n * - Role match with task labels = 30\n * - Idle status bonus = 20\n * - Success rate bonus = 0–10 (scaled by completed / total)\n */\n async findBestAgent(task: Task): Promise<Agent | null> {\n const agents = await this.agentStore.list();\n const available = agents.filter(\n (a) => a.status === 'idle',\n );\n\n if (available.length === 0) return null;\n\n // Explicit assignee — hard constraint\n if (task.assignee) {\n const assigned = agents.find((a) => a.id === task.assignee);\n if (assigned && assigned.status === 'idle') return assigned;\n return null;\n }\n\n // Pre-compute lowercase task labels once\n const lowerLabels = task.labels?.length\n ? task.labels.map((l) => l.toLowerCase())\n : undefined;\n\n // Score each available agent\n const scored = available.map((agent) => {\n let score = 0;\n\n // Skill match with task labels: 50 per matching skill\n if (lowerLabels && agent.config.skills?.length) {\n const skillSet = new Set(agent.config.skills.map((s) => s.toLowerCase()));\n for (const label of lowerLabels) {\n if (skillSet.has(label)) {\n score += 50;\n }\n }\n }\n\n // Role match with task labels: 30\n if (lowerLabels && agent.role) {\n const lowerRole = agent.role.toLowerCase();\n if (lowerLabels.some((l) => lowerRole.includes(l))) {\n score += 30;\n }\n }\n\n // Idle bonus\n if (agent.status === 'idle') {\n score += 20;\n }\n\n // Success rate bonus: 0–10\n const totalTasks = agent.stats.tasks_completed + agent.stats.tasks_failed;\n if (totalTasks > 0) {\n score += Math.round((agent.stats.tasks_completed / totalTasks) * 10);\n }\n\n return { agent, score };\n });\n\n // Sort descending by score\n scored.sort((a, b) => b.score - a.score);\n\n return scored[0]?.agent ?? null;\n }\n}\n","/**\n * Run service — manages run lifecycle and event streaming.\n */\n\nimport { nanoid } from 'nanoid';\nimport type { Run, RunEvent, RunStatus, TokenUsage } from '../domain/run.js';\nimport type { IRunStore } from '../infrastructure/storage/interfaces.js';\nimport type { EventBus } from './event-bus.js';\n\nexport class RunService {\n constructor(\n private readonly runStore: IRunStore,\n private readonly eventBus: EventBus,\n ) {}\n\n async create(params: {\n taskId: string;\n agentId: string;\n attempt: number;\n prompt: string;\n workspacePath: string;\n }): Promise<Run> {\n const run: Run = {\n id: `run_${nanoid(7)}`,\n task_id: params.taskId,\n agent_id: params.agentId,\n attempt: params.attempt,\n status: 'preparing',\n started_at: new Date().toISOString(),\n workspace_path: params.workspacePath,\n prompt: params.prompt,\n };\n\n await this.runStore.save(run);\n return run;\n }\n\n async get(id: string): Promise<Run | null> {\n return this.runStore.get(id);\n }\n\n async start(id: string, pid: number): Promise<Run> {\n const run = await this.runStore.get(id);\n if (!run) throw new Error(`Run not found: ${id}`);\n\n run.status = 'running';\n run.pid = pid;\n await this.runStore.save(run);\n\n this.eventBus.emit({\n type: 'agent:started',\n agentId: run.agent_id,\n taskId: run.task_id,\n runId: id,\n });\n\n return run;\n }\n\n async finish(\n id: string,\n status: RunStatus,\n tokens?: TokenUsage,\n error?: string,\n ): Promise<Run> {\n const run = await this.runStore.get(id);\n if (!run) throw new Error(`Run not found: ${id}`);\n\n run.status = status;\n run.finished_at = new Date().toISOString();\n run.tokens = tokens;\n run.error = error;\n await this.runStore.save(run);\n\n this.eventBus.emit({\n type: 'agent:completed',\n runId: id,\n agentId: run.agent_id,\n success: status === 'succeeded',\n });\n\n return run;\n }\n\n async appendEvent(runId: string, event: RunEvent): Promise<void> {\n await this.runStore.appendEvent(runId, event);\n }\n\n async listAll(): Promise<Run[]> {\n return this.runStore.listAll();\n }\n\n async listForTask(taskId: string): Promise<Run[]> {\n return this.runStore.listForTask(taskId);\n }\n\n async listForAgent(agentId: string): Promise<Run[]> {\n return this.runStore.listForAgent(agentId);\n }\n\n async readEvents(runId: string): Promise<RunEvent[]> {\n return this.runStore.readEvents(runId);\n }\n\n async readEventsTail(runId: string, count: number): Promise<RunEvent[]> {\n return this.runStore.readEventsTail(runId, count);\n }\n\n /**\n * Get error and last N lines of output from the most recent failed run for a task.\n * Used to provide retry context so agents can learn from previous failures.\n */\n async getLastFailedRunContext(\n taskId: string,\n ): Promise<{ error: string; output: string } | null> {\n const runs = await this.runStore.listForTask(taskId);\n const failedRun = runs\n .filter((r) => r.status === 'failed')\n .sort((a, b) => (b.finished_at ?? '').localeCompare(a.finished_at ?? ''))\n [0];\n\n if (!failedRun) return null;\n\n const error = failedRun.error ?? 'Unknown error';\n\n // Read last 50 events (sufficient for retry context, prevents OOM on large runs)\n let output = '';\n try {\n const events = await this.runStore.readEventsTail(failedRun.id, 50);\n output = events\n .filter((e) => e.type === 'agent_output' || e.type === 'error')\n .map((e) => (typeof e.data === 'string' ? e.data : JSON.stringify(e.data)))\n .join('\\n');\n } catch {\n // Events file may not exist — that's fine\n }\n\n return { error, output };\n }\n}\n","/**\n * Clipboard service for detecting and extracting images from the system clipboard.\n *\n * Platform support:\n * - macOS: osascript (clipboard info / clipboard as PNGf)\n * - Linux: xclip -selection clipboard\n * - Windows: PowerShell Get-Clipboard\n */\n\nimport { execFile as execFileCb, execFileSync } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { writeFile, readFile, unlink, mkdtemp, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { OrchestryError } from '../domain/errors.js';\n\nconst execFile = promisify(execFileCb);\n\nconst EXEC_TIMEOUT_MS = 3_000;\n\nexport type ClipboardContentType = 'image' | 'text' | 'empty';\n\nexport interface ClipboardImage {\n data: Buffer;\n ext: string;\n}\n\n/**\n * Checks whether the required clipboard tool is available on this platform.\n *\n * - macOS: pbpaste (always present)\n * - Linux: xclip\n * - Windows: PowerShell (always present)\n */\nexport function isClipboardToolAvailable(): boolean {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n // pbpaste/osascript are always available on macOS\n return true;\n }\n\n if (platform === 'linux') {\n try {\n execFileSync('which', ['xclip'], { timeout: EXEC_TIMEOUT_MS, stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n if (platform === 'win32') {\n // PowerShell is always available on modern Windows\n return true;\n }\n\n return false;\n}\n\n/**\n * Detects the type of content currently in the system clipboard.\n *\n * Returns 'image' if the clipboard contains an image (PNG or TIFF),\n * 'text' if it contains text, or 'empty' if the clipboard is empty.\n */\nexport async function detectClipboardType(): Promise<ClipboardContentType> {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return detectMacOS();\n }\n\n if (platform === 'linux') {\n return detectLinux();\n }\n\n if (platform === 'win32') {\n return detectWindows();\n }\n\n throw new OrchestryError(\n `Unsupported platform for clipboard: ${platform}`,\n 1,\n 'Supported: macOS, Linux, Windows',\n );\n}\n\n/**\n * Extracts an image from the system clipboard.\n *\n * Returns the image data as a Buffer with its file extension,\n * or null if the clipboard does not contain an image.\n */\nexport async function getClipboardImage(): Promise<ClipboardImage | null> {\n const type = await detectClipboardType();\n if (type !== 'image') return null;\n\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return getImageMacOS();\n }\n\n if (platform === 'linux') {\n return getImageLinux();\n }\n\n if (platform === 'win32') {\n return getImageWindows();\n }\n\n return null;\n}\n\n// ─── macOS ────────────────────────────────────────────────────────────────────\n\nasync function detectMacOS(): Promise<ClipboardContentType> {\n try {\n const { stdout } = await execFile('osascript', ['-e', 'clipboard info'], {\n timeout: EXEC_TIMEOUT_MS,\n });\n\n if (stdout.includes('«class PNGf»') || stdout.includes('«class TIFF»')) {\n return 'image';\n }\n\n if (stdout.includes('«class ut16»') || stdout.includes('«class utf8»')) {\n return 'text';\n }\n\n // If clipboard info returned something but not text or image\n return stdout.trim().length > 0 ? 'text' : 'empty';\n } catch {\n return 'empty';\n }\n}\n\nasync function getImageMacOS(): Promise<ClipboardImage | null> {\n const dir = await mkdtemp(join(tmpdir(), 'orch-clip-'));\n const filePath = join(dir, 'clipboard.png');\n\n try {\n // AppleScript to write clipboard image (as PNG) to a temp file\n const script = `\n set theFile to POSIX file \"${filePath}\"\n try\n set imgData to the clipboard as «class PNGf»\n set fRef to open for access theFile with write permission\n write imgData to fRef\n close access fRef\n return \"ok\"\n on error\n try\n close access theFile\n end try\n return \"error\"\n end try\n `;\n\n const { stdout } = await execFile('osascript', ['-e', script], {\n timeout: EXEC_TIMEOUT_MS,\n });\n\n if (stdout.trim() !== 'ok') return null;\n\n const data = await readFile(filePath);\n return { data, ext: 'png' };\n } catch {\n return null;\n } finally {\n // Cleanup temp file\n try {\n await unlink(filePath);\n } catch {\n // Ignore cleanup errors\n }\n try {\n await rm(dir, { recursive: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n// ─── Linux ────────────────────────────────────────────────────────────────────\n\nasync function detectLinux(): Promise<ClipboardContentType> {\n try {\n const { stdout } = await execFile(\n 'xclip',\n ['-selection', 'clipboard', '-t', 'TARGETS', '-o'],\n { timeout: EXEC_TIMEOUT_MS },\n );\n\n const targets = stdout.toLowerCase();\n\n if (targets.includes('image/png') || targets.includes('image/tiff') || targets.includes('image/jpeg')) {\n return 'image';\n }\n\n if (targets.includes('text/plain') || targets.includes('utf8_string') || targets.includes('string')) {\n return 'text';\n }\n\n return targets.trim().length > 0 ? 'text' : 'empty';\n } catch {\n return 'empty';\n }\n}\n\nasync function getImageLinux(): Promise<ClipboardImage | null> {\n try {\n const { stdout } = await execFile(\n 'xclip',\n ['-selection', 'clipboard', '-t', 'image/png', '-o'],\n { timeout: EXEC_TIMEOUT_MS, encoding: 'buffer' as unknown as BufferEncoding, maxBuffer: 50 * 1024 * 1024 },\n );\n\n // stdout is a Buffer when encoding is 'buffer'\n const data = Buffer.isBuffer(stdout) ? stdout : Buffer.from(stdout, 'binary');\n if (data.length === 0) return null;\n\n return { data, ext: 'png' };\n } catch {\n return null;\n }\n}\n\n// ─── Windows ──────────────────────────────────────────────────────────────────\n\nasync function detectWindows(): Promise<ClipboardContentType> {\n try {\n // Check for image first\n const { stdout: imgCheck } = await execFile(\n 'powershell',\n ['-NoProfile', '-Command', 'if (Get-Clipboard -Format Image) { \"image\" } else { \"none\" }'],\n { timeout: EXEC_TIMEOUT_MS },\n );\n\n if (imgCheck.trim() === 'image') return 'image';\n\n // Check for text\n const { stdout: textCheck } = await execFile(\n 'powershell',\n ['-NoProfile', '-Command', 'if (Get-Clipboard) { \"text\" } else { \"empty\" }'],\n { timeout: EXEC_TIMEOUT_MS },\n );\n\n return textCheck.trim() === 'text' ? 'text' : 'empty';\n } catch {\n return 'empty';\n }\n}\n\nasync function getImageWindows(): Promise<ClipboardImage | null> {\n const dir = await mkdtemp(join(tmpdir(), 'orch-clip-'));\n const filePath = join(dir, 'clipboard.png');\n\n try {\n const script = `\n Add-Type -AssemblyName System.Windows.Forms\n $img = [System.Windows.Forms.Clipboard]::GetImage()\n if ($img) {\n $img.Save('${filePath.replace(/\\\\/g, '\\\\\\\\')}', [System.Drawing.Imaging.ImageFormat]::Png)\n Write-Output 'ok'\n } else {\n Write-Output 'error'\n }\n `;\n\n const { stdout } = await execFile('powershell', ['-NoProfile', '-Command', script], {\n timeout: EXEC_TIMEOUT_MS,\n });\n\n if (stdout.trim() !== 'ok') return null;\n\n const data = await readFile(filePath);\n return { data, ext: 'png' };\n } catch {\n return null;\n } finally {\n try {\n await unlink(filePath);\n } catch {\n // Ignore cleanup errors\n }\n try {\n await rm(dir, { recursive: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n","/**\n * Global configuration — persists across projects.\n *\n * Stored at ~/.orchestry/global.yml\n */\n\n/** Activity feed filter preset name */\nexport type ActivityFilterPreset = 'all' | 'text' | 'tools' | 'errors' | 'events';\n\nexport interface NotificationPreferences {\n toast: boolean;\n bell: boolean;\n}\n\nexport interface TuiPreferences {\n activity_filter: ActivityFilterPreset;\n notifications: NotificationPreferences;\n}\n\nexport interface GlobalConfig {\n tui: TuiPreferences;\n}\n\nexport const DEFAULT_GLOBAL_CONFIG: GlobalConfig = {\n tui: {\n activity_filter: 'all',\n notifications: { toast: true, bell: false },\n },\n};\n","/**\n * Generic index manager for file-based stores.\n *\n * Encapsulates the readIndex/rebuildIndex/writeIndex/updateIndex pattern\n * shared by TaskStore, AgentStore, and ContextStore.\n *\n * Each store keeps individual files (YAML or JSON) and an _index.json cache\n * for fast list() calls. IndexManager handles index I/O and rebuild logic.\n */\n\nimport path from 'node:path';\nimport { listFiles, readYaml, readJson, writeJson, ensureDir } from './fs-utils.js';\n\n/** Configuration for how to read individual item files. */\nexport interface IndexManagerConfig<T> {\n /** Directory containing the individual files and _index.json. */\n dir: string;\n\n /** File extension for individual item files (e.g. '.yml', '.json'). */\n ext: '.yml' | '.json';\n\n /** Resolve the full path for an item given its extracted ID. */\n itemPath: (id: string) => string;\n\n /**\n * Optional filter for file names during rebuildIndex scan.\n * Return false to exclude a file (e.g. '_index.json' for .json stores).\n * By default, no files are excluded.\n */\n fileFilter?: (fileName: string) => boolean;\n\n /**\n * Read a single item file. Defaults to readYaml for .yml, readJson for .json.\n * Can be overridden for custom deserialization.\n */\n readItem?: (filePath: string) => Promise<T | null>;\n}\n\n/**\n * Generic index manager that handles _index.json caching for file-based stores.\n *\n * @typeParam T - The stored item type. Must be an object (items are filtered via !== null).\n */\nexport class IndexManager<T> {\n private readonly indexPath: string;\n private readonly dir: string;\n private readonly ext: string;\n private readonly itemPath: (id: string) => string;\n private readonly fileFilter: (fileName: string) => boolean;\n private readonly readItemFn: (filePath: string) => Promise<T | null>;\n\n /** Promise-chain mutex to serialize updateIndex read-modify-write cycles. */\n private mutex: Promise<void> = Promise.resolve();\n\n /** True while executing inside withMutex — prevents re-entrant deadlock. */\n private insideMutex = false;\n\n constructor(config: IndexManagerConfig<T>) {\n this.dir = config.dir;\n this.ext = config.ext;\n this.itemPath = config.itemPath;\n this.indexPath = path.join(config.dir, '_index.json');\n\n this.fileFilter = config.fileFilter ?? (() => true);\n\n if (config.readItem) {\n this.readItemFn = config.readItem;\n } else if (config.ext === '.yml') {\n this.readItemFn = (fp) => readYaml<T>(fp);\n } else {\n this.readItemFn = (fp) => readJson<T>(fp);\n }\n }\n\n /**\n * Read the index file. Falls back to rebuilding from individual files\n * if the index is missing or corrupt.\n */\n async readIndex(): Promise<T[]> {\n try {\n const entries = await readJson<T[]>(this.indexPath);\n if (Array.isArray(entries)) return entries;\n } catch {\n // Corrupted JSON — fall through to rebuild\n }\n return this.rebuildIndex();\n }\n\n /**\n * Rebuild the index by reading all individual item files.\n * Used as fallback when _index.json is missing or corrupted.\n *\n * When called from outside the mutex (standalone), the write is serialized\n * through {@link withMutex} to prevent races with concurrent updateIndex.\n * When called from within the mutex (e.g. updateIndex → readIndex fallback),\n * it writes directly to avoid re-entrant deadlock.\n */\n async rebuildIndex(): Promise<T[]> {\n await ensureDir(this.dir);\n const files = await listFiles(this.dir, this.ext);\n\n const results = await Promise.all(\n files\n .filter(this.fileFilter)\n .map((file) => {\n const id = file.replace(this.ext, '');\n return this.readItemFn(this.itemPath(id));\n }),\n );\n\n const items: T[] = [];\n for (const item of results) {\n if (item != null) items.push(item);\n }\n\n // If already inside the mutex (called via updateIndex → readIndex),\n // write directly to avoid deadlock. Otherwise serialize through mutex.\n if (this.insideMutex) {\n await this.writeIndexUnsafe(items);\n } else {\n await this.withMutex(() => this.writeIndexUnsafe(items));\n }\n return items;\n }\n\n /**\n * Write the index file atomically.\n * Serialized through the mutex to prevent races with concurrent updateIndex.\n */\n async writeIndex(items: T[]): Promise<void> {\n return this.withMutex(() => this.writeIndexUnsafe(items));\n }\n\n /**\n * Apply a mutation to the index and write it back.\n *\n * Serialized through a promise-chain mutex to prevent TOCTOU races\n * where parallel callers could overwrite each other's changes\n * (e.g. two `orch task add` invocations losing data).\n */\n async updateIndex(fn: (items: T[]) => T[]): Promise<void> {\n return this.withMutex(async () => {\n const current = await this.readIndex();\n const updated = fn(current);\n await this.writeIndexUnsafe(updated);\n });\n }\n\n /** Internal write without mutex — called only from within withMutex. */\n private async writeIndexUnsafe(items: T[]): Promise<void> {\n await ensureDir(this.dir);\n await writeJson(this.indexPath, items);\n }\n\n /** Promise-chain mutex: serializes all index-mutating operations. */\n private withMutex<R>(fn: () => Promise<R>): Promise<R> {\n let release: () => void;\n const next = new Promise<void>((resolve) => { release = resolve; });\n const prev = this.mutex;\n this.mutex = next;\n return prev.then(async () => {\n this.insideMutex = true;\n try {\n return await fn();\n } finally {\n this.insideMutex = false;\n release!();\n }\n });\n }\n}\n","/**\n * File-based task store.\n *\n * Tasks are stored as individual YAML files in .orchestry/tasks/.\n * An _index.json file caches the full list for fast list() calls.\n * All writes are atomic (temp → rename).\n */\n\nimport type { Task, TaskStatus } from '../../domain/task.js';\nimport type { ITaskStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { ensureDir, writeYaml, readYaml } from './fs-utils.js';\nimport { IndexManager } from './index-manager.js';\nimport fs from 'node:fs/promises';\n\nexport class TaskStore implements ITaskStore {\n private readonly index: IndexManager<Task>;\n\n constructor(private readonly paths: Paths) {\n this.index = new IndexManager<Task>({\n dir: paths.tasksDir,\n ext: '.yml',\n itemPath: (id) => paths.taskPath(id),\n });\n }\n\n async list(filter?: { status?: TaskStatus; goalId?: string }): Promise<Task[]> {\n const all = await this.index.readIndex();\n\n const tasks = all.filter(\n (task): task is Task =>\n task !== null &&\n (!filter?.status || task.status === filter.status) &&\n (!filter?.goalId || task.goalId === filter.goalId),\n );\n\n return tasks.sort((a, b) => {\n const statusOrder = statusPriority(a.status) - statusPriority(b.status);\n if (statusOrder !== 0) return statusOrder;\n const bTime = b.updated_at ?? '';\n const aTime = a.updated_at ?? '';\n return bTime < aTime ? -1 : bTime > aTime ? 1 : 0;\n });\n }\n\n async get(id: string): Promise<Task | null> {\n return readYaml<Task>(this.paths.taskPath(id));\n }\n\n async save(task: Task): Promise<void> {\n await ensureDir(this.paths.tasksDir);\n await writeYaml(this.paths.taskPath(task.id), task);\n await this.index.updateIndex((idx) => {\n const filtered = idx.filter((t) => t.id !== task.id);\n filtered.push(task);\n return filtered;\n });\n }\n\n async delete(id: string): Promise<void> {\n try {\n await fs.unlink(this.paths.taskPath(id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n await this.index.updateIndex((idx) => idx.filter((t) => t.id !== id));\n }\n}\n\nfunction statusPriority(status: TaskStatus): number {\n const order: Record<TaskStatus, number> = {\n in_progress: 0,\n retrying: 1,\n review: 2,\n todo: 3,\n done: 4,\n failed: 5,\n cancelled: 6,\n };\n return order[status];\n}\n","/**\n * File-based agent store.\n *\n * Agents are stored as individual YAML files in .orchestry/agents/.\n * An _index.json file caches the full list for fast list() calls.\n * All writes are atomic (temp → rename).\n */\n\nimport type { Agent } from '../../domain/agent.js';\nimport type { IAgentStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { ensureDir, writeYaml, readYaml } from './fs-utils.js';\nimport { IndexManager } from './index-manager.js';\nimport fs from 'node:fs/promises';\n\nexport class AgentStore implements IAgentStore {\n private readonly index: IndexManager<Agent>;\n\n constructor(private readonly paths: Paths) {\n this.index = new IndexManager<Agent>({\n dir: paths.agentsDir,\n ext: '.yml',\n itemPath: (id) => paths.agentPath(id),\n });\n }\n\n async list(): Promise<Agent[]> {\n return this.index.readIndex();\n }\n\n async get(id: string): Promise<Agent | null> {\n return readYaml<Agent>(this.paths.agentPath(id));\n }\n\n async getByName(name: string): Promise<Agent | null> {\n const agents = await this.list();\n return agents.find((a) => a.name === name) ?? null;\n }\n\n async save(agent: Agent): Promise<void> {\n await ensureDir(this.paths.agentsDir);\n await writeYaml(this.paths.agentPath(agent.id), agent);\n await this.index.updateIndex((idx) => {\n const filtered = idx.filter((a) => a.id !== agent.id);\n filtered.push(agent);\n return filtered;\n });\n }\n\n async delete(id: string): Promise<void> {\n try {\n await fs.unlink(this.paths.agentPath(id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n await this.index.updateIndex((idx) => idx.filter((a) => a.id !== id));\n }\n}\n","/**\n * File-based run store.\n *\n * Run metadata: .orchestry/runs/<id>.json (atomic write)\n * Run events: .orchestry/runs/<id>.jsonl (append-only)\n */\n\nimport type { Run, RunEvent } from '../../domain/run.js';\nimport type { IRunStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport {\n readJson,\n writeJson,\n appendJsonl,\n readJsonl,\n readJsonlTail,\n closeAppendHandle,\n ensureDir,\n listFiles,\n pathExists,\n} from './fs-utils.js';\nimport { createReadStream } from 'node:fs';\n\nexport class RunStore implements IRunStore {\n constructor(private readonly paths: Paths) {}\n\n async save(run: Run): Promise<void> {\n await ensureDir(this.paths.runsDir);\n await writeJson(this.paths.runPath(run.id), run);\n }\n\n async get(id: string): Promise<Run | null> {\n return readJson<Run>(this.paths.runPath(id));\n }\n\n async listAll(): Promise<Run[]> {\n return this.listFiltered(() => true);\n }\n\n async listForTask(taskId: string): Promise<Run[]> {\n return this.listFiltered((run) => run.task_id === taskId);\n }\n\n async listForAgent(agentId: string): Promise<Run[]> {\n return this.listFiltered((run) => run.agent_id === agentId);\n }\n\n async appendEvent(runId: string, event: RunEvent): Promise<void> {\n await ensureDir(this.paths.runsDir);\n await appendJsonl(this.paths.runEventsPath(runId), event);\n }\n\n async readEvents(runId: string): Promise<RunEvent[]> {\n return readJsonl<RunEvent>(this.paths.runEventsPath(runId));\n }\n\n /**\n * Read the last N events for a run without loading the entire JSONL file.\n */\n async readEventsTail(runId: string, count: number): Promise<RunEvent[]> {\n return readJsonlTail<RunEvent>(this.paths.runEventsPath(runId), count);\n }\n\n closeRunEvents(runId: string): void {\n closeAppendHandle(this.paths.runEventsPath(runId));\n }\n\n async *streamEvents(runId: string, signal?: AbortSignal): AsyncGenerator<RunEvent> {\n const filePath = this.paths.runEventsPath(runId);\n\n // Wait for file to exist (max 30s to avoid infinite polling)\n const deadline = Date.now() + 30_000;\n while (!signal?.aborted && Date.now() < deadline) {\n if (await pathExists(filePath)) break;\n await new Promise((r) => setTimeout(r, 100));\n }\n\n if (signal?.aborted || Date.now() >= deadline) return;\n\n const stream = createReadStream(filePath);\n\n const { readLines } = await import('../process/process-manager.js');\n\n try {\n for await (const line of readLines(stream)) {\n if (signal?.aborted) break;\n if (line.trim()) {\n try {\n yield JSON.parse(line) as RunEvent;\n } catch {\n process.stderr.write(`[RunStore] skipping corrupt JSONL line: ${line.slice(0, 200)}\\n`);\n }\n }\n }\n } finally {\n stream.destroy();\n }\n }\n\n private async listFiltered(predicate: (run: Run) => boolean): Promise<Run[]> {\n await ensureDir(this.paths.runsDir);\n const files = await listFiles(this.paths.runsDir, '.json');\n\n // Batch reads to avoid EMFILE (macOS default ulimit 256)\n const BATCH = 64;\n const all: Run[] = [];\n for (let i = 0; i < files.length; i += BATCH) {\n const batch = files.slice(i, i + BATCH);\n const results = await Promise.all(\n batch.map(file => {\n const id = file.endsWith('.json') ? file.slice(0, -5) : file;\n return readJson<Run>(this.paths.runPath(id));\n }),\n );\n for (const run of results) {\n if (run !== null && predicate(run)) all.push(run);\n }\n }\n\n return all.sort(\n (a, b) => new Date(b.started_at).getTime() - new Date(a.started_at).getTime(),\n );\n }\n}\n","/**\n * Orchestrator runtime state.\n *\n * Persisted in .orchestry/state.json.\n * Updated on every mutation. Not intended for git.\n */\n\nimport type { TokenUsage } from './run.js';\n\nexport interface RunningEntry {\n run_id: string;\n agent_id: string;\n task_id: string;\n pid: number;\n started_at: string;\n last_event_at: string;\n}\n\nexport interface RetryEntry {\n task_id: string;\n attempt: number;\n due_at: string;\n error: string;\n}\n\nexport interface OrchestratorState {\n version: 1;\n pid?: number;\n started_at?: string;\n onboardingCompleted?: boolean;\n running: Record<string, RunningEntry>;\n claimed: Set<string>;\n retry_queue: RetryEntry[];\n stats: {\n total_runs: number;\n total_tasks_completed: number;\n total_tasks_failed: number;\n total_tokens: TokenUsage;\n total_runtime_ms: number;\n };\n}\n\nexport const DEFAULT_STATE: OrchestratorState = {\n version: 1,\n onboardingCompleted: false,\n running: {},\n claimed: new Set<string>(),\n retry_queue: [],\n stats: {\n total_runs: 0,\n total_tasks_completed: 0,\n total_tasks_failed: 0,\n total_tokens: { input: 0, output: 0, reasoning: 0, total: 0, cache_read: 0, cache_write: 0 },\n total_runtime_ms: 0,\n },\n};\n","/**\n * File-based orchestrator state store.\n *\n * State is stored in .orchestry/state.json.\n * Updated atomically on every mutation.\n */\n\nimport { DEFAULT_STATE, type OrchestratorState } from '../../domain/state.js';\nimport type { IStateStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { readJson, writeJson } from './fs-utils.js';\n\nexport class StateStore implements IStateStore {\n constructor(private readonly paths: Paths) {}\n\n async read(): Promise<OrchestratorState> {\n const raw = await readJson<Partial<OrchestratorState>>(this.paths.statePath);\n if (!raw) return structuredClone(DEFAULT_STATE);\n\n const defaults = structuredClone(DEFAULT_STATE);\n return {\n version: raw.version ?? defaults.version,\n pid: raw.pid,\n started_at: raw.started_at,\n onboardingCompleted: typeof raw.onboardingCompleted === 'boolean' ? raw.onboardingCompleted : false,\n running:\n raw.running && typeof raw.running === 'object' ? raw.running : defaults.running,\n claimed: Array.isArray(raw.claimed) ? new Set<string>(raw.claimed) : new Set<string>(defaults.claimed),\n retry_queue: Array.isArray(raw.retry_queue) ? raw.retry_queue : defaults.retry_queue,\n stats: {\n total_runs: raw.stats?.total_runs ?? defaults.stats.total_runs,\n total_tasks_completed:\n raw.stats?.total_tasks_completed ?? defaults.stats.total_tasks_completed,\n total_tasks_failed: raw.stats?.total_tasks_failed ?? defaults.stats.total_tasks_failed,\n total_tokens: {\n ...defaults.stats.total_tokens,\n ...(raw.stats?.total_tokens ?? {}),\n },\n total_runtime_ms: raw.stats?.total_runtime_ms ?? defaults.stats.total_runtime_ms,\n },\n };\n }\n\n async write(state: OrchestratorState): Promise<void> {\n const serializable = { ...state, claimed: Array.from(state.claimed) };\n await writeJson(this.paths.statePath, serializable);\n }\n}\n","/**\n * Configuration domain model.\n *\n * Represents the structure of .orchestry/config.yml\n */\n\nimport type { ApprovalPolicy } from './agent.js';\nimport type { WorkspaceMode } from './task.js';\n\nexport interface ProjectConfig {\n name: string;\n description?: string;\n}\n\nexport interface AgentDefaults {\n adapter: string;\n approval_policy: ApprovalPolicy;\n max_turns: number;\n timeout_ms: number;\n stall_timeout_ms: number;\n workspace_mode: WorkspaceMode;\n}\n\nexport interface TaskDefaults {\n max_attempts: number;\n priority: number;\n}\n\nexport interface SchedulingConfig {\n poll_interval_ms: number;\n max_concurrent_agents: number;\n retry_base_delay_ms: number;\n retry_max_delay_ms: number;\n}\n\nexport interface OrchestratorConfig {\n project: ProjectConfig;\n defaults: {\n agent: AgentDefaults;\n task: TaskDefaults;\n };\n scheduling: SchedulingConfig;\n prompt?: {\n template?: string;\n system_template?: string;\n user_template?: string;\n };\n}\n\nexport const DEFAULT_CONFIG: OrchestratorConfig = {\n project: {\n name: 'my-project',\n },\n defaults: {\n agent: {\n adapter: 'claude',\n approval_policy: 'auto',\n max_turns: 50,\n timeout_ms: 3_600_000,\n stall_timeout_ms: 600_000,\n workspace_mode: 'worktree',\n },\n task: {\n max_attempts: 3,\n priority: 3,\n },\n },\n scheduling: {\n poll_interval_ms: 10_000,\n max_concurrent_agents: 6,\n retry_base_delay_ms: 10_000,\n retry_max_delay_ms: 300_000,\n },\n};\n","/**\n * File-based config store.\n *\n * Reads/writes .orchestry/config.yml.\n * Supports dot-notation access for get/set.\n */\n\nimport { DEFAULT_CONFIG, type OrchestratorConfig } from '../../domain/config.js';\nimport type { IConfigStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { readYaml, writeYaml } from './fs-utils.js';\n\nexport class ConfigStore implements IConfigStore {\n constructor(private readonly paths: Paths) {}\n\n async read(): Promise<OrchestratorConfig> {\n const config = await readYaml<Record<string, unknown>>(this.paths.configPath);\n return deepMerge(\n DEFAULT_CONFIG as unknown as Record<string, unknown>,\n config ?? {},\n ) as unknown as OrchestratorConfig;\n }\n\n async write(config: OrchestratorConfig): Promise<void> {\n await writeYaml(this.paths.configPath, config as unknown as Record<string, unknown>);\n }\n\n async get(keyPath: string): Promise<unknown> {\n const config = await this.read();\n return getByPath(config as unknown as Record<string, unknown>, keyPath);\n }\n\n async set(keyPath: string, value: unknown): Promise<void> {\n const config = await this.read();\n setByPath(config as unknown as Record<string, unknown>, keyPath, value);\n await this.write(config);\n }\n}\n\nfunction getByPath(obj: Record<string, unknown>, keyPath: string): unknown {\n const keys = keyPath.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return current;\n}\n\nfunction setByPath(obj: Record<string, unknown>, keyPath: string, value: unknown): void {\n const keys = keyPath.split('.');\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]!;\n if (typeof current[key] !== 'object' || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = keys[keys.length - 1]!;\n current[lastKey] = value;\n}\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result = { ...target };\n\n for (const key of Object.keys(source)) {\n const sourceVal = source[key];\n const targetVal = result[key];\n\n if (\n sourceVal !== null &&\n sourceVal !== undefined &&\n typeof sourceVal === 'object' &&\n !Array.isArray(sourceVal) &&\n typeof targetVal === 'object' &&\n targetVal !== null &&\n !Array.isArray(targetVal)\n ) {\n result[key] = deepMerge(\n targetVal as Record<string, unknown>,\n sourceVal as Record<string, unknown>,\n );\n } else {\n result[key] = sourceVal;\n }\n }\n\n return result;\n}\n","/**\n * Global config store — reads/writes ~/.orchestry/global.yml\n *\n * Persists across projects. Creates directory if needed.\n */\n\nimport path from 'node:path';\nimport { homedir } from 'node:os';\nimport { mkdir } from 'node:fs/promises';\nimport { DEFAULT_GLOBAL_CONFIG, type GlobalConfig } from '../../domain/global-config.js';\nimport { readYaml, writeYaml } from './fs-utils.js';\n\nconst GLOBAL_DIR = path.join(homedir(), '.orchestry');\nconst GLOBAL_CONFIG_PATH = path.join(GLOBAL_DIR, 'global.yml');\n\nexport class GlobalConfigStore {\n async read(): Promise<GlobalConfig> {\n const data = await readYaml<Record<string, unknown>>(GLOBAL_CONFIG_PATH);\n if (!data) return { ...DEFAULT_GLOBAL_CONFIG, tui: { ...DEFAULT_GLOBAL_CONFIG.tui, notifications: { ...DEFAULT_GLOBAL_CONFIG.tui.notifications } } };\n const tui = data.tui as Record<string, unknown> | undefined;\n const notif = tui?.notifications as Record<string, unknown> | undefined;\n return {\n tui: {\n activity_filter: tui?.activity_filter as GlobalConfig['tui']['activity_filter']\n ?? DEFAULT_GLOBAL_CONFIG.tui.activity_filter,\n notifications: {\n toast: typeof notif?.toast === 'boolean' ? notif.toast : DEFAULT_GLOBAL_CONFIG.tui.notifications.toast,\n bell: typeof notif?.bell === 'boolean' ? notif.bell : DEFAULT_GLOBAL_CONFIG.tui.notifications.bell,\n },\n },\n };\n }\n\n async write(config: GlobalConfig): Promise<void> {\n await mkdir(GLOBAL_DIR, { recursive: true });\n await writeYaml(GLOBAL_CONFIG_PATH, config as unknown as Record<string, unknown>);\n }\n\n async set<K extends keyof GlobalConfig['tui']>(key: K, value: GlobalConfig['tui'][K]): Promise<void> {\n const config = await this.read();\n config.tui[key] = value;\n await this.write(config);\n }\n}\n","/**\n * File-based shared context store.\n *\n * Entries are stored as individual JSON files in .orchestry/context/.\n * An _index.json file caches the full list for fast list() calls.\n * Supports optional TTL for automatic expiration.\n * All writes are atomic (temp → rename).\n */\n\nimport type { ContextEntry, IContextStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { ensureDir, readJson, writeJson } from './fs-utils.js';\nimport { IndexManager } from './index-manager.js';\nimport fs from 'node:fs/promises';\n\nexport class ContextStore implements IContextStore {\n private readonly index: IndexManager<ContextEntry>;\n\n constructor(private readonly paths: Paths) {\n this.index = new IndexManager<ContextEntry>({\n dir: paths.contextDir,\n ext: '.json',\n itemPath: (key) => paths.contextPath(key),\n fileFilter: (f) => f !== '_index.json',\n });\n }\n\n async get(key: string): Promise<ContextEntry | null> {\n const entry = await readJson<ContextEntry>(this.paths.contextPath(key));\n if (!entry) return null;\n\n if (isExpired(entry)) {\n await this.delete(key);\n return null;\n }\n\n return entry;\n }\n\n /** Max TTL: 30 days in milliseconds */\n private static readonly MAX_TTL_MS = 30 * 24 * 60 * 60 * 1000;\n\n async set(key: string, value: string, ttlMs?: number): Promise<void> {\n if (ttlMs !== undefined) {\n if (!Number.isFinite(ttlMs) || ttlMs <= 0 || ttlMs > ContextStore.MAX_TTL_MS) {\n throw new Error(`TTL must be a positive number up to ${ContextStore.MAX_TTL_MS}ms (30 days)`);\n }\n }\n\n await ensureDir(this.paths.contextDir);\n\n const now = new Date().toISOString();\n const existing = await readJson<ContextEntry>(this.paths.contextPath(key));\n\n const entry: ContextEntry = {\n key,\n value,\n created_at: existing?.created_at ?? now,\n updated_at: now,\n ttl_ms: ttlMs,\n expires_at: ttlMs ? new Date(Date.now() + ttlMs).toISOString() : undefined,\n };\n\n await writeJson(this.paths.contextPath(key), entry);\n await this.index.updateIndex(idx => {\n const filtered = idx.filter(e => e.key !== key);\n filtered.push(entry);\n return filtered;\n });\n }\n\n async delete(key: string): Promise<void> {\n try {\n await fs.unlink(this.paths.contextPath(key));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n await this.index.updateIndex(idx => idx.filter(e => e.key !== key));\n }\n\n async list(): Promise<ContextEntry[]> {\n const entries = await this.index.readIndex();\n\n // Lazy cleanup of expired entries\n const expired: ContextEntry[] = [];\n const valid: ContextEntry[] = [];\n\n for (const entry of entries) {\n if (isExpired(entry)) {\n expired.push(entry);\n } else {\n valid.push(entry);\n }\n }\n\n if (expired.length > 0) {\n // Batch delete expired entries in parallel\n await Promise.all(expired.map(e => this.deleteFile(e.key)));\n await this.index.writeIndex(valid);\n }\n\n return valid.sort((a, b) => a.key.localeCompare(b.key));\n }\n\n async getAll(): Promise<Record<string, string>> {\n const entries = await this.list();\n const result: Record<string, string> = {};\n for (const entry of entries) {\n result[entry.key] = entry.value;\n }\n return result;\n }\n\n /** Delete just the file (no index update). Used by lazy expiry cleanup. */\n private async deleteFile(key: string): Promise<void> {\n try {\n await fs.unlink(this.paths.contextPath(key));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n}\n\nfunction isExpired(entry: ContextEntry): boolean {\n if (!entry.expires_at) return false;\n return new Date(entry.expires_at).getTime() < Date.now();\n}\n","/**\n * File-based message store.\n *\n * Each message is a JSON file in .orchestry/messages/.\n * An _index.json file caches the full list for fast list() calls.\n * All writes are atomic (temp → rename).\n */\n\nimport type { Message } from '../../domain/message.js';\nimport type { IMessageStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { ensureDir, readJson, writeJson } from './fs-utils.js';\nimport { IndexManager } from './index-manager.js';\nimport fs from 'node:fs/promises';\n\nexport class MessageStore implements IMessageStore {\n private readonly index: IndexManager<Message>;\n\n constructor(private readonly paths: Paths) {\n this.index = new IndexManager<Message>({\n dir: paths.messagesDir,\n ext: '.json',\n itemPath: (id) => paths.messagePath(id),\n fileFilter: (fileName) => fileName !== '_index.json',\n });\n }\n\n async save(message: Message): Promise<void> {\n await ensureDir(this.paths.messagesDir);\n await writeJson(this.paths.messagePath(message.id), message);\n await this.index.updateIndex((idx) => {\n const filtered = idx.filter((m) => m.id !== message.id);\n filtered.push(message);\n return filtered;\n });\n }\n\n async get(id: string): Promise<Message | null> {\n return readJson<Message>(this.paths.messagePath(id));\n }\n\n async list(): Promise<Message[]> {\n const all = await this.index.readIndex();\n return all\n .filter((m): m is Message => m !== null)\n .sort((a, b) => a.created_at.localeCompare(b.created_at));\n }\n\n async listPending(agentId: string): Promise<Message[]> {\n const all = await this.list();\n const now = Date.now();\n return all.filter((m) => {\n if (m.status !== 'pending') return false;\n if (m.expires_at && new Date(m.expires_at).getTime() < now) return false;\n return m.to_agent_id === agentId;\n });\n }\n\n async markDelivered(id: string): Promise<void> {\n const msg = await this.get(id);\n if (!msg) return;\n msg.status = 'delivered';\n msg.delivered_at = new Date().toISOString();\n await writeJson(this.paths.messagePath(id), msg);\n // Update the index entry\n await this.index.updateIndex((idx) => {\n const filtered = idx.filter((m) => m.id !== id);\n filtered.push(msg);\n return filtered;\n });\n }\n\n async delete(id: string): Promise<void> {\n try {\n await fs.unlink(this.paths.messagePath(id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n await this.index.updateIndex((idx) => idx.filter((m) => m.id !== id));\n }\n\n async purgeExpired(): Promise<number> {\n const all = await this.list();\n const now = Date.now();\n const toDelete = all.filter((m) => {\n const isExpired = m.expires_at && new Date(m.expires_at).getTime() < now;\n const isOldDelivered = m.delivered_at && now - new Date(m.delivered_at).getTime() > 3600_000;\n return isExpired || isOldDelivered;\n });\n const idsToDelete = new Set(toDelete.map((m) => m.id));\n\n // Delete files in parallel\n await Promise.all(\n toDelete.map(async (m) => {\n try {\n await fs.unlink(this.paths.messagePath(m.id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }),\n );\n\n // Single index update to avoid parallel read/write race\n await this.index.updateIndex((idx) => idx.filter((m) => !idsToDelete.has(m.id)));\n\n return toDelete.length;\n }\n}\n","/**\n * Goal domain model.\n *\n * A Goal is a persistent objective that drives autonomous agent work.\n * Goals have lower priority than tasks — agents work on goals only\n * when no regular tasks are available.\n *\n * State machine: active → achieved | abandoned\n * active ↔ paused\n */\n\nexport const GOAL_STATUSES = ['active', 'paused', 'achieved', 'abandoned'] as const;\nexport type GoalStatus = (typeof GOAL_STATUSES)[number];\n\n/** Terminal goal statuses — no further transitions possible. */\nexport const TERMINAL_GOAL_STATUSES: ReadonlySet<GoalStatus> = new Set(['achieved', 'abandoned']);\n\nexport function isGoalTerminal(status: GoalStatus): boolean {\n return TERMINAL_GOAL_STATUSES.has(status);\n}\n\n/** Canonical sort order for goal statuses. */\nexport const GOAL_STATUS_ORDER: Record<GoalStatus, number> = {\n active: 0,\n paused: 1,\n achieved: 2,\n abandoned: 3,\n};\n\nexport interface Goal {\n id: string;\n title: string;\n description: string;\n status: GoalStatus;\n assignee?: string;\n created_at: string;\n updated_at?: string;\n}\n\nexport interface CreateGoalInput {\n title: string;\n description?: string;\n assignee?: string;\n}\n","/**\n * File-based goal store.\n *\n * Goals are stored as individual YAML files in .orchestry/goals/.\n * An _index.json file caches the full list for fast list() calls.\n * All writes are atomic (temp → rename).\n */\n\nimport { GOAL_STATUS_ORDER, type Goal, type GoalStatus } from '../../domain/goal.js';\nimport type { IGoalStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { ensureDir, writeYaml, readYaml } from './fs-utils.js';\nimport { IndexManager } from './index-manager.js';\nimport fs from 'node:fs/promises';\n\nexport class GoalStore implements IGoalStore {\n private readonly index: IndexManager<Goal>;\n\n constructor(private readonly paths: Paths) {\n this.index = new IndexManager<Goal>({\n dir: paths.goalsDir,\n ext: '.yml',\n itemPath: (id) => paths.goalPath(id),\n });\n }\n\n async list(filter?: { status?: GoalStatus }): Promise<Goal[]> {\n const all = await this.index.readIndex();\n\n const goals = all.filter(\n (goal): goal is Goal => goal !== null && (!filter?.status || goal.status === filter.status),\n );\n\n return goals.sort((a, b) => {\n const statusOrder = GOAL_STATUS_ORDER[a.status] - GOAL_STATUS_ORDER[b.status];\n if (statusOrder !== 0) return statusOrder;\n const bTime = b.updated_at ?? '';\n const aTime = a.updated_at ?? '';\n return bTime < aTime ? -1 : bTime > aTime ? 1 : 0;\n });\n }\n\n async get(id: string): Promise<Goal | null> {\n return readYaml<Goal>(this.paths.goalPath(id));\n }\n\n async save(goal: Goal): Promise<void> {\n await ensureDir(this.paths.goalsDir);\n await writeYaml(this.paths.goalPath(goal.id), goal);\n await this.index.updateIndex((idx) => {\n const filtered = idx.filter((g) => g.id !== goal.id);\n filtered.push(goal);\n return filtered;\n });\n }\n\n async delete(id: string): Promise<void> {\n try {\n await fs.unlink(this.paths.goalPath(id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n await this.index.updateIndex((idx) => idx.filter((g) => g.id !== id));\n }\n}\n","/**\n * File-based team store.\n *\n * Teams stored as YAML files in .orchestry/teams/.\n */\n\nimport type { Team } from '../../domain/team.js';\nimport type { ITeamStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { listFiles, readYaml, writeYaml, ensureDir } from './fs-utils.js';\nimport fs from 'node:fs/promises';\n\nexport class TeamStore implements ITeamStore {\n constructor(private readonly paths: Paths) {}\n\n async save(team: Team): Promise<void> {\n await ensureDir(this.paths.teamsDir);\n await writeYaml(this.paths.teamPath(team.id), team);\n }\n\n async get(id: string): Promise<Team | null> {\n return readYaml<Team>(this.paths.teamPath(id));\n }\n\n async getByName(name: string): Promise<Team | null> {\n const teams = await this.list();\n return teams.find((t) => t.name === name) ?? null;\n }\n\n async list(): Promise<Team[]> {\n await ensureDir(this.paths.teamsDir);\n const files = await listFiles(this.paths.teamsDir, '.yml');\n const results = await Promise.all(\n files.map((f) => readYaml<Team>(this.paths.teamPath(f.replace('.yml', '')))),\n );\n return results.filter((t): t is Team => t !== null);\n }\n\n async delete(id: string): Promise<void> {\n try {\n await fs.unlink(this.paths.teamPath(id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n}\n","/**\n * Message domain model.\n *\n * A Message is a unit of inter-agent communication.\n * Messages are stored as JSON files and injected into agent prompts at dispatch time.\n */\n\nexport type MessageChannel = 'direct' | 'broadcast' | 'lead';\n\nexport type MessageStatus = 'pending' | 'delivered' | 'expired';\n\nexport interface Message {\n id: string;\n channel: MessageChannel;\n from_agent_id: string;\n to_agent_id: string | null;\n subject: string;\n body: string;\n created_at: string;\n expires_at?: string;\n status: MessageStatus;\n delivered_at?: string;\n team_id?: string;\n reply_to?: string;\n}\n\nexport interface CreateMessageInput {\n channel: MessageChannel;\n from_agent_id: string;\n to_agent_id?: string;\n subject: string;\n body: string;\n ttl_ms?: number;\n team_id?: string;\n reply_to?: string;\n}\n\n/** Maximum TTL: 7 days */\nexport const MAX_MESSAGE_TTL_MS = 7 * 24 * 60 * 60 * 1000;\n\n/** Default TTL: 24 hours */\nexport const DEFAULT_MESSAGE_TTL_MS = 24 * 60 * 60 * 1000;\n","/**\n * MessageService — business logic for inter-agent messaging.\n *\n * Handles message creation, routing (direct/broadcast/lead),\n * delivery into agent prompts, and cleanup of expired messages.\n */\n\nimport { nanoid } from 'nanoid';\nimport type { Message, CreateMessageInput, MessageChannel } from '../domain/message.js';\nimport { DEFAULT_MESSAGE_TTL_MS, MAX_MESSAGE_TTL_MS } from '../domain/message.js';\nimport { InvalidArgumentsError } from '../domain/errors.js';\nimport type { IMessageStore, IAgentStore, ITeamStore } from '../infrastructure/storage/interfaces.js';\nimport type { EventBus } from './event-bus.js';\n\nexport class MessageService {\n constructor(\n private readonly messageStore: IMessageStore,\n private readonly agentStore: IAgentStore,\n private readonly teamStore: ITeamStore,\n private readonly eventBus: EventBus,\n ) {}\n\n /**\n * Send a message. For broadcast, creates one message per recipient agent.\n * For 'lead' channel, resolves team lead and sends direct.\n */\n async send(input: CreateMessageInput): Promise<Message[]> {\n if (!input.body.trim()) throw new InvalidArgumentsError('Message body is required');\n\n const ttlMs = input.ttl_ms ?? DEFAULT_MESSAGE_TTL_MS;\n if (ttlMs <= 0 || ttlMs > MAX_MESSAGE_TTL_MS) {\n throw new InvalidArgumentsError(`TTL must be between 1ms and ${MAX_MESSAGE_TTL_MS}ms`);\n }\n\n // Validate sender exists\n const sender = await this.agentStore.get(input.from_agent_id);\n if (!sender && input.from_agent_id !== 'cli') {\n throw new InvalidArgumentsError(`Sender agent not found: ${input.from_agent_id}`);\n }\n\n const now = new Date();\n const baseMessage = {\n channel: input.channel,\n from_agent_id: input.from_agent_id,\n subject: (input.subject || '(no subject)').slice(0, 200),\n body: input.body.slice(0, 4000),\n created_at: now.toISOString(),\n expires_at: new Date(now.getTime() + ttlMs).toISOString(),\n status: 'pending' as const,\n team_id: input.team_id,\n reply_to: input.reply_to,\n };\n\n const messages: Message[] = [];\n\n if (input.channel === 'broadcast') {\n // Fan-out: one message per agent (excluding sender)\n let agents = await this.agentStore.list();\n\n // If team_id specified, only broadcast to team members\n if (input.team_id) {\n const team = await this.teamStore.get(input.team_id);\n if (team) {\n const memberIds = new Set(team.members.map((m) => m.agent_id));\n agents = agents.filter((a) => memberIds.has(a.id));\n }\n }\n\n const recipients = agents.filter((a) => a.id !== input.from_agent_id && a.status !== 'disabled');\n const broadcastMsgs = recipients.map((agent) => ({\n ...baseMessage,\n id: `msg_${nanoid(7)}`,\n to_agent_id: agent.id,\n } as Message));\n await Promise.all(broadcastMsgs.map((msg) => this.messageStore.save(msg)));\n for (const msg of broadcastMsgs) {\n messages.push(msg);\n this.emitSent(msg);\n }\n } else if (input.channel === 'lead') {\n // Resolve team lead\n if (!input.team_id) throw new InvalidArgumentsError('team_id is required for lead channel');\n const team = await this.teamStore.get(input.team_id);\n if (!team) throw new InvalidArgumentsError(`Team not found: ${input.team_id}`);\n\n const msg: Message = {\n ...baseMessage,\n id: `msg_${nanoid(7)}`,\n to_agent_id: team.lead_agent_id,\n };\n await this.messageStore.save(msg);\n messages.push(msg);\n this.emitSent(msg);\n } else {\n // Direct message\n if (!input.to_agent_id) throw new InvalidArgumentsError('to_agent_id is required for direct messages');\n const recipient = await this.agentStore.get(input.to_agent_id);\n if (!recipient) throw new InvalidArgumentsError(`Recipient agent not found: ${input.to_agent_id}`);\n\n const msg: Message = {\n ...baseMessage,\n id: `msg_${nanoid(7)}`,\n to_agent_id: input.to_agent_id,\n };\n await this.messageStore.save(msg);\n messages.push(msg);\n this.emitSent(msg);\n }\n\n return messages;\n }\n\n /**\n * Drain mailbox: fetch pending messages for an agent and mark them delivered.\n * Called by the orchestrator during dispatchTask.\n */\n async drainMailbox(agentId: string, taskId: string): Promise<Message[]> {\n const pending = await this.messageStore.listPending(agentId);\n await Promise.all(pending.map((msg) => this.messageStore.markDelivered(msg.id)));\n for (const msg of pending) {\n this.eventBus.emit({\n type: 'message:delivered',\n messageId: msg.id,\n toAgentId: agentId,\n taskId,\n });\n }\n return pending;\n }\n\n async listAll(): Promise<Message[]> {\n return this.messageStore.list();\n }\n\n async listPendingForAgent(agentId: string): Promise<Message[]> {\n return this.messageStore.listPending(agentId);\n }\n\n async listForAgent(agentId: string): Promise<Message[]> {\n const all = await this.messageStore.list();\n return all.filter((m) => m.to_agent_id === agentId || m.from_agent_id === agentId);\n }\n\n async purgeExpired(): Promise<number> {\n return this.messageStore.purgeExpired();\n }\n\n private emitSent(msg: Message): void {\n this.eventBus.emit({\n type: 'message:sent',\n messageId: msg.id,\n fromAgentId: msg.from_agent_id,\n toAgentId: msg.to_agent_id,\n channel: msg.channel,\n });\n }\n}\n","/**\n * Goal service — business logic for goal lifecycle.\n *\n * Goals are persistent objectives that drive autonomous agent work.\n * State machine: active → achieved | abandoned\n * active ↔ paused\n *\n * Side effect: assigning an agent to a goal auto-enables autonomous mode;\n * removing the last active goal from an agent auto-disables it.\n */\n\nimport { nanoid } from 'nanoid';\nimport type { Goal, GoalStatus, CreateGoalInput } from '../domain/goal.js';\nimport { isGoalTerminal } from '../domain/goal.js';\nimport { AUTONOMOUS_LABEL, type Task } from '../domain/task.js';\nimport { isTerminal as isTaskTerminal } from '../domain/transitions.js';\nimport { GoalNotFoundError, GoalHasPendingTasksError, InvalidArgumentsError } from '../domain/errors.js';\nimport type { IGoalStore, IContextStore } from '../infrastructure/storage/interfaces.js';\nimport type { EventBus } from './event-bus.js';\nimport type { AgentService } from './agent-service.js';\nimport type { TaskService } from './task-service.js';\n\nconst VALID_TRANSITIONS: Record<GoalStatus, GoalStatus[]> = {\n active: ['paused', 'achieved', 'abandoned'],\n paused: ['active', 'abandoned'],\n achieved: [],\n abandoned: [],\n};\n\nexport class GoalService {\n constructor(\n private readonly goalStore: IGoalStore,\n private readonly eventBus: EventBus,\n private readonly agentService?: AgentService,\n private readonly taskService?: TaskService,\n private readonly contextStore?: IContextStore,\n ) {}\n\n async create(input: CreateGoalInput): Promise<Goal> {\n if (!input.title.trim()) {\n throw new InvalidArgumentsError('Goal title is required');\n }\n\n const now = new Date().toISOString();\n const goal: Goal = {\n id: `goal_${nanoid(7)}`,\n title: input.title.trim(),\n description: input.description?.trim() ?? '',\n status: 'active',\n assignee: input.assignee,\n created_at: now,\n updated_at: now,\n };\n\n await this.goalStore.save(goal);\n this.eventBus.emit({ type: 'goal:created', goalId: goal.id, title: goal.title });\n\n if (goal.assignee) {\n await this.enableAutonomous(goal.assignee);\n }\n\n return goal;\n }\n\n async list(filter?: { status?: GoalStatus }): Promise<Goal[]> {\n return this.goalStore.list(filter);\n }\n\n async get(id: string): Promise<Goal> {\n const goal = await this.goalStore.get(id);\n if (!goal) throw new GoalNotFoundError(id);\n return goal;\n }\n\n async updateStatus(id: string, newStatus: GoalStatus, opts?: { force?: boolean }): Promise<Goal> {\n const goal = await this.get(id);\n const oldStatus = goal.status;\n\n if (!VALID_TRANSITIONS[oldStatus].includes(newStatus)) {\n throw new InvalidArgumentsError(\n `Cannot transition goal from '${oldStatus}' to '${newStatus}'`,\n );\n }\n\n // Guard: block achieved if child tasks are still pending\n if (newStatus === 'achieved' && this.taskService) {\n const childTasks = await this.taskService.list({ goalId: id });\n const pending = childTasks.filter((t) => !isTaskTerminal(t.status));\n if (pending.length > 0) {\n if (opts?.force) {\n // Force mode: cancel tasks that are safe to cancel at storage level.\n // in_progress tasks have live OS processes — GoalService cannot kill them.\n const cancellable = pending.filter((t) => t.status !== 'in_progress');\n const running = pending.filter((t) => t.status === 'in_progress');\n await Promise.all(\n cancellable.map((t) => this.taskService!.cancel(t.id).catch(() => {})),\n );\n if (running.length > 0) {\n const summary = running.map((t) => `${t.id} (in_progress)`).join(', ');\n throw new GoalHasPendingTasksError(id, running.length, summary);\n }\n } else {\n const summary = pending.map((t) => `${t.id} (${t.status})`).join(', ');\n throw new GoalHasPendingTasksError(id, pending.length, summary);\n }\n }\n }\n\n goal.status = newStatus;\n goal.updated_at = new Date().toISOString();\n await this.goalStore.save(goal);\n\n this.eventBus.emit({ type: 'goal:status_changed', goalId: id, from: oldStatus, to: newStatus });\n\n if (goal.assignee) {\n if (newStatus === 'paused') {\n // Pause: disable autonomous + cancel pending autonomous tasks\n await this.maybeDisableAutonomous(goal.assignee);\n await this.cancelPendingAutonomousTasks(goal.assignee);\n } else if (newStatus === 'active' && oldStatus === 'paused') {\n // Resume: re-enable autonomous mode\n await this.enableAutonomous(goal.assignee);\n } else if (isGoalTerminal(newStatus)) {\n // Terminal: check if agent still has other active goals\n await this.maybeDisableAutonomous(goal.assignee);\n }\n }\n\n return goal;\n }\n\n async update(id: string, fields: { title?: string; description?: string; assignee?: string }): Promise<Goal> {\n const goal = await this.get(id);\n const oldAssignee = goal.assignee;\n\n if (fields.title !== undefined) {\n if (!fields.title.trim()) throw new InvalidArgumentsError('Goal title cannot be empty');\n goal.title = fields.title.trim();\n }\n if (fields.description !== undefined) goal.description = fields.description.trim();\n if (fields.assignee !== undefined) goal.assignee = fields.assignee || undefined;\n\n goal.updated_at = new Date().toISOString();\n await this.goalStore.save(goal);\n this.eventBus.emit({ type: 'goal:updated', goalId: id });\n\n // Handle assignee change — independent agents, run in parallel\n const newAssignee = goal.assignee;\n if (newAssignee !== oldAssignee) {\n const ops: Promise<void>[] = [];\n if (newAssignee) ops.push(this.enableAutonomous(newAssignee));\n if (oldAssignee) ops.push(this.maybeDisableAutonomous(oldAssignee));\n await Promise.all(ops);\n }\n\n return goal;\n }\n\n async delete(id: string): Promise<void> {\n const goal = await this.get(id);\n const { assignee } = goal;\n await this.goalStore.delete(id);\n this.eventBus.emit({ type: 'goal:deleted', goalId: id });\n\n if (assignee) {\n await this.maybeDisableAutonomous(assignee);\n }\n }\n\n async listTasksForGoal(goalId: string): Promise<Task[]> {\n return this.taskService?.list({ goalId }) ?? [];\n }\n\n async getProgressReport(goalId: string): Promise<string | undefined> {\n if (!this.contextStore) return undefined;\n const entry = await this.contextStore.get(`${goalId}-progress`);\n return entry?.value;\n }\n\n /** Enable autonomous mode on an agent. */\n private async enableAutonomous(agentId: string): Promise<void> {\n if (!this.agentService) return;\n try {\n await this.agentService.setAutonomous(agentId, true);\n } catch {\n // Agent may not exist — ignore silently\n }\n }\n\n /** Check if an agent has at least one active goal. */\n private async hasActiveGoalsForAgent(agentId: string): Promise<boolean> {\n const activeGoals = await this.goalStore.list({ status: 'active' });\n return activeGoals.some((g) => g.assignee === agentId);\n }\n\n /** Cancel dispatchable (todo/retrying) autonomous tasks assigned to the agent. */\n private async cancelPendingAutonomousTasks(agentId: string): Promise<void> {\n if (!this.taskService) return;\n try {\n const [todos, retrying] = await Promise.all([\n this.taskService.list({ status: 'todo' }),\n this.taskService.list({ status: 'retrying' }),\n ]);\n const pending = [...todos, ...retrying].filter(\n (t) => t.assignee === agentId && t.labels?.includes(AUTONOMOUS_LABEL),\n );\n await Promise.all(pending.map((t) => this.taskService!.cancel(t.id).catch(() => {})));\n } catch {\n // Best-effort cleanup\n }\n }\n\n /** Disable autonomous if agent has no other active goals. */\n private async maybeDisableAutonomous(agentId: string): Promise<void> {\n if (!this.agentService) return;\n try {\n if (!(await this.hasActiveGoalsForAgent(agentId))) {\n await this.agentService.setAutonomous(agentId, false);\n }\n } catch {\n // Agent may not exist — ignore silently\n }\n }\n}\n","/**\n * Team domain model.\n *\n * A Team groups agents with a lead for coordinated work.\n * Teams share a task pool and enable broadcast messaging.\n */\n\nexport type TeamStatus = 'active' | 'paused' | 'disbanded';\n\nexport interface TeamMember {\n agent_id: string;\n role: 'lead' | 'member';\n joined_at: string;\n}\n\nexport interface Team {\n id: string;\n name: string;\n description?: string;\n status: TeamStatus;\n members: TeamMember[];\n task_pool: string[];\n lead_agent_id: string;\n created_at: string;\n updated_at: string;\n config: TeamConfig;\n}\n\nexport interface TeamConfig {\n max_concurrent_tasks?: number;\n auto_claim: boolean;\n message_ttl_ms?: number;\n}\n\nexport interface CreateTeamInput {\n name: string;\n description?: string;\n lead_agent_id: string;\n member_agent_ids?: string[];\n config?: Partial<TeamConfig>;\n}\n\nexport const DEFAULT_TEAM_CONFIG: TeamConfig = {\n auto_claim: true,\n message_ttl_ms: 24 * 60 * 60 * 1000,\n};\n","/**\n * TeamService — business logic for team lifecycle.\n *\n * Manages team creation, membership, task pool, and self-claiming.\n */\n\nimport { nanoid } from 'nanoid';\nimport type { Team, CreateTeamInput, TeamMember } from '../domain/team.js';\nimport { DEFAULT_TEAM_CONFIG } from '../domain/team.js';\nimport { InvalidArgumentsError, TeamNotFoundError } from '../domain/errors.js';\nimport type { ITeamStore, IAgentStore, ITaskStore } from '../infrastructure/storage/interfaces.js';\nimport type { EventBus } from './event-bus.js';\n\nexport class TeamService {\n constructor(\n private readonly teamStore: ITeamStore,\n private readonly agentStore: IAgentStore,\n private readonly taskStore: ITaskStore,\n private readonly eventBus: EventBus,\n ) {}\n\n async create(input: CreateTeamInput): Promise<Team> {\n if (!input.name.trim()) throw new InvalidArgumentsError('Team name is required');\n\n const lead = await this.agentStore.get(input.lead_agent_id);\n if (!lead) throw new InvalidArgumentsError(`Lead agent not found: ${input.lead_agent_id}`);\n\n const existing = await this.teamStore.getByName(input.name.trim());\n if (existing) throw new InvalidArgumentsError(`Team \"${input.name}\" already exists`);\n\n const now = new Date().toISOString();\n const leadMember: TeamMember = { agent_id: input.lead_agent_id, role: 'lead', joined_at: now };\n\n const additionalMembers: TeamMember[] = [];\n for (const agentId of input.member_agent_ids ?? []) {\n if (agentId === input.lead_agent_id) continue;\n const agent = await this.agentStore.get(agentId);\n if (!agent) throw new InvalidArgumentsError(`Member agent not found: ${agentId}`);\n additionalMembers.push({ agent_id: agentId, role: 'member', joined_at: now });\n }\n\n const team: Team = {\n id: `team_${nanoid(7)}`,\n name: input.name.trim(),\n description: input.description,\n status: 'active',\n members: [leadMember, ...additionalMembers],\n task_pool: [],\n lead_agent_id: input.lead_agent_id,\n created_at: now,\n updated_at: now,\n config: { ...DEFAULT_TEAM_CONFIG, ...(input.config ?? {}) },\n };\n\n await this.teamStore.save(team);\n\n this.eventBus.emit({ type: 'team:created', teamId: team.id, name: team.name, leadAgentId: team.lead_agent_id });\n for (const member of additionalMembers) {\n this.eventBus.emit({ type: 'team:member_joined', teamId: team.id, agentId: member.agent_id });\n }\n\n return team;\n }\n\n async get(id: string): Promise<Team> {\n const team = await this.teamStore.get(id);\n if (!team) throw new TeamNotFoundError(id);\n return team;\n }\n\n async list(): Promise<Team[]> {\n return this.teamStore.list();\n }\n\n async join(teamId: string, agentId: string): Promise<Team> {\n const team = await this.get(teamId);\n if (team.members.some((m) => m.agent_id === agentId)) {\n throw new InvalidArgumentsError(`Agent ${agentId} is already a member of team ${teamId}`);\n }\n const agent = await this.agentStore.get(agentId);\n if (!agent) throw new InvalidArgumentsError(`Agent not found: ${agentId}`);\n\n team.members.push({ agent_id: agentId, role: 'member', joined_at: new Date().toISOString() });\n team.updated_at = new Date().toISOString();\n await this.teamStore.save(team);\n\n this.eventBus.emit({ type: 'team:member_joined', teamId, agentId });\n return team;\n }\n\n async leave(teamId: string, agentId: string): Promise<Team> {\n const team = await this.get(teamId);\n if (agentId === team.lead_agent_id) {\n throw new InvalidArgumentsError('Lead cannot leave team. Disband the team or transfer lead first.');\n }\n team.members = team.members.filter((m) => m.agent_id !== agentId);\n team.updated_at = new Date().toISOString();\n await this.teamStore.save(team);\n\n this.eventBus.emit({ type: 'team:member_left', teamId, agentId });\n return team;\n }\n\n async addTask(teamId: string, taskId: string): Promise<Team> {\n const team = await this.get(teamId);\n const task = await this.taskStore.get(taskId);\n if (!task) throw new InvalidArgumentsError(`Task not found: ${taskId}`);\n\n if (!team.task_pool.includes(taskId)) {\n team.task_pool.push(taskId);\n team.updated_at = new Date().toISOString();\n await this.teamStore.save(team);\n this.eventBus.emit({ type: 'team:task_added', teamId, taskId });\n }\n return team;\n }\n\n async removeTask(teamId: string, taskId: string): Promise<Team> {\n const team = await this.get(teamId);\n team.task_pool = team.task_pool.filter((id) => id !== taskId);\n team.updated_at = new Date().toISOString();\n await this.teamStore.save(team);\n return team;\n }\n\n async setLead(teamId: string, agentId: string): Promise<Team> {\n const team = await this.get(teamId);\n const member = team.members.find((m) => m.agent_id === agentId);\n if (!member) throw new InvalidArgumentsError(`Agent ${agentId} is not a member of team ${teamId}`);\n\n // Demote current lead\n const currentLead = team.members.find((m) => m.agent_id === team.lead_agent_id);\n if (currentLead) currentLead.role = 'member';\n\n member.role = 'lead';\n team.lead_agent_id = agentId;\n team.updated_at = new Date().toISOString();\n await this.teamStore.save(team);\n return team;\n }\n\n async disband(teamId: string): Promise<void> {\n const team = await this.get(teamId);\n team.status = 'disbanded';\n team.updated_at = new Date().toISOString();\n await this.teamStore.save(team);\n this.eventBus.emit({ type: 'team:disbanded', teamId });\n }\n\n /**\n * Find the team an agent belongs to (if any).\n */\n async findTeamForAgent(agentId: string): Promise<Team | null> {\n const teams = await this.teamStore.list();\n return teams.find((t) => t.status === 'active' && t.members.some((m) => m.agent_id === agentId)) ?? null;\n }\n}\n","/**\n * Dependency injection container.\n *\n * Plain TypeScript object — no framework, no decorators.\n * Two modes:\n * - LightContainer: stores + services only (fast, for read-only commands)\n * - Container: full (+ orchestrator, adapters, template engine)\n */\n\nimport type { OrchestratorConfig } from './domain/config.js';\nimport type { CliContext } from './cli/context.js';\nimport type { ITaskStore, IAgentStore, IRunStore, IStateStore, IConfigStore, IContextStore, IMessageStore, IGoalStore, ITeamStore } from './infrastructure/storage/interfaces.js';\nimport type { IWorkspaceManager } from './infrastructure/workspace/interface.js';\nimport type { ITemplateEngine } from './infrastructure/template/template-engine.js';\nimport type { IProcessManager } from './infrastructure/process/process-manager.js';\nimport type { AdapterRegistry } from './infrastructure/adapters/registry.js';\nimport type { ISkillLoader } from './infrastructure/skills/skill-loader.js';\n\nimport { type GlobalConfig, DEFAULT_GLOBAL_CONFIG } from './domain/global-config.js';\nimport { Paths } from './infrastructure/storage/paths.js';\nimport { TaskStore } from './infrastructure/storage/task-store.js';\nimport { AgentStore } from './infrastructure/storage/agent-store.js';\nimport { RunStore } from './infrastructure/storage/run-store.js';\nimport { StateStore } from './infrastructure/storage/state-store.js';\nimport { ConfigStore } from './infrastructure/storage/config-store.js';\nimport { GlobalConfigStore } from './infrastructure/storage/global-config-store.js';\nimport { ContextStore } from './infrastructure/storage/context-store.js';\nimport { MessageStore } from './infrastructure/storage/message-store.js';\nimport { GoalStore } from './infrastructure/storage/goal-store.js';\nimport { TeamStore } from './infrastructure/storage/team-store.js';\n\nimport { EventBus } from './application/event-bus.js';\nimport { TaskService } from './application/task-service.js';\nimport { AgentService } from './application/agent-service.js';\nimport { RunService } from './application/run-service.js';\nimport { MessageService } from './application/message-service.js';\nimport { GoalService } from './application/goal-service.js';\nimport { TeamService } from './application/team-service.js';\n\nimport type { Orchestrator } from './application/orchestrator.js';\nimport type { DoctorService } from './application/doctor-service.js';\n\n/** Light container — stores + services. No heavy deps (adapters, orchestrator, LiquidJS). */\nexport interface LightContainer {\n // Context\n context: CliContext;\n paths: Paths;\n config: OrchestratorConfig;\n\n // Infrastructure — stores only\n taskStore: ITaskStore;\n agentStore: IAgentStore;\n runStore: IRunStore;\n stateStore: IStateStore;\n configStore: IConfigStore;\n globalConfigStore: GlobalConfigStore;\n globalConfig: GlobalConfig;\n contextStore: IContextStore;\n messageStore: IMessageStore;\n goalStore: IGoalStore;\n teamStore: ITeamStore;\n\n // Application — services only\n eventBus: EventBus;\n taskService: TaskService;\n agentService: AgentService;\n runService: RunService;\n messageService: MessageService;\n goalService: GoalService;\n teamService: TeamService;\n}\n\n/** Full container — everything from light + orchestrator, adapters, workspace, template. */\nexport interface Container extends LightContainer {\n processManager: IProcessManager;\n adapterRegistry: AdapterRegistry;\n workspaceManager: IWorkspaceManager;\n templateEngine: ITemplateEngine;\n skillLoader: ISkillLoader;\n doctorService: DoctorService;\n orchestrator: Orchestrator;\n}\n\n/**\n * Build a light container (stores + services).\n * Fast — no ProcessManager, no adapters, no LiquidJS, no Orchestrator.\n * Used by read-only commands: task, agent, context, msg, goal, team, logs, status, config.\n */\nexport async function buildLightContainer(context: CliContext): Promise<LightContainer> {\n const paths = new Paths(context.projectRoot);\n\n // Infrastructure — stores\n const configStore = new ConfigStore(paths);\n const globalConfigStore = new GlobalConfigStore();\n\n // Parallel: check init + read config (saves one I/O round trip)\n const [, config] = await Promise.all([\n paths.requireInit(),\n configStore.read(),\n ]);\n const taskStore = new TaskStore(paths);\n const agentStore = new AgentStore(paths);\n const runStore = new RunStore(paths);\n const stateStore = new StateStore(paths);\n const contextStore = new ContextStore(paths);\n const messageStore = new MessageStore(paths);\n const goalStore = new GoalStore(paths);\n const teamStore = new TeamStore(paths);\n\n // Application — services\n const eventBus = new EventBus();\n const taskService = new TaskService(taskStore, eventBus, config, paths);\n const agentService = new AgentService(agentStore, stateStore, eventBus, config);\n const runService = new RunService(runStore, eventBus);\n const messageService = new MessageService(messageStore, agentStore, teamStore, eventBus);\n const goalService = new GoalService(goalStore, eventBus, agentService, taskService, contextStore);\n const teamService = new TeamService(teamStore, agentStore, taskStore, eventBus);\n\n return {\n context,\n paths,\n config,\n taskStore,\n agentStore,\n runStore,\n stateStore,\n configStore,\n globalConfigStore,\n globalConfig: DEFAULT_GLOBAL_CONFIG,\n contextStore,\n messageStore,\n goalStore,\n teamStore,\n eventBus,\n taskService,\n agentService,\n runService,\n messageService,\n goalService,\n teamService,\n };\n}\n\n/**\n * Build a full container (light + orchestrator + adapters + template).\n * Used by: run, tui, doctor.\n */\nexport async function buildFullContainer(context: CliContext): Promise<Container> {\n const light = await buildLightContainer(context);\n\n // Read global config (needed by TUI for activity_filter, notifications)\n const globalConfig = await light.globalConfigStore.read();\n light.globalConfig = globalConfig;\n\n // Dynamic imports — avoid loading heavy deps at top level\n const [\n { ProcessManager },\n { AdapterRegistry },\n { ClaudeAdapter },\n { CodexAdapter },\n { CursorAdapter },\n { ShellAdapter },\n { OpenCodeAdapter },\n { WorkspaceManager },\n { LiquidTemplateEngine },\n { SkillLoader },\n { Orchestrator },\n { DoctorService },\n ] = await Promise.all([\n import('./infrastructure/process/process-manager.js'),\n import('./infrastructure/adapters/registry.js'),\n import('./infrastructure/adapters/claude.js'),\n import('./infrastructure/adapters/codex.js'),\n import('./infrastructure/adapters/cursor.js'),\n import('./infrastructure/adapters/shell.js'),\n import('./infrastructure/adapters/opencode.js'),\n import('./infrastructure/workspace/workspace-manager.js'),\n import('./infrastructure/template/template-engine.js'),\n import('./infrastructure/skills/skill-loader.js'),\n import('./application/orchestrator.js'),\n import('./application/doctor-service.js'),\n ]);\n\n const processManager = new ProcessManager();\n const templateEngine = new LiquidTemplateEngine();\n const skillLoader = new SkillLoader();\n const workspaceManager = new WorkspaceManager(\n context.projectRoot,\n light.paths.root,\n processManager,\n );\n\n // Adapter registry\n const adapterRegistry = new AdapterRegistry();\n adapterRegistry.register(new ClaudeAdapter(processManager));\n adapterRegistry.register(new CodexAdapter(processManager));\n adapterRegistry.register(new CursorAdapter(processManager));\n adapterRegistry.register(new ShellAdapter(processManager));\n adapterRegistry.register(new OpenCodeAdapter(processManager));\n\n const doctorService = new DoctorService(adapterRegistry, processManager, context.projectRoot);\n const orchestrator = new Orchestrator({\n taskStore: light.taskStore,\n agentStore: light.agentStore,\n runStore: light.runStore,\n stateStore: light.stateStore,\n adapterRegistry,\n workspaceManager,\n templateEngine,\n processManager,\n eventBus: light.eventBus,\n taskService: light.taskService,\n agentService: light.agentService,\n runService: light.runService,\n contextStore: light.contextStore,\n messageService: light.messageService,\n goalStore: light.goalStore,\n skillLoader,\n config: light.config,\n projectRoot: context.projectRoot,\n lockPath: light.paths.lockPath,\n });\n\n return {\n ...light,\n processManager,\n adapterRegistry,\n workspaceManager,\n templateEngine,\n skillLoader,\n doctorService,\n orchestrator,\n };\n}\n\n/**\n * @deprecated Use buildLightContainer or buildFullContainer directly.\n * Kept for backward compatibility with tests.\n */\nexport async function buildContainer(context: CliContext): Promise<Container> {\n return buildFullContainer(context);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/domain/model-tiers.ts","../src/domain/agent-shop.ts","../src/application/event-bus.ts","../src/application/agent-factory.ts","../src/application/task-service.ts","../src/application/agent-service.ts","../src/application/run-service.ts","../src/infrastructure/clipboard-service.ts","../src/domain/global-config.ts","../src/infrastructure/storage/index-manager.ts","../src/infrastructure/storage/task-store.ts","../src/infrastructure/storage/agent-store.ts","../src/infrastructure/storage/run-store.ts","../src/domain/state.ts","../src/infrastructure/storage/state-store.ts","../src/domain/config.ts","../src/infrastructure/storage/config-store.ts","../src/infrastructure/storage/global-config-store.ts","../src/infrastructure/storage/context-store.ts","../src/infrastructure/storage/message-store.ts","../src/domain/goal.ts","../src/infrastructure/storage/goal-store.ts","../src/infrastructure/storage/team-store.ts","../src/domain/message.ts","../src/application/message-service.ts","../src/application/goal-service.ts","../src/domain/team.ts","../src/application/team-service.ts","../src/container.ts"],"names":["nanoid","execFileCb","path","fs","isExpired","AdapterRegistry","SkillLoader","Orchestrator"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Model tier system — single source of truth for adapter → tier → model resolution.\n *\n * Agent Shop templates reference semantic tiers (capable / balanced / fast)\n * instead of hardcoded model strings. At instantiation time, the actual model\n * is resolved based on the user's chosen adapter.\n */\n\n/** The five supported adapter kinds. */\nexport type AdapterKind = 'claude' | 'opencode' | 'codex' | 'cursor' | 'shell';\n\n/**\n * Semantic capability tiers — adapter-agnostic.\n * capable — most powerful / highest quality (opus, gpt-5.4)\n * balanced — good quality + speed (sonnet, gpt-5.3-codex)\n * fast — cheapest / fastest (haiku, gpt-5-mini)\n */\nexport type ModelTier = 'capable' | 'balanced' | 'fast';\n\n/**\n * Tier → model mapping per adapter.\n *\n * Conventions:\n * - shell: '' for all tiers (model irrelevant)\n * - opencode: '' for balanced (delegate to opencode's own config)\n * - cursor: 'auto' for all tiers (Cursor handles selection)\n */\nexport const MODEL_TIER_MAP: Record<AdapterKind, Record<ModelTier, string>> = {\n claude: {\n capable: 'claude-opus-4-6',\n balanced: 'claude-sonnet-4-6',\n fast: 'claude-haiku-4-6',\n },\n opencode: {\n capable: 'openrouter/anthropic/claude-opus-4.6',\n balanced: '',\n fast: 'openrouter/google/gemini-2.5-flash',\n },\n codex: {\n capable: 'gpt-5.4',\n balanced: 'gpt-5.3-codex',\n fast: 'gpt-5-mini',\n },\n cursor: {\n capable: 'auto',\n balanced: 'auto',\n fast: 'auto',\n },\n shell: {\n capable: '',\n balanced: '',\n fast: '',\n },\n};\n\n/**\n * Resolve a concrete model string from adapter + tier.\n * Returns '' for unknown adapters (let the adapter decide).\n */\nexport function resolveModel(adapter: string, tier: ModelTier): string {\n const adapterMap = MODEL_TIER_MAP[adapter as AdapterKind];\n if (!adapterMap) return '';\n return adapterMap[tier];\n}\n\n/** Returns the default (balanced) model for the adapter. */\nexport function defaultModelForAdapter(adapter: string): string {\n return resolveModel(adapter, 'balanced');\n}\n\n/** Type guard: is a string a valid AdapterKind? */\nexport function isAdapterKind(value: string): value is AdapterKind {\n return value in MODEL_TIER_MAP;\n}\n\n/** Type guard: is a string a valid ModelTier? */\nexport function isModelTier(value: string): value is ModelTier {\n return value === 'capable' || value === 'balanced' || value === 'fast';\n}\n\n/** All supported adapter names in display order. */\nexport const SUPPORTED_ADAPTERS: readonly AdapterKind[] = ['claude', 'opencode', 'codex', 'cursor', 'shell'];\n","/**\n * ORCH Agent Shop — pre-built agent templates.\n *\n * Each template defines a ready-to-use agent with a detailed role prompt,\n * recommended model, skills, and approval policy. Users can browse the shop\n * via `orch shop` and add agents to their project with one command.\n *\n * Role prompts define the agent's identity and high-level approach.\n * Detailed methodology comes from library skills injected at runtime.\n */\n\nimport type { ApprovalPolicy } from './agent.js';\nimport type { ModelTier } from './model-tiers.js';\n\nexport interface AgentShopTemplate {\n key: string;\n name: string;\n description: string;\n tier: ModelTier;\n approval_policy: ApprovalPolicy;\n skills: string[];\n role: string;\n}\n\n// ---------------------------------------------------------------------------\n// Role prompts\n// ---------------------------------------------------------------------------\n\nconst BACKEND_DEV_ROLE = `Backend engineer — builds APIs, services, database layers, and server-side business logic.\n\n## WORKFLOW\n\n1) READ the task description and identify the scope: new endpoint, service refactor, DB migration, etc.\n2) EXPLORE the existing codebase to understand project structure, conventions, and dependencies.\n3) DESIGN the solution — define data models, API contracts, and error handling strategy. For non-trivial changes, outline the plan in a context message before coding.\n4) IMPLEMENT — write production code following the project's patterns (naming, folder structure, error classes).\n5) WRITE TESTS — add unit tests for new logic; ensure edge cases and error paths are covered.\n6) SELF-REVIEW — use the review skill methodology to check your own diff for security issues, N+1 queries, and missing validation.\n7) MARK DONE — commit to your worktree branch and transition the task to review.\n\n## RULES\n\n- Always work inside your assigned git worktree; never modify the main branch directly.\n- Follow existing project conventions for file naming, export style, and error handling.\n- Every public function must have at least one test.\n- Never store secrets or credentials in code — use environment variables.\n- Keep functions under 40 lines; extract helpers when complexity grows.\n- If the task is ambiguous, set context with your questions before coding.`;\n\nconst FRONTEND_DEV_ROLE = `Frontend engineer — builds React UI components, pages, styles, and client-side interactions.\n\n## WORKFLOW\n\n1) READ the task and identify the deliverable: new component, page, style fix, responsive layout, etc.\n2) EXPLORE the component tree and design system to find reusable primitives and naming conventions.\n3) PLAN the component hierarchy — props interface, state management, and data flow.\n4) IMPLEMENT — write components with proper TypeScript types, accessibility attributes, and responsive styles.\n5) STYLE — use the project's CSS approach (modules, Tailwind, styled-components) consistently. Check mobile, tablet, desktop breakpoints.\n6) TEST — add component tests for rendering, user interactions, and edge states (loading, empty, error).\n7) SELF-REVIEW — use the design-review skill to check accessibility, responsiveness, and visual consistency, then transition to review.\n\n## RULES\n\n- Components must be typed — no \\`any\\` props.\n- Always handle loading, error, and empty states explicitly.\n- Use semantic HTML elements (nav, main, section, button) — not div soup.\n- Keep components under 150 lines; extract sub-components when they grow.\n- Never hardcode colors or spacing — use design tokens / theme variables.\n- Ensure keyboard navigation and ARIA labels for interactive elements.`;\n\nconst QA_ENGINEER_ROLE = `QA engineer — writes tests, analyzes coverage, and ensures code quality across the project.\n\nUses the \\`qa\\` library skill for full QA methodology including browser testing, health scoring, bug triage, and fix loops. For report-only mode without auto-fixes, add \\`qa-only\\` skill instead.\n\n## WORKFLOW\n\n1) READ the task — determine what needs testing: new feature, regression, coverage gap, flaky test.\n2) ANALYZE existing coverage to identify untested paths and weak spots.\n3) PLAN the test matrix — list scenarios, edge cases, error paths, and boundary values.\n4) EXECUTE QA — follow the qa skill's phased approach: orient, explore, document, triage, fix, verify.\n5) WRITE TESTS — unit tests for logic, integration tests for services, e2e for critical flows.\n6) RUN the test suite and verify all new tests pass. Fix flaky tests if discovered.\n7) REPORT — generate a QA report with health score, coverage delta, and risks.\n\n## RULES\n\n- Tests must be deterministic — no reliance on timing, network, or random data without seeding.\n- Each test must have a clear description that explains WHAT is tested and WHY.\n- Never test implementation details — test behavior and contracts.\n- Mock external dependencies at the boundary, not deep inside the code.\n- Coverage targets: aim for >80% line coverage on new code, >90% on critical paths.\n- Flag any untestable code as a design smell and suggest refactoring.`;\n\nconst CODE_REVIEWER_ROLE = `Senior code reviewer — performs thorough PR reviews focused on correctness, security, maintainability, and adherence to project standards.\n\nUses the \\`review\\` library skill for structured two-pass review (Critical + Informational), auto-fix workflow, TODOS cross-reference, doc staleness checking, and adversarial review scaled by diff size.\n\n## WORKFLOW\n\n1) READ the task and the diff — understand the intent of the change, not just the code.\n2) EXPLORE context — check how the changed code integrates with the rest of the system.\n3) REVIEW — follow the review skill's multi-step methodology:\n a) Scope drift detection — did they build what was requested?\n b) Two-pass review: Critical issues first, then Informational.\n c) Fix-First approach — auto-fix what you can, batch-ask the rest.\n d) Adversarial review — auto-scaled by diff size (small/medium/large).\n4) WRITE FEEDBACK — be specific, cite line numbers, suggest concrete fixes. Distinguish blockers from nits.\n5) DECIDE — approve, request changes, or flag for architect review.\n\n## RULES\n\n- Always explain WHY something is a problem, not just WHAT to change.\n- Distinguish severity: blocker (must fix), suggestion (should fix), nit (optional).\n- Never approve code with known security issues, even if the task is urgent.\n- Be respectful — critique code, not the author.\n- If the change is too large to review safely, request it be split.\n- Check that tests exist for new logic; flag untested paths.`;\n\nconst ARCHITECT_ROLE = `Software architect and technical leader — makes system-level design decisions, defines architecture, and ensures technical coherence across the project.\n\nUses \\`plan-eng-review\\` for structured engineering review of technical plans, and \\`office-hours\\` for YC-style product thinking before major decisions.\n\n## WORKFLOW\n\n1) READ the task — understand the architectural question: new system, scaling challenge, tech debt, migration.\n2) EXPLORE the full codebase to map dependencies, layers, and boundaries.\n3) THINK — use the office-hours skill to challenge premises and explore alternatives before committing to a direction.\n4) ANALYZE trade-offs — document at least two alternative approaches with pros/cons for each.\n5) DESIGN the solution — define component boundaries, data flow, API contracts, and failure modes.\n6) REVIEW — use plan-eng-review to validate the technical plan against engineering standards.\n7) DOCUMENT the decision — write an ADR explaining the chosen approach and rejected alternatives.\n8) COMMUNICATE — set context for the team explaining the architectural direction and constraints.\n\n## RULES\n\n- Every architectural decision must have a documented rationale.\n- Prefer simple solutions over clever ones — complexity is a liability.\n- Design for failure — every external call can fail, every queue can back up.\n- Enforce layer boundaries — domain must not depend on infrastructure.\n- Never introduce a new technology without evaluating operational cost.\n- Think in interfaces first, implementations second.\n- Flag technical debt explicitly; don't let it accumulate silently.`;\n\nconst DEVOPS_ENGINEER_ROLE = `DevOps engineer — manages CI/CD pipelines, infrastructure, deployment automation, and cloud configuration.\n\nUses \\`ship\\` for automated deployment pipelines and \\`canary\\` for post-deploy monitoring. For production deployment verification, add \\`land-and-deploy\\` skill to the agent when needed.\n\n## WORKFLOW\n\n1) READ the task — identify the scope: pipeline fix, infra provisioning, deployment config, monitoring setup.\n2) EXPLORE current infrastructure and CI/CD config to understand the existing setup.\n3) DESIGN the change — plan the infrastructure or pipeline modification with rollback strategy.\n4) IMPLEMENT — write IaC (Terraform, CloudFormation, Docker, K8s manifests) or pipeline configs (GitHub Actions, GitLab CI).\n5) VALIDATE — dry-run or plan the change; verify no destructive modifications to production resources.\n6) DEPLOY — use the ship skill for structured deployment with health checks.\n7) MONITOR — use canary skill for post-deploy verification.\n8) DOCUMENT — update runbooks, env variable lists, and deployment docs.\n\n## RULES\n\n- Never hardcode credentials — use secret managers or environment injection.\n- Every infrastructure change must be idempotent and reversible.\n- Pipeline changes must be tested in a non-production environment first.\n- Always include health checks and rollback triggers in deployments.\n- Tag all cloud resources with project, environment, and owner.\n- Prefer declarative config over imperative scripts.\n- Monitor cost implications of infrastructure changes.`;\n\nconst BUG_HUNTER_ROLE = `Bug hunter — finds, reproduces, and diagnoses bugs through systematic investigation and proposes minimal fixes.\n\nUses the \\`investigate\\` library skill for structured debugging with root cause methodology, 3-strike hypothesis testing, scope lock, and 5-file blast radius check.\n\n## WORKFLOW\n\n1) READ the bug report — extract symptoms, reproduction steps, and expected behavior.\n2) INVESTIGATE — follow the investigate skill's phased approach:\n a) Collect symptoms and trace the execution path.\n b) Scope lock — freeze edits to the affected module.\n c) Form hypotheses and test them (3-strike rule).\n d) Implement minimal fix with regression test.\n e) Verify with 5-file blast radius check.\n3) REPRODUCE — write a failing test that captures the bug before attempting any fix.\n4) FIX — apply the minimal change that resolves the root cause. Avoid collateral refactoring.\n5) VERIFY — confirm the failing test now passes and no existing tests regress.\n6) REPORT — structured debug report explaining root cause, fix, and related areas.\n\n## RULES\n\n- Always reproduce the bug with a test BEFORE fixing it.\n- Fix the root cause, not the symptom — band-aids create more bugs.\n- Keep fixes minimal and focused — one bug per task, no scope creep.\n- Check for the same bug pattern elsewhere in the codebase.\n- Never suppress errors to hide bugs — surface them properly.\n- If the bug is in a dependency, document the workaround and file upstream.`;\n\nconst TECH_WRITER_ROLE = `Technical writer — creates and maintains documentation, READMEs, API references, guides, and inline code comments.\n\nUses \\`document-release\\` for automated post-ship documentation updates, ensuring docs stay in sync with code changes.\n\n## WORKFLOW\n\n1) READ the task — determine the documentation need: new feature docs, API reference, migration guide, README update.\n2) EXPLORE the codebase to understand the feature, its API surface, configuration options, and edge cases.\n3) OUTLINE the document structure — headings, sections, and key points to cover.\n4) WRITE using clear, concise language:\n - Lead with the most important information (inverted pyramid).\n - Include working code examples for every API or configuration option.\n - Add diagrams or tables where they clarify complex relationships.\n5) REVIEW — check for accuracy against the actual code, test that code examples work.\n6) PUBLISH — commit the documentation and set context for the team.\n\n## RULES\n\n- Documentation must match the current code — outdated docs are worse than no docs.\n- Every public API must have: description, parameters, return type, and at least one example.\n- Use active voice and second person (\"you can configure…\" not \"it can be configured…\").\n- Keep sentences under 25 words; paragraphs under 5 sentences.\n- Code examples must be complete and runnable — no pseudo-code in docs.\n- Never document internal implementation details in user-facing docs.`;\n\nconst MARKETER_ROLE = `Marketing strategist — develops positioning, messaging, copy, and campaign strategies using marketing psychology principles.\n\nUses \\`office-hours\\` for product reframing and premise challenge before crafting positioning.\n\n## WORKFLOW\n\n1) READ the task — identify the marketing objective: positioning, landing page copy, campaign plan, competitor analysis.\n2) THINK — use office-hours to challenge assumptions and reframe the product from the customer's perspective.\n3) RESEARCH the product and market — understand the target audience, pain points, and competitive landscape.\n4) STRATEGIZE — define messaging pillars, value propositions, and differentiation angles.\n5) CREATE the deliverable:\n - Copy: headlines, body text, CTAs — with A/B variants.\n - Strategy: channel plan, funnel stages, KPIs.\n - Analysis: competitive matrix, SWOT, positioning map.\n6) REVIEW — check for clarity, consistency, and alignment with brand voice.\n7) DELIVER — commit artifacts and set context with rationale for the chosen approach.\n\n## RULES\n\n- Always lead with customer benefits, not product features.\n- Every claim must be substantiated — no empty superlatives (\"best\", \"revolutionary\").\n- Include measurable KPIs for every campaign recommendation.\n- Respect brand voice and tone guidelines if they exist.\n- A/B test assumptions — never assume you know what converts.\n- Keep copy scannable: short paragraphs, bullet points, clear hierarchy.`;\n\nconst CONTENT_CREATOR_ROLE = `Content creator — writes blog posts, articles, social media content, and educational materials that drive engagement and authority.\n\n## WORKFLOW\n\n1) READ the task — understand the content goal: thought leadership, tutorial, announcement, social post.\n2) RESEARCH the topic — gather key points, statistics, and angles that resonate with the target audience.\n3) OUTLINE the content structure — hook, key sections, CTA. For long-form, plan 3-5 main sections.\n4) WRITE the first draft:\n - Hook the reader in the first two sentences.\n - Use concrete examples and data points.\n - End with a clear call-to-action.\n5) EDIT — tighten prose, eliminate jargon, ensure logical flow.\n6) DELIVER — commit the content and set context with publishing recommendations.\n\n## RULES\n\n- Every piece must have a clear audience and goal defined upfront.\n- Use the inverted pyramid — most important information first.\n- Paragraphs max 3-4 sentences for readability.\n- Include at least one concrete example or data point per section.\n- Never plagiarize — all content must be original.\n- Optimize for the target platform (blog post ≠ tweet ≠ LinkedIn post).`;\n\nconst GROWTH_HACKER_ROLE = `Growth hacker — designs and implements data-driven growth experiments to improve acquisition, activation, retention, and revenue.\n\n## WORKFLOW\n\n1) READ the task — identify the growth lever: onboarding funnel, activation rate, retention loop, referral mechanism.\n2) ANALYZE current metrics — map the funnel, identify drop-off points, and size opportunities.\n3) HYPOTHESIZE — formulate a testable hypothesis: \"If we [change X], then [metric Y] will improve by [Z%] because [reason].\"\n4) DESIGN the experiment — define the test, control group, success metric, sample size, and duration.\n5) IMPLEMENT — build the experiment (feature flag, A/B test, new flow) if code changes are needed.\n6) REPORT — document the experiment design, expected impact, and measurement plan.\n\n## RULES\n\n- Every experiment must have a written hypothesis BEFORE implementation.\n- Define success metrics and minimum detectable effect upfront.\n- Run one experiment per funnel stage at a time to avoid confounding.\n- Prioritize experiments by ICE score (Impact × Confidence × Ease).\n- Never ship a \"growth hack\" that degrades user experience long-term.\n- Document results of every experiment, including failures — they are data.`;\n\nconst SECURITY_AUDITOR_ROLE = `Security auditor — performs security analysis, identifies vulnerabilities, and recommends hardening measures following OWASP and industry best practices.\n\nUses the \\`review\\` skill for structured code review with security focus, and \\`careful\\`/\\`guard\\` skills for safety guardrails on destructive operations.\n\n## WORKFLOW\n\n1) READ the task — determine the audit scope: full codebase review, specific feature, dependency check, or incident response.\n2) EXPLORE the attack surface — map entry points (APIs, forms, file uploads), auth boundaries, and data flows.\n3) AUDIT systematically:\n a) OWASP Top 10 — injection, broken auth, XSS, CSRF, insecure deserialization.\n b) Dependency vulnerabilities — outdated packages, known CVEs.\n c) Secrets — hardcoded credentials, API keys in code or config.\n d) Access control — missing authorization checks, privilege escalation paths.\n e) Data protection — encryption at rest/transit, PII exposure, logging sensitive data.\n4) CLASSIFY findings by severity: Critical, High, Medium, Low — with CVSS-like scoring.\n5) RECOMMEND fixes — provide specific, actionable remediation steps for each finding.\n6) REPORT — commit the audit report and set context with a prioritized action plan.\n\n## RULES\n\n- Never ignore a vulnerability because \"it's unlikely to be exploited\" — document everything.\n- Always verify findings — no false positive reports. Reproduce or prove the vulnerability.\n- Classify severity honestly — don't inflate or downplay.\n- Check both application code AND configuration (CORS, headers, TLS, CSP).\n- Recommend defense-in-depth — never rely on a single security control.\n- Flag any plaintext secrets immediately as Critical, even in test code.`;\n\nconst PERFORMANCE_ENGINEER_ROLE = `Performance engineer — profiles, benchmarks, and optimizes code for speed, memory efficiency, and scalability.\n\nUses the \\`benchmark\\` library skill for structured performance benchmarking with before/after metrics, regression detection, and reporting.\n\n## WORKFLOW\n\n1) READ the task — identify the performance concern: slow endpoint, high memory usage, scaling bottleneck, build time.\n2) MEASURE first — use the benchmark skill to profile the current state, establish baseline metrics (latency, throughput, memory, CPU).\n3) ANALYZE — identify hotspots, bottlenecks, and inefficient patterns. Look for:\n - O(n^2) or worse algorithms where O(n log n) or O(n) is possible.\n - Unnecessary allocations, memory leaks, missing cleanup.\n - N+1 queries, missing indexes, unoptimized joins.\n - Blocking I/O on the main thread, missing parallelism.\n4) OPTIMIZE — apply targeted fixes. One optimization per commit for clear attribution.\n5) BENCHMARK — use the benchmark skill to measure improvement against baseline. Report absolute numbers and percentage change.\n6) DOCUMENT — set context with before/after metrics and explain the optimization rationale.\n\n## RULES\n\n- Always measure BEFORE and AFTER — no optimization without numbers.\n- Optimize the bottleneck, not the code you like refactoring.\n- Prefer algorithmic improvements over micro-optimizations.\n- Never sacrifice readability for marginal performance gains.\n- Profile in realistic conditions — not with trivial test data.\n- Watch for regressions — optimization in one area can degrade another.`;\n\nconst DATA_ENGINEER_ROLE = `Data engineer — builds data pipelines, ETL processes, analytics queries, and data infrastructure.\n\n## WORKFLOW\n\n1) READ the task — identify the data need: new pipeline, query optimization, schema migration, analytics report.\n2) EXPLORE existing data models and pipelines to understand the current data architecture.\n3) DESIGN the data flow — source, transformation steps, destination, error handling, and idempotency strategy.\n4) IMPLEMENT:\n - Schema changes with migrations (never modify in place).\n - ETL logic with proper error handling and retry.\n - Queries optimized for the target database engine.\n5) TEST — validate with representative data samples; check edge cases (nulls, duplicates, encoding, timezone).\n6) DOCUMENT — schema diagrams, pipeline dependencies, SLA expectations.\n\n## RULES\n\n- Every schema change must have a reversible migration.\n- Pipelines must be idempotent — safe to re-run without duplicating data.\n- Always validate data at ingestion boundaries — never trust upstream data.\n- Handle NULLs, duplicates, and encoding issues explicitly.\n- Log pipeline metrics: rows processed, duration, error count.\n- Never run DELETE or UPDATE without a WHERE clause and a backup plan.`;\n\nconst FULLSTACK_DEV_ROLE = `Full-stack developer — works across the entire stack, from database and API to UI components and styling.\n\nUses \\`review\\` for self-review of diffs before transitioning, and \\`design-review\\` for frontend visual consistency checks.\n\n## WORKFLOW\n\n1) READ the task — identify scope: does it span backend and frontend, or is it a vertical slice of a feature?\n2) EXPLORE both backend and frontend code to understand existing patterns and data flow end-to-end.\n3) PLAN the implementation — define the API contract first (request/response shapes), then plan UI components that consume it.\n4) IMPLEMENT BACKEND:\n - Data model, validation, service logic, API endpoint.\n - Error handling with proper HTTP status codes and messages.\n5) IMPLEMENT FRONTEND:\n - Components, state management, API integration.\n - Loading, error, and empty states.\n - Responsive layout and accessibility.\n6) TEST — backend unit/integration tests + frontend component tests. Verify the full data flow works end-to-end.\n7) SELF-REVIEW — use the review skill to check your own diff holistically before transitioning.\n\n## RULES\n\n- Define the API contract before writing any code — frontend and backend must agree.\n- Never duplicate validation — validate on the backend, display errors on the frontend.\n- Keep frontend and backend changes in the same branch for atomic features.\n- Follow each layer's conventions independently — backend patterns for backend, frontend patterns for frontend.\n- Handle every error state in the UI — users should never see a blank screen.\n- If a task is too large to deliver end-to-end, split it and communicate the dependency.`;\n\n// ---------------------------------------------------------------------------\n// Template catalog\n// ---------------------------------------------------------------------------\n\nexport const AGENT_SHOP_TEMPLATES: AgentShopTemplate[] = [\n {\n key: 'backend-dev',\n name: 'Backend Developer',\n description: 'APIs, databases, backend services',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['review', 'careful', 'feature-dev:feature-dev', 'feature-dev:code-explorer'],\n role: BACKEND_DEV_ROLE,\n },\n {\n key: 'frontend-dev',\n name: 'Frontend Developer',\n description: 'React, UI components, CSS, responsive design',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['design-review', 'review', 'feature-dev:feature-dev', 'feature-dev:code-explorer'],\n role: FRONTEND_DEV_ROLE,\n },\n {\n key: 'qa-engineer',\n name: 'QA Engineer',\n description: 'Test writing, coverage analysis, quality assurance, browser testing',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['qa', 'testing-suite:generate-tests', 'testing-suite:test-coverage'],\n role: QA_ENGINEER_ROLE,\n },\n {\n key: 'code-reviewer',\n name: 'Code Reviewer',\n description: 'PR review with auto-fix, adversarial review, security checks',\n tier: 'capable',\n approval_policy: 'suggest',\n skills: ['review', 'careful', 'feature-dev:code-reviewer', 'feature-dev:code-explorer'],\n role: CODE_REVIEWER_ROLE,\n },\n {\n key: 'architect',\n name: 'Architect',\n description: 'System design, architecture decisions, tech leadership',\n tier: 'capable',\n approval_policy: 'suggest',\n skills: ['plan-eng-review', 'office-hours', 'feature-dev:code-architect', 'feature-dev:code-explorer'],\n role: ARCHITECT_ROLE,\n },\n {\n key: 'devops-engineer',\n name: 'DevOps Engineer',\n description: 'CI/CD, infrastructure, deployment, monitoring',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['ship', 'canary', 'devops-automation:cloud-architect'],\n role: DEVOPS_ENGINEER_ROLE,\n },\n {\n key: 'bug-hunter',\n name: 'Bug Hunter',\n description: 'Systematic debugging, root cause analysis, minimal fixes',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['investigate', 'careful', 'feature-dev:feature-dev', 'feature-dev:code-explorer'],\n role: BUG_HUNTER_ROLE,\n },\n {\n key: 'tech-writer',\n name: 'Technical Writer',\n description: 'Documentation, READMEs, API docs, release notes',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['document-release', 'review', 'feature-dev:code-explorer'],\n role: TECH_WRITER_ROLE,\n },\n {\n key: 'marketer',\n name: 'Marketer',\n description: 'Marketing strategy, positioning, copy, campaigns',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['office-hours'],\n role: MARKETER_ROLE,\n },\n {\n key: 'content-creator',\n name: 'Content Creator',\n description: 'Blog posts, articles, social media content',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['office-hours'],\n role: CONTENT_CREATOR_ROLE,\n },\n {\n key: 'growth-hacker',\n name: 'Growth Hacker',\n description: 'Growth experiments, analytics, user acquisition',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['office-hours', 'feature-dev:feature-dev'],\n role: GROWTH_HACKER_ROLE,\n },\n {\n key: 'security-auditor',\n name: 'Security Auditor',\n description: 'Security scanning, vulnerability analysis, OWASP, guardrails',\n tier: 'capable',\n approval_policy: 'suggest',\n skills: ['review', 'careful', 'guard', 'feature-dev:code-reviewer'],\n role: SECURITY_AUDITOR_ROLE,\n },\n {\n key: 'performance-engineer',\n name: 'Performance Engineer',\n description: 'Optimization, profiling, benchmarks, load testing',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['benchmark', 'investigate', 'feature-dev:feature-dev', 'feature-dev:code-explorer'],\n role: PERFORMANCE_ENGINEER_ROLE,\n },\n {\n key: 'data-engineer',\n name: 'Data Engineer',\n description: 'Data pipelines, ETL, analytics, SQL',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['careful', 'feature-dev:feature-dev', 'feature-dev:code-explorer'],\n role: DATA_ENGINEER_ROLE,\n },\n {\n key: 'fullstack-dev',\n name: 'Full-Stack Developer',\n description: 'End-to-end development, frontend and backend',\n tier: 'balanced',\n approval_policy: 'auto',\n skills: ['review', 'design-review', 'feature-dev:feature-dev', 'feature-dev:code-explorer'],\n role: FULLSTACK_DEV_ROLE,\n },\n];\n\n/** All known shop template keys. */\nexport type AgentShopKey =\n | 'backend-dev' | 'frontend-dev' | 'qa-engineer' | 'code-reviewer'\n | 'architect' | 'devops-engineer' | 'bug-hunter' | 'tech-writer'\n | 'marketer' | 'content-creator' | 'growth-hacker' | 'security-auditor'\n | 'performance-engineer' | 'data-engineer' | 'fullstack-dev';\n\n/** Look up a shop template by its key. */\nexport function getShopTemplateByKey(key: string): AgentShopTemplate | undefined {\n return AGENT_SHOP_TEMPLATES.find((t) => t.key === key);\n}\n","/**\n * Typed event bus.\n *\n * The single communication channel between all layers.\n * Synchronous emit — handlers run inline.\n * TUI, logger, run store, state all subscribe independently.\n */\n\nimport type {\n OrchestratorEvent,\n OrchestratorEventType,\n EventPayload,\n} from '../domain/events.js';\n\ntype Handler<T> = (event: T) => void;\n\nexport class EventBus {\n private handlers = new Map<string, Set<Handler<any>>>();\n private wildcardHandlers = new Set<Handler<OrchestratorEvent>>();\n private maxListeners: number = 10;\n private warnedTypes = new Set<string>();\n\n /**\n * Set the maximum number of listeners per event type before a warning is emitted.\n * Helps detect memory leaks from repeated subscriptions in watch mode.\n */\n setMaxListeners(n: number): void {\n this.maxListeners = n;\n }\n\n getMaxListeners(): number {\n return this.maxListeners;\n }\n\n /**\n * Get the number of listeners for a specific event type.\n */\n listenerCount(type: OrchestratorEventType): number {\n return this.handlers.get(type)?.size ?? 0;\n }\n\n /**\n * Subscribe to events of a specific type.\n * Returns an unsubscribe function.\n */\n on<T extends OrchestratorEventType>(\n type: T,\n handler: Handler<EventPayload<T>>,\n ): () => void {\n if (!this.handlers.has(type)) {\n this.handlers.set(type, new Set());\n }\n const set = this.handlers.get(type)!;\n set.add(handler);\n\n // Warn once per type when listener count exceeds maxListeners\n if (this.maxListeners > 0 && set.size > this.maxListeners && !this.warnedTypes.has(type)) {\n this.warnedTypes.add(type);\n console.warn(\n `EventBus: possible memory leak detected. ${set.size} listeners added for \"${type}\". ` +\n `Use setMaxListeners() to increase limit if this is intentional.`,\n );\n }\n\n return () => this.off(type, handler);\n }\n\n /**\n * Subscribe to an event type, auto-unsubscribe after first call.\n */\n once<T extends OrchestratorEventType>(\n type: T,\n handler: Handler<EventPayload<T>>,\n ): () => void {\n const wrapper: Handler<EventPayload<T>> = (event) => {\n this.off(type, wrapper);\n handler(event);\n };\n return this.on(type, wrapper);\n }\n\n /**\n * Unsubscribe a handler from an event type.\n */\n off<T extends OrchestratorEventType>(\n type: T,\n handler: Handler<EventPayload<T>>,\n ): void {\n this.handlers.get(type)?.delete(handler);\n }\n\n /**\n * Emit an event synchronously to all subscribed handlers.\n */\n emit(event: OrchestratorEvent): void {\n const typed = this.handlers.get(event.type);\n if (typed) this.dispatchToSet(typed, event, 'handler');\n this.dispatchToSet(this.wildcardHandlers, event, 'wildcard handler');\n }\n\n private dispatchToSet(handlers: Iterable<Handler<any>>, event: OrchestratorEvent, label: string): void {\n for (const handler of handlers) {\n try {\n handler(event);\n } catch (err) {\n console.error(`EventBus ${label} error for \"${event.type}\":`, err);\n }\n }\n }\n\n /**\n * Subscribe to ALL events regardless of type.\n */\n onAny(handler: Handler<OrchestratorEvent>): () => void {\n this.wildcardHandlers.add(handler);\n\n if (\n this.maxListeners > 0 &&\n this.wildcardHandlers.size > this.maxListeners &&\n !this.warnedTypes.has('*')\n ) {\n this.warnedTypes.add('*');\n console.warn(\n `EventBus: possible memory leak detected. ${this.wildcardHandlers.size} wildcard listeners added. ` +\n `Use setMaxListeners() to increase limit if this is intentional.`,\n );\n }\n\n return () => { this.wildcardHandlers.delete(handler); };\n }\n\n /**\n * Remove all handlers.\n */\n clear(): void {\n this.handlers.clear();\n this.wildcardHandlers.clear();\n this.warnedTypes.clear();\n }\n}\n","/**\n * Agent factory — converts shop templates into CreateAgentInput.\n *\n * Resolves adapter-specific model from the template's semantic tier\n * and filters MCP skills (colon-format) for non-Claude adapters.\n */\n\nimport type { AgentShopTemplate } from '../domain/agent-shop.js';\nimport type { CreateAgentInput } from '../domain/agent.js';\nimport { resolveModel } from '../domain/model-tiers.js';\n\n/** MCP skills use colon-separated names (e.g. `package:skill-name`). */\nexport function isMcpSkill(skill: string): boolean {\n return skill.includes(':');\n}\n\n/**\n * Convert a shop template into CreateAgentInput for the given adapter.\n *\n * - Resolves the concrete model string from adapter + tier\n * - Filters out MCP skills for non-Claude adapters (they only work with Claude CLI)\n */\nexport function templateToAgentInput(\n template: AgentShopTemplate,\n adapter: string,\n): CreateAgentInput {\n const model = resolveModel(adapter, template.tier);\n const skills = adapter === 'claude'\n ? template.skills\n : template.skills.filter((s) => !isMcpSkill(s));\n\n return {\n name: template.name,\n adapter,\n model: model || undefined,\n role: template.role,\n skills,\n approval_policy: template.approval_policy,\n };\n}\n","/**\n * Task service — business logic for task lifecycle.\n *\n * Validates state transitions, emits events, manages CRUD.\n * CLI commands call this service, not storage directly.\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { nanoid } from 'nanoid';\nimport type { Task, CreateTaskInput, TaskStatus } from '../domain/task.js';\nimport { canTransition, isTerminal } from '../domain/transitions.js';\nimport {\n TaskNotFoundError,\n InvalidTransitionError,\n InvalidArgumentsError,\n} from '../domain/errors.js';\nimport type { ITaskStore } from '../infrastructure/storage/interfaces.js';\nimport type { Paths } from '../infrastructure/storage/paths.js';\nimport type { OrchestratorConfig } from '../domain/config.js';\nimport type { EventBus } from './event-bus.js';\nimport { ensureDir } from '../infrastructure/storage/fs-utils.js';\n\nexport class TaskService {\n constructor(\n private readonly taskStore: ITaskStore,\n private readonly eventBus: EventBus,\n private readonly config: OrchestratorConfig,\n private readonly paths?: Paths,\n ) {}\n\n async create(input: CreateTaskInput): Promise<Task> {\n if (!input.title.trim()) {\n throw new InvalidArgumentsError('Task title is required');\n }\n\n const priority = input.priority ?? this.config.defaults.task.priority;\n if (!Number.isInteger(priority) || priority < 1 || priority > 4) {\n throw new InvalidArgumentsError('Priority must be an integer between 1 and 4');\n }\n\n if (input.depends_on?.length) {\n const results = await Promise.all(\n input.depends_on.map(async (depId) => ({ depId, exists: !!(await this.taskStore.get(depId)) })),\n );\n const missing = results.filter((r) => !r.exists).map((r) => r.depId);\n if (missing.length > 0) {\n throw new InvalidArgumentsError(\n `Unknown depends_on task ID(s): ${missing.join(', ')}`,\n );\n }\n }\n\n const now = new Date().toISOString();\n const task: Task = {\n id: `tsk_${nanoid(7)}`,\n title: input.title.trim(),\n description: input.description?.trim() ?? '',\n status: 'todo',\n priority,\n assignee: input.assignee,\n labels: input.labels ?? [],\n depends_on: input.depends_on ?? [],\n created_at: now,\n updated_at: now,\n attempts: 0,\n max_attempts: input.max_attempts ?? this.config.defaults.task.max_attempts,\n workspace_mode: input.workspace_mode,\n review_criteria: input.review_criteria,\n scope: input.scope,\n goalId: input.goalId,\n };\n\n if (input.attachments?.length && this.paths) {\n const attachmentNames = await this.copyAttachments(task.id, input.attachments);\n task.attachments = attachmentNames;\n }\n\n await this.taskStore.save(task);\n this.eventBus.emit({ type: 'task:created', task });\n\n return task;\n }\n\n async list(filter?: { status?: TaskStatus; goalId?: string }): Promise<Task[]> {\n return this.taskStore.list(filter);\n }\n\n async get(id: string): Promise<Task> {\n const task = await this.taskStore.get(id);\n if (!task) throw new TaskNotFoundError(id);\n return task;\n }\n\n async updateStatus(id: string, newStatus: TaskStatus): Promise<Task> {\n const task = await this.get(id);\n const oldStatus = task.status;\n\n if (!canTransition(oldStatus, newStatus)) {\n throw new InvalidTransitionError(id, oldStatus, newStatus);\n }\n\n task.status = newStatus;\n task.updated_at = new Date().toISOString();\n await this.taskStore.save(task);\n\n this.eventBus.emit({\n type: 'task:status_changed',\n taskId: id,\n from: oldStatus,\n to: newStatus,\n });\n\n return task;\n }\n\n async assign(taskId: string, agentId: string): Promise<Task> {\n const task = await this.get(taskId);\n task.assignee = agentId;\n task.updated_at = new Date().toISOString();\n await this.taskStore.save(task);\n\n this.eventBus.emit({\n type: 'task:assigned',\n taskId,\n agentId,\n });\n\n return task;\n }\n\n async cancel(id: string): Promise<Task> {\n const task = await this.get(id);\n\n if (isTerminal(task.status)) {\n throw new InvalidTransitionError(id, task.status, 'cancelled');\n }\n\n return this.updateStatus(id, 'cancelled');\n }\n\n async retry(id: string): Promise<Task> {\n const task = await this.get(id);\n\n if (task.status !== 'failed' && task.status !== 'cancelled') {\n throw new InvalidTransitionError(id, task.status, 'todo');\n }\n\n const oldStatus = task.status;\n task.status = 'todo';\n task.attempts = 0;\n task.updated_at = new Date().toISOString();\n await this.taskStore.save(task);\n\n this.eventBus.emit({\n type: 'task:status_changed',\n taskId: id,\n from: oldStatus,\n to: 'todo',\n });\n\n return task;\n }\n\n async reject(id: string, feedback?: string): Promise<Task> {\n const task = await this.get(id);\n\n if (task.status !== 'review') {\n throw new InvalidTransitionError(id, task.status, 'todo');\n }\n\n const oldStatus = task.status;\n task.status = 'todo';\n task.attempts = 0;\n task.feedback = feedback;\n task.updated_at = new Date().toISOString();\n await this.taskStore.save(task);\n\n this.eventBus.emit({\n type: 'task:status_changed',\n taskId: id,\n from: oldStatus,\n to: 'todo',\n });\n\n return task;\n }\n\n async update(id: string, fields: { title?: string; description?: string; priority?: number; labels?: string[]; attachments?: string[] }): Promise<Task> {\n const task = await this.get(id);\n\n if (fields.title !== undefined) {\n if (!fields.title.trim()) throw new InvalidArgumentsError('Task title cannot be empty');\n task.title = fields.title.trim();\n }\n if (fields.description !== undefined) task.description = fields.description.trim();\n if (fields.priority !== undefined) {\n if (!Number.isInteger(fields.priority) || fields.priority < 1 || fields.priority > 4) {\n throw new InvalidArgumentsError('Priority must be an integer between 1 and 4');\n }\n task.priority = fields.priority;\n }\n if (fields.labels !== undefined) task.labels = fields.labels;\n if (fields.attachments?.length && this.paths) {\n const attachmentNames = await this.copyAttachments(id, fields.attachments);\n task.attachments = [...(task.attachments ?? []), ...attachmentNames];\n }\n\n task.updated_at = new Date().toISOString();\n await this.taskStore.save(task);\n return task;\n }\n\n async delete(id: string): Promise<void> {\n const task = await this.get(id);\n if (task.status === 'in_progress') {\n throw new InvalidArgumentsError('Cannot delete a running task. Cancel it first.');\n }\n await this.taskStore.delete(id);\n\n if (this.paths) {\n const dir = this.paths.taskAttachmentsDir(id);\n await fs.rm(dir, { recursive: true, force: true });\n }\n }\n\n getAttachmentPath(taskId: string, filename: string): string {\n if (!this.paths) {\n throw new InvalidArgumentsError('Paths not configured');\n }\n return path.join(this.paths.taskAttachmentsDir(taskId), filename);\n }\n\n private async copyAttachments(taskId: string, sourcePaths: string[]): Promise<string[]> {\n if (!this.paths) return [];\n\n const dir = this.paths.taskAttachmentsDir(taskId);\n await ensureDir(dir);\n\n // Validate all files exist first\n await Promise.all(\n sourcePaths.map(async (srcPath) => {\n try {\n await fs.access(srcPath);\n } catch {\n throw new InvalidArgumentsError(`Attachment file not found: ${srcPath}`);\n }\n }),\n );\n\n // Copy all files in parallel\n const names = await Promise.all(\n sourcePaths.map(async (srcPath) => {\n const basename = path.basename(srcPath);\n await fs.copyFile(srcPath, path.join(dir, basename));\n return basename;\n }),\n );\n\n return names;\n }\n\n async incrementAttempts(id: string): Promise<Task> {\n const task = await this.get(id);\n task.attempts += 1;\n task.updated_at = new Date().toISOString();\n await this.taskStore.save(task);\n return task;\n }\n}\n","/**\n * Agent service — business logic for agent lifecycle.\n *\n * Manages agent CRUD, availability, and task assignment matching.\n */\n\nimport { nanoid } from 'nanoid';\nimport type { Agent, CreateAgentInput, AgentStatus } from '../domain/agent.js';\nimport type { Task } from '../domain/task.js';\nimport { AgentNotFoundError, InvalidArgumentsError } from '../domain/errors.js';\nimport type { IAgentStore, IStateStore } from '../infrastructure/storage/interfaces.js';\nimport type { OrchestratorConfig } from '../domain/config.js';\nimport type { EventBus } from './event-bus.js';\n\nexport class AgentService {\n constructor(\n private readonly agentStore: IAgentStore,\n private readonly stateStore: IStateStore,\n private readonly eventBus: EventBus,\n private readonly config: OrchestratorConfig,\n ) {}\n\n async create(input: CreateAgentInput): Promise<Agent> {\n if (!input.name.trim()) {\n throw new InvalidArgumentsError('Agent name is required');\n }\n\n // Check for duplicate name\n const existing = await this.agentStore.getByName(input.name);\n if (existing) {\n throw new InvalidArgumentsError(`Agent \"${input.name}\" already exists`);\n }\n\n const agent: Agent = {\n id: `agt_${nanoid(7)}`,\n name: input.name.trim(),\n adapter: input.adapter || this.config.defaults.agent.adapter,\n role: input.role,\n config: {\n command: input.command,\n model: input.model,\n effort: input.effort,\n approval_policy: input.approval_policy ?? this.config.defaults.agent.approval_policy,\n max_turns: input.max_turns ?? this.config.defaults.agent.max_turns,\n timeout_ms: input.timeout_ms ?? this.config.defaults.agent.timeout_ms,\n stall_timeout_ms: input.stall_timeout_ms ?? this.config.defaults.agent.stall_timeout_ms,\n env: input.env,\n system_prompt: input.system_prompt,\n workspace_mode: input.workspace_mode,\n skills: input.skills,\n },\n status: 'idle',\n stats: {\n tasks_completed: 0,\n tasks_failed: 0,\n total_runs: 0,\n total_runtime_ms: 0,\n },\n };\n\n await this.agentStore.save(agent);\n return agent;\n }\n\n async list(): Promise<Agent[]> {\n return this.agentStore.list();\n }\n\n async get(id: string): Promise<Agent> {\n const agent = await this.agentStore.get(id);\n if (!agent) throw new AgentNotFoundError(id);\n return agent;\n }\n\n async remove(id: string): Promise<void> {\n const agent = await this.get(id);\n if (agent.status === 'running') {\n // Check if actually running (has entry in state.running)\n const state = await this.stateStore.read();\n const isActuallyRunning = Object.values(state.running).some((e) => e.agent_id === id);\n if (isActuallyRunning) {\n throw new InvalidArgumentsError('Cannot remove a running agent. Stop it first.');\n }\n // Agent stuck in 'running' with no active run — reset and allow delete\n agent.status = 'idle';\n await this.agentStore.save(agent);\n }\n await this.agentStore.delete(id);\n }\n\n async update(id: string, fields: { name?: string; role?: string; model?: string; effort?: Agent['config']['effort']; approval_policy?: Agent['config']['approval_policy'] }): Promise<Agent> {\n const agent = await this.get(id);\n\n if (fields.name !== undefined) {\n if (!fields.name.trim()) throw new InvalidArgumentsError('Agent name cannot be empty');\n // Check for duplicate name (excluding self)\n const existing = await this.agentStore.getByName(fields.name.trim());\n if (existing && existing.id !== id) {\n throw new InvalidArgumentsError(`Agent \"${fields.name}\" already exists`);\n }\n agent.name = fields.name.trim();\n }\n if (fields.role !== undefined) agent.role = fields.role || undefined;\n if (fields.model !== undefined) agent.config.model = fields.model || undefined;\n if (fields.effort !== undefined) agent.config.effort = fields.effort || undefined;\n if (fields.approval_policy !== undefined) agent.config.approval_policy = fields.approval_policy;\n\n await this.agentStore.save(agent);\n return agent;\n }\n\n async disable(id: string): Promise<Agent> {\n return this.setStatus(id, 'disabled');\n }\n\n async enable(id: string): Promise<Agent> {\n return this.setStatus(id, 'idle');\n }\n\n async setAutonomous(id: string, enabled: boolean): Promise<Agent> {\n const agent = await this.get(id);\n agent.autonomous = enabled;\n await this.agentStore.save(agent);\n this.eventBus.emit({ type: 'agent:autonomous_toggled', agentId: id, autonomous: enabled });\n return agent;\n }\n\n async setStatus(id: string, status: AgentStatus): Promise<Agent> {\n const agent = await this.get(id);\n agent.status = status;\n await this.agentStore.save(agent);\n return agent;\n }\n\n async updateStats(\n id: string,\n update: Partial<Agent['stats']>,\n ): Promise<Agent> {\n const agent = await this.get(id);\n Object.assign(agent.stats, update);\n await this.agentStore.save(agent);\n return agent;\n }\n\n /**\n * Find the best available agent for a task using scoring.\n *\n * Scoring:\n * - Explicit assignee match = 100\n * - Skill match with task labels = 50 per match\n * - Role match with task labels = 30\n * - Idle status bonus = 20\n * - Success rate bonus = 0–10 (scaled by completed / total)\n */\n async findBestAgent(task: Task): Promise<Agent | null> {\n const agents = await this.agentStore.list();\n const available = agents.filter(\n (a) => a.status === 'idle',\n );\n\n if (available.length === 0) return null;\n\n // Explicit assignee — hard constraint\n if (task.assignee) {\n const assigned = agents.find((a) => a.id === task.assignee);\n if (assigned && assigned.status === 'idle') return assigned;\n return null;\n }\n\n // Pre-compute lowercase task labels once\n const lowerLabels = task.labels?.length\n ? task.labels.map((l) => l.toLowerCase())\n : undefined;\n\n // Score each available agent\n const scored = available.map((agent) => {\n let score = 0;\n\n // Skill match with task labels: 50 per matching skill\n if (lowerLabels && agent.config.skills?.length) {\n const skillSet = new Set(agent.config.skills.map((s) => s.toLowerCase()));\n for (const label of lowerLabels) {\n if (skillSet.has(label)) {\n score += 50;\n }\n }\n }\n\n // Role match with task labels: 30\n if (lowerLabels && agent.role) {\n const lowerRole = agent.role.toLowerCase();\n if (lowerLabels.some((l) => lowerRole.includes(l))) {\n score += 30;\n }\n }\n\n // Idle bonus\n if (agent.status === 'idle') {\n score += 20;\n }\n\n // Success rate bonus: 0–10\n const totalTasks = agent.stats.tasks_completed + agent.stats.tasks_failed;\n if (totalTasks > 0) {\n score += Math.round((agent.stats.tasks_completed / totalTasks) * 10);\n }\n\n return { agent, score };\n });\n\n // Sort descending by score\n scored.sort((a, b) => b.score - a.score);\n\n return scored[0]?.agent ?? null;\n }\n}\n","/**\n * Run service — manages run lifecycle and event streaming.\n */\n\nimport { nanoid } from 'nanoid';\nimport type { Run, RunEvent, RunStatus, TokenUsage } from '../domain/run.js';\nimport type { IRunStore } from '../infrastructure/storage/interfaces.js';\nimport type { EventBus } from './event-bus.js';\n\nexport class RunService {\n constructor(\n private readonly runStore: IRunStore,\n private readonly eventBus: EventBus,\n ) {}\n\n async create(params: {\n taskId: string;\n agentId: string;\n attempt: number;\n prompt: string;\n workspacePath: string;\n }): Promise<Run> {\n const run: Run = {\n id: `run_${nanoid(7)}`,\n task_id: params.taskId,\n agent_id: params.agentId,\n attempt: params.attempt,\n status: 'preparing',\n started_at: new Date().toISOString(),\n workspace_path: params.workspacePath,\n prompt: params.prompt,\n };\n\n await this.runStore.save(run);\n return run;\n }\n\n async get(id: string): Promise<Run | null> {\n return this.runStore.get(id);\n }\n\n async start(id: string, pid: number): Promise<Run> {\n const run = await this.runStore.get(id);\n if (!run) throw new Error(`Run not found: ${id}`);\n\n run.status = 'running';\n run.pid = pid;\n await this.runStore.save(run);\n\n this.eventBus.emit({\n type: 'agent:started',\n agentId: run.agent_id,\n taskId: run.task_id,\n runId: id,\n });\n\n return run;\n }\n\n async finish(\n id: string,\n status: RunStatus,\n tokens?: TokenUsage,\n error?: string,\n ): Promise<Run> {\n const run = await this.runStore.get(id);\n if (!run) throw new Error(`Run not found: ${id}`);\n\n run.status = status;\n run.finished_at = new Date().toISOString();\n run.tokens = tokens;\n run.error = error;\n await this.runStore.save(run);\n\n this.eventBus.emit({\n type: 'agent:completed',\n runId: id,\n agentId: run.agent_id,\n success: status === 'succeeded',\n });\n\n return run;\n }\n\n async appendEvent(runId: string, event: RunEvent): Promise<void> {\n await this.runStore.appendEvent(runId, event);\n }\n\n async listAll(): Promise<Run[]> {\n return this.runStore.listAll();\n }\n\n async listForTask(taskId: string): Promise<Run[]> {\n return this.runStore.listForTask(taskId);\n }\n\n async listForAgent(agentId: string): Promise<Run[]> {\n return this.runStore.listForAgent(agentId);\n }\n\n async readEvents(runId: string): Promise<RunEvent[]> {\n return this.runStore.readEvents(runId);\n }\n\n async readEventsTail(runId: string, count: number): Promise<RunEvent[]> {\n return this.runStore.readEventsTail(runId, count);\n }\n\n /**\n * Get error and last N lines of output from the most recent failed run for a task.\n * Used to provide retry context so agents can learn from previous failures.\n */\n async getLastFailedRunContext(\n taskId: string,\n ): Promise<{ error: string; output: string } | null> {\n const runs = await this.runStore.listForTask(taskId);\n const failedRun = runs\n .filter((r) => r.status === 'failed')\n .sort((a, b) => (b.finished_at ?? '').localeCompare(a.finished_at ?? ''))\n [0];\n\n if (!failedRun) return null;\n\n const error = failedRun.error ?? 'Unknown error';\n\n // Read last 50 events (sufficient for retry context, prevents OOM on large runs)\n let output = '';\n try {\n const events = await this.runStore.readEventsTail(failedRun.id, 50);\n output = events\n .filter((e) => e.type === 'agent_output' || e.type === 'error')\n .map((e) => (typeof e.data === 'string' ? e.data : JSON.stringify(e.data)))\n .join('\\n');\n } catch {\n // Events file may not exist — that's fine\n }\n\n return { error, output };\n }\n}\n","/**\n * Clipboard service for detecting and extracting images from the system clipboard.\n *\n * Platform support:\n * - macOS: osascript (clipboard info / clipboard as PNGf)\n * - Linux: xclip -selection clipboard\n * - Windows: PowerShell Get-Clipboard\n */\n\nimport { execFile as execFileCb, execFileSync } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { writeFile, readFile, unlink, mkdtemp, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { OrchestryError } from '../domain/errors.js';\n\nconst execFile = promisify(execFileCb);\n\nconst EXEC_TIMEOUT_MS = 3_000;\n\nexport type ClipboardContentType = 'image' | 'text' | 'empty';\n\nexport interface ClipboardImage {\n data: Buffer;\n ext: string;\n}\n\n/**\n * Checks whether the required clipboard tool is available on this platform.\n *\n * - macOS: pbpaste (always present)\n * - Linux: xclip\n * - Windows: PowerShell (always present)\n */\nexport function isClipboardToolAvailable(): boolean {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n // pbpaste/osascript are always available on macOS\n return true;\n }\n\n if (platform === 'linux') {\n try {\n execFileSync('which', ['xclip'], { timeout: EXEC_TIMEOUT_MS, stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n if (platform === 'win32') {\n // PowerShell is always available on modern Windows\n return true;\n }\n\n return false;\n}\n\n/**\n * Detects the type of content currently in the system clipboard.\n *\n * Returns 'image' if the clipboard contains an image (PNG or TIFF),\n * 'text' if it contains text, or 'empty' if the clipboard is empty.\n */\nexport async function detectClipboardType(): Promise<ClipboardContentType> {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return detectMacOS();\n }\n\n if (platform === 'linux') {\n return detectLinux();\n }\n\n if (platform === 'win32') {\n return detectWindows();\n }\n\n throw new OrchestryError(\n `Unsupported platform for clipboard: ${platform}`,\n 1,\n 'Supported: macOS, Linux, Windows',\n );\n}\n\n/**\n * Extracts an image from the system clipboard.\n *\n * Returns the image data as a Buffer with its file extension,\n * or null if the clipboard does not contain an image.\n */\nexport async function getClipboardImage(): Promise<ClipboardImage | null> {\n const type = await detectClipboardType();\n if (type !== 'image') return null;\n\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return getImageMacOS();\n }\n\n if (platform === 'linux') {\n return getImageLinux();\n }\n\n if (platform === 'win32') {\n return getImageWindows();\n }\n\n return null;\n}\n\n// ─── macOS ────────────────────────────────────────────────────────────────────\n\nasync function detectMacOS(): Promise<ClipboardContentType> {\n try {\n const { stdout } = await execFile('osascript', ['-e', 'clipboard info'], {\n timeout: EXEC_TIMEOUT_MS,\n });\n\n if (stdout.includes('«class PNGf»') || stdout.includes('«class TIFF»')) {\n return 'image';\n }\n\n if (stdout.includes('«class ut16»') || stdout.includes('«class utf8»')) {\n return 'text';\n }\n\n // If clipboard info returned something but not text or image\n return stdout.trim().length > 0 ? 'text' : 'empty';\n } catch {\n return 'empty';\n }\n}\n\nasync function getImageMacOS(): Promise<ClipboardImage | null> {\n const dir = await mkdtemp(join(tmpdir(), 'orch-clip-'));\n const filePath = join(dir, 'clipboard.png');\n\n try {\n // AppleScript to write clipboard image (as PNG) to a temp file\n const script = `\n set theFile to POSIX file \"${filePath}\"\n try\n set imgData to the clipboard as «class PNGf»\n set fRef to open for access theFile with write permission\n write imgData to fRef\n close access fRef\n return \"ok\"\n on error\n try\n close access theFile\n end try\n return \"error\"\n end try\n `;\n\n const { stdout } = await execFile('osascript', ['-e', script], {\n timeout: EXEC_TIMEOUT_MS,\n });\n\n if (stdout.trim() !== 'ok') return null;\n\n const data = await readFile(filePath);\n return { data, ext: 'png' };\n } catch {\n return null;\n } finally {\n // Cleanup temp file\n try {\n await unlink(filePath);\n } catch {\n // Ignore cleanup errors\n }\n try {\n await rm(dir, { recursive: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n// ─── Linux ────────────────────────────────────────────────────────────────────\n\nasync function detectLinux(): Promise<ClipboardContentType> {\n try {\n const { stdout } = await execFile(\n 'xclip',\n ['-selection', 'clipboard', '-t', 'TARGETS', '-o'],\n { timeout: EXEC_TIMEOUT_MS },\n );\n\n const targets = stdout.toLowerCase();\n\n if (targets.includes('image/png') || targets.includes('image/tiff') || targets.includes('image/jpeg')) {\n return 'image';\n }\n\n if (targets.includes('text/plain') || targets.includes('utf8_string') || targets.includes('string')) {\n return 'text';\n }\n\n return targets.trim().length > 0 ? 'text' : 'empty';\n } catch {\n return 'empty';\n }\n}\n\nasync function getImageLinux(): Promise<ClipboardImage | null> {\n try {\n const { stdout } = await execFile(\n 'xclip',\n ['-selection', 'clipboard', '-t', 'image/png', '-o'],\n { timeout: EXEC_TIMEOUT_MS, encoding: 'buffer' as unknown as BufferEncoding, maxBuffer: 50 * 1024 * 1024 },\n );\n\n // stdout is a Buffer when encoding is 'buffer'\n const data = Buffer.isBuffer(stdout) ? stdout : Buffer.from(stdout, 'binary');\n if (data.length === 0) return null;\n\n return { data, ext: 'png' };\n } catch {\n return null;\n }\n}\n\n// ─── Windows ──────────────────────────────────────────────────────────────────\n\nasync function detectWindows(): Promise<ClipboardContentType> {\n try {\n // Check for image first\n const { stdout: imgCheck } = await execFile(\n 'powershell',\n ['-NoProfile', '-Command', 'if (Get-Clipboard -Format Image) { \"image\" } else { \"none\" }'],\n { timeout: EXEC_TIMEOUT_MS },\n );\n\n if (imgCheck.trim() === 'image') return 'image';\n\n // Check for text\n const { stdout: textCheck } = await execFile(\n 'powershell',\n ['-NoProfile', '-Command', 'if (Get-Clipboard) { \"text\" } else { \"empty\" }'],\n { timeout: EXEC_TIMEOUT_MS },\n );\n\n return textCheck.trim() === 'text' ? 'text' : 'empty';\n } catch {\n return 'empty';\n }\n}\n\nasync function getImageWindows(): Promise<ClipboardImage | null> {\n const dir = await mkdtemp(join(tmpdir(), 'orch-clip-'));\n const filePath = join(dir, 'clipboard.png');\n\n try {\n const script = `\n Add-Type -AssemblyName System.Windows.Forms\n $img = [System.Windows.Forms.Clipboard]::GetImage()\n if ($img) {\n $img.Save('${filePath.replace(/\\\\/g, '\\\\\\\\')}', [System.Drawing.Imaging.ImageFormat]::Png)\n Write-Output 'ok'\n } else {\n Write-Output 'error'\n }\n `;\n\n const { stdout } = await execFile('powershell', ['-NoProfile', '-Command', script], {\n timeout: EXEC_TIMEOUT_MS,\n });\n\n if (stdout.trim() !== 'ok') return null;\n\n const data = await readFile(filePath);\n return { data, ext: 'png' };\n } catch {\n return null;\n } finally {\n try {\n await unlink(filePath);\n } catch {\n // Ignore cleanup errors\n }\n try {\n await rm(dir, { recursive: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n","/**\n * Global configuration — persists across projects.\n *\n * Stored at ~/.orchestry/global.yml\n */\n\n/** Activity feed filter preset name */\nexport type ActivityFilterPreset = 'all' | 'text' | 'tools' | 'errors' | 'events';\n\nexport interface NotificationPreferences {\n toast: boolean;\n bell: boolean;\n}\n\nexport interface TuiPreferences {\n activity_filter: ActivityFilterPreset;\n notifications: NotificationPreferences;\n}\n\nexport interface GlobalConfig {\n tui: TuiPreferences;\n}\n\nexport const DEFAULT_GLOBAL_CONFIG: GlobalConfig = {\n tui: {\n activity_filter: 'all',\n notifications: { toast: true, bell: false },\n },\n};\n","/**\n * Generic index manager for file-based stores.\n *\n * Encapsulates the readIndex/rebuildIndex/writeIndex/updateIndex pattern\n * shared by TaskStore, AgentStore, and ContextStore.\n *\n * Each store keeps individual files (YAML or JSON) and an _index.json cache\n * for fast list() calls. IndexManager handles index I/O and rebuild logic.\n */\n\nimport path from 'node:path';\nimport { listFiles, readYaml, readJson, writeJson, ensureDir } from './fs-utils.js';\n\n/** Configuration for how to read individual item files. */\nexport interface IndexManagerConfig<T> {\n /** Directory containing the individual files and _index.json. */\n dir: string;\n\n /** File extension for individual item files (e.g. '.yml', '.json'). */\n ext: '.yml' | '.json';\n\n /** Resolve the full path for an item given its extracted ID. */\n itemPath: (id: string) => string;\n\n /**\n * Optional filter for file names during rebuildIndex scan.\n * Return false to exclude a file (e.g. '_index.json' for .json stores).\n * By default, no files are excluded.\n */\n fileFilter?: (fileName: string) => boolean;\n\n /**\n * Read a single item file. Defaults to readYaml for .yml, readJson for .json.\n * Can be overridden for custom deserialization.\n */\n readItem?: (filePath: string) => Promise<T | null>;\n}\n\n/**\n * Generic index manager that handles _index.json caching for file-based stores.\n *\n * @typeParam T - The stored item type. Must be an object (items are filtered via !== null).\n */\nexport class IndexManager<T> {\n private readonly indexPath: string;\n private readonly dir: string;\n private readonly ext: string;\n private readonly itemPath: (id: string) => string;\n private readonly fileFilter: (fileName: string) => boolean;\n private readonly readItemFn: (filePath: string) => Promise<T | null>;\n\n /** Promise-chain mutex to serialize updateIndex read-modify-write cycles. */\n private mutex: Promise<void> = Promise.resolve();\n\n /** True while executing inside withMutex — prevents re-entrant deadlock. */\n private insideMutex = false;\n\n constructor(config: IndexManagerConfig<T>) {\n this.dir = config.dir;\n this.ext = config.ext;\n this.itemPath = config.itemPath;\n this.indexPath = path.join(config.dir, '_index.json');\n\n this.fileFilter = config.fileFilter ?? (() => true);\n\n if (config.readItem) {\n this.readItemFn = config.readItem;\n } else if (config.ext === '.yml') {\n this.readItemFn = (fp) => readYaml<T>(fp);\n } else {\n this.readItemFn = (fp) => readJson<T>(fp);\n }\n }\n\n /**\n * Read the index file. Falls back to rebuilding from individual files\n * if the index is missing or corrupt.\n */\n async readIndex(): Promise<T[]> {\n try {\n const entries = await readJson<T[]>(this.indexPath);\n if (Array.isArray(entries)) return entries;\n } catch {\n // Corrupted JSON — fall through to rebuild\n }\n return this.rebuildIndex();\n }\n\n /**\n * Rebuild the index by reading all individual item files.\n * Used as fallback when _index.json is missing or corrupted.\n *\n * When called from outside the mutex (standalone), the write is serialized\n * through {@link withMutex} to prevent races with concurrent updateIndex.\n * When called from within the mutex (e.g. updateIndex → readIndex fallback),\n * it writes directly to avoid re-entrant deadlock.\n */\n async rebuildIndex(): Promise<T[]> {\n await ensureDir(this.dir);\n const files = await listFiles(this.dir, this.ext);\n\n const results = await Promise.all(\n files\n .filter(this.fileFilter)\n .map((file) => {\n const id = file.replace(this.ext, '');\n return this.readItemFn(this.itemPath(id));\n }),\n );\n\n const items: T[] = [];\n for (const item of results) {\n if (item != null) items.push(item);\n }\n\n // If already inside the mutex (called via updateIndex → readIndex),\n // write directly to avoid deadlock. Otherwise serialize through mutex.\n if (this.insideMutex) {\n await this.writeIndexUnsafe(items);\n } else {\n await this.withMutex(() => this.writeIndexUnsafe(items));\n }\n return items;\n }\n\n /**\n * Write the index file atomically.\n * Serialized through the mutex to prevent races with concurrent updateIndex.\n */\n async writeIndex(items: T[]): Promise<void> {\n return this.withMutex(() => this.writeIndexUnsafe(items));\n }\n\n /**\n * Apply a mutation to the index and write it back.\n *\n * Serialized through a promise-chain mutex to prevent TOCTOU races\n * where parallel callers could overwrite each other's changes\n * (e.g. two `orch task add` invocations losing data).\n */\n async updateIndex(fn: (items: T[]) => T[]): Promise<void> {\n return this.withMutex(async () => {\n const current = await this.readIndex();\n const updated = fn(current);\n await this.writeIndexUnsafe(updated);\n });\n }\n\n /** Internal write without mutex — called only from within withMutex. */\n private async writeIndexUnsafe(items: T[]): Promise<void> {\n await ensureDir(this.dir);\n await writeJson(this.indexPath, items);\n }\n\n /** Promise-chain mutex: serializes all index-mutating operations. */\n private withMutex<R>(fn: () => Promise<R>): Promise<R> {\n let release: () => void;\n const next = new Promise<void>((resolve) => { release = resolve; });\n const prev = this.mutex;\n this.mutex = next;\n return prev.then(async () => {\n this.insideMutex = true;\n try {\n return await fn();\n } finally {\n this.insideMutex = false;\n release!();\n }\n });\n }\n}\n","/**\n * File-based task store.\n *\n * Tasks are stored as individual YAML files in .orchestry/tasks/.\n * An _index.json file caches the full list for fast list() calls.\n * All writes are atomic (temp → rename).\n */\n\nimport type { Task, TaskStatus } from '../../domain/task.js';\nimport type { ITaskStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { ensureDir, writeYaml, readYaml } from './fs-utils.js';\nimport { IndexManager } from './index-manager.js';\nimport fs from 'node:fs/promises';\n\nexport class TaskStore implements ITaskStore {\n private readonly index: IndexManager<Task>;\n\n constructor(private readonly paths: Paths) {\n this.index = new IndexManager<Task>({\n dir: paths.tasksDir,\n ext: '.yml',\n itemPath: (id) => paths.taskPath(id),\n });\n }\n\n async list(filter?: { status?: TaskStatus; goalId?: string }): Promise<Task[]> {\n const all = await this.index.readIndex();\n\n const tasks = all.filter(\n (task): task is Task =>\n task !== null &&\n (!filter?.status || task.status === filter.status) &&\n (!filter?.goalId || task.goalId === filter.goalId),\n );\n\n return tasks.sort((a, b) => {\n const statusOrder = statusPriority(a.status) - statusPriority(b.status);\n if (statusOrder !== 0) return statusOrder;\n const bTime = b.updated_at ?? '';\n const aTime = a.updated_at ?? '';\n return bTime < aTime ? -1 : bTime > aTime ? 1 : 0;\n });\n }\n\n async get(id: string): Promise<Task | null> {\n return readYaml<Task>(this.paths.taskPath(id));\n }\n\n async save(task: Task): Promise<void> {\n await ensureDir(this.paths.tasksDir);\n await writeYaml(this.paths.taskPath(task.id), task);\n await this.index.updateIndex((idx) => {\n const filtered = idx.filter((t) => t.id !== task.id);\n filtered.push(task);\n return filtered;\n });\n }\n\n async delete(id: string): Promise<void> {\n try {\n await fs.unlink(this.paths.taskPath(id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n await this.index.updateIndex((idx) => idx.filter((t) => t.id !== id));\n }\n}\n\nfunction statusPriority(status: TaskStatus): number {\n const order: Record<TaskStatus, number> = {\n in_progress: 0,\n retrying: 1,\n review: 2,\n todo: 3,\n done: 4,\n failed: 5,\n cancelled: 6,\n };\n return order[status];\n}\n","/**\n * File-based agent store.\n *\n * Agents are stored as individual YAML files in .orchestry/agents/.\n * An _index.json file caches the full list for fast list() calls.\n * All writes are atomic (temp → rename).\n */\n\nimport type { Agent } from '../../domain/agent.js';\nimport type { IAgentStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { ensureDir, writeYaml, readYaml } from './fs-utils.js';\nimport { IndexManager } from './index-manager.js';\nimport fs from 'node:fs/promises';\n\nexport class AgentStore implements IAgentStore {\n private readonly index: IndexManager<Agent>;\n\n constructor(private readonly paths: Paths) {\n this.index = new IndexManager<Agent>({\n dir: paths.agentsDir,\n ext: '.yml',\n itemPath: (id) => paths.agentPath(id),\n });\n }\n\n async list(): Promise<Agent[]> {\n return this.index.readIndex();\n }\n\n async get(id: string): Promise<Agent | null> {\n return readYaml<Agent>(this.paths.agentPath(id));\n }\n\n async getByName(name: string): Promise<Agent | null> {\n const agents = await this.list();\n return agents.find((a) => a.name === name) ?? null;\n }\n\n async save(agent: Agent): Promise<void> {\n await ensureDir(this.paths.agentsDir);\n await writeYaml(this.paths.agentPath(agent.id), agent);\n await this.index.updateIndex((idx) => {\n const filtered = idx.filter((a) => a.id !== agent.id);\n filtered.push(agent);\n return filtered;\n });\n }\n\n async delete(id: string): Promise<void> {\n try {\n await fs.unlink(this.paths.agentPath(id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n await this.index.updateIndex((idx) => idx.filter((a) => a.id !== id));\n }\n}\n","/**\n * File-based run store.\n *\n * Run metadata: .orchestry/runs/<id>.json (atomic write)\n * Run events: .orchestry/runs/<id>.jsonl (append-only)\n */\n\nimport type { Run, RunEvent } from '../../domain/run.js';\nimport type { IRunStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport {\n readJson,\n writeJson,\n appendJsonl,\n readJsonl,\n readJsonlTail,\n closeAppendHandle,\n ensureDir,\n listFiles,\n pathExists,\n} from './fs-utils.js';\nimport { createReadStream } from 'node:fs';\n\nexport class RunStore implements IRunStore {\n constructor(private readonly paths: Paths) {}\n\n async save(run: Run): Promise<void> {\n await ensureDir(this.paths.runsDir);\n await writeJson(this.paths.runPath(run.id), run);\n }\n\n async get(id: string): Promise<Run | null> {\n return readJson<Run>(this.paths.runPath(id));\n }\n\n async listAll(): Promise<Run[]> {\n return this.listFiltered(() => true);\n }\n\n async listForTask(taskId: string): Promise<Run[]> {\n return this.listFiltered((run) => run.task_id === taskId);\n }\n\n async listForAgent(agentId: string): Promise<Run[]> {\n return this.listFiltered((run) => run.agent_id === agentId);\n }\n\n async appendEvent(runId: string, event: RunEvent): Promise<void> {\n await ensureDir(this.paths.runsDir);\n await appendJsonl(this.paths.runEventsPath(runId), event);\n }\n\n async readEvents(runId: string): Promise<RunEvent[]> {\n return readJsonl<RunEvent>(this.paths.runEventsPath(runId));\n }\n\n /**\n * Read the last N events for a run without loading the entire JSONL file.\n */\n async readEventsTail(runId: string, count: number): Promise<RunEvent[]> {\n return readJsonlTail<RunEvent>(this.paths.runEventsPath(runId), count);\n }\n\n closeRunEvents(runId: string): void {\n closeAppendHandle(this.paths.runEventsPath(runId));\n }\n\n async *streamEvents(runId: string, signal?: AbortSignal): AsyncGenerator<RunEvent> {\n const filePath = this.paths.runEventsPath(runId);\n\n // Wait for file to exist (max 30s to avoid infinite polling)\n const deadline = Date.now() + 30_000;\n while (!signal?.aborted && Date.now() < deadline) {\n if (await pathExists(filePath)) break;\n await new Promise((r) => setTimeout(r, 100));\n }\n\n if (signal?.aborted || Date.now() >= deadline) return;\n\n const stream = createReadStream(filePath);\n\n const { readLines } = await import('../process/process-manager.js');\n\n try {\n for await (const line of readLines(stream)) {\n if (signal?.aborted) break;\n if (line.trim()) {\n try {\n yield JSON.parse(line) as RunEvent;\n } catch {\n process.stderr.write(`[RunStore] skipping corrupt JSONL line: ${line.slice(0, 200)}\\n`);\n }\n }\n }\n } finally {\n stream.destroy();\n }\n }\n\n private async listFiltered(predicate: (run: Run) => boolean): Promise<Run[]> {\n await ensureDir(this.paths.runsDir);\n const files = await listFiles(this.paths.runsDir, '.json');\n\n // Batch reads to avoid EMFILE (macOS default ulimit 256)\n const BATCH = 64;\n const all: Run[] = [];\n for (let i = 0; i < files.length; i += BATCH) {\n const batch = files.slice(i, i + BATCH);\n const results = await Promise.all(\n batch.map(file => {\n const id = file.endsWith('.json') ? file.slice(0, -5) : file;\n return readJson<Run>(this.paths.runPath(id));\n }),\n );\n for (const run of results) {\n if (run !== null && predicate(run)) all.push(run);\n }\n }\n\n return all.sort(\n (a, b) => new Date(b.started_at).getTime() - new Date(a.started_at).getTime(),\n );\n }\n}\n","/**\n * Orchestrator runtime state.\n *\n * Persisted in .orchestry/state.json.\n * Updated on every mutation. Not intended for git.\n */\n\nimport type { TokenUsage } from './run.js';\n\nexport interface RunningEntry {\n run_id: string;\n agent_id: string;\n task_id: string;\n pid: number;\n started_at: string;\n last_event_at: string;\n}\n\nexport interface RetryEntry {\n task_id: string;\n attempt: number;\n due_at: string;\n error: string;\n}\n\nexport interface OrchestratorState {\n version: 1;\n pid?: number;\n started_at?: string;\n onboardingCompleted?: boolean;\n running: Record<string, RunningEntry>;\n claimed: Set<string>;\n retry_queue: RetryEntry[];\n stats: {\n total_runs: number;\n total_tasks_completed: number;\n total_tasks_failed: number;\n total_tokens: TokenUsage;\n total_runtime_ms: number;\n };\n}\n\nexport const DEFAULT_STATE: OrchestratorState = {\n version: 1,\n onboardingCompleted: false,\n running: {},\n claimed: new Set<string>(),\n retry_queue: [],\n stats: {\n total_runs: 0,\n total_tasks_completed: 0,\n total_tasks_failed: 0,\n total_tokens: { input: 0, output: 0, reasoning: 0, total: 0, cache_read: 0, cache_write: 0 },\n total_runtime_ms: 0,\n },\n};\n","/**\n * File-based orchestrator state store.\n *\n * State is stored in .orchestry/state.json.\n * Updated atomically on every mutation.\n */\n\nimport { DEFAULT_STATE, type OrchestratorState } from '../../domain/state.js';\nimport type { IStateStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { readJson, writeJson } from './fs-utils.js';\n\nexport class StateStore implements IStateStore {\n constructor(private readonly paths: Paths) {}\n\n async read(): Promise<OrchestratorState> {\n const raw = await readJson<Partial<OrchestratorState>>(this.paths.statePath);\n if (!raw) return structuredClone(DEFAULT_STATE);\n\n const defaults = structuredClone(DEFAULT_STATE);\n return {\n version: raw.version ?? defaults.version,\n pid: raw.pid,\n started_at: raw.started_at,\n onboardingCompleted: typeof raw.onboardingCompleted === 'boolean' ? raw.onboardingCompleted : false,\n running:\n raw.running && typeof raw.running === 'object' ? raw.running : defaults.running,\n claimed: Array.isArray(raw.claimed) ? new Set<string>(raw.claimed) : new Set<string>(defaults.claimed),\n retry_queue: Array.isArray(raw.retry_queue) ? raw.retry_queue : defaults.retry_queue,\n stats: {\n total_runs: raw.stats?.total_runs ?? defaults.stats.total_runs,\n total_tasks_completed:\n raw.stats?.total_tasks_completed ?? defaults.stats.total_tasks_completed,\n total_tasks_failed: raw.stats?.total_tasks_failed ?? defaults.stats.total_tasks_failed,\n total_tokens: {\n ...defaults.stats.total_tokens,\n ...(raw.stats?.total_tokens ?? {}),\n },\n total_runtime_ms: raw.stats?.total_runtime_ms ?? defaults.stats.total_runtime_ms,\n },\n };\n }\n\n async write(state: OrchestratorState): Promise<void> {\n const serializable = { ...state, claimed: Array.from(state.claimed) };\n await writeJson(this.paths.statePath, serializable);\n }\n}\n","/**\n * Configuration domain model.\n *\n * Represents the structure of .orchestry/config.yml\n */\n\nimport type { ApprovalPolicy } from './agent.js';\nimport type { WorkspaceMode } from './task.js';\n\nexport interface ProjectConfig {\n name: string;\n description?: string;\n}\n\nexport interface AgentDefaults {\n adapter: string;\n approval_policy: ApprovalPolicy;\n max_turns: number;\n timeout_ms: number;\n stall_timeout_ms: number;\n workspace_mode: WorkspaceMode;\n}\n\nexport interface TaskDefaults {\n max_attempts: number;\n priority: number;\n}\n\nexport interface SchedulingConfig {\n poll_interval_ms: number;\n max_concurrent_agents: number;\n retry_base_delay_ms: number;\n retry_max_delay_ms: number;\n}\n\nexport interface OrchestratorConfig {\n project: ProjectConfig;\n defaults: {\n agent: AgentDefaults;\n task: TaskDefaults;\n };\n scheduling: SchedulingConfig;\n prompt?: {\n template?: string;\n system_template?: string;\n user_template?: string;\n };\n}\n\nexport const DEFAULT_CONFIG: OrchestratorConfig = {\n project: {\n name: 'my-project',\n },\n defaults: {\n agent: {\n adapter: 'claude',\n approval_policy: 'auto',\n max_turns: 50,\n timeout_ms: 3_600_000,\n stall_timeout_ms: 600_000,\n workspace_mode: 'worktree',\n },\n task: {\n max_attempts: 3,\n priority: 3,\n },\n },\n scheduling: {\n poll_interval_ms: 10_000,\n max_concurrent_agents: 6,\n retry_base_delay_ms: 10_000,\n retry_max_delay_ms: 300_000,\n },\n};\n","/**\n * File-based config store.\n *\n * Reads/writes .orchestry/config.yml.\n * Supports dot-notation access for get/set.\n */\n\nimport { DEFAULT_CONFIG, type OrchestratorConfig } from '../../domain/config.js';\nimport type { IConfigStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { readYaml, writeYaml } from './fs-utils.js';\n\nexport class ConfigStore implements IConfigStore {\n constructor(private readonly paths: Paths) {}\n\n async read(): Promise<OrchestratorConfig> {\n const config = await readYaml<Record<string, unknown>>(this.paths.configPath);\n return deepMerge(\n DEFAULT_CONFIG as unknown as Record<string, unknown>,\n config ?? {},\n ) as unknown as OrchestratorConfig;\n }\n\n async write(config: OrchestratorConfig): Promise<void> {\n await writeYaml(this.paths.configPath, config as unknown as Record<string, unknown>);\n }\n\n async get(keyPath: string): Promise<unknown> {\n const config = await this.read();\n return getByPath(config as unknown as Record<string, unknown>, keyPath);\n }\n\n async set(keyPath: string, value: unknown): Promise<void> {\n const config = await this.read();\n setByPath(config as unknown as Record<string, unknown>, keyPath, value);\n await this.write(config);\n }\n}\n\nfunction getByPath(obj: Record<string, unknown>, keyPath: string): unknown {\n const keys = keyPath.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return current;\n}\n\nfunction setByPath(obj: Record<string, unknown>, keyPath: string, value: unknown): void {\n const keys = keyPath.split('.');\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]!;\n if (typeof current[key] !== 'object' || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = keys[keys.length - 1]!;\n current[lastKey] = value;\n}\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result = { ...target };\n\n for (const key of Object.keys(source)) {\n const sourceVal = source[key];\n const targetVal = result[key];\n\n if (\n sourceVal !== null &&\n sourceVal !== undefined &&\n typeof sourceVal === 'object' &&\n !Array.isArray(sourceVal) &&\n typeof targetVal === 'object' &&\n targetVal !== null &&\n !Array.isArray(targetVal)\n ) {\n result[key] = deepMerge(\n targetVal as Record<string, unknown>,\n sourceVal as Record<string, unknown>,\n );\n } else {\n result[key] = sourceVal;\n }\n }\n\n return result;\n}\n","/**\n * Global config store — reads/writes ~/.orchestry/global.yml\n *\n * Persists across projects. Creates directory if needed.\n */\n\nimport path from 'node:path';\nimport { homedir } from 'node:os';\nimport { mkdir } from 'node:fs/promises';\nimport { DEFAULT_GLOBAL_CONFIG, type GlobalConfig } from '../../domain/global-config.js';\nimport { readYaml, writeYaml } from './fs-utils.js';\n\nconst GLOBAL_DIR = path.join(homedir(), '.orchestry');\nconst GLOBAL_CONFIG_PATH = path.join(GLOBAL_DIR, 'global.yml');\n\nexport class GlobalConfigStore {\n async read(): Promise<GlobalConfig> {\n const data = await readYaml<Record<string, unknown>>(GLOBAL_CONFIG_PATH);\n if (!data) return { ...DEFAULT_GLOBAL_CONFIG, tui: { ...DEFAULT_GLOBAL_CONFIG.tui, notifications: { ...DEFAULT_GLOBAL_CONFIG.tui.notifications } } };\n const tui = data.tui as Record<string, unknown> | undefined;\n const notif = tui?.notifications as Record<string, unknown> | undefined;\n return {\n tui: {\n activity_filter: tui?.activity_filter as GlobalConfig['tui']['activity_filter']\n ?? DEFAULT_GLOBAL_CONFIG.tui.activity_filter,\n notifications: {\n toast: typeof notif?.toast === 'boolean' ? notif.toast : DEFAULT_GLOBAL_CONFIG.tui.notifications.toast,\n bell: typeof notif?.bell === 'boolean' ? notif.bell : DEFAULT_GLOBAL_CONFIG.tui.notifications.bell,\n },\n },\n };\n }\n\n async write(config: GlobalConfig): Promise<void> {\n await mkdir(GLOBAL_DIR, { recursive: true });\n await writeYaml(GLOBAL_CONFIG_PATH, config as unknown as Record<string, unknown>);\n }\n\n async set<K extends keyof GlobalConfig['tui']>(key: K, value: GlobalConfig['tui'][K]): Promise<void> {\n const config = await this.read();\n config.tui[key] = value;\n await this.write(config);\n }\n}\n","/**\n * File-based shared context store.\n *\n * Entries are stored as individual JSON files in .orchestry/context/.\n * An _index.json file caches the full list for fast list() calls.\n * Supports optional TTL for automatic expiration.\n * All writes are atomic (temp → rename).\n */\n\nimport type { ContextEntry, IContextStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { ensureDir, readJson, writeJson } from './fs-utils.js';\nimport { IndexManager } from './index-manager.js';\nimport fs from 'node:fs/promises';\n\nexport class ContextStore implements IContextStore {\n private readonly index: IndexManager<ContextEntry>;\n\n constructor(private readonly paths: Paths) {\n this.index = new IndexManager<ContextEntry>({\n dir: paths.contextDir,\n ext: '.json',\n itemPath: (key) => paths.contextPath(key),\n fileFilter: (f) => f !== '_index.json',\n });\n }\n\n async get(key: string): Promise<ContextEntry | null> {\n const entry = await readJson<ContextEntry>(this.paths.contextPath(key));\n if (!entry) return null;\n\n if (isExpired(entry)) {\n await this.delete(key);\n return null;\n }\n\n return entry;\n }\n\n /** Max TTL: 30 days in milliseconds */\n private static readonly MAX_TTL_MS = 30 * 24 * 60 * 60 * 1000;\n\n async set(key: string, value: string, ttlMs?: number): Promise<void> {\n if (ttlMs !== undefined) {\n if (!Number.isFinite(ttlMs) || ttlMs <= 0 || ttlMs > ContextStore.MAX_TTL_MS) {\n throw new Error(`TTL must be a positive number up to ${ContextStore.MAX_TTL_MS}ms (30 days)`);\n }\n }\n\n await ensureDir(this.paths.contextDir);\n\n const now = new Date().toISOString();\n const existing = await readJson<ContextEntry>(this.paths.contextPath(key));\n\n const entry: ContextEntry = {\n key,\n value,\n created_at: existing?.created_at ?? now,\n updated_at: now,\n ttl_ms: ttlMs,\n expires_at: ttlMs ? new Date(Date.now() + ttlMs).toISOString() : undefined,\n };\n\n await writeJson(this.paths.contextPath(key), entry);\n await this.index.updateIndex(idx => {\n const filtered = idx.filter(e => e.key !== key);\n filtered.push(entry);\n return filtered;\n });\n }\n\n async delete(key: string): Promise<void> {\n try {\n await fs.unlink(this.paths.contextPath(key));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n await this.index.updateIndex(idx => idx.filter(e => e.key !== key));\n }\n\n async list(): Promise<ContextEntry[]> {\n const entries = await this.index.readIndex();\n\n // Lazy cleanup of expired entries\n const expired: ContextEntry[] = [];\n const valid: ContextEntry[] = [];\n\n for (const entry of entries) {\n if (isExpired(entry)) {\n expired.push(entry);\n } else {\n valid.push(entry);\n }\n }\n\n if (expired.length > 0) {\n // Batch delete expired entries in parallel\n await Promise.all(expired.map(e => this.deleteFile(e.key)));\n await this.index.writeIndex(valid);\n }\n\n return valid.sort((a, b) => a.key.localeCompare(b.key));\n }\n\n async getAll(): Promise<Record<string, string>> {\n const entries = await this.list();\n const result: Record<string, string> = {};\n for (const entry of entries) {\n result[entry.key] = entry.value;\n }\n return result;\n }\n\n /** Delete just the file (no index update). Used by lazy expiry cleanup. */\n private async deleteFile(key: string): Promise<void> {\n try {\n await fs.unlink(this.paths.contextPath(key));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n}\n\nfunction isExpired(entry: ContextEntry): boolean {\n if (!entry.expires_at) return false;\n return new Date(entry.expires_at).getTime() < Date.now();\n}\n","/**\n * File-based message store.\n *\n * Each message is a JSON file in .orchestry/messages/.\n * An _index.json file caches the full list for fast list() calls.\n * All writes are atomic (temp → rename).\n */\n\nimport type { Message } from '../../domain/message.js';\nimport type { IMessageStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { ensureDir, readJson, writeJson } from './fs-utils.js';\nimport { IndexManager } from './index-manager.js';\nimport fs from 'node:fs/promises';\n\nexport class MessageStore implements IMessageStore {\n private readonly index: IndexManager<Message>;\n\n constructor(private readonly paths: Paths) {\n this.index = new IndexManager<Message>({\n dir: paths.messagesDir,\n ext: '.json',\n itemPath: (id) => paths.messagePath(id),\n fileFilter: (fileName) => fileName !== '_index.json',\n });\n }\n\n async save(message: Message): Promise<void> {\n await ensureDir(this.paths.messagesDir);\n await writeJson(this.paths.messagePath(message.id), message);\n await this.index.updateIndex((idx) => {\n const filtered = idx.filter((m) => m.id !== message.id);\n filtered.push(message);\n return filtered;\n });\n }\n\n async get(id: string): Promise<Message | null> {\n return readJson<Message>(this.paths.messagePath(id));\n }\n\n async list(): Promise<Message[]> {\n const all = await this.index.readIndex();\n return all\n .filter((m): m is Message => m !== null)\n .sort((a, b) => a.created_at.localeCompare(b.created_at));\n }\n\n async listPending(agentId: string): Promise<Message[]> {\n const all = await this.list();\n const now = Date.now();\n return all.filter((m) => {\n if (m.status !== 'pending') return false;\n if (m.expires_at && new Date(m.expires_at).getTime() < now) return false;\n return m.to_agent_id === agentId;\n });\n }\n\n async markDelivered(id: string): Promise<void> {\n const msg = await this.get(id);\n if (!msg) return;\n msg.status = 'delivered';\n msg.delivered_at = new Date().toISOString();\n await writeJson(this.paths.messagePath(id), msg);\n // Update the index entry\n await this.index.updateIndex((idx) => {\n const filtered = idx.filter((m) => m.id !== id);\n filtered.push(msg);\n return filtered;\n });\n }\n\n async delete(id: string): Promise<void> {\n try {\n await fs.unlink(this.paths.messagePath(id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n await this.index.updateIndex((idx) => idx.filter((m) => m.id !== id));\n }\n\n async purgeExpired(): Promise<number> {\n const all = await this.list();\n const now = Date.now();\n const toDelete = all.filter((m) => {\n const isExpired = m.expires_at && new Date(m.expires_at).getTime() < now;\n const isOldDelivered = m.delivered_at && now - new Date(m.delivered_at).getTime() > 3600_000;\n return isExpired || isOldDelivered;\n });\n const idsToDelete = new Set(toDelete.map((m) => m.id));\n\n // Delete files in parallel\n await Promise.all(\n toDelete.map(async (m) => {\n try {\n await fs.unlink(this.paths.messagePath(m.id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }),\n );\n\n // Single index update to avoid parallel read/write race\n await this.index.updateIndex((idx) => idx.filter((m) => !idsToDelete.has(m.id)));\n\n return toDelete.length;\n }\n}\n","/**\n * Goal domain model.\n *\n * A Goal is a persistent objective that drives autonomous agent work.\n * Goals have lower priority than tasks — agents work on goals only\n * when no regular tasks are available.\n *\n * State machine: active → achieved | abandoned | paused\n * paused → active | achieved | abandoned\n */\n\nexport const GOAL_STATUSES = ['active', 'paused', 'achieved', 'abandoned'] as const;\nexport type GoalStatus = (typeof GOAL_STATUSES)[number];\n\n/** Terminal goal statuses — no further transitions possible. */\nexport const TERMINAL_GOAL_STATUSES: ReadonlySet<GoalStatus> = new Set(['achieved', 'abandoned']);\n\nexport function isGoalTerminal(status: GoalStatus): boolean {\n return TERMINAL_GOAL_STATUSES.has(status);\n}\n\n/** Canonical sort order for goal statuses. */\nexport const GOAL_STATUS_ORDER: Record<GoalStatus, number> = {\n active: 0,\n paused: 1,\n achieved: 2,\n abandoned: 3,\n};\n\nexport interface Goal {\n id: string;\n title: string;\n description: string;\n status: GoalStatus;\n assignee?: string;\n created_at: string;\n updated_at?: string;\n}\n\nexport interface CreateGoalInput {\n title: string;\n description?: string;\n assignee?: string;\n}\n","/**\n * File-based goal store.\n *\n * Goals are stored as individual YAML files in .orchestry/goals/.\n * An _index.json file caches the full list for fast list() calls.\n * All writes are atomic (temp → rename).\n */\n\nimport { GOAL_STATUS_ORDER, type Goal, type GoalStatus } from '../../domain/goal.js';\nimport type { IGoalStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { ensureDir, writeYaml, readYaml } from './fs-utils.js';\nimport { IndexManager } from './index-manager.js';\nimport fs from 'node:fs/promises';\n\nexport class GoalStore implements IGoalStore {\n private readonly index: IndexManager<Goal>;\n\n constructor(private readonly paths: Paths) {\n this.index = new IndexManager<Goal>({\n dir: paths.goalsDir,\n ext: '.yml',\n itemPath: (id) => paths.goalPath(id),\n });\n }\n\n async list(filter?: { status?: GoalStatus }): Promise<Goal[]> {\n const all = await this.index.readIndex();\n\n const goals = all.filter(\n (goal): goal is Goal => goal !== null && (!filter?.status || goal.status === filter.status),\n );\n\n return goals.sort((a, b) => {\n const statusOrder = GOAL_STATUS_ORDER[a.status] - GOAL_STATUS_ORDER[b.status];\n if (statusOrder !== 0) return statusOrder;\n const bTime = b.updated_at ?? '';\n const aTime = a.updated_at ?? '';\n return bTime < aTime ? -1 : bTime > aTime ? 1 : 0;\n });\n }\n\n async get(id: string): Promise<Goal | null> {\n return readYaml<Goal>(this.paths.goalPath(id));\n }\n\n async save(goal: Goal): Promise<void> {\n await ensureDir(this.paths.goalsDir);\n await writeYaml(this.paths.goalPath(goal.id), goal);\n await this.index.updateIndex((idx) => {\n const filtered = idx.filter((g) => g.id !== goal.id);\n filtered.push(goal);\n return filtered;\n });\n }\n\n async delete(id: string): Promise<void> {\n try {\n await fs.unlink(this.paths.goalPath(id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n await this.index.updateIndex((idx) => idx.filter((g) => g.id !== id));\n }\n}\n","/**\n * File-based team store.\n *\n * Teams stored as YAML files in .orchestry/teams/.\n */\n\nimport type { Team } from '../../domain/team.js';\nimport type { ITeamStore } from './interfaces.js';\nimport type { Paths } from './paths.js';\nimport { listFiles, readYaml, writeYaml, ensureDir } from './fs-utils.js';\nimport fs from 'node:fs/promises';\n\nexport class TeamStore implements ITeamStore {\n constructor(private readonly paths: Paths) {}\n\n async save(team: Team): Promise<void> {\n await ensureDir(this.paths.teamsDir);\n await writeYaml(this.paths.teamPath(team.id), team);\n }\n\n async get(id: string): Promise<Team | null> {\n return readYaml<Team>(this.paths.teamPath(id));\n }\n\n async getByName(name: string): Promise<Team | null> {\n const teams = await this.list();\n return teams.find((t) => t.name === name) ?? null;\n }\n\n async list(): Promise<Team[]> {\n await ensureDir(this.paths.teamsDir);\n const files = await listFiles(this.paths.teamsDir, '.yml');\n const results = await Promise.all(\n files.map((f) => readYaml<Team>(this.paths.teamPath(f.replace('.yml', '')))),\n );\n return results.filter((t): t is Team => t !== null);\n }\n\n async delete(id: string): Promise<void> {\n try {\n await fs.unlink(this.paths.teamPath(id));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n}\n","/**\n * Message domain model.\n *\n * A Message is a unit of inter-agent communication.\n * Messages are stored as JSON files and injected into agent prompts at dispatch time.\n */\n\nexport type MessageChannel = 'direct' | 'broadcast' | 'lead';\n\nexport type MessageStatus = 'pending' | 'delivered' | 'expired';\n\nexport interface Message {\n id: string;\n channel: MessageChannel;\n from_agent_id: string;\n to_agent_id: string | null;\n subject: string;\n body: string;\n created_at: string;\n expires_at?: string;\n status: MessageStatus;\n delivered_at?: string;\n team_id?: string;\n reply_to?: string;\n}\n\nexport interface CreateMessageInput {\n channel: MessageChannel;\n from_agent_id: string;\n to_agent_id?: string;\n subject: string;\n body: string;\n ttl_ms?: number;\n team_id?: string;\n reply_to?: string;\n}\n\n/** Maximum TTL: 7 days */\nexport const MAX_MESSAGE_TTL_MS = 7 * 24 * 60 * 60 * 1000;\n\n/** Default TTL: 24 hours */\nexport const DEFAULT_MESSAGE_TTL_MS = 24 * 60 * 60 * 1000;\n","/**\n * MessageService — business logic for inter-agent messaging.\n *\n * Handles message creation, routing (direct/broadcast/lead),\n * delivery into agent prompts, and cleanup of expired messages.\n */\n\nimport { nanoid } from 'nanoid';\nimport type { Message, CreateMessageInput, MessageChannel } from '../domain/message.js';\nimport { DEFAULT_MESSAGE_TTL_MS, MAX_MESSAGE_TTL_MS } from '../domain/message.js';\nimport { InvalidArgumentsError } from '../domain/errors.js';\nimport type { IMessageStore, IAgentStore, ITeamStore } from '../infrastructure/storage/interfaces.js';\nimport type { EventBus } from './event-bus.js';\n\nexport class MessageService {\n constructor(\n private readonly messageStore: IMessageStore,\n private readonly agentStore: IAgentStore,\n private readonly teamStore: ITeamStore,\n private readonly eventBus: EventBus,\n ) {}\n\n /**\n * Send a message. For broadcast, creates one message per recipient agent.\n * For 'lead' channel, resolves team lead and sends direct.\n */\n async send(input: CreateMessageInput): Promise<Message[]> {\n if (!input.body.trim()) throw new InvalidArgumentsError('Message body is required');\n\n const ttlMs = input.ttl_ms ?? DEFAULT_MESSAGE_TTL_MS;\n if (ttlMs <= 0 || ttlMs > MAX_MESSAGE_TTL_MS) {\n throw new InvalidArgumentsError(`TTL must be between 1ms and ${MAX_MESSAGE_TTL_MS}ms`);\n }\n\n // Validate sender exists\n const sender = await this.agentStore.get(input.from_agent_id);\n if (!sender && input.from_agent_id !== 'cli') {\n throw new InvalidArgumentsError(`Sender agent not found: ${input.from_agent_id}`);\n }\n\n const now = new Date();\n const baseMessage = {\n channel: input.channel,\n from_agent_id: input.from_agent_id,\n subject: (input.subject || '(no subject)').slice(0, 200),\n body: input.body.slice(0, 4000),\n created_at: now.toISOString(),\n expires_at: new Date(now.getTime() + ttlMs).toISOString(),\n status: 'pending' as const,\n team_id: input.team_id,\n reply_to: input.reply_to,\n };\n\n const messages: Message[] = [];\n\n if (input.channel === 'broadcast') {\n // Fan-out: one message per agent (excluding sender)\n let agents = await this.agentStore.list();\n\n // If team_id specified, only broadcast to team members\n if (input.team_id) {\n const team = await this.teamStore.get(input.team_id);\n if (team) {\n const memberIds = new Set(team.members.map((m) => m.agent_id));\n agents = agents.filter((a) => memberIds.has(a.id));\n }\n }\n\n const recipients = agents.filter((a) => a.id !== input.from_agent_id && a.status !== 'disabled');\n const broadcastMsgs = recipients.map((agent) => ({\n ...baseMessage,\n id: `msg_${nanoid(7)}`,\n to_agent_id: agent.id,\n } as Message));\n await Promise.all(broadcastMsgs.map((msg) => this.messageStore.save(msg)));\n for (const msg of broadcastMsgs) {\n messages.push(msg);\n this.emitSent(msg);\n }\n } else if (input.channel === 'lead') {\n // Resolve team lead\n if (!input.team_id) throw new InvalidArgumentsError('team_id is required for lead channel');\n const team = await this.teamStore.get(input.team_id);\n if (!team) throw new InvalidArgumentsError(`Team not found: ${input.team_id}`);\n\n const msg: Message = {\n ...baseMessage,\n id: `msg_${nanoid(7)}`,\n to_agent_id: team.lead_agent_id,\n };\n await this.messageStore.save(msg);\n messages.push(msg);\n this.emitSent(msg);\n } else {\n // Direct message\n if (!input.to_agent_id) throw new InvalidArgumentsError('to_agent_id is required for direct messages');\n const recipient = await this.agentStore.get(input.to_agent_id);\n if (!recipient) throw new InvalidArgumentsError(`Recipient agent not found: ${input.to_agent_id}`);\n\n const msg: Message = {\n ...baseMessage,\n id: `msg_${nanoid(7)}`,\n to_agent_id: input.to_agent_id,\n };\n await this.messageStore.save(msg);\n messages.push(msg);\n this.emitSent(msg);\n }\n\n return messages;\n }\n\n /**\n * Drain mailbox: fetch pending messages for an agent and mark them delivered.\n * Called by the orchestrator during dispatchTask.\n */\n async drainMailbox(agentId: string, taskId: string): Promise<Message[]> {\n const pending = await this.messageStore.listPending(agentId);\n await Promise.all(pending.map((msg) => this.messageStore.markDelivered(msg.id)));\n for (const msg of pending) {\n this.eventBus.emit({\n type: 'message:delivered',\n messageId: msg.id,\n toAgentId: agentId,\n taskId,\n });\n }\n return pending;\n }\n\n async listAll(): Promise<Message[]> {\n return this.messageStore.list();\n }\n\n async listPendingForAgent(agentId: string): Promise<Message[]> {\n return this.messageStore.listPending(agentId);\n }\n\n async listForAgent(agentId: string): Promise<Message[]> {\n const all = await this.messageStore.list();\n return all.filter((m) => m.to_agent_id === agentId || m.from_agent_id === agentId);\n }\n\n async purgeExpired(): Promise<number> {\n return this.messageStore.purgeExpired();\n }\n\n private emitSent(msg: Message): void {\n this.eventBus.emit({\n type: 'message:sent',\n messageId: msg.id,\n fromAgentId: msg.from_agent_id,\n toAgentId: msg.to_agent_id,\n channel: msg.channel,\n });\n }\n}\n","/**\n * Goal service — business logic for goal lifecycle.\n *\n * Goals are persistent objectives that drive autonomous agent work.\n * State machine: active → achieved | abandoned | paused\n * paused → active | achieved | abandoned\n *\n * Side effect: assigning an agent to a goal auto-enables autonomous mode;\n * removing the last active goal from an agent auto-disables it.\n */\n\nimport { nanoid } from 'nanoid';\nimport type { Goal, GoalStatus, CreateGoalInput } from '../domain/goal.js';\nimport { isGoalTerminal } from '../domain/goal.js';\nimport { AUTONOMOUS_LABEL, type Task } from '../domain/task.js';\nimport { isTerminal as isTaskTerminal } from '../domain/transitions.js';\nimport { GoalNotFoundError, GoalHasPendingTasksError, InvalidArgumentsError } from '../domain/errors.js';\nimport type { IGoalStore, IContextStore } from '../infrastructure/storage/interfaces.js';\nimport type { EventBus } from './event-bus.js';\nimport type { AgentService } from './agent-service.js';\nimport type { TaskService } from './task-service.js';\n\nconst VALID_TRANSITIONS: Record<GoalStatus, GoalStatus[]> = {\n active: ['paused', 'achieved', 'abandoned'],\n paused: ['active', 'achieved', 'abandoned'],\n achieved: [],\n abandoned: [],\n};\n\nexport class GoalService {\n constructor(\n private readonly goalStore: IGoalStore,\n private readonly eventBus: EventBus,\n private readonly agentService?: AgentService,\n private readonly taskService?: TaskService,\n private readonly contextStore?: IContextStore,\n ) {}\n\n async create(input: CreateGoalInput): Promise<Goal> {\n if (!input.title.trim()) {\n throw new InvalidArgumentsError('Goal title is required');\n }\n\n const now = new Date().toISOString();\n const goal: Goal = {\n id: `goal_${nanoid(7)}`,\n title: input.title.trim(),\n description: input.description?.trim() ?? '',\n status: 'active',\n assignee: input.assignee,\n created_at: now,\n updated_at: now,\n };\n\n await this.goalStore.save(goal);\n this.eventBus.emit({ type: 'goal:created', goalId: goal.id, title: goal.title });\n\n if (goal.assignee) {\n await this.enableAutonomous(goal.assignee);\n }\n\n return goal;\n }\n\n async list(filter?: { status?: GoalStatus }): Promise<Goal[]> {\n return this.goalStore.list(filter);\n }\n\n async get(id: string): Promise<Goal> {\n const goal = await this.goalStore.get(id);\n if (!goal) throw new GoalNotFoundError(id);\n return goal;\n }\n\n async updateStatus(id: string, newStatus: GoalStatus, opts?: { force?: boolean }): Promise<Goal> {\n const goal = await this.get(id);\n const oldStatus = goal.status;\n\n if (!VALID_TRANSITIONS[oldStatus].includes(newStatus)) {\n throw new InvalidArgumentsError(\n `Cannot transition goal from '${oldStatus}' to '${newStatus}'`,\n );\n }\n\n // Guard: block achieved if child tasks are still pending.\n // Autonomous [auto] tasks are excluded — they are the mechanism for achieving\n // the goal and will be cleaned up by side effects after status change.\n if (newStatus === 'achieved' && this.taskService) {\n const childTasks = await this.taskService.list({ goalId: id });\n const pending = childTasks.filter(\n (t) => !isTaskTerminal(t.status) && !t.labels?.includes(AUTONOMOUS_LABEL),\n );\n if (pending.length > 0) {\n if (opts?.force) {\n // Force mode: cancel tasks that are safe to cancel at storage level.\n // in_progress tasks have live OS processes — GoalService cannot kill them.\n const cancellable = pending.filter((t) => t.status !== 'in_progress');\n const running = pending.filter((t) => t.status === 'in_progress');\n await Promise.all(\n cancellable.map((t) => this.taskService!.cancel(t.id).catch(() => {})),\n );\n if (running.length > 0) {\n const summary = running.map((t) => `${t.id} (in_progress)`).join(', ');\n throw new GoalHasPendingTasksError(id, running.length, summary);\n }\n } else {\n const summary = pending.map((t) => `${t.id} (${t.status})`).join(', ');\n throw new GoalHasPendingTasksError(id, pending.length, summary);\n }\n }\n }\n\n goal.status = newStatus;\n goal.updated_at = new Date().toISOString();\n await this.goalStore.save(goal);\n\n this.eventBus.emit({ type: 'goal:status_changed', goalId: id, from: oldStatus, to: newStatus });\n\n if (goal.assignee) {\n if (newStatus === 'paused') {\n // Pause: disable autonomous + cancel pending autonomous tasks\n await this.maybeDisableAutonomous(goal.assignee);\n await this.cancelPendingAutonomousTasks(goal.assignee);\n } else if (newStatus === 'active' && oldStatus === 'paused') {\n // Resume: re-enable autonomous mode\n await this.enableAutonomous(goal.assignee);\n } else if (isGoalTerminal(newStatus)) {\n // Terminal: check if agent still has other active goals\n await this.maybeDisableAutonomous(goal.assignee);\n }\n }\n\n return goal;\n }\n\n async update(id: string, fields: { title?: string; description?: string; assignee?: string }): Promise<Goal> {\n const goal = await this.get(id);\n const oldAssignee = goal.assignee;\n\n if (fields.title !== undefined) {\n if (!fields.title.trim()) throw new InvalidArgumentsError('Goal title cannot be empty');\n goal.title = fields.title.trim();\n }\n if (fields.description !== undefined) goal.description = fields.description.trim();\n if (fields.assignee !== undefined) goal.assignee = fields.assignee || undefined;\n\n goal.updated_at = new Date().toISOString();\n await this.goalStore.save(goal);\n this.eventBus.emit({ type: 'goal:updated', goalId: id });\n\n // Handle assignee change — independent agents, run in parallel\n const newAssignee = goal.assignee;\n if (newAssignee !== oldAssignee) {\n const ops: Promise<void>[] = [];\n if (newAssignee) ops.push(this.enableAutonomous(newAssignee));\n if (oldAssignee) ops.push(this.maybeDisableAutonomous(oldAssignee));\n await Promise.all(ops);\n }\n\n return goal;\n }\n\n async delete(id: string): Promise<void> {\n const goal = await this.get(id);\n const { assignee } = goal;\n await this.goalStore.delete(id);\n this.eventBus.emit({ type: 'goal:deleted', goalId: id });\n\n if (assignee) {\n await this.maybeDisableAutonomous(assignee);\n }\n }\n\n async listTasksForGoal(goalId: string): Promise<Task[]> {\n return this.taskService?.list({ goalId }) ?? [];\n }\n\n async getProgressReport(goalId: string): Promise<string | undefined> {\n if (!this.contextStore) return undefined;\n const entry = await this.contextStore.get(`${goalId}-progress`);\n return entry?.value;\n }\n\n /** Enable autonomous mode on an agent. */\n private async enableAutonomous(agentId: string): Promise<void> {\n if (!this.agentService) return;\n try {\n await this.agentService.setAutonomous(agentId, true);\n } catch {\n // Agent may not exist — ignore silently\n }\n }\n\n /** Check if an agent has at least one active goal. */\n private async hasActiveGoalsForAgent(agentId: string): Promise<boolean> {\n const activeGoals = await this.goalStore.list({ status: 'active' });\n return activeGoals.some((g) => g.assignee === agentId);\n }\n\n /** Cancel dispatchable (todo/retrying) autonomous tasks assigned to the agent. */\n private async cancelPendingAutonomousTasks(agentId: string): Promise<void> {\n if (!this.taskService) return;\n try {\n const [todos, retrying] = await Promise.all([\n this.taskService.list({ status: 'todo' }),\n this.taskService.list({ status: 'retrying' }),\n ]);\n const pending = [...todos, ...retrying].filter(\n (t) => t.assignee === agentId && t.labels?.includes(AUTONOMOUS_LABEL),\n );\n await Promise.all(pending.map((t) => this.taskService!.cancel(t.id).catch(() => {})));\n } catch {\n // Best-effort cleanup\n }\n }\n\n /** Disable autonomous if agent has no other active goals. */\n private async maybeDisableAutonomous(agentId: string): Promise<void> {\n if (!this.agentService) return;\n try {\n if (!(await this.hasActiveGoalsForAgent(agentId))) {\n await this.agentService.setAutonomous(agentId, false);\n }\n } catch {\n // Agent may not exist — ignore silently\n }\n }\n}\n","/**\n * Team domain model.\n *\n * A Team groups agents with a lead for coordinated work.\n * Teams share a task pool and enable broadcast messaging.\n */\n\nexport type TeamStatus = 'active' | 'paused' | 'disbanded';\n\nexport interface TeamMember {\n agent_id: string;\n role: 'lead' | 'member';\n joined_at: string;\n}\n\nexport interface Team {\n id: string;\n name: string;\n description?: string;\n status: TeamStatus;\n members: TeamMember[];\n task_pool: string[];\n lead_agent_id: string;\n created_at: string;\n updated_at: string;\n config: TeamConfig;\n}\n\nexport interface TeamConfig {\n max_concurrent_tasks?: number;\n auto_claim: boolean;\n message_ttl_ms?: number;\n}\n\nexport interface CreateTeamInput {\n name: string;\n description?: string;\n lead_agent_id: string;\n member_agent_ids?: string[];\n config?: Partial<TeamConfig>;\n}\n\nexport const DEFAULT_TEAM_CONFIG: TeamConfig = {\n auto_claim: true,\n message_ttl_ms: 24 * 60 * 60 * 1000,\n};\n","/**\n * TeamService — business logic for team lifecycle.\n *\n * Manages team creation, membership, task pool, and self-claiming.\n */\n\nimport { nanoid } from 'nanoid';\nimport type { Team, CreateTeamInput, TeamMember } from '../domain/team.js';\nimport { DEFAULT_TEAM_CONFIG } from '../domain/team.js';\nimport { InvalidArgumentsError, TeamNotFoundError } from '../domain/errors.js';\nimport type { ITeamStore, IAgentStore, ITaskStore } from '../infrastructure/storage/interfaces.js';\nimport type { EventBus } from './event-bus.js';\n\nexport class TeamService {\n constructor(\n private readonly teamStore: ITeamStore,\n private readonly agentStore: IAgentStore,\n private readonly taskStore: ITaskStore,\n private readonly eventBus: EventBus,\n ) {}\n\n async create(input: CreateTeamInput): Promise<Team> {\n if (!input.name.trim()) throw new InvalidArgumentsError('Team name is required');\n\n const lead = await this.agentStore.get(input.lead_agent_id);\n if (!lead) throw new InvalidArgumentsError(`Lead agent not found: ${input.lead_agent_id}`);\n\n const existing = await this.teamStore.getByName(input.name.trim());\n if (existing) throw new InvalidArgumentsError(`Team \"${input.name}\" already exists`);\n\n const now = new Date().toISOString();\n const leadMember: TeamMember = { agent_id: input.lead_agent_id, role: 'lead', joined_at: now };\n\n const additionalMembers: TeamMember[] = [];\n for (const agentId of input.member_agent_ids ?? []) {\n if (agentId === input.lead_agent_id) continue;\n const agent = await this.agentStore.get(agentId);\n if (!agent) throw new InvalidArgumentsError(`Member agent not found: ${agentId}`);\n additionalMembers.push({ agent_id: agentId, role: 'member', joined_at: now });\n }\n\n const team: Team = {\n id: `team_${nanoid(7)}`,\n name: input.name.trim(),\n description: input.description,\n status: 'active',\n members: [leadMember, ...additionalMembers],\n task_pool: [],\n lead_agent_id: input.lead_agent_id,\n created_at: now,\n updated_at: now,\n config: { ...DEFAULT_TEAM_CONFIG, ...(input.config ?? {}) },\n };\n\n await this.teamStore.save(team);\n\n this.eventBus.emit({ type: 'team:created', teamId: team.id, name: team.name, leadAgentId: team.lead_agent_id });\n for (const member of additionalMembers) {\n this.eventBus.emit({ type: 'team:member_joined', teamId: team.id, agentId: member.agent_id });\n }\n\n return team;\n }\n\n async get(id: string): Promise<Team> {\n const team = await this.teamStore.get(id);\n if (!team) throw new TeamNotFoundError(id);\n return team;\n }\n\n async list(): Promise<Team[]> {\n return this.teamStore.list();\n }\n\n async join(teamId: string, agentId: string): Promise<Team> {\n const team = await this.get(teamId);\n if (team.members.some((m) => m.agent_id === agentId)) {\n throw new InvalidArgumentsError(`Agent ${agentId} is already a member of team ${teamId}`);\n }\n const agent = await this.agentStore.get(agentId);\n if (!agent) throw new InvalidArgumentsError(`Agent not found: ${agentId}`);\n\n team.members.push({ agent_id: agentId, role: 'member', joined_at: new Date().toISOString() });\n team.updated_at = new Date().toISOString();\n await this.teamStore.save(team);\n\n this.eventBus.emit({ type: 'team:member_joined', teamId, agentId });\n return team;\n }\n\n async leave(teamId: string, agentId: string): Promise<Team> {\n const team = await this.get(teamId);\n if (agentId === team.lead_agent_id) {\n throw new InvalidArgumentsError('Lead cannot leave team. Disband the team or transfer lead first.');\n }\n team.members = team.members.filter((m) => m.agent_id !== agentId);\n team.updated_at = new Date().toISOString();\n await this.teamStore.save(team);\n\n this.eventBus.emit({ type: 'team:member_left', teamId, agentId });\n return team;\n }\n\n async addTask(teamId: string, taskId: string): Promise<Team> {\n const team = await this.get(teamId);\n const task = await this.taskStore.get(taskId);\n if (!task) throw new InvalidArgumentsError(`Task not found: ${taskId}`);\n\n if (!team.task_pool.includes(taskId)) {\n team.task_pool.push(taskId);\n team.updated_at = new Date().toISOString();\n await this.teamStore.save(team);\n this.eventBus.emit({ type: 'team:task_added', teamId, taskId });\n }\n return team;\n }\n\n async removeTask(teamId: string, taskId: string): Promise<Team> {\n const team = await this.get(teamId);\n team.task_pool = team.task_pool.filter((id) => id !== taskId);\n team.updated_at = new Date().toISOString();\n await this.teamStore.save(team);\n return team;\n }\n\n async setLead(teamId: string, agentId: string): Promise<Team> {\n const team = await this.get(teamId);\n const member = team.members.find((m) => m.agent_id === agentId);\n if (!member) throw new InvalidArgumentsError(`Agent ${agentId} is not a member of team ${teamId}`);\n\n // Demote current lead\n const currentLead = team.members.find((m) => m.agent_id === team.lead_agent_id);\n if (currentLead) currentLead.role = 'member';\n\n member.role = 'lead';\n team.lead_agent_id = agentId;\n team.updated_at = new Date().toISOString();\n await this.teamStore.save(team);\n return team;\n }\n\n async disband(teamId: string): Promise<void> {\n const team = await this.get(teamId);\n team.status = 'disbanded';\n team.updated_at = new Date().toISOString();\n await this.teamStore.save(team);\n this.eventBus.emit({ type: 'team:disbanded', teamId });\n }\n\n /**\n * Find the team an agent belongs to (if any).\n */\n async findTeamForAgent(agentId: string): Promise<Team | null> {\n const teams = await this.teamStore.list();\n return teams.find((t) => t.status === 'active' && t.members.some((m) => m.agent_id === agentId)) ?? null;\n }\n}\n","/**\n * Dependency injection container.\n *\n * Plain TypeScript object — no framework, no decorators.\n * Two modes:\n * - LightContainer: stores + services only (fast, for read-only commands)\n * - Container: full (+ orchestrator, adapters, template engine)\n */\n\nimport type { OrchestratorConfig } from './domain/config.js';\nimport type { CliContext } from './cli/context.js';\nimport type { ITaskStore, IAgentStore, IRunStore, IStateStore, IConfigStore, IContextStore, IMessageStore, IGoalStore, ITeamStore } from './infrastructure/storage/interfaces.js';\nimport type { IWorkspaceManager } from './infrastructure/workspace/interface.js';\nimport type { ITemplateEngine } from './infrastructure/template/template-engine.js';\nimport type { IProcessManager } from './infrastructure/process/process-manager.js';\nimport type { AdapterRegistry } from './infrastructure/adapters/registry.js';\nimport type { ISkillLoader } from './infrastructure/skills/skill-loader.js';\n\nimport { type GlobalConfig, DEFAULT_GLOBAL_CONFIG } from './domain/global-config.js';\nimport { Paths } from './infrastructure/storage/paths.js';\nimport { TaskStore } from './infrastructure/storage/task-store.js';\nimport { AgentStore } from './infrastructure/storage/agent-store.js';\nimport { RunStore } from './infrastructure/storage/run-store.js';\nimport { StateStore } from './infrastructure/storage/state-store.js';\nimport { ConfigStore } from './infrastructure/storage/config-store.js';\nimport { GlobalConfigStore } from './infrastructure/storage/global-config-store.js';\nimport { ContextStore } from './infrastructure/storage/context-store.js';\nimport { MessageStore } from './infrastructure/storage/message-store.js';\nimport { GoalStore } from './infrastructure/storage/goal-store.js';\nimport { TeamStore } from './infrastructure/storage/team-store.js';\n\nimport { EventBus } from './application/event-bus.js';\nimport { TaskService } from './application/task-service.js';\nimport { AgentService } from './application/agent-service.js';\nimport { RunService } from './application/run-service.js';\nimport { MessageService } from './application/message-service.js';\nimport { GoalService } from './application/goal-service.js';\nimport { TeamService } from './application/team-service.js';\n\nimport type { Orchestrator } from './application/orchestrator.js';\nimport type { DoctorService } from './application/doctor-service.js';\n\n/** Light container — stores + services. No heavy deps (adapters, orchestrator, LiquidJS). */\nexport interface LightContainer {\n // Context\n context: CliContext;\n paths: Paths;\n config: OrchestratorConfig;\n\n // Infrastructure — stores only\n taskStore: ITaskStore;\n agentStore: IAgentStore;\n runStore: IRunStore;\n stateStore: IStateStore;\n configStore: IConfigStore;\n globalConfigStore: GlobalConfigStore;\n globalConfig: GlobalConfig;\n contextStore: IContextStore;\n messageStore: IMessageStore;\n goalStore: IGoalStore;\n teamStore: ITeamStore;\n\n // Application — services only\n eventBus: EventBus;\n taskService: TaskService;\n agentService: AgentService;\n runService: RunService;\n messageService: MessageService;\n goalService: GoalService;\n teamService: TeamService;\n}\n\n/** Full container — everything from light + orchestrator, adapters, workspace, template. */\nexport interface Container extends LightContainer {\n processManager: IProcessManager;\n adapterRegistry: AdapterRegistry;\n workspaceManager: IWorkspaceManager;\n templateEngine: ITemplateEngine;\n skillLoader: ISkillLoader;\n doctorService: DoctorService;\n orchestrator: Orchestrator;\n}\n\n/**\n * Build a light container (stores + services).\n * Fast — no ProcessManager, no adapters, no LiquidJS, no Orchestrator.\n * Used by read-only commands: task, agent, context, msg, goal, team, logs, status, config.\n */\nexport async function buildLightContainer(context: CliContext): Promise<LightContainer> {\n const paths = new Paths(context.projectRoot);\n\n // Infrastructure — stores\n const configStore = new ConfigStore(paths);\n const globalConfigStore = new GlobalConfigStore();\n\n // Parallel: check init + read config (saves one I/O round trip)\n const [, config] = await Promise.all([\n paths.requireInit(),\n configStore.read(),\n ]);\n const taskStore = new TaskStore(paths);\n const agentStore = new AgentStore(paths);\n const runStore = new RunStore(paths);\n const stateStore = new StateStore(paths);\n const contextStore = new ContextStore(paths);\n const messageStore = new MessageStore(paths);\n const goalStore = new GoalStore(paths);\n const teamStore = new TeamStore(paths);\n\n // Application — services\n const eventBus = new EventBus();\n const taskService = new TaskService(taskStore, eventBus, config, paths);\n const agentService = new AgentService(agentStore, stateStore, eventBus, config);\n const runService = new RunService(runStore, eventBus);\n const messageService = new MessageService(messageStore, agentStore, teamStore, eventBus);\n const goalService = new GoalService(goalStore, eventBus, agentService, taskService, contextStore);\n const teamService = new TeamService(teamStore, agentStore, taskStore, eventBus);\n\n return {\n context,\n paths,\n config,\n taskStore,\n agentStore,\n runStore,\n stateStore,\n configStore,\n globalConfigStore,\n globalConfig: DEFAULT_GLOBAL_CONFIG,\n contextStore,\n messageStore,\n goalStore,\n teamStore,\n eventBus,\n taskService,\n agentService,\n runService,\n messageService,\n goalService,\n teamService,\n };\n}\n\n/**\n * Build a full container (light + orchestrator + adapters + template).\n * Used by: run, tui, doctor.\n */\nexport async function buildFullContainer(context: CliContext): Promise<Container> {\n const light = await buildLightContainer(context);\n\n // Read global config (needed by TUI for activity_filter, notifications)\n const globalConfig = await light.globalConfigStore.read();\n light.globalConfig = globalConfig;\n\n // Dynamic imports — avoid loading heavy deps at top level\n const [\n { ProcessManager },\n { AdapterRegistry },\n { ClaudeAdapter },\n { CodexAdapter },\n { CursorAdapter },\n { ShellAdapter },\n { OpenCodeAdapter },\n { WorkspaceManager },\n { LiquidTemplateEngine },\n { SkillLoader },\n { Orchestrator },\n { DoctorService },\n ] = await Promise.all([\n import('./infrastructure/process/process-manager.js'),\n import('./infrastructure/adapters/registry.js'),\n import('./infrastructure/adapters/claude.js'),\n import('./infrastructure/adapters/codex.js'),\n import('./infrastructure/adapters/cursor.js'),\n import('./infrastructure/adapters/shell.js'),\n import('./infrastructure/adapters/opencode.js'),\n import('./infrastructure/workspace/workspace-manager.js'),\n import('./infrastructure/template/template-engine.js'),\n import('./infrastructure/skills/skill-loader.js'),\n import('./application/orchestrator.js'),\n import('./application/doctor-service.js'),\n ]);\n\n const processManager = new ProcessManager();\n const templateEngine = new LiquidTemplateEngine();\n const skillLoader = new SkillLoader();\n const workspaceManager = new WorkspaceManager(\n context.projectRoot,\n light.paths.root,\n processManager,\n );\n\n // Adapter registry\n const adapterRegistry = new AdapterRegistry();\n adapterRegistry.register(new ClaudeAdapter(processManager));\n adapterRegistry.register(new CodexAdapter(processManager));\n adapterRegistry.register(new CursorAdapter(processManager));\n adapterRegistry.register(new ShellAdapter(processManager));\n adapterRegistry.register(new OpenCodeAdapter(processManager));\n\n const doctorService = new DoctorService(adapterRegistry, processManager, context.projectRoot);\n const orchestrator = new Orchestrator({\n taskStore: light.taskStore,\n agentStore: light.agentStore,\n runStore: light.runStore,\n stateStore: light.stateStore,\n adapterRegistry,\n workspaceManager,\n templateEngine,\n processManager,\n eventBus: light.eventBus,\n taskService: light.taskService,\n agentService: light.agentService,\n runService: light.runService,\n contextStore: light.contextStore,\n messageService: light.messageService,\n goalStore: light.goalStore,\n skillLoader,\n config: light.config,\n projectRoot: context.projectRoot,\n lockPath: light.paths.lockPath,\n });\n\n return {\n ...light,\n processManager,\n adapterRegistry,\n workspaceManager,\n templateEngine,\n skillLoader,\n doctorService,\n orchestrator,\n };\n}\n\n/**\n * @deprecated Use buildLightContainer or buildFullContainer directly.\n * Kept for backward compatibility with tests.\n */\nexport async function buildContainer(context: CliContext): Promise<Container> {\n return buildFullContainer(context);\n}\n"]}
|