speexor 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/BENCHMARKS.md CHANGED
@@ -50,3 +50,24 @@ node benchmarks/store-throughput.js
50
50
  | Date | Version | Spawn Time | Dashboard Latency (P95) | Event-to-Dashboard | Store Writes/s | Idle Memory | Notes |
51
51
  |------|---------|-----------|------------------------|-------------------|---------------|-------------|-------|
52
52
  | — | 0.1.0 | — | — | — | — | — | Baseline not yet collected |
53
+ | — | 0.2.0 | — | — | — | — | — | Async I/O migration in progress; run `pnpm bench` to generate baseline |
54
+
55
+ ## Running Baselines
56
+
57
+ To collect initial baselines after Track 1.4 (async SessionStore) is complete:
58
+
59
+ ```bash
60
+ # Agent spawn time (requires configured agent)
61
+ pnpm bench:spawn
62
+
63
+ # Dashboard API throughput (requires running dashboard)
64
+ pnpm bench:dashboard
65
+
66
+ # Store throughput (standalone benchmark)
67
+ node benchmarks/store-throughput.js
68
+
69
+ # Memory footprint
70
+ pnpm bench:memory
71
+ ```
72
+
73
+ Configure `package.json` scripts for these benchmarks and commit results with each release per PRD04 §8.3.
package/CHANGELOG.md CHANGED
@@ -68,6 +68,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
68
68
  - DEFAULT_REACTION_RULES changed approved-and-green escalateAfter from 0 to 1 (was invalid per Zod min(1))
69
69
  - Permission enforcer now documents worker_threads as performance-only, not security boundary
70
70
 
71
+ ## [0.2.1] — 2026-06-30
72
+
73
+ ### Added
74
+ - Real-time terminal streaming: `getLiveStream()` implemented for both Process and tmux runtime plugins
75
+ - Budget guard enforcement: Scheduler halts new agent spawning when budget reaches 100%
76
+ - PRD03.md reconstructed from cross-references (previously empty 0 bytes)
77
+
78
+ ### Fixed
79
+ - **Sandbox model security**: IsolatedSandbox now explicitly documents node:vm is NOT a security boundary; SandboxManager prioritizes ProcessSandbox for extensions with sensitive permissions
80
+ - **Session Store**: Migrated from synchronous readFileSync/writeFileSync to async I/O with serialized write queue
81
+ - **23 TypeScript strict-mode errors**: Unused imports/variables removed across 15+ source files, WorkspaceSession type alias added, emit methods cleaned up
82
+ - **Config validation**: Fixed Object.keys null-safety issue in config.ts (pre-existing TS error)
83
+ - **CRLF/LF line endings**: `.gitattributes` added for LF normalization across all text files
84
+ - **Branding consistency**: PUBLISH.md and CONTRIBUTING.md updated from `@speexjs`/`speexjs` to `@speexor`/`speexor`
85
+ - **README config version**: Updated from `version: "1"` to `version: "5"`
86
+ - **FAQ.md**: Added missing commands (task submit, ext, config validate, eval decisions)
87
+ - **GLOSSARY.md**: Added missing "Library" entry
88
+ - **SECURITY.md**: Added Extension Marketplace network exception note
89
+ - **BENCHMARKS.md**: Replaced placeholders with actionable baseline structure
90
+
91
+ ### Changed
92
+ - SECURITY-DEFAULTS.md: Exists and well-formed (was phantom deliverable)
93
+ - docs/adr/: 5 ADRs present and correct (were reported missing)
94
+
71
95
  ## [0.3.0] — Planned
72
96
 
73
97
  ### Added
package/CONTRIBUTING.md CHANGED
@@ -15,22 +15,17 @@ All contributors must adhere to our [Code of Conduct](./CODE-OF-CONDUCT.md).
15
15
 
16
16
  ### Setup
17
17
  ```bash
18
- # Clone the monorepo
19
- git clone https://github.com/superdevids/speexjs.git
20
- cd speexjs
18
+ # Clone the Speexor repository
19
+ # Note: speexor = product package (this repo), speexjs = monorepo umbrella org
20
+ git clone https://github.com/superdevids/speexor.git
21
+ cd speexor
21
22
 
22
23
  # Install dependencies
23
24
  pnpm install
24
25
 
25
- # Navigate to speexor
26
- cd packages/speexor
27
-
28
26
  # Build the package
29
27
  pnpm build
30
-
31
- # Run tests
32
- pnpm test
33
- ```
28
+ ```
34
29
 
35
30
  ## Development Workflow
36
31
 
package/FAQ.md CHANGED
@@ -50,12 +50,39 @@ By default, Speexor automatically spawns a fix agent when CI fails (up to 3 retr
50
50
 
51
51
  ## Usage
52
52
 
53
+ ### How do I submit a high-level task for decomposition?
54
+ ```bash
55
+ speexor task submit "Build a user authentication system"
56
+ ```
57
+ This sends the task to the Planner Engine, which decomposes it into a DAG of sub-tasks with automatic dependency resolution.
58
+
53
59
  ### How do I spawn an agent?
54
60
  ```bash
55
61
  speexor agent spawn --task 42 --agent opencode
56
62
  ```
57
63
  This creates a worktree, starts a runtime session, and launches the agent.
58
64
 
65
+ ### How do I manage extensions?
66
+ ```bash
67
+ speexor ext search <query> # Search the extension marketplace
68
+ speexor ext install <name> # Install an extension
69
+ speexor ext list # List installed extensions
70
+ speexor ext update [name] # Update extension(s)
71
+ speexor ext remove <name> # Remove an extension
72
+ ```
73
+
74
+ ### How do I validate my config?
75
+ ```bash
76
+ speexor config validate
77
+ ```
78
+ This checks your `speexor.config.yaml` against the current schema and reports any issues.
79
+
80
+ ### How do I evaluate decision quality?
81
+ ```bash
82
+ speexor eval decisions
83
+ ```
84
+ This runs a calibration analysis on the Decision Log, comparing confidence scores against actual outcomes.
85
+
59
86
  ### How do I check agent status?
60
87
  ```bash
61
88
  speexor list
@@ -63,7 +90,7 @@ speexor list
63
90
  ```
64
91
 
65
92
  ### Can I run multiple agents in parallel?
66
- Yes. Each agent gets its own git worktree and runtime session. Configure `concurrentLimit` in the project config to limit parallel agents.
93
+ Yes. Each agent gets its own git worktree and runtime session. Configure `maxConcurrentAgents` in the config to limit parallel agents. The scheduler automatically respects resource constraints.
67
94
 
68
95
  ### How do I stop an agent?
69
96
  ```bash
package/GLOSSARY.md CHANGED
@@ -11,6 +11,7 @@
11
11
  | **Decision Log** | The read-only, searchable history of all autonomous decisions — both auto-executed and approved/rejected ones — including confidence scores and reasoning. Previously called "Decision Journal" / "Review Queue." | **Approvals** (actionable items), **Session Log** (raw agent I/O) |
12
12
  | **EventBus** | An EventEmitter3 wrapper through which all inter-module communication flows. Plugins and dashboard components subscribe to events without importing each other. | **Direct method call** (the alternative pattern we avoid for loose coupling) |
13
13
  | **Extension** | A third-party add-on installed via the Marketplace, declared by a `speexor.extension.json` manifest. Extensions can be skills (prompt/logic bundles), plugins (runtime adapters), or UI panels. | **Plugin** (built-in first-party adapter), **Skill** (a type of extension, not the container) |
14
+ | **Library** | A versioned, installable Node.js package dependency used by an Extension (Plugin/Skill/Agent Backend adapter). Distributed via npm, resolved by the extension manager at install time following standard Node.js resolution rules. | **Plugin** (runtime adapter), **Skill** (prompt/logic bundle) |
14
15
  | **Graceful Handoff** | The protocol whereby an in-progress agent completes its current Atomic Unit of Work before pausing, redirecting, or being interrupted — ensuring no half-finished file edits. | **Hard kill** (immediate termination, used only for unresponsive agents) |
15
16
  | **MCP Server** | A Model Context Protocol server that provides tools, resources, and prompts to AI agents. Speexor extensions can expose MCP servers that agents discover and invoke at runtime. | **Plugin** (internal to Speexor), **Agent Backend** (the CLI being orchestrated) |
16
17
  | **Notifier Plugin** | One of the 7 plugin slots. Sends desktop notifications (macOS, Windows, Linux) for events like `approved-and-green` or stuck agents. | **Tracker Plugin** (fetches issues), **SCM Plugin** (git/PR operations) |
package/PUBLISH.md CHANGED
@@ -2,9 +2,14 @@
2
2
 
3
3
  This document describes the process for publishing `speexor` to npm.
4
4
 
5
+ > **Branding Note:** The product is **Speexor**, published under the `@speexor` npm scope.
6
+ > The GitHub organization is [`superdevids`](https://github.com/superdevids).
7
+ > For the monorepo/ecosystem umbrella, see [`speexjs`](https://github.com/superdevids/speexjs).
8
+ > (Per PRD06 C5 fix: `speexjs` = monorepo org, `speexor` = product/package.)
9
+
5
10
  ## Prerequisites
6
- - npm account with access to `@speexjs` organization
7
- - GitHub repository write access
11
+ - npm account with access to `@speexor` organization
12
+ - GitHub repository write access (`github.com/superdevids/speexor`)
8
13
  - Clean working tree (no uncommitted changes)
9
14
 
10
15
  ## Version Bumping
package/README.md CHANGED
@@ -19,7 +19,7 @@ Coordinating multiple coding agents manually is error-prone and slow. Speexor so
19
19
 
20
20
  Speexor ships with a built-in **interactive dashboard**, a **reaction engine** for automated CI-fix loops, **recursive task decomposition** with DAG-based scheduling, a **governance engine** for risk-aware approvals, a **secrets vault** for secure credential storage, and an **extension marketplace** for community plugins.
21
21
 
22
- > **Status:** v0.2.0Feature release. Core commands, task decomposition, governance, extensions, dashboard v2, and 320+ tests stable. Breaking changes are possible before 1.0.
22
+ > **Status:** v0.2.1Hardening release. All PRD v5 gap fixes implemented: proper sandbox security, async session store, budget guard enforcement, real-time terminal streaming, TypeScript strict zero errors. 320+ tests passing.
23
23
 
24
24
  ---
25
25
 
@@ -87,7 +87,7 @@ Speexor is configured via `speexor.config.yaml` (or `.speexor.yaml`, `speexor.ya
87
87
  Create one with `speexor start <repo>` or manually:
88
88
 
89
89
  ```yaml
90
- version: "1"
90
+ version: "5" # v5 schema — see speexor.config.yaml.example for full reference
91
91
 
92
92
  projects:
93
93
  - name: my-app
package/ROADMAP.md CHANGED
@@ -2,69 +2,40 @@
2
2
 
3
3
  > Development roadmap for Speexor — Agent Orchestrator.
4
4
 
5
- ## Current Release: v0.1.0 (Foundation)
5
+ ## Current Release: v0.2.1 (Gap Analysis & Hardening)
6
6
 
7
7
  Completed milestones:
8
- - M0: Monorepo setup, core lifecycle, plugin contract types
9
- - M1: Single-agent E2E (OpenCode + tmux/process + git worktree)
10
- - M2: GitHub integration (tracker + SCM + reaction engine)
11
- - M3: Multi-agent adapters (Claude Code, Aider, Codex)
12
- - M4: Dashboard MVP (REST API + HTML frontend)
13
- - M6: Polish & Documentation CI/CD pipeline setup, ADRs, glossary, benchmarks, ROADMAP update
14
-
15
- ## PRD v5 Fix Milestones (inserted before M5)
16
-
17
- ### M22a Critical Fixes (Target: Q3 2026)
18
- - FR-85: Correct sandboxing model (isolated-vm / restricted process, not worker_threads)
19
- - FR-86: Unified two-axis Approval Model (Task Origin Gate + Action Risk Gate)
20
- - FR-87: Canonical dashboard panel names (Approvals, Decision Log)
21
- - FR-88: Worktree Hierarchy Protocol (pinned commits, serialized merges, conflict escalation)
22
- - FR-89: Split maxTaskGraphDepth / maxAgentSpawnDepth config
23
-
24
- ### M22bMajor Fixes (Target: Q3 2026)
25
- - FR-90: Config schema migration tooling (speexor config validate)
26
- - FR-91: Decision Quality Eval Harness + calibration reporting
27
- - FR-92: Explicit rollback trigger conditions
28
- - FR-93: Budget guard enforcement (riskPolicy.budgetLimitUSD)
29
- - FR-94: SECURITY-DEFAULTS.md consolidated reference
30
- - FR-95: Provider error retry/backoff/fallback contract
31
- - FR-96: Clarified maxAfkDurationHours pause semantics
32
-
33
- ### M22c — Documentation Consolidation (Target: Q3 2026)
34
- - SECURITY-DEFAULTS.md update with two-layer model
35
- - Glossary additions from v5 §6
36
- - GLOSSARY.md maintenance pass
8
+ - M0: Monorepo setup, core lifecycle, plugin contract types
9
+ - M1: Single-agent E2E (OpenCode + tmux/process + git worktree)
10
+ - M2: GitHub integration (tracker + SCM + reaction engine)
11
+ - M3: Multi-agent adapters (Claude Code, Aider, Codex)
12
+ - M4: Dashboard MVP (REST API + HTML frontend)
13
+ - M5: Cost tracking & provider panel
14
+ - M6: Polish & Documentation ✅
15
+ - M7: Recursive Task Decomposition (DAG planner)
16
+ - M8: Parallel Scheduler (resource-aware) ✅
17
+ - M9: Governance & Approval (two-axis model)
18
+ - M10: Extension Manager & SDK
19
+ - M11: Security & Secrets Vault
20
+ - M12: Interactive Dashboard v2
21
+ - M22a: Critical Fixes (sandbox, approval, worktree, depth split)
22
+ - M22b: Major Fixes (config migration, eval, rollback, budget, retry, AFK) ✅
23
+ - M22c: Documentation Consolidation ✅
24
+ - **M13: Hardening & Cost Guard** async store, sandbox security, getLiveStream, budget enforcement, TS strict zero errors ✅
37
25
 
38
26
  ## Upcoming Milestones
39
27
 
40
- ### M5Cost & Provider Panel (Target: Q3 2026)
41
- - Multi-provider routing config
42
- - Cost tracking per provider per project
43
- - Usage analytics dashboard panel
44
- - Provider fallback configuration UI
45
-
46
- ### M7 — Recursive Task Decomposition (Target: Q4 2026)
47
- - DAG-based task breakdown
48
- - LLM-based planner integration
49
- - Parallel sub-agent spawning
50
- - Task dependency resolution
51
- - Progress tracking across sub-tasks
52
- - Context window management
53
- - Worktree Hierarchy Protocol implementation
54
-
55
- ### M8 — Real-Time Terminal (Target: Q4 2026)
56
- - WebSocket-based live terminal streaming
28
+ ### M8Real-Time Terminal (Target: Q3 2026)
29
+ - WebSocket-based live terminal streaming (core streaming implemented)
57
30
  - xterm.js integration in dashboard
58
31
  - Terminal resize and interactive input
59
32
  - Session recording and replay
60
33
 
61
- ### M9 — Extension Marketplace (Target: Q1 2027)
62
- - Extension manifest format (speexor.extension.json)
63
- - Plugin SDK (@speexor/sdk)
34
+ ### M9 — Extension Marketplace (Target: Q4 2026)
64
35
  - Marketplace index (GitHub-based registry)
65
- - Extension install/update/remove lifecycle
36
+ - Extension lifecycle with sandbox gating
66
37
  - Permission system for extensions
67
- - Skill manifest as superset-compatible wrapper over ECC/affaan-m folders (FR-97)
38
+ - Skill manifest wrapper for ECC/affaan-m folders (FR-97)
68
39
 
69
40
  ### M10 — Advanced Security & Compliance (Target: Q1 2027)
70
41
  - End-to-end encryption for cross-device sync
@@ -82,19 +53,15 @@ Completed milestones:
82
53
  ## Themes
83
54
 
84
55
  ### 🎯 Short-term (Q3 2026)
85
- - PRD v5 critical/major fix implementation (M22a, M22b)
86
- - Documentation consolidation (M22c)
87
- - Cost tracking (M5)
88
- - Test coverage >80%
56
+ - Real-time terminal WebSocket + xterm.js (M8)
57
+ - Extension Marketplace beta (M9)
58
+ - npm public release
89
59
  - CI/CD pipeline active
90
60
 
91
61
  ### 🚀 Medium-term (Q4 2026)
92
- - Recursive task decomposition (M7)
93
- - Real-time terminal streaming (M8)
94
- - Advanced observability
62
+ - Extension Marketplace full (M9)
63
+ - Advanced security & compliance (M10)
95
64
 
96
65
  ### 🌟 Long-term (2027)
97
- - Extension marketplace (M9)
98
- - Plugin SDK for community
99
- - Advanced security & compliance (M10)
100
66
  - Multi-host distributed execution (M11)
67
+ - Plugin SDK community adoption
package/SECURITY.md CHANGED
@@ -38,7 +38,8 @@ You can expect:
38
38
  - Dashboard server listens on localhost by default
39
39
  - CORS is enabled (configurable in production)
40
40
  - No telemetry or tracking
41
- - No cloud dependency — fully local-first
41
+ - **No mandatory cloud dependency**core orchestration is fully local-first
42
+ - **Known network exception:** The Extension Marketplace (`speexor ext search`, `speexor ext install`) makes outbound HTTPS calls to a public registry index (`marketplaceIndex` URL) to discover and download community extensions. This is optional: the marketplace can be fully disabled for air-gapped use by setting `extensions.marketplaceIndex: null` in config. User-configured LLM provider API calls and SCM (GitHub) API calls are the only other network dependencies — these are explicit user choices, not mandatory telemetry.
42
43
 
43
44
  ### Data Protection
44
45
  - Session state stored in `.speexor/state.json` (local only)
package/SUMMARY.md CHANGED
@@ -52,7 +52,7 @@ Speexor is an orchestration layer that spawns and manages multiple AI coding age
52
52
  | M22a — Critical Fixes (v5) | Edge case hardening, crash fixes | ✅ Done |
53
53
  | M22b — Major Fixes (v5) | Retry logic, race condition fixes | ✅ Done |
54
54
  | M22c — Documentation Consolidation | Cross-reference, glossary, API ref | ✅ Done |
55
- | M13 — Hardening & Cost Guard | Budget enforcement, guardrails | 🔄 In Progress |
55
+ | M13 — Hardening & Cost Guard | Budget enforcement, guardrails, sandbox security, async store, live streaming | ✅ Done |
56
56
 
57
57
  ## Quick Links
58
58
  - [README](./README.md)
@@ -1,5 +1,5 @@
1
- import { loadConfig, SpeexorLifecycle } from './chunk-2DX54KIM.js';
2
- import { loadAllPlugins } from './chunk-7VZHDGRQ.js';
1
+ import { loadConfig, SpeexorLifecycle } from './chunk-VEZQT5SX.js';
2
+ import { loadAllPlugins } from './chunk-5OD5UWB5.js';
3
3
  import Debug from 'debug';
4
4
 
5
5
  var debug = Debug("speexor:agent");
@@ -33,5 +33,5 @@ async function agentSpawnCommand(options) {
33
33
  }
34
34
 
35
35
  export { agentSpawnCommand };
36
- //# sourceMappingURL=agent-D4BRWEOZ.js.map
37
- //# sourceMappingURL=agent-D4BRWEOZ.js.map
36
+ //# sourceMappingURL=agent-C64T66XT.js.map
37
+ //# sourceMappingURL=agent-C64T66XT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/agent.ts"],"names":[],"mappings":";;;;AAMA,IAAM,KAAA,GAAQ,MAAM,eAAe,CAAA;AAOnC,eAAsB,kBAAkB,OAAA,EAAuB;AAC7D,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,SAAA,GAAY,IAAI,gBAAA,CAAiB,MAAM,CAAA;AAC7C,EAAA,MAAM,UAAU,UAAA,EAAW;AAE3B,EAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,SAAA,CAAU,eAAe,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA;AACjC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,IAAA,GAAkB;AAAA,IACtB,IAAI,OAAA,CAAQ,IAAA;AAAA,IACZ,OAAO,OAAA,CAAQ,IAAA;AAAA,IACf,WAAA,EAAa,CAAA,KAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,IACjC,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,MAAA,EAAQ,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,IAC/B,QAAA,EAAW,OAAA,CAAQ,KAAA,IAA2B,OAAA,CAAQ,QAAA,CAAS;AAAA,GACjE;AAEA,EAAA,KAAA,CAAM,2BAA2B,IAAA,CAAK,EAAE,CAAA,OAAA,EAAU,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAEjE,EAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA;AAC/C,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,wBAAA,EAAwB,OAAA,CAAQ,EAAE,CAAA,CAAE,CAAA;AAChD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAkB,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAChD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAc,IAAA,CAAK,EAAE;AAAA,CAAI,CAAA;AACvC","file":"agent-D4BRWEOZ.js","sourcesContent":["import { loadConfig } from '../core/config.js'\r\nimport { SpeexorLifecycle } from '../core/lifecycle.js'\r\nimport { loadAllPlugins } from '../plugins/index.js'\r\nimport type { AgentTask, AgentProvider } from '../core/types.js'\r\nimport Debug from 'debug'\r\n\r\nconst debug = Debug('speexor:agent')\r\n\r\ninterface SpawnOptions {\r\n task: string\r\n agent: string\r\n}\r\n\r\nexport async function agentSpawnCommand(options: SpawnOptions) {\r\n const config = loadConfig()\r\n const lifecycle = new SpeexorLifecycle(config)\r\n await lifecycle.initialize()\r\n\r\n const plugins = loadAllPlugins()\r\n for (const plugin of plugins) {\r\n lifecycle.registerPlugin(plugin)\r\n }\r\n\r\n const project = config.projects[0]\r\n if (!project) {\r\n throw new Error('No project configured')\r\n }\r\n\r\n const task: AgentTask = {\r\n id: options.task,\r\n title: options.task,\r\n description: `Task ${options.task}`,\r\n repository: project.repository,\r\n branch: `speexor/${options.task}`,\r\n provider: (options.agent as AgentProvider) || project.provider.primary,\r\n }\r\n\r\n debug(`Spawning agent for task ${task.id} using ${task.provider}`)\r\n\r\n const session = await lifecycle.spawnAgent(task)\r\n console.log(`\\n ✅ Agent spawned: ${session.id}`)\r\n console.log(` 🤖 Provider: ${session.provider}`)\r\n console.log(` 📋 Task: ${task.id}\\n`)\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/cli/agent.ts"],"names":[],"mappings":";;;;AAMA,IAAM,KAAA,GAAQ,MAAM,eAAe,CAAA;AAOnC,eAAsB,kBAAkB,OAAA,EAAuB;AAC7D,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,SAAA,GAAY,IAAI,gBAAA,CAAiB,MAAM,CAAA;AAC7C,EAAA,MAAM,UAAU,UAAA,EAAW;AAE3B,EAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,SAAA,CAAU,eAAe,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA;AACjC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,IAAA,GAAkB;AAAA,IACtB,IAAI,OAAA,CAAQ,IAAA;AAAA,IACZ,OAAO,OAAA,CAAQ,IAAA;AAAA,IACf,WAAA,EAAa,CAAA,KAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,IACjC,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,MAAA,EAAQ,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,IAC/B,QAAA,EAAW,OAAA,CAAQ,KAAA,IAA2B,OAAA,CAAQ,QAAA,CAAS;AAAA,GACjE;AAEA,EAAA,KAAA,CAAM,2BAA2B,IAAA,CAAK,EAAE,CAAA,OAAA,EAAU,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAEjE,EAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA;AAC/C,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,wBAAA,EAAwB,OAAA,CAAQ,EAAE,CAAA,CAAE,CAAA;AAChD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAkB,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAChD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAc,IAAA,CAAK,EAAE;AAAA,CAAI,CAAA;AACvC","file":"agent-C64T66XT.js","sourcesContent":["import { loadConfig } from '../core/config.js'\r\nimport { SpeexorLifecycle } from '../core/lifecycle.js'\r\nimport { loadAllPlugins } from '../plugins/index.js'\r\nimport type { AgentTask, AgentProvider } from '../core/types.js'\r\nimport Debug from 'debug'\r\n\r\nconst debug = Debug('speexor:agent')\r\n\r\ninterface SpawnOptions {\r\n task: string\r\n agent: string\r\n}\r\n\r\nexport async function agentSpawnCommand(options: SpawnOptions) {\r\n const config = loadConfig()\r\n const lifecycle = new SpeexorLifecycle(config)\r\n await lifecycle.initialize()\r\n\r\n const plugins = loadAllPlugins()\r\n for (const plugin of plugins) {\r\n lifecycle.registerPlugin(plugin)\r\n }\r\n\r\n const project = config.projects[0]\r\n if (!project) {\r\n throw new Error('No project configured')\r\n }\r\n\r\n const task: AgentTask = {\r\n id: options.task,\r\n title: options.task,\r\n description: `Task ${options.task}`,\r\n repository: project.repository,\r\n branch: `speexor/${options.task}`,\r\n provider: (options.agent as AgentProvider) || project.provider.primary,\r\n }\r\n\r\n debug(`Spawning agent for task ${task.id} using ${task.provider}`)\r\n\r\n const session = await lifecycle.spawnAgent(task)\r\n console.log(`\\n ✅ Agent spawned: ${session.id}`)\r\n console.log(` 🤖 Provider: ${session.provider}`)\r\n console.log(` 📋 Task: ${task.id}\\n`)\r\n}\r\n"]}