@stackmemoryai/stackmemory 0.3.6 → 0.3.8
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/agents/core/agent-task-manager.js +5 -5
- package/dist/agents/core/agent-task-manager.js.map +2 -2
- package/dist/agents/verifiers/base-verifier.js +2 -2
- package/dist/agents/verifiers/base-verifier.js.map +2 -2
- package/dist/agents/verifiers/formatter-verifier.js.map +2 -2
- package/dist/agents/verifiers/llm-judge.js.map +2 -2
- package/dist/cli/claude-sm.js +13 -13
- package/dist/cli/claude-sm.js.map +2 -2
- package/dist/cli/codex-sm.js +13 -13
- package/dist/cli/codex-sm.js.map +2 -2
- package/dist/cli/commands/agent.js.map +2 -2
- package/dist/cli/commands/chromadb.js +261 -46
- package/dist/cli/commands/chromadb.js.map +2 -2
- package/dist/cli/commands/clear.js +10 -3
- package/dist/cli/commands/clear.js.map +2 -2
- package/dist/cli/commands/config.js +43 -33
- package/dist/cli/commands/config.js.map +2 -2
- package/dist/cli/commands/context.js +13 -2
- package/dist/cli/commands/context.js.map +2 -2
- package/dist/cli/commands/dashboard.js +41 -13
- package/dist/cli/commands/dashboard.js.map +2 -2
- package/dist/cli/commands/gc.js +251 -0
- package/dist/cli/commands/gc.js.map +7 -0
- package/dist/cli/commands/handoff.js +12 -1
- package/dist/cli/commands/handoff.js.map +2 -2
- package/dist/cli/commands/infinite-storage.js +92 -40
- package/dist/cli/commands/infinite-storage.js.map +2 -2
- package/dist/cli/commands/linear-create.js +49 -10
- package/dist/cli/commands/linear-create.js.map +2 -2
- package/dist/cli/commands/linear-list.js +45 -11
- package/dist/cli/commands/linear-list.js.map +2 -2
- package/dist/cli/commands/linear-migrate.js +29 -5
- package/dist/cli/commands/linear-migrate.js.map +2 -2
- package/dist/cli/commands/linear-test.js +26 -7
- package/dist/cli/commands/linear-test.js.map +2 -2
- package/dist/cli/commands/linear-unified.js +350 -0
- package/dist/cli/commands/linear-unified.js.map +7 -0
- package/dist/cli/commands/linear.js +17 -6
- package/dist/cli/commands/linear.js.map +2 -2
- package/dist/cli/commands/monitor.js.map +2 -2
- package/dist/cli/commands/onboard.js +35 -8
- package/dist/cli/commands/onboard.js.map +2 -2
- package/dist/cli/commands/quality.js +2 -7
- package/dist/cli/commands/quality.js.map +2 -2
- package/dist/cli/commands/search.js.map +2 -2
- package/dist/cli/commands/session.js +23 -6
- package/dist/cli/commands/session.js.map +2 -2
- package/dist/cli/commands/skills.js +84 -28
- package/dist/cli/commands/skills.js.map +2 -2
- package/dist/cli/commands/storage.js +119 -38
- package/dist/cli/commands/storage.js.map +2 -2
- package/dist/cli/commands/tasks.js.map +2 -2
- package/dist/cli/commands/tui.js +13 -2
- package/dist/cli/commands/tui.js.map +2 -2
- package/dist/cli/commands/webhook.js +71 -21
- package/dist/cli/commands/webhook.js.map +2 -2
- package/dist/cli/commands/workflow.js +11 -7
- package/dist/cli/commands/workflow.js.map +2 -2
- package/dist/cli/commands/worktree.js +34 -13
- package/dist/cli/commands/worktree.js.map +2 -2
- package/dist/cli/index.js +7 -5
- package/dist/cli/index.js.map +2 -2
- package/dist/core/config/config-manager.js.map +2 -2
- package/dist/core/config/types.js.map +1 -1
- package/dist/core/context/auto-context.js +10 -6
- package/dist/core/context/auto-context.js.map +2 -2
- package/dist/core/context/compaction-handler.js.map +2 -2
- package/dist/core/context/context-bridge.js.map +2 -2
- package/dist/core/context/dual-stack-manager.js.map +2 -2
- package/dist/core/context/frame-database.js +13 -3
- package/dist/core/context/frame-database.js.map +2 -2
- package/dist/core/context/frame-digest.js +7 -5
- package/dist/core/context/frame-digest.js.map +2 -2
- package/dist/core/context/frame-handoff-manager.js.map +2 -2
- package/dist/core/context/frame-manager.js +12 -1
- package/dist/core/context/frame-manager.js.map +2 -2
- package/dist/core/context/frame-stack.js +16 -5
- package/dist/core/context/frame-stack.js.map +2 -2
- package/dist/core/context/incremental-gc.js +286 -0
- package/dist/core/context/incremental-gc.js.map +7 -0
- package/dist/core/context/index.js.map +1 -1
- package/dist/core/context/permission-manager.js +12 -1
- package/dist/core/context/permission-manager.js.map +2 -2
- package/dist/core/context/refactored-frame-manager.js +12 -3
- package/dist/core/context/refactored-frame-manager.js.map +2 -2
- package/dist/core/context/shared-context-layer.js +16 -3
- package/dist/core/context/shared-context-layer.js.map +2 -2
- package/dist/core/context/stack-merge-resolver.js.map +2 -2
- package/dist/core/context/validation.js.map +2 -2
- package/dist/core/database/batch-operations.js +112 -86
- package/dist/core/database/batch-operations.js.map +2 -2
- package/dist/core/database/connection-pool.js.map +2 -2
- package/dist/core/database/migration-manager.js.map +2 -2
- package/dist/core/database/paradedb-adapter.js.map +2 -2
- package/dist/core/database/query-cache.js +19 -9
- package/dist/core/database/query-cache.js.map +2 -2
- package/dist/core/database/query-router.js.map +2 -2
- package/dist/core/database/sqlite-adapter.js +1 -1
- package/dist/core/database/sqlite-adapter.js.map +2 -2
- package/dist/core/digest/enhanced-hybrid-digest.js +8 -2
- package/dist/core/digest/enhanced-hybrid-digest.js.map +2 -2
- package/dist/core/errors/recovery.js +9 -2
- package/dist/core/errors/recovery.js.map +2 -2
- package/dist/core/frame/workflow-templates-stub.js.map +1 -1
- package/dist/core/frame/workflow-templates.js +40 -1
- package/dist/core/frame/workflow-templates.js.map +2 -2
- package/dist/core/merge/resolution-engine.js.map +2 -2
- package/dist/core/monitoring/error-handler.js.map +2 -2
- package/dist/core/monitoring/logger.js +19 -3
- package/dist/core/monitoring/logger.js.map +2 -2
- package/dist/core/monitoring/metrics.js +13 -2
- package/dist/core/monitoring/metrics.js.map +2 -2
- package/dist/core/monitoring/progress-tracker.js +12 -1
- package/dist/core/monitoring/progress-tracker.js.map +2 -2
- package/dist/core/monitoring/session-monitor.js.map +2 -2
- package/dist/core/performance/context-cache.js.map +2 -2
- package/dist/core/performance/lazy-context-loader.js +24 -20
- package/dist/core/performance/lazy-context-loader.js.map +2 -2
- package/dist/core/performance/monitor.js.map +2 -2
- package/dist/core/performance/optimized-frame-context.js +27 -12
- package/dist/core/performance/optimized-frame-context.js.map +2 -2
- package/dist/core/performance/performance-benchmark.js +10 -6
- package/dist/core/performance/performance-benchmark.js.map +2 -2
- package/dist/core/performance/performance-profiler.js +63 -15
- package/dist/core/performance/performance-profiler.js.map +2 -2
- package/dist/core/performance/streaming-jsonl-parser.js +5 -1
- package/dist/core/performance/streaming-jsonl-parser.js.map +2 -2
- package/dist/core/persistence/postgres-adapter.js.map +2 -2
- package/dist/core/projects/project-manager.js +14 -20
- package/dist/core/projects/project-manager.js.map +2 -2
- package/dist/core/retrieval/context-retriever.js.map +2 -2
- package/dist/core/retrieval/graph-retrieval.js.map +2 -2
- package/dist/core/retrieval/llm-context-retrieval.js.map +2 -2
- package/dist/core/retrieval/retrieval-benchmarks.js.map +2 -2
- package/dist/core/retrieval/summary-generator.js.map +2 -2
- package/dist/core/session/clear-survival-stub.js +5 -1
- package/dist/core/session/clear-survival-stub.js.map +2 -2
- package/dist/core/session/clear-survival.js +35 -0
- package/dist/core/session/clear-survival.js.map +2 -2
- package/dist/core/session/handoff-generator.js.map +2 -2
- package/dist/core/session/index.js.map +1 -1
- package/dist/core/session/session-manager.js +16 -5
- package/dist/core/session/session-manager.js.map +2 -2
- package/dist/core/skills/skill-storage.js +13 -2
- package/dist/core/skills/skill-storage.js.map +2 -2
- package/dist/core/storage/chromadb-adapter.js +6 -2
- package/dist/core/storage/chromadb-adapter.js.map +2 -2
- package/dist/core/storage/chromadb-simple.js +17 -5
- package/dist/core/storage/chromadb-simple.js.map +2 -2
- package/dist/core/storage/infinite-storage.js +109 -46
- package/dist/core/storage/infinite-storage.js.map +2 -2
- package/dist/core/storage/railway-optimized-storage.js +67 -30
- package/dist/core/storage/railway-optimized-storage.js.map +2 -2
- package/dist/core/storage/remote-storage.js +53 -24
- package/dist/core/storage/remote-storage.js.map +2 -2
- package/dist/core/trace/cli-trace-wrapper.js +25 -7
- package/dist/core/trace/cli-trace-wrapper.js.map +2 -2
- package/dist/core/trace/db-trace-wrapper.js +96 -68
- package/dist/core/trace/db-trace-wrapper.js.map +2 -2
- package/dist/core/trace/debug-trace.js +44 -16
- package/dist/core/trace/debug-trace.js.map +2 -2
- package/dist/core/trace/index.js +50 -35
- package/dist/core/trace/index.js.map +2 -2
- package/dist/core/trace/linear-api-wrapper.js +10 -5
- package/dist/core/trace/linear-api-wrapper.js.map +2 -2
- package/dist/core/trace/trace-demo.js +26 -11
- package/dist/core/trace/trace-demo.js.map +2 -2
- package/dist/core/trace/trace-detector.js +9 -2
- package/dist/core/trace/trace-detector.js.map +2 -2
- package/dist/core/trace/trace-store.js.map +2 -2
- package/dist/core/trace/types.js.map +1 -1
- package/dist/core/utils/compression.js.map +1 -1
- package/dist/core/utils/update-checker.js.map +2 -2
- package/dist/core/worktree/worktree-manager.js +18 -7
- package/dist/core/worktree/worktree-manager.js.map +2 -2
- package/dist/features/analytics/api/analytics-api.js.map +2 -2
- package/dist/features/analytics/core/analytics-service.js +12 -1
- package/dist/features/analytics/core/analytics-service.js.map +2 -2
- package/dist/features/analytics/queries/metrics-queries.js +1 -1
- package/dist/features/analytics/queries/metrics-queries.js.map +2 -2
- package/dist/features/tasks/pebbles-task-store.js.map +2 -2
- package/dist/features/tui/components/analytics-panel.js +36 -15
- package/dist/features/tui/components/analytics-panel.js.map +2 -2
- package/dist/features/tui/components/pr-tracker.js +19 -7
- package/dist/features/tui/components/pr-tracker.js.map +2 -2
- package/dist/features/tui/components/session-monitor.js +22 -9
- package/dist/features/tui/components/session-monitor.js.map +2 -2
- package/dist/features/tui/components/subagent-fleet.js +20 -13
- package/dist/features/tui/components/subagent-fleet.js.map +2 -2
- package/dist/features/tui/components/task-board.js +666 -2
- package/dist/features/tui/components/task-board.js.map +2 -2
- package/dist/features/tui/index.js +16 -5
- package/dist/features/tui/index.js.map +2 -2
- package/dist/features/tui/services/data-service.js +30 -15
- package/dist/features/tui/services/data-service.js.map +2 -2
- package/dist/features/tui/services/linear-task-reader.js +3 -1
- package/dist/features/tui/services/linear-task-reader.js.map +2 -2
- package/dist/features/tui/services/websocket-client.js +16 -3
- package/dist/features/tui/services/websocket-client.js.map +2 -2
- package/dist/features/tui/terminal-compat.js +33 -18
- package/dist/features/tui/terminal-compat.js.map +2 -2
- package/dist/features/web/client/stores/task-store.js.map +2 -2
- package/dist/features/web/server/index.js +31 -12
- package/dist/features/web/server/index.js.map +2 -2
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +2 -2
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +2 -2
- package/dist/integrations/claude-code/post-task-hooks.js.map +2 -2
- package/dist/integrations/linear/auth.js +17 -6
- package/dist/integrations/linear/auth.js.map +2 -2
- package/dist/integrations/linear/auto-sync.js.map +2 -2
- package/dist/integrations/linear/client.js.map +2 -2
- package/dist/integrations/linear/config.js.map +2 -2
- package/dist/integrations/linear/migration.js.map +2 -2
- package/dist/integrations/linear/oauth-server.js +13 -2
- package/dist/integrations/linear/oauth-server.js.map +2 -2
- package/dist/integrations/linear/rest-client.js.map +2 -2
- package/dist/integrations/linear/sync-enhanced.js +202 -0
- package/dist/integrations/linear/sync-enhanced.js.map +7 -0
- package/dist/integrations/linear/sync-manager.js.map +2 -2
- package/dist/integrations/linear/sync-service.js +24 -14
- package/dist/integrations/linear/sync-service.js.map +2 -2
- package/dist/integrations/linear/sync.js +196 -3
- package/dist/integrations/linear/sync.js.map +2 -2
- package/dist/integrations/linear/unified-sync.js +560 -0
- package/dist/integrations/linear/unified-sync.js.map +7 -0
- package/dist/integrations/linear/webhook-handler.js +12 -1
- package/dist/integrations/linear/webhook-handler.js.map +2 -2
- package/dist/integrations/linear/webhook-server.js +29 -19
- package/dist/integrations/linear/webhook-server.js.map +2 -2
- package/dist/integrations/linear/webhook.js +12 -1
- package/dist/integrations/linear/webhook.js.map +2 -2
- package/dist/integrations/mcp/handlers/context-handlers.js.map +2 -2
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +2 -2
- package/dist/integrations/mcp/handlers/skill-handlers.js +13 -2
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +2 -2
- package/dist/integrations/mcp/handlers/task-handlers.js.map +2 -2
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +2 -2
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +2 -2
- package/dist/integrations/mcp/refactored-server.js +15 -4
- package/dist/integrations/mcp/refactored-server.js.map +2 -2
- package/dist/integrations/mcp/server.js +12 -1
- package/dist/integrations/mcp/server.js.map +2 -2
- package/dist/integrations/mcp/tool-definitions.js.map +2 -2
- package/dist/integrations/pg-aiguide/embedding-provider.js +13 -2
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +2 -2
- package/dist/integrations/pg-aiguide/semantic-search.js.map +2 -2
- package/dist/mcp/stackmemory-mcp-server.js +1 -1
- package/dist/mcp/stackmemory-mcp-server.js.map +2 -2
- package/dist/middleware/exponential-rate-limiter.js.map +2 -2
- package/dist/servers/production/auth-middleware.js +13 -2
- package/dist/servers/production/auth-middleware.js.map +2 -2
- package/dist/servers/railway/index.js +22 -11
- package/dist/servers/railway/index.js.map +2 -2
- package/dist/services/config-service.js +6 -7
- package/dist/services/config-service.js.map +2 -2
- package/dist/services/context-service.js +11 -12
- package/dist/services/context-service.js.map +2 -2
- package/dist/skills/claude-skills.js +108 -3
- package/dist/skills/claude-skills.js.map +2 -2
- package/dist/skills/dashboard-launcher.js.map +2 -2
- package/dist/skills/repo-ingestion-skill.js +561 -0
- package/dist/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/utils/env.js +46 -0
- package/dist/utils/env.js.map +7 -0
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +2 -2
- package/package.json +5 -1
package/dist/cli/codex-sm.js
CHANGED
|
@@ -187,19 +187,19 @@ class CodexSM {
|
|
|
187
187
|
i++;
|
|
188
188
|
}
|
|
189
189
|
if (this.config.tracingEnabled) {
|
|
190
|
-
process.env
|
|
191
|
-
process.env
|
|
192
|
-
process.env
|
|
193
|
-
process.env
|
|
190
|
+
process.env["DEBUG_TRACE"] = "true";
|
|
191
|
+
process.env["STACKMEMORY_DEBUG"] = "true";
|
|
192
|
+
process.env["TRACE_OUTPUT"] = "file";
|
|
193
|
+
process.env["TRACE_MASK_SENSITIVE"] = "true";
|
|
194
194
|
if (this.config.verboseTracing) {
|
|
195
|
-
process.env
|
|
196
|
-
process.env
|
|
197
|
-
process.env
|
|
198
|
-
process.env
|
|
195
|
+
process.env["TRACE_VERBOSITY"] = "full";
|
|
196
|
+
process.env["TRACE_PARAMS"] = "true";
|
|
197
|
+
process.env["TRACE_RESULTS"] = "true";
|
|
198
|
+
process.env["TRACE_MEMORY"] = "true";
|
|
199
199
|
} else {
|
|
200
|
-
process.env
|
|
201
|
-
process.env
|
|
202
|
-
process.env
|
|
200
|
+
process.env["TRACE_VERBOSITY"] = "summary";
|
|
201
|
+
process.env["TRACE_PARAMS"] = "true";
|
|
202
|
+
process.env["TRACE_RESULTS"] = "false";
|
|
203
203
|
}
|
|
204
204
|
initializeTracing();
|
|
205
205
|
trace.command(
|
|
@@ -235,9 +235,9 @@ class CodexSM {
|
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
237
|
this.loadContext();
|
|
238
|
-
process.env
|
|
238
|
+
process.env["CODEX_INSTANCE_ID"] = this.config.instanceId;
|
|
239
239
|
if (this.config.worktreePath)
|
|
240
|
-
process.env
|
|
240
|
+
process.env["CODEX_WORKTREE_PATH"] = this.config.worktreePath;
|
|
241
241
|
console.log(chalk.gray(`\u{1F916} Instance ID: ${this.config.instanceId}`));
|
|
242
242
|
console.log(chalk.gray(`\u{1F4C1} Working in: ${process.cwd()}`));
|
|
243
243
|
console.log();
|
package/dist/cli/codex-sm.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/cli/codex-sm.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n\n/**\n * codex-sm: Codex wrapper with StackMemory and worktree integration\n * Automatically manages context persistence, optional worktree isolation, and tracing\n */\n\nimport { spawn, execSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { program } from 'commander';\nimport { v4 as uuidv4 } from 'uuid';\nimport chalk from 'chalk';\nimport { initializeTracing, trace } from '../core/trace/index.js';\n\ninterface CodexConfig {\n instanceId: string;\n worktreePath?: string;\n useWorktree: boolean;\n contextEnabled: boolean;\n branch?: string;\n task?: string;\n tracingEnabled: boolean;\n verboseTracing: boolean;\n}\n\nclass CodexSM {\n private config: CodexConfig;\n private stackmemoryPath: string;\n\n constructor() {\n this.config = {\n instanceId: this.generateInstanceId(),\n useWorktree: false,\n contextEnabled: true,\n tracingEnabled: true,\n verboseTracing: false,\n };\n\n this.stackmemoryPath = this.findStackMemory();\n }\n\n private generateInstanceId(): string {\n return uuidv4().substring(0, 8);\n }\n\n private findStackMemory(): string {\n const possiblePaths = [\n path.join(os.homedir(), '.stackmemory', 'bin', 'stackmemory'),\n '/usr/local/bin/stackmemory',\n '/opt/homebrew/bin/stackmemory',\n 'stackmemory',\n ];\n for (const smPath of possiblePaths) {\n try {\n execSync(`which ${smPath}`, { stdio: 'ignore' });\n return smPath;\n } catch {\n // continue\n }\n }\n return 'stackmemory';\n }\n\n private isGitRepo(): boolean {\n try {\n execSync('git rev-parse --git-dir', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n private getCurrentBranch(): string {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf8',\n }).trim();\n } catch {\n return 'main';\n }\n }\n\n private hasUncommittedChanges(): boolean {\n try {\n const status = execSync('git status --porcelain', { encoding: 'utf8' });\n return status.length > 0;\n } catch {\n return false;\n }\n }\n\n private setupWorktree(): string | null {\n if (!this.config.useWorktree || !this.isGitRepo()) return null;\n\n console.log(chalk.blue('\uD83C\uDF33 Setting up isolated worktree...'));\n\n const timestamp = new Date()\n .toISOString()\n .replace(/[:.]/g, '-')\n .substring(0, 19);\n const branch =\n this.config.branch ||\n `codex-${this.config.task || 'work'}-${timestamp}-${this.config.instanceId}`;\n const repoName = path.basename(process.cwd());\n const worktreePath = path.join(\n path.dirname(process.cwd()),\n `${repoName}--${branch}`\n );\n\n try {\n const cmd = `git worktree add -b \"${branch}\" \"${worktreePath}\"`;\n execSync(cmd, { stdio: 'inherit' });\n\n console.log(chalk.green(`\u2705 Worktree created: ${worktreePath}`));\n console.log(chalk.gray(` Branch: ${branch}`));\n\n const configPath = path.join(worktreePath, '.codex-instance.json');\n const configData = {\n instanceId: this.config.instanceId,\n worktreePath,\n branch,\n task: this.config.task,\n created: new Date().toISOString(),\n parentRepo: process.cwd(),\n };\n fs.writeFileSync(configPath, JSON.stringify(configData, null, 2));\n\n const envFiles = ['.env', '.env.local', '.mise.toml', '.tool-versions'];\n for (const file of envFiles) {\n const srcPath = path.join(process.cwd(), file);\n if (fs.existsSync(srcPath))\n fs.copyFileSync(srcPath, path.join(worktreePath, file));\n }\n\n return worktreePath;\n } catch (err) {\n console.error(chalk.red('\u274C Failed to create worktree:'), err);\n return null;\n }\n }\n\n private saveContext(\n message: string,\n metadata: Record<string, unknown> = {}\n ): void {\n if (!this.config.contextEnabled) return;\n try {\n const contextData = {\n message,\n metadata: {\n ...metadata,\n instanceId: this.config.instanceId,\n worktree: this.config.worktreePath,\n timestamp: new Date().toISOString(),\n },\n };\n const cmd = `${this.stackmemoryPath} context save --json '${JSON.stringify(contextData)}'`;\n execSync(cmd, { stdio: 'ignore' });\n } catch {\n // ignore\n }\n }\n\n private loadContext(): void {\n if (!this.config.contextEnabled) return;\n try {\n console.log(chalk.blue('\uD83D\uDCDA Loading previous context...'));\n const cmd = `${this.stackmemoryPath} context list --limit 5 --format json`;\n const output = execSync(cmd, { encoding: 'utf8' });\n const contexts = JSON.parse(output);\n if (Array.isArray(contexts) && contexts.length > 0) {\n console.log(chalk.gray('Recent context loaded:'));\n contexts.forEach(\n (ctx: { message: string; metadata?: { timestamp?: string } }) => {\n console.log(\n chalk.gray(` - ${ctx.message} (${ctx.metadata?.timestamp})`)\n );\n }\n );\n }\n } catch {\n // ignore\n }\n }\n\n private suggestWorktreeMode(): void {\n if (this.hasUncommittedChanges()) {\n console.log(chalk.yellow('\u26A0\uFE0F Uncommitted changes detected'));\n console.log(\n chalk.gray(' Consider using --worktree to work in isolation')\n );\n }\n }\n\n public async run(args: string[]): Promise<void> {\n const codexArgs: string[] = [];\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n switch (arg) {\n case '--worktree':\n case '-w':\n this.config.useWorktree = true;\n break;\n case '--no-context':\n this.config.contextEnabled = false;\n break;\n case '--no-trace':\n this.config.tracingEnabled = false;\n break;\n case '--verbose-trace':\n this.config.verboseTracing = true;\n break;\n case '--branch':\n case '-b':\n i++;\n this.config.branch = args[i];\n break;\n case '--task':\n case '-t':\n i++;\n this.config.task = args[i];\n break;\n case '--auto':\n case '-a':\n if (this.isGitRepo()) {\n this.config.useWorktree = this.hasUncommittedChanges();\n }\n break;\n default:\n codexArgs.push(arg);\n }\n i++;\n }\n\n if (this.config.tracingEnabled) {\n process.env.DEBUG_TRACE = 'true';\n process.env.STACKMEMORY_DEBUG = 'true';\n process.env.TRACE_OUTPUT = 'file';\n process.env.TRACE_MASK_SENSITIVE = 'true';\n if (this.config.verboseTracing) {\n process.env.TRACE_VERBOSITY = 'full';\n process.env.TRACE_PARAMS = 'true';\n process.env.TRACE_RESULTS = 'true';\n process.env.TRACE_MEMORY = 'true';\n } else {\n process.env.TRACE_VERBOSITY = 'summary';\n process.env.TRACE_PARAMS = 'true';\n process.env.TRACE_RESULTS = 'false';\n }\n initializeTracing();\n trace.command(\n 'codex-sm',\n {\n instanceId: this.config.instanceId,\n worktree: this.config.useWorktree,\n task: this.config.task,\n },\n async () => {}\n );\n }\n\n console.log(chalk.blue('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557'));\n console.log(chalk.blue('\u2551 Codex + StackMemory + Worktree \u2551'));\n console.log(chalk.blue('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D'));\n console.log();\n\n if (this.isGitRepo()) {\n const branch = this.getCurrentBranch();\n console.log(chalk.gray(`\uD83D\uDCCD Current branch: ${branch}`));\n if (!this.config.useWorktree) this.suggestWorktreeMode();\n }\n\n if (this.config.useWorktree) {\n const worktreePath = this.setupWorktree();\n if (worktreePath) {\n this.config.worktreePath = worktreePath;\n process.chdir(worktreePath);\n this.saveContext('Created worktree for Codex instance', {\n action: 'worktree_created',\n path: worktreePath,\n branch: this.config.branch,\n });\n }\n }\n\n this.loadContext();\n\n process.env.CODEX_INSTANCE_ID = this.config.instanceId;\n if (this.config.worktreePath)\n process.env.CODEX_WORKTREE_PATH = this.config.worktreePath;\n\n console.log(chalk.gray(`\uD83E\uDD16 Instance ID: ${this.config.instanceId}`));\n console.log(chalk.gray(`\uD83D\uDCC1 Working in: ${process.cwd()}`));\n\n console.log();\n console.log(chalk.gray('Starting Codex...'));\n console.log(chalk.gray('\u2500'.repeat(42)));\n\n const codexBin = (() => {\n try {\n execSync('which codex', { stdio: 'ignore' });\n return 'codex';\n } catch {}\n try {\n execSync('which codex-cli', { stdio: 'ignore' });\n return 'codex-cli';\n } catch {}\n return null;\n })();\n\n if (!codexBin) {\n console.error(\n chalk.red('\u274C Codex CLI not found in PATH (codex or codex-cli).')\n );\n process.exit(1);\n return;\n }\n\n const child = spawn(codexBin, codexArgs, {\n stdio: 'inherit',\n env: process.env,\n });\n\n child.on('exit', (code) => {\n this.saveContext('Codex session ended', {\n action: 'session_end',\n exitCode: code,\n });\n if (this.config.tracingEnabled) {\n const summary = trace.getExecutionSummary();\n console.log();\n console.log(chalk.gray('\u2500'.repeat(42)));\n console.log(chalk.blue('Debug Trace Summary:'));\n console.log(chalk.gray(summary));\n }\n if (this.config.worktreePath) {\n console.log();\n console.log(chalk.gray('\u2500'.repeat(42)));\n console.log(chalk.blue('Session ended in worktree:'));\n console.log(chalk.gray(` ${this.config.worktreePath}`));\n }\n process.exit(code || 0);\n });\n\n process.on('SIGINT', () => {\n this.saveContext('Codex session interrupted', {\n action: 'session_interrupt',\n });\n child.kill('SIGINT');\n });\n\n process.on('SIGTERM', () => {\n this.saveContext('Codex session terminated', {\n action: 'session_terminate',\n });\n child.kill('SIGTERM');\n });\n }\n}\n\nprogram\n .name('codex-sm')\n .description('Codex with StackMemory context and optional worktree isolation')\n .version('1.0.0')\n .option('-w, --worktree', 'Create isolated worktree for this instance')\n .option('-a, --auto', 'Automatically detect and apply best settings')\n .option('-b, --branch <name>', 'Specify branch name for worktree')\n .option('-t, --task <desc>', 'Task description for context')\n .option('--no-context', 'Disable StackMemory context integration')\n .option('--no-trace', 'Disable debug tracing (enabled by default)')\n .option('--verbose-trace', 'Enable verbose debug tracing with full details')\n .helpOption('-h, --help', 'Display help')\n .allowUnknownOption(true)\n .action(async (_options) => {\n const codexSM = new CodexSM();\n const args = process.argv.slice(2);\n await codexSM.run(args);\n });\n\nif (require.main === module) {\n program.parse(process.argv);\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\n/**\n * codex-sm: Codex wrapper with StackMemory and worktree integration\n * Automatically manages context persistence, optional worktree isolation, and tracing\n */\n\nimport { spawn, execSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { program } from 'commander';\nimport { v4 as uuidv4 } from 'uuid';\nimport chalk from 'chalk';\nimport { initializeTracing, trace } from '../core/trace/index.js';\n\ninterface CodexConfig {\n instanceId: string;\n worktreePath?: string;\n useWorktree: boolean;\n contextEnabled: boolean;\n branch?: string;\n task?: string;\n tracingEnabled: boolean;\n verboseTracing: boolean;\n}\n\nclass CodexSM {\n private config: CodexConfig;\n private stackmemoryPath: string;\n\n constructor() {\n this.config = {\n instanceId: this.generateInstanceId(),\n useWorktree: false,\n contextEnabled: true,\n tracingEnabled: true,\n verboseTracing: false,\n };\n\n this.stackmemoryPath = this.findStackMemory();\n }\n\n private generateInstanceId(): string {\n return uuidv4().substring(0, 8);\n }\n\n private findStackMemory(): string {\n const possiblePaths = [\n path.join(os.homedir(), '.stackmemory', 'bin', 'stackmemory'),\n '/usr/local/bin/stackmemory',\n '/opt/homebrew/bin/stackmemory',\n 'stackmemory',\n ];\n for (const smPath of possiblePaths) {\n try {\n execSync(`which ${smPath}`, { stdio: 'ignore' });\n return smPath;\n } catch {\n // continue\n }\n }\n return 'stackmemory';\n }\n\n private isGitRepo(): boolean {\n try {\n execSync('git rev-parse --git-dir', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n private getCurrentBranch(): string {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf8',\n }).trim();\n } catch {\n return 'main';\n }\n }\n\n private hasUncommittedChanges(): boolean {\n try {\n const status = execSync('git status --porcelain', { encoding: 'utf8' });\n return status.length > 0;\n } catch {\n return false;\n }\n }\n\n private setupWorktree(): string | null {\n if (!this.config.useWorktree || !this.isGitRepo()) return null;\n\n console.log(chalk.blue('\uD83C\uDF33 Setting up isolated worktree...'));\n\n const timestamp = new Date()\n .toISOString()\n .replace(/[:.]/g, '-')\n .substring(0, 19);\n const branch =\n this.config.branch ||\n `codex-${this.config.task || 'work'}-${timestamp}-${this.config.instanceId}`;\n const repoName = path.basename(process.cwd());\n const worktreePath = path.join(\n path.dirname(process.cwd()),\n `${repoName}--${branch}`\n );\n\n try {\n const cmd = `git worktree add -b \"${branch}\" \"${worktreePath}\"`;\n execSync(cmd, { stdio: 'inherit' });\n\n console.log(chalk.green(`\u2705 Worktree created: ${worktreePath}`));\n console.log(chalk.gray(` Branch: ${branch}`));\n\n const configPath = path.join(worktreePath, '.codex-instance.json');\n const configData = {\n instanceId: this.config.instanceId,\n worktreePath,\n branch,\n task: this.config.task,\n created: new Date().toISOString(),\n parentRepo: process.cwd(),\n };\n fs.writeFileSync(configPath, JSON.stringify(configData, null, 2));\n\n const envFiles = ['.env', '.env.local', '.mise.toml', '.tool-versions'];\n for (const file of envFiles) {\n const srcPath = path.join(process.cwd(), file);\n if (fs.existsSync(srcPath))\n fs.copyFileSync(srcPath, path.join(worktreePath, file));\n }\n\n return worktreePath;\n } catch (err: unknown) {\n console.error(chalk.red('\u274C Failed to create worktree:'), err);\n return null;\n }\n }\n\n private saveContext(\n message: string,\n metadata: Record<string, unknown> = {}\n ): void {\n if (!this.config.contextEnabled) return;\n try {\n const contextData = {\n message,\n metadata: {\n ...metadata,\n instanceId: this.config.instanceId,\n worktree: this.config.worktreePath,\n timestamp: new Date().toISOString(),\n },\n };\n const cmd = `${this.stackmemoryPath} context save --json '${JSON.stringify(contextData)}'`;\n execSync(cmd, { stdio: 'ignore' });\n } catch {\n // ignore\n }\n }\n\n private loadContext(): void {\n if (!this.config.contextEnabled) return;\n try {\n console.log(chalk.blue('\uD83D\uDCDA Loading previous context...'));\n const cmd = `${this.stackmemoryPath} context list --limit 5 --format json`;\n const output = execSync(cmd, { encoding: 'utf8' });\n const contexts = JSON.parse(output);\n if (Array.isArray(contexts) && contexts.length > 0) {\n console.log(chalk.gray('Recent context loaded:'));\n contexts.forEach(\n (ctx: { message: string; metadata?: { timestamp?: string } }) => {\n console.log(\n chalk.gray(` - ${ctx.message} (${ctx.metadata?.timestamp})`)\n );\n }\n );\n }\n } catch {\n // ignore\n }\n }\n\n private suggestWorktreeMode(): void {\n if (this.hasUncommittedChanges()) {\n console.log(chalk.yellow('\u26A0\uFE0F Uncommitted changes detected'));\n console.log(\n chalk.gray(' Consider using --worktree to work in isolation')\n );\n }\n }\n\n public async run(args: string[]): Promise<void> {\n const codexArgs: string[] = [];\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n switch (arg) {\n case '--worktree':\n case '-w':\n this.config.useWorktree = true;\n break;\n case '--no-context':\n this.config.contextEnabled = false;\n break;\n case '--no-trace':\n this.config.tracingEnabled = false;\n break;\n case '--verbose-trace':\n this.config.verboseTracing = true;\n break;\n case '--branch':\n case '-b':\n i++;\n this.config.branch = args[i];\n break;\n case '--task':\n case '-t':\n i++;\n this.config.task = args[i];\n break;\n case '--auto':\n case '-a':\n if (this.isGitRepo()) {\n this.config.useWorktree = this.hasUncommittedChanges();\n }\n break;\n default:\n codexArgs.push(arg);\n }\n i++;\n }\n\n if (this.config.tracingEnabled) {\n process.env['DEBUG_TRACE'] = 'true';\n process.env['STACKMEMORY_DEBUG'] = 'true';\n process.env['TRACE_OUTPUT'] = 'file';\n process.env['TRACE_MASK_SENSITIVE'] = 'true';\n if (this.config.verboseTracing) {\n process.env['TRACE_VERBOSITY'] = 'full';\n process.env['TRACE_PARAMS'] = 'true';\n process.env['TRACE_RESULTS'] = 'true';\n process.env['TRACE_MEMORY'] = 'true';\n } else {\n process.env['TRACE_VERBOSITY'] = 'summary';\n process.env['TRACE_PARAMS'] = 'true';\n process.env['TRACE_RESULTS'] = 'false';\n }\n initializeTracing();\n trace.command(\n 'codex-sm',\n {\n instanceId: this.config.instanceId,\n worktree: this.config.useWorktree,\n task: this.config.task,\n },\n async () => {}\n );\n }\n\n console.log(chalk.blue('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557'));\n console.log(chalk.blue('\u2551 Codex + StackMemory + Worktree \u2551'));\n console.log(chalk.blue('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D'));\n console.log();\n\n if (this.isGitRepo()) {\n const branch = this.getCurrentBranch();\n console.log(chalk.gray(`\uD83D\uDCCD Current branch: ${branch}`));\n if (!this.config.useWorktree) this.suggestWorktreeMode();\n }\n\n if (this.config.useWorktree) {\n const worktreePath = this.setupWorktree();\n if (worktreePath) {\n this.config.worktreePath = worktreePath;\n process.chdir(worktreePath);\n this.saveContext('Created worktree for Codex instance', {\n action: 'worktree_created',\n path: worktreePath,\n branch: this.config.branch,\n });\n }\n }\n\n this.loadContext();\n\n process.env['CODEX_INSTANCE_ID'] = this.config.instanceId;\n if (this.config.worktreePath)\n process.env['CODEX_WORKTREE_PATH'] = this.config.worktreePath;\n\n console.log(chalk.gray(`\uD83E\uDD16 Instance ID: ${this.config.instanceId}`));\n console.log(chalk.gray(`\uD83D\uDCC1 Working in: ${process.cwd()}`));\n\n console.log();\n console.log(chalk.gray('Starting Codex...'));\n console.log(chalk.gray('\u2500'.repeat(42)));\n\n const codexBin = (() => {\n try {\n execSync('which codex', { stdio: 'ignore' });\n return 'codex';\n } catch {}\n try {\n execSync('which codex-cli', { stdio: 'ignore' });\n return 'codex-cli';\n } catch {}\n return null;\n })();\n\n if (!codexBin) {\n console.error(\n chalk.red('\u274C Codex CLI not found in PATH (codex or codex-cli).')\n );\n process.exit(1);\n return;\n }\n\n const child = spawn(codexBin, codexArgs, {\n stdio: 'inherit',\n env: process.env,\n });\n\n child.on('exit', (code) => {\n this.saveContext('Codex session ended', {\n action: 'session_end',\n exitCode: code,\n });\n if (this.config.tracingEnabled) {\n const summary = trace.getExecutionSummary();\n console.log();\n console.log(chalk.gray('\u2500'.repeat(42)));\n console.log(chalk.blue('Debug Trace Summary:'));\n console.log(chalk.gray(summary));\n }\n if (this.config.worktreePath) {\n console.log();\n console.log(chalk.gray('\u2500'.repeat(42)));\n console.log(chalk.blue('Session ended in worktree:'));\n console.log(chalk.gray(` ${this.config.worktreePath}`));\n }\n process.exit(code || 0);\n });\n\n process.on('SIGINT', () => {\n this.saveContext('Codex session interrupted', {\n action: 'session_interrupt',\n });\n child.kill('SIGINT');\n });\n\n process.on('SIGTERM', () => {\n this.saveContext('Codex session terminated', {\n action: 'session_terminate',\n });\n child.kill('SIGTERM');\n });\n }\n}\n\nprogram\n .name('codex-sm')\n .description('Codex with StackMemory context and optional worktree isolation')\n .version('1.0.0')\n .option('-w, --worktree', 'Create isolated worktree for this instance')\n .option('-a, --auto', 'Automatically detect and apply best settings')\n .option('-b, --branch <name>', 'Specify branch name for worktree')\n .option('-t, --task <desc>', 'Task description for context')\n .option('--no-context', 'Disable StackMemory context integration')\n .option('--no-trace', 'Disable debug tracing (enabled by default)')\n .option('--verbose-trace', 'Enable verbose debug tracing with full details')\n .helpOption('-h, --help', 'Display help')\n .allowUnknownOption(true)\n .action(async (_options) => {\n const codexSM = new CodexSM();\n const args = process.argv.slice(2);\n await codexSM.run(args);\n });\n\nif (require.main === module) {\n program.parse(process.argv);\n}\n"],
|
|
5
|
+
"mappings": ";AAOA,SAAS,OAAO,gBAAgB;AAChC,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,SAAS,eAAe;AACxB,SAAS,MAAM,cAAc;AAC7B,OAAO,WAAW;AAClB,SAAS,mBAAmB,aAAa;AAazC,MAAM,QAAQ;AAAA,EACJ;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,SAAS;AAAA,MACZ,YAAY,KAAK,mBAAmB;AAAA,MACpC,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAClB;AAEA,SAAK,kBAAkB,KAAK,gBAAgB;AAAA,EAC9C;AAAA,EAEQ,qBAA6B;AACnC,WAAO,OAAO,EAAE,UAAU,GAAG,CAAC;AAAA,EAChC;AAAA,EAEQ,kBAA0B;AAChC,UAAM,gBAAgB;AAAA,MACpB,KAAK,KAAK,GAAG,QAAQ,GAAG,gBAAgB,OAAO,aAAa;AAAA,MAC5D;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,eAAW,UAAU,eAAe;AAClC,UAAI;AACF,iBAAS,SAAS,MAAM,IAAI,EAAE,OAAO,SAAS,CAAC;AAC/C,eAAO;AAAA,MACT,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAqB;AAC3B,QAAI;AACF,eAAS,2BAA2B,EAAE,OAAO,SAAS,CAAC;AACvD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,mBAA2B;AACjC,QAAI;AACF,aAAO,SAAS,mCAAmC;AAAA,QACjD,UAAU;AAAA,MACZ,CAAC,EAAE,KAAK;AAAA,IACV,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,wBAAiC;AACvC,QAAI;AACF,YAAM,SAAS,SAAS,0BAA0B,EAAE,UAAU,OAAO,CAAC;AACtE,aAAO,OAAO,SAAS;AAAA,IACzB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,gBAA+B;AACrC,QAAI,CAAC,KAAK,OAAO,eAAe,CAAC,KAAK,UAAU,EAAG,QAAO;AAE1D,YAAQ,IAAI,MAAM,KAAK,2CAAoC,CAAC;AAE5D,UAAM,aAAY,oBAAI,KAAK,GACxB,YAAY,EACZ,QAAQ,SAAS,GAAG,EACpB,UAAU,GAAG,EAAE;AAClB,UAAM,SACJ,KAAK,OAAO,UACZ,SAAS,KAAK,OAAO,QAAQ,MAAM,IAAI,SAAS,IAAI,KAAK,OAAO,UAAU;AAC5E,UAAM,WAAW,KAAK,SAAS,QAAQ,IAAI,CAAC;AAC5C,UAAM,eAAe,KAAK;AAAA,MACxB,KAAK,QAAQ,QAAQ,IAAI,CAAC;AAAA,MAC1B,GAAG,QAAQ,KAAK,MAAM;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,MAAM,wBAAwB,MAAM,MAAM,YAAY;AAC5D,eAAS,KAAK,EAAE,OAAO,UAAU,CAAC;AAElC,cAAQ,IAAI,MAAM,MAAM,4BAAuB,YAAY,EAAE,CAAC;AAC9D,cAAQ,IAAI,MAAM,KAAK,cAAc,MAAM,EAAE,CAAC;AAE9C,YAAM,aAAa,KAAK,KAAK,cAAc,sBAAsB;AACjE,YAAM,aAAa;AAAA,QACjB,YAAY,KAAK,OAAO;AAAA,QACxB;AAAA,QACA;AAAA,QACA,MAAM,KAAK,OAAO;AAAA,QAClB,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,QAChC,YAAY,QAAQ,IAAI;AAAA,MAC1B;AACA,SAAG,cAAc,YAAY,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAEhE,YAAM,WAAW,CAAC,QAAQ,cAAc,cAAc,gBAAgB;AACtE,iBAAW,QAAQ,UAAU;AAC3B,cAAM,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG,IAAI;AAC7C,YAAI,GAAG,WAAW,OAAO;AACvB,aAAG,aAAa,SAAS,KAAK,KAAK,cAAc,IAAI,CAAC;AAAA,MAC1D;AAEA,aAAO;AAAA,IACT,SAAS,KAAc;AACrB,cAAQ,MAAM,MAAM,IAAI,mCAA8B,GAAG,GAAG;AAC5D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,YACN,SACA,WAAoC,CAAC,GAC/B;AACN,QAAI,CAAC,KAAK,OAAO,eAAgB;AACjC,QAAI;AACF,YAAM,cAAc;AAAA,QAClB;AAAA,QACA,UAAU;AAAA,UACR,GAAG;AAAA,UACH,YAAY,KAAK,OAAO;AAAA,UACxB,UAAU,KAAK,OAAO;AAAA,UACtB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC;AAAA,MACF;AACA,YAAM,MAAM,GAAG,KAAK,eAAe,yBAAyB,KAAK,UAAU,WAAW,CAAC;AACvF,eAAS,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,IACnC,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,cAAoB;AAC1B,QAAI,CAAC,KAAK,OAAO,eAAgB;AACjC,QAAI;AACF,cAAQ,IAAI,MAAM,KAAK,uCAAgC,CAAC;AACxD,YAAM,MAAM,GAAG,KAAK,eAAe;AACnC,YAAM,SAAS,SAAS,KAAK,EAAE,UAAU,OAAO,CAAC;AACjD,YAAM,WAAW,KAAK,MAAM,MAAM;AAClC,UAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG;AAClD,gBAAQ,IAAI,MAAM,KAAK,wBAAwB,CAAC;AAChD,iBAAS;AAAA,UACP,CAAC,QAAgE;AAC/D,oBAAQ;AAAA,cACN,MAAM,KAAK,OAAO,IAAI,OAAO,KAAK,IAAI,UAAU,SAAS,GAAG;AAAA,YAC9D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,sBAA4B;AAClC,QAAI,KAAK,sBAAsB,GAAG;AAChC,cAAQ,IAAI,MAAM,OAAO,4CAAkC,CAAC;AAC5D,cAAQ;AAAA,QACN,MAAM,KAAK,mDAAmD;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,IAAI,MAA+B;AAC9C,UAAM,YAAsB,CAAC;AAC7B,QAAI,IAAI;AACR,WAAO,IAAI,KAAK,QAAQ;AACtB,YAAM,MAAM,KAAK,CAAC;AAClB,cAAQ,KAAK;AAAA,QACX,KAAK;AAAA,QACL,KAAK;AACH,eAAK,OAAO,cAAc;AAC1B;AAAA,QACF,KAAK;AACH,eAAK,OAAO,iBAAiB;AAC7B;AAAA,QACF,KAAK;AACH,eAAK,OAAO,iBAAiB;AAC7B;AAAA,QACF,KAAK;AACH,eAAK,OAAO,iBAAiB;AAC7B;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH;AACA,eAAK,OAAO,SAAS,KAAK,CAAC;AAC3B;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH;AACA,eAAK,OAAO,OAAO,KAAK,CAAC;AACzB;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,cAAI,KAAK,UAAU,GAAG;AACpB,iBAAK,OAAO,cAAc,KAAK,sBAAsB;AAAA,UACvD;AACA;AAAA,QACF;AACE,oBAAU,KAAK,GAAG;AAAA,MACtB;AACA;AAAA,IACF;AAEA,QAAI,KAAK,OAAO,gBAAgB;AAC9B,cAAQ,IAAI,aAAa,IAAI;AAC7B,cAAQ,IAAI,mBAAmB,IAAI;AACnC,cAAQ,IAAI,cAAc,IAAI;AAC9B,cAAQ,IAAI,sBAAsB,IAAI;AACtC,UAAI,KAAK,OAAO,gBAAgB;AAC9B,gBAAQ,IAAI,iBAAiB,IAAI;AACjC,gBAAQ,IAAI,cAAc,IAAI;AAC9B,gBAAQ,IAAI,eAAe,IAAI;AAC/B,gBAAQ,IAAI,cAAc,IAAI;AAAA,MAChC,OAAO;AACL,gBAAQ,IAAI,iBAAiB,IAAI;AACjC,gBAAQ,IAAI,cAAc,IAAI;AAC9B,gBAAQ,IAAI,eAAe,IAAI;AAAA,MACjC;AACA,wBAAkB;AAClB,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,YAAY,KAAK,OAAO;AAAA,UACxB,UAAU,KAAK,OAAO;AAAA,UACtB,MAAM,KAAK,OAAO;AAAA,QACpB;AAAA,QACA,YAAY;AAAA,QAAC;AAAA,MACf;AAAA,IACF;AAEA,YAAQ,IAAI,MAAM,KAAK,8PAA4C,CAAC;AACpE,YAAQ,IAAI,MAAM,KAAK,qDAA2C,CAAC;AACnE,YAAQ,IAAI,MAAM,KAAK,8PAA4C,CAAC;AACpE,YAAQ,IAAI;AAEZ,QAAI,KAAK,UAAU,GAAG;AACpB,YAAM,SAAS,KAAK,iBAAiB;AACrC,cAAQ,IAAI,MAAM,KAAK,6BAAsB,MAAM,EAAE,CAAC;AACtD,UAAI,CAAC,KAAK,OAAO,YAAa,MAAK,oBAAoB;AAAA,IACzD;AAEA,QAAI,KAAK,OAAO,aAAa;AAC3B,YAAM,eAAe,KAAK,cAAc;AACxC,UAAI,cAAc;AAChB,aAAK,OAAO,eAAe;AAC3B,gBAAQ,MAAM,YAAY;AAC1B,aAAK,YAAY,uCAAuC;AAAA,UACtD,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QAAQ,KAAK,OAAO;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,YAAY;AAEjB,YAAQ,IAAI,mBAAmB,IAAI,KAAK,OAAO;AAC/C,QAAI,KAAK,OAAO;AACd,cAAQ,IAAI,qBAAqB,IAAI,KAAK,OAAO;AAEnD,YAAQ,IAAI,MAAM,KAAK,0BAAmB,KAAK,OAAO,UAAU,EAAE,CAAC;AACnE,YAAQ,IAAI,MAAM,KAAK,yBAAkB,QAAQ,IAAI,CAAC,EAAE,CAAC;AAEzD,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,KAAK,mBAAmB,CAAC;AAC3C,YAAQ,IAAI,MAAM,KAAK,SAAI,OAAO,EAAE,CAAC,CAAC;AAEtC,UAAM,YAAY,MAAM;AACtB,UAAI;AACF,iBAAS,eAAe,EAAE,OAAO,SAAS,CAAC;AAC3C,eAAO;AAAA,MACT,QAAQ;AAAA,MAAC;AACT,UAAI;AACF,iBAAS,mBAAmB,EAAE,OAAO,SAAS,CAAC;AAC/C,eAAO;AAAA,MACT,QAAQ;AAAA,MAAC;AACT,aAAO;AAAA,IACT,GAAG;AAEH,QAAI,CAAC,UAAU;AACb,cAAQ;AAAA,QACN,MAAM,IAAI,0DAAqD;AAAA,MACjE;AACA,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,UAAU,WAAW;AAAA,MACvC,OAAO;AAAA,MACP,KAAK,QAAQ;AAAA,IACf,CAAC;AAED,UAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,WAAK,YAAY,uBAAuB;AAAA,QACtC,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ,CAAC;AACD,UAAI,KAAK,OAAO,gBAAgB;AAC9B,cAAM,UAAU,MAAM,oBAAoB;AAC1C,gBAAQ,IAAI;AACZ,gBAAQ,IAAI,MAAM,KAAK,SAAI,OAAO,EAAE,CAAC,CAAC;AACtC,gBAAQ,IAAI,MAAM,KAAK,sBAAsB,CAAC;AAC9C,gBAAQ,IAAI,MAAM,KAAK,OAAO,CAAC;AAAA,MACjC;AACA,UAAI,KAAK,OAAO,cAAc;AAC5B,gBAAQ,IAAI;AACZ,gBAAQ,IAAI,MAAM,KAAK,SAAI,OAAO,EAAE,CAAC,CAAC;AACtC,gBAAQ,IAAI,MAAM,KAAK,4BAA4B,CAAC;AACpD,gBAAQ,IAAI,MAAM,KAAK,KAAK,KAAK,OAAO,YAAY,EAAE,CAAC;AAAA,MACzD;AACA,cAAQ,KAAK,QAAQ,CAAC;AAAA,IACxB,CAAC;AAED,YAAQ,GAAG,UAAU,MAAM;AACzB,WAAK,YAAY,6BAA6B;AAAA,QAC5C,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,KAAK,QAAQ;AAAA,IACrB,CAAC;AAED,YAAQ,GAAG,WAAW,MAAM;AAC1B,WAAK,YAAY,4BAA4B;AAAA,QAC3C,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,KAAK,SAAS;AAAA,IACtB,CAAC;AAAA,EACH;AACF;AAEA,QACG,KAAK,UAAU,EACf,YAAY,gEAAgE,EAC5E,QAAQ,OAAO,EACf,OAAO,kBAAkB,4CAA4C,EACrE,OAAO,cAAc,8CAA8C,EACnE,OAAO,uBAAuB,kCAAkC,EAChE,OAAO,qBAAqB,8BAA8B,EAC1D,OAAO,gBAAgB,yCAAyC,EAChE,OAAO,cAAc,4CAA4C,EACjE,OAAO,mBAAmB,gDAAgD,EAC1E,WAAW,cAAc,cAAc,EACvC,mBAAmB,IAAI,EACvB,OAAO,OAAO,aAAa;AAC1B,QAAM,UAAU,IAAI,QAAQ;AAC5B,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,QAAQ,IAAI,IAAI;AACxB,CAAC;AAEH,IAAI,QAAQ,SAAS,QAAQ;AAC3B,UAAQ,MAAM,QAAQ,IAAI;AAC5B;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/commands/agent.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Agent command - Integrates Spotify's background coding agent strategies\n * with StackMemory's task system\n *\n * Usage: stackmemory agent <action> [options]\n */\n\nimport { Command } from 'commander';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { PebblesTaskStore } from '../../features/tasks/pebbles-task-store.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport {\n AgentTaskManager,\n AgentTaskSession,\n} from '../../agents/core/agent-task-manager.js';\nimport { FormatterVerifier } from '../../agents/verifiers/formatter-verifier.js';\nimport { LLMJudge } from '../../agents/verifiers/llm-judge.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport function createAgentCommand(): Command {\n const agent = new Command('agent')\n .description('AI agent task execution with Spotify-inspired strategies')\n .option('-p, --project <path>', 'Project root directory', process.cwd());\n\n agent\n .command('execute <taskId>')\n .description('Execute a task with agent assistance')\n .option('-f, --frame <frameId>', 'Frame ID to use')\n .option('--max-turns <number>', 'Maximum turns per session', '10')\n .option('--no-verify', 'Skip verification loops')\n .action(async (taskId: string, options) => {\n const spinner = ora('Initializing agent...').start();\n\n try {\n const { taskManager, session } = await initializeAgent(\n options.project,\n taskId,\n options.frame,\n parseInt(options.maxTurns)\n );\n\n spinner.succeed('Agent initialized');\n\n // Display session info\n console.log(chalk.cyan('\\n\uD83D\uDCCB Task Session Started'));\n console.log(chalk.gray(' Session ID:'), session.id);\n console.log(chalk.gray(' Task ID:'), session.taskId);\n console.log(chalk.gray(' Max Turns:'), session.maxTurns);\n console.log(\n chalk.gray(' Verification:'),\n options.verify ? 'Enabled' : 'Disabled'\n );\n\n // Execute task with feedback loop\n await executeTaskWithFeedback(taskManager, session, options.verify);\n } catch (error) {\n spinner.fail('Agent execution failed');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n agent\n .command('status')\n .description('Show active agent sessions')\n .action(async (options) => {\n const spinner = ora('Loading sessions...').start();\n\n try {\n const projectRoot = options.parent?.project || process.cwd();\n const { taskManager } = await initializeAgentManager(projectRoot);\n\n const sessions = taskManager.getActiveSessions();\n spinner.stop();\n\n if (sessions.length === 0) {\n console.log(chalk.yellow('No active agent sessions'));\n return;\n }\n\n console.log(chalk.cyan('\\n\uD83E\uDD16 Active Agent Sessions\\n'));\n\n for (const session of sessions) {\n console.log(chalk.bold(`Session: ${session.sessionId}`));\n console.log(chalk.gray(' Task:'), session.taskId);\n console.log(\n chalk.gray(' Status:'),\n getStatusColor(session.status)(session.status)\n );\n console.log(chalk.gray(' Turn:'), `${session.turnCount}/10`);\n console.log(\n chalk.gray(' Started:'),\n session.startedAt.toLocaleString()\n );\n console.log('');\n }\n } catch (error) {\n spinner.fail('Failed to load sessions');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n agent\n .command('retry <sessionId>')\n .description('Retry a failed session with learned context')\n .action(async (sessionId: string, options) => {\n const spinner = ora('Retrying session...').start();\n\n try {\n const projectRoot = options.parent?.project || process.cwd();\n const { taskManager } = await initializeAgentManager(projectRoot);\n\n const newSession = await taskManager.retrySession(sessionId);\n\n if (!newSession) {\n spinner.fail(\n 'Cannot retry session (max retries reached or session active)'\n );\n return;\n }\n\n spinner.succeed('Session retry started');\n console.log(chalk.cyan('\\n\u267B\uFE0F Retry Session Started'));\n console.log(chalk.gray(' New Session ID:'), newSession.id);\n console.log(chalk.gray(' Task ID:'), newSession.taskId);\n\n // Execute with feedback\n await executeTaskWithFeedback(taskManager, newSession, true);\n } catch (error) {\n spinner.fail('Retry failed');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n agent\n .command('breakdown <taskId>')\n .description('Break down a complex task into subtasks')\n .action(async (taskId: string, options) => {\n const spinner = ora('Analyzing task complexity...').start();\n\n try {\n const projectRoot = options.parent?.project || process.cwd();\n const db = await openDatabase(projectRoot);\n const taskStore = new PebblesTaskStore(projectRoot, db);\n\n const task = taskStore.getTask(taskId);\n if (!task) {\n spinner.fail(`Task ${taskId} not found`);\n return;\n }\n\n spinner.text = 'Breaking down task...';\n\n // Simulate task breakdown (in production, would use LLM)\n const subtasks = generateTaskBreakdown(\n task.title,\n task.description || ''\n );\n\n spinner.succeed('Task breakdown complete');\n\n console.log(chalk.cyan(`\\n\uD83D\uDCCA Task Breakdown: ${task.title}\\n`));\n\n subtasks.forEach((subtask, index) => {\n console.log(chalk.bold(`${index + 1}. ${subtask.title}`));\n console.log(chalk.gray(' Description:'), subtask.description);\n console.log(\n chalk.gray(' Estimated turns:'),\n subtask.estimatedTurns\n );\n console.log(\n chalk.gray(' Verifiers:'),\n subtask.verifiers.join(', ')\n );\n console.log('');\n });\n\n console.log(\n chalk.yellow('Total estimated turns:'),\n subtasks.reduce((sum, st) => sum + st.estimatedTurns, 0)\n );\n } catch (error) {\n spinner.fail('Breakdown failed');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n return agent;\n}\n\n/**\n * Initialize agent and start task session\n */\nasync function initializeAgent(\n projectRoot: string,\n taskId: string,\n frameId?: string,\n maxTurns = 10\n): Promise<{\n taskManager: AgentTaskManager;\n session: AgentTaskSession;\n}> {\n const { taskManager, frameManager, taskStore } =\n await initializeAgentManager(projectRoot);\n\n // Create or get frame\n const finalFrameId =\n frameId ||\n frameManager.createFrame({\n type: 'task',\n name: `Agent task execution for ${taskId}`,\n inputs: { taskId, agentSession: true },\n });\n\n // Start session\n const session = await taskManager.startTaskSession(taskId, finalFrameId);\n\n // Override max turns if specified\n if (maxTurns !== 10) {\n session.maxTurns = maxTurns;\n }\n\n return { taskManager, session };\n}\n\n/**\n * Initialize agent manager components\n */\nasync function initializeAgentManager(projectRoot: string): Promise<{\n taskManager: AgentTaskManager;\n frameManager: FrameManager;\n taskStore: PebblesTaskStore;\n}> {\n const db = await openDatabase(projectRoot);\n const taskStore = new PebblesTaskStore(projectRoot, db);\n const frameManager = new FrameManager(db, projectRoot, undefined);\n const taskManager = new AgentTaskManager(taskStore, frameManager);\n\n return { taskManager, frameManager, taskStore };\n}\n\n/**\n * Execute task with feedback loop (Spotify pattern)\n */\nasync function executeTaskWithFeedback(\n taskManager: AgentTaskManager,\n session: AgentTaskSession,\n enableVerification: boolean\n): Promise<void> {\n console.log(chalk.cyan('\\n\uD83D\uDD04 Starting execution loop...\\n'));\n\n let turnCount = 0;\n let shouldContinue = true;\n let lastFeedback = '';\n\n while (shouldContinue && turnCount < session.maxTurns) {\n turnCount++;\n\n console.log(chalk.bold(`\\n\u2550\u2550\u2550 Turn ${turnCount}/${session.maxTurns} \u2550\u2550\u2550`));\n\n // Simulate agent action (in production, would use actual AI)\n const action = generateMockAction(turnCount, lastFeedback);\n console.log(chalk.gray('Action:'), action.substring(0, 100) + '...');\n\n // Execute turn with verification\n const spinner = ora('Executing...').start();\n\n const result = await taskManager.executeTurn(session.id, action, {\n codeChange: turnCount > 1,\n testsPresent: turnCount > 2,\n enableVerification,\n });\n\n if (result.success) {\n spinner.succeed('Turn completed successfully');\n } else {\n spinner.warn('Turn completed with issues');\n }\n\n // Display feedback\n console.log(chalk.yellow('\\n\uD83D\uDCDD Feedback:'));\n console.log(result.feedback);\n\n // Display verification results if any\n if (result.verificationResults.length > 0) {\n console.log(chalk.cyan('\\n\u2713 Verification Results:'));\n for (const vr of result.verificationResults) {\n const icon = vr.passed ? '\u2713' : '\u2717';\n const color = vr.passed ? chalk.green : chalk.red;\n console.log(color(` ${icon} ${vr.verifierId}: ${vr.message}`));\n }\n }\n\n shouldContinue = result.shouldContinue;\n lastFeedback = result.feedback;\n\n // Short delay for readability\n await delay(1000);\n }\n\n // Final status\n console.log(chalk.cyan('\\n\u2550\u2550\u2550 Session Complete \u2550\u2550\u2550\\n'));\n console.log(chalk.gray('Total turns:'), turnCount);\n console.log(chalk.gray('Final status:'), session.status);\n}\n\n/**\n * Generate mock action for demonstration\n */\nfunction generateMockAction(turn: number, previousFeedback: string): string {\n const actions = [\n 'Analyzing task requirements and constraints',\n 'Setting up project structure and dependencies',\n 'Implementing core functionality',\n 'Adding error handling and validation',\n 'Writing unit tests',\n 'Refactoring for better code organization',\n 'Adding documentation and comments',\n 'Running final verification checks',\n 'Optimizing performance',\n 'Completing final cleanup',\n ];\n\n if (previousFeedback.includes('error')) {\n return `Fixing issues: ${previousFeedback.substring(0, 50)}...`;\n }\n\n return actions[Math.min(turn - 1, actions.length - 1)];\n}\n\n/**\n * Generate task breakdown for complex tasks\n */\nfunction generateTaskBreakdown(\n title: string,\n description: string\n): Array<{\n title: string;\n description: string;\n estimatedTurns: number;\n verifiers: string[];\n}> {\n // Simple heuristic breakdown (in production, would use LLM)\n return [\n {\n title: `Analyze and plan: ${title}`,\n description: 'Understand requirements and create implementation plan',\n estimatedTurns: 2,\n verifiers: ['semantic-validator'],\n },\n {\n title: `Implement core: ${title}`,\n description: 'Build main functionality',\n estimatedTurns: 4,\n verifiers: ['formatter', 'linter', 'semantic-validator'],\n },\n {\n title: `Test and validate: ${title}`,\n description: 'Add tests and validate implementation',\n estimatedTurns: 3,\n verifiers: ['test-runner', 'semantic-validator'],\n },\n {\n title: `Polish and document: ${title}`,\n description: 'Final improvements and documentation',\n estimatedTurns: 1,\n verifiers: ['formatter', 'linter'],\n },\n ];\n}\n\n/**\n * Open or create database\n */\nasync function openDatabase(projectRoot: string): Promise<Database.Database> {\n const dbPath = join(projectRoot, '.stackmemory', 'cache.db');\n\n if (!existsSync(join(projectRoot, '.stackmemory'))) {\n throw new Error(\n 'StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n }\n\n return new Database(dbPath);\n}\n\n/**\n * Get color function for status\n */\nfunction getStatusColor(status: string): (text: string) => string {\n switch (status) {\n case 'active':\n return chalk.green;\n case 'completed':\n return chalk.blue;\n case 'failed':\n return chalk.red;\n case 'timeout':\n return chalk.yellow;\n default:\n return chalk.gray;\n }\n}\n\n/**\n * Delay helper\n */\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],
|
|
5
|
-
"mappings": "AAOA,SAAS,eAAe;AACxB,OAAO,cAAc;AACrB,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAC3B,OAAO,WAAW;AAClB,OAAO,SAAS;AAChB,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,OAEK;AAKA,SAAS,qBAA8B;AAC5C,QAAM,QAAQ,IAAI,QAAQ,OAAO,EAC9B,YAAY,0DAA0D,EACtE,OAAO,wBAAwB,0BAA0B,QAAQ,IAAI,CAAC;AAEzE,QACG,QAAQ,kBAAkB,EAC1B,YAAY,sCAAsC,EAClD,OAAO,yBAAyB,iBAAiB,EACjD,OAAO,wBAAwB,6BAA6B,IAAI,EAChE,OAAO,eAAe,yBAAyB,EAC/C,OAAO,OAAO,QAAgB,YAAY;AACzC,UAAM,UAAU,IAAI,uBAAuB,EAAE,MAAM;AAEnD,QAAI;AACF,YAAM,EAAE,aAAa,QAAQ,IAAI,MAAM;AAAA,QACrC,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR,SAAS,QAAQ,QAAQ;AAAA,MAC3B;AAEA,cAAQ,QAAQ,mBAAmB;AAGnC,cAAQ,IAAI,MAAM,KAAK,kCAA2B,CAAC;AACnD,cAAQ,IAAI,MAAM,KAAK,eAAe,GAAG,QAAQ,EAAE;AACnD,cAAQ,IAAI,MAAM,KAAK,YAAY,GAAG,QAAQ,MAAM;AACpD,cAAQ,IAAI,MAAM,KAAK,cAAc,GAAG,QAAQ,QAAQ;AACxD,cAAQ;AAAA,QACN,MAAM,KAAK,iBAAiB;AAAA,QAC5B,QAAQ,SAAS,YAAY;AAAA,MAC/B;AAGA,YAAM,wBAAwB,aAAa,SAAS,QAAQ,MAAM;AAAA,IACpE,SAAS,
|
|
4
|
+
"sourcesContent": ["/**\n * Agent command - Integrates Spotify's background coding agent strategies\n * with StackMemory's task system\n *\n * Usage: stackmemory agent <action> [options]\n */\n\nimport { Command } from 'commander';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { PebblesTaskStore } from '../../features/tasks/pebbles-task-store.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport {\n AgentTaskManager,\n AgentTaskSession,\n} from '../../agents/core/agent-task-manager.js';\nimport { FormatterVerifier } from '../../agents/verifiers/formatter-verifier.js';\nimport { LLMJudge } from '../../agents/verifiers/llm-judge.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport function createAgentCommand(): Command {\n const agent = new Command('agent')\n .description('AI agent task execution with Spotify-inspired strategies')\n .option('-p, --project <path>', 'Project root directory', process.cwd());\n\n agent\n .command('execute <taskId>')\n .description('Execute a task with agent assistance')\n .option('-f, --frame <frameId>', 'Frame ID to use')\n .option('--max-turns <number>', 'Maximum turns per session', '10')\n .option('--no-verify', 'Skip verification loops')\n .action(async (taskId: string, options) => {\n const spinner = ora('Initializing agent...').start();\n\n try {\n const { taskManager, session } = await initializeAgent(\n options.project,\n taskId,\n options.frame,\n parseInt(options.maxTurns)\n );\n\n spinner.succeed('Agent initialized');\n\n // Display session info\n console.log(chalk.cyan('\\n\uD83D\uDCCB Task Session Started'));\n console.log(chalk.gray(' Session ID:'), session.id);\n console.log(chalk.gray(' Task ID:'), session.taskId);\n console.log(chalk.gray(' Max Turns:'), session.maxTurns);\n console.log(\n chalk.gray(' Verification:'),\n options.verify ? 'Enabled' : 'Disabled'\n );\n\n // Execute task with feedback loop\n await executeTaskWithFeedback(taskManager, session, options.verify);\n } catch (error: unknown) {\n spinner.fail('Agent execution failed');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n agent\n .command('status')\n .description('Show active agent sessions')\n .action(async (options) => {\n const spinner = ora('Loading sessions...').start();\n\n try {\n const projectRoot = options.parent?.project || process.cwd();\n const { taskManager } = await initializeAgentManager(projectRoot);\n\n const sessions = taskManager.getActiveSessions();\n spinner.stop();\n\n if (sessions.length === 0) {\n console.log(chalk.yellow('No active agent sessions'));\n return;\n }\n\n console.log(chalk.cyan('\\n\uD83E\uDD16 Active Agent Sessions\\n'));\n\n for (const session of sessions) {\n console.log(chalk.bold(`Session: ${session.sessionId}`));\n console.log(chalk.gray(' Task:'), session.taskId);\n console.log(\n chalk.gray(' Status:'),\n getStatusColor(session.status)(session.status)\n );\n console.log(chalk.gray(' Turn:'), `${session.turnCount}/10`);\n console.log(\n chalk.gray(' Started:'),\n session.startedAt.toLocaleString()\n );\n console.log('');\n }\n } catch (error: unknown) {\n spinner.fail('Failed to load sessions');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n agent\n .command('retry <sessionId>')\n .description('Retry a failed session with learned context')\n .action(async (sessionId: string, options) => {\n const spinner = ora('Retrying session...').start();\n\n try {\n const projectRoot = options.parent?.project || process.cwd();\n const { taskManager } = await initializeAgentManager(projectRoot);\n\n const newSession = await taskManager.retrySession(sessionId);\n\n if (!newSession) {\n spinner.fail(\n 'Cannot retry session (max retries reached or session active)'\n );\n return;\n }\n\n spinner.succeed('Session retry started');\n console.log(chalk.cyan('\\n\u267B\uFE0F Retry Session Started'));\n console.log(chalk.gray(' New Session ID:'), newSession.id);\n console.log(chalk.gray(' Task ID:'), newSession.taskId);\n\n // Execute with feedback\n await executeTaskWithFeedback(taskManager, newSession, true);\n } catch (error: unknown) {\n spinner.fail('Retry failed');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n agent\n .command('breakdown <taskId>')\n .description('Break down a complex task into subtasks')\n .action(async (taskId: string, options) => {\n const spinner = ora('Analyzing task complexity...').start();\n\n try {\n const projectRoot = options.parent?.project || process.cwd();\n const db = await openDatabase(projectRoot);\n const taskStore = new PebblesTaskStore(projectRoot, db);\n\n const task = taskStore.getTask(taskId);\n if (!task) {\n spinner.fail(`Task ${taskId} not found`);\n return;\n }\n\n spinner.text = 'Breaking down task...';\n\n // Simulate task breakdown (in production, would use LLM)\n const subtasks = generateTaskBreakdown(\n task.title,\n task.description || ''\n );\n\n spinner.succeed('Task breakdown complete');\n\n console.log(chalk.cyan(`\\n\uD83D\uDCCA Task Breakdown: ${task.title}\\n`));\n\n subtasks.forEach((subtask, index) => {\n console.log(chalk.bold(`${index + 1}. ${subtask.title}`));\n console.log(chalk.gray(' Description:'), subtask.description);\n console.log(\n chalk.gray(' Estimated turns:'),\n subtask.estimatedTurns\n );\n console.log(\n chalk.gray(' Verifiers:'),\n subtask.verifiers.join(', ')\n );\n console.log('');\n });\n\n console.log(\n chalk.yellow('Total estimated turns:'),\n subtasks.reduce((sum, st) => sum + st.estimatedTurns, 0)\n );\n } catch (error: unknown) {\n spinner.fail('Breakdown failed');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n return agent;\n}\n\n/**\n * Initialize agent and start task session\n */\nasync function initializeAgent(\n projectRoot: string,\n taskId: string,\n frameId?: string,\n maxTurns = 10\n): Promise<{\n taskManager: AgentTaskManager;\n session: AgentTaskSession;\n}> {\n const { taskManager, frameManager, taskStore } =\n await initializeAgentManager(projectRoot);\n\n // Create or get frame\n const finalFrameId =\n frameId ||\n frameManager.createFrame({\n type: 'task',\n name: `Agent task execution for ${taskId}`,\n inputs: { taskId, agentSession: true },\n });\n\n // Start session\n const session = await taskManager.startTaskSession(taskId, finalFrameId);\n\n // Override max turns if specified\n if (maxTurns !== 10) {\n session.maxTurns = maxTurns;\n }\n\n return { taskManager, session };\n}\n\n/**\n * Initialize agent manager components\n */\nasync function initializeAgentManager(projectRoot: string): Promise<{\n taskManager: AgentTaskManager;\n frameManager: FrameManager;\n taskStore: PebblesTaskStore;\n}> {\n const db = await openDatabase(projectRoot);\n const taskStore = new PebblesTaskStore(projectRoot, db);\n const frameManager = new FrameManager(db, projectRoot, undefined);\n const taskManager = new AgentTaskManager(taskStore, frameManager);\n\n return { taskManager, frameManager, taskStore };\n}\n\n/**\n * Execute task with feedback loop (Spotify pattern)\n */\nasync function executeTaskWithFeedback(\n taskManager: AgentTaskManager,\n session: AgentTaskSession,\n enableVerification: boolean\n): Promise<void> {\n console.log(chalk.cyan('\\n\uD83D\uDD04 Starting execution loop...\\n'));\n\n let turnCount = 0;\n let shouldContinue = true;\n let lastFeedback = '';\n\n while (shouldContinue && turnCount < session.maxTurns) {\n turnCount++;\n\n console.log(chalk.bold(`\\n\u2550\u2550\u2550 Turn ${turnCount}/${session.maxTurns} \u2550\u2550\u2550`));\n\n // Simulate agent action (in production, would use actual AI)\n const action = generateMockAction(turnCount, lastFeedback);\n console.log(chalk.gray('Action:'), action.substring(0, 100) + '...');\n\n // Execute turn with verification\n const spinner = ora('Executing...').start();\n\n const result = await taskManager.executeTurn(session.id, action, {\n codeChange: turnCount > 1,\n testsPresent: turnCount > 2,\n enableVerification,\n });\n\n if (result.success) {\n spinner.succeed('Turn completed successfully');\n } else {\n spinner.warn('Turn completed with issues');\n }\n\n // Display feedback\n console.log(chalk.yellow('\\n\uD83D\uDCDD Feedback:'));\n console.log(result.feedback);\n\n // Display verification results if any\n if (result.verificationResults.length > 0) {\n console.log(chalk.cyan('\\n\u2713 Verification Results:'));\n for (const vr of result.verificationResults) {\n const icon = vr.passed ? '\u2713' : '\u2717';\n const color = vr.passed ? chalk.green : chalk.red;\n console.log(color(` ${icon} ${vr.verifierId}: ${vr.message}`));\n }\n }\n\n shouldContinue = result.shouldContinue;\n lastFeedback = result.feedback;\n\n // Short delay for readability\n await delay(1000);\n }\n\n // Final status\n console.log(chalk.cyan('\\n\u2550\u2550\u2550 Session Complete \u2550\u2550\u2550\\n'));\n console.log(chalk.gray('Total turns:'), turnCount);\n console.log(chalk.gray('Final status:'), session.status);\n}\n\n/**\n * Generate mock action for demonstration\n */\nfunction generateMockAction(turn: number, previousFeedback: string): string {\n const actions = [\n 'Analyzing task requirements and constraints',\n 'Setting up project structure and dependencies',\n 'Implementing core functionality',\n 'Adding error handling and validation',\n 'Writing unit tests',\n 'Refactoring for better code organization',\n 'Adding documentation and comments',\n 'Running final verification checks',\n 'Optimizing performance',\n 'Completing final cleanup',\n ];\n\n if (previousFeedback.includes('error')) {\n return `Fixing issues: ${previousFeedback.substring(0, 50)}...`;\n }\n\n return actions[Math.min(turn - 1, actions.length - 1)];\n}\n\n/**\n * Generate task breakdown for complex tasks\n */\nfunction generateTaskBreakdown(\n title: string,\n description: string\n): Array<{\n title: string;\n description: string;\n estimatedTurns: number;\n verifiers: string[];\n}> {\n // Simple heuristic breakdown (in production, would use LLM)\n return [\n {\n title: `Analyze and plan: ${title}`,\n description: 'Understand requirements and create implementation plan',\n estimatedTurns: 2,\n verifiers: ['semantic-validator'],\n },\n {\n title: `Implement core: ${title}`,\n description: 'Build main functionality',\n estimatedTurns: 4,\n verifiers: ['formatter', 'linter', 'semantic-validator'],\n },\n {\n title: `Test and validate: ${title}`,\n description: 'Add tests and validate implementation',\n estimatedTurns: 3,\n verifiers: ['test-runner', 'semantic-validator'],\n },\n {\n title: `Polish and document: ${title}`,\n description: 'Final improvements and documentation',\n estimatedTurns: 1,\n verifiers: ['formatter', 'linter'],\n },\n ];\n}\n\n/**\n * Open or create database\n */\nasync function openDatabase(projectRoot: string): Promise<Database.Database> {\n const dbPath = join(projectRoot, '.stackmemory', 'cache.db');\n\n if (!existsSync(join(projectRoot, '.stackmemory'))) {\n throw new Error(\n 'StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n }\n\n return new Database(dbPath);\n}\n\n/**\n * Get color function for status\n */\nfunction getStatusColor(status: string): (text: string) => string {\n switch (status) {\n case 'active':\n return chalk.green;\n case 'completed':\n return chalk.blue;\n case 'failed':\n return chalk.red;\n case 'timeout':\n return chalk.yellow;\n default:\n return chalk.gray;\n }\n}\n\n/**\n * Delay helper\n */\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,eAAe;AACxB,OAAO,cAAc;AACrB,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAC3B,OAAO,WAAW;AAClB,OAAO,SAAS;AAChB,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,OAEK;AAKA,SAAS,qBAA8B;AAC5C,QAAM,QAAQ,IAAI,QAAQ,OAAO,EAC9B,YAAY,0DAA0D,EACtE,OAAO,wBAAwB,0BAA0B,QAAQ,IAAI,CAAC;AAEzE,QACG,QAAQ,kBAAkB,EAC1B,YAAY,sCAAsC,EAClD,OAAO,yBAAyB,iBAAiB,EACjD,OAAO,wBAAwB,6BAA6B,IAAI,EAChE,OAAO,eAAe,yBAAyB,EAC/C,OAAO,OAAO,QAAgB,YAAY;AACzC,UAAM,UAAU,IAAI,uBAAuB,EAAE,MAAM;AAEnD,QAAI;AACF,YAAM,EAAE,aAAa,QAAQ,IAAI,MAAM;AAAA,QACrC,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR,SAAS,QAAQ,QAAQ;AAAA,MAC3B;AAEA,cAAQ,QAAQ,mBAAmB;AAGnC,cAAQ,IAAI,MAAM,KAAK,kCAA2B,CAAC;AACnD,cAAQ,IAAI,MAAM,KAAK,eAAe,GAAG,QAAQ,EAAE;AACnD,cAAQ,IAAI,MAAM,KAAK,YAAY,GAAG,QAAQ,MAAM;AACpD,cAAQ,IAAI,MAAM,KAAK,cAAc,GAAG,QAAQ,QAAQ;AACxD,cAAQ;AAAA,QACN,MAAM,KAAK,iBAAiB;AAAA,QAC5B,QAAQ,SAAS,YAAY;AAAA,MAC/B;AAGA,YAAM,wBAAwB,aAAa,SAAS,QAAQ,MAAM;AAAA,IACpE,SAAS,OAAgB;AACvB,cAAQ,KAAK,wBAAwB;AACrC,cAAQ;AAAA,QACN,MAAM,IAAI,QAAQ;AAAA,QAClB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACvD;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,4BAA4B,EACxC,OAAO,OAAO,YAAY;AACzB,UAAM,UAAU,IAAI,qBAAqB,EAAE,MAAM;AAEjD,QAAI;AACF,YAAM,cAAc,QAAQ,QAAQ,WAAW,QAAQ,IAAI;AAC3D,YAAM,EAAE,YAAY,IAAI,MAAM,uBAAuB,WAAW;AAEhE,YAAM,WAAW,YAAY,kBAAkB;AAC/C,cAAQ,KAAK;AAEb,UAAI,SAAS,WAAW,GAAG;AACzB,gBAAQ,IAAI,MAAM,OAAO,0BAA0B,CAAC;AACpD;AAAA,MACF;AAEA,cAAQ,IAAI,MAAM,KAAK,qCAA8B,CAAC;AAEtD,iBAAW,WAAW,UAAU;AAC9B,gBAAQ,IAAI,MAAM,KAAK,YAAY,QAAQ,SAAS,EAAE,CAAC;AACvD,gBAAQ,IAAI,MAAM,KAAK,SAAS,GAAG,QAAQ,MAAM;AACjD,gBAAQ;AAAA,UACN,MAAM,KAAK,WAAW;AAAA,UACtB,eAAe,QAAQ,MAAM,EAAE,QAAQ,MAAM;AAAA,QAC/C;AACA,gBAAQ,IAAI,MAAM,KAAK,SAAS,GAAG,GAAG,QAAQ,SAAS,KAAK;AAC5D,gBAAQ;AAAA,UACN,MAAM,KAAK,YAAY;AAAA,UACvB,QAAQ,UAAU,eAAe;AAAA,QACnC;AACA,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAAA,IACF,SAAS,OAAgB;AACvB,cAAQ,KAAK,yBAAyB;AACtC,cAAQ;AAAA,QACN,MAAM,IAAI,QAAQ;AAAA,QAClB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACvD;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,mBAAmB,EAC3B,YAAY,6CAA6C,EACzD,OAAO,OAAO,WAAmB,YAAY;AAC5C,UAAM,UAAU,IAAI,qBAAqB,EAAE,MAAM;AAEjD,QAAI;AACF,YAAM,cAAc,QAAQ,QAAQ,WAAW,QAAQ,IAAI;AAC3D,YAAM,EAAE,YAAY,IAAI,MAAM,uBAAuB,WAAW;AAEhE,YAAM,aAAa,MAAM,YAAY,aAAa,SAAS;AAE3D,UAAI,CAAC,YAAY;AACf,gBAAQ;AAAA,UACN;AAAA,QACF;AACA;AAAA,MACF;AAEA,cAAQ,QAAQ,uBAAuB;AACvC,cAAQ,IAAI,MAAM,KAAK,sCAA4B,CAAC;AACpD,cAAQ,IAAI,MAAM,KAAK,mBAAmB,GAAG,WAAW,EAAE;AAC1D,cAAQ,IAAI,MAAM,KAAK,YAAY,GAAG,WAAW,MAAM;AAGvD,YAAM,wBAAwB,aAAa,YAAY,IAAI;AAAA,IAC7D,SAAS,OAAgB;AACvB,cAAQ,KAAK,cAAc;AAC3B,cAAQ;AAAA,QACN,MAAM,IAAI,QAAQ;AAAA,QAClB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACvD;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,oBAAoB,EAC5B,YAAY,yCAAyC,EACrD,OAAO,OAAO,QAAgB,YAAY;AACzC,UAAM,UAAU,IAAI,8BAA8B,EAAE,MAAM;AAE1D,QAAI;AACF,YAAM,cAAc,QAAQ,QAAQ,WAAW,QAAQ,IAAI;AAC3D,YAAM,KAAK,MAAM,aAAa,WAAW;AACzC,YAAM,YAAY,IAAI,iBAAiB,aAAa,EAAE;AAEtD,YAAM,OAAO,UAAU,QAAQ,MAAM;AACrC,UAAI,CAAC,MAAM;AACT,gBAAQ,KAAK,QAAQ,MAAM,YAAY;AACvC;AAAA,MACF;AAEA,cAAQ,OAAO;AAGf,YAAM,WAAW;AAAA,QACf,KAAK;AAAA,QACL,KAAK,eAAe;AAAA,MACtB;AAEA,cAAQ,QAAQ,yBAAyB;AAEzC,cAAQ,IAAI,MAAM,KAAK;AAAA,4BAAwB,KAAK,KAAK;AAAA,CAAI,CAAC;AAE9D,eAAS,QAAQ,CAAC,SAAS,UAAU;AACnC,gBAAQ,IAAI,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,QAAQ,KAAK,EAAE,CAAC;AACxD,gBAAQ,IAAI,MAAM,KAAK,iBAAiB,GAAG,QAAQ,WAAW;AAC9D,gBAAQ;AAAA,UACN,MAAM,KAAK,qBAAqB;AAAA,UAChC,QAAQ;AAAA,QACV;AACA,gBAAQ;AAAA,UACN,MAAM,KAAK,eAAe;AAAA,UAC1B,QAAQ,UAAU,KAAK,IAAI;AAAA,QAC7B;AACA,gBAAQ,IAAI,EAAE;AAAA,MAChB,CAAC;AAED,cAAQ;AAAA,QACN,MAAM,OAAO,wBAAwB;AAAA,QACrC,SAAS,OAAO,CAAC,KAAK,OAAO,MAAM,GAAG,gBAAgB,CAAC;AAAA,MACzD;AAAA,IACF,SAAS,OAAgB;AACvB,cAAQ,KAAK,kBAAkB;AAC/B,cAAQ;AAAA,QACN,MAAM,IAAI,QAAQ;AAAA,QAClB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACvD;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAKA,eAAe,gBACb,aACA,QACA,SACA,WAAW,IAIV;AACD,QAAM,EAAE,aAAa,cAAc,UAAU,IAC3C,MAAM,uBAAuB,WAAW;AAG1C,QAAM,eACJ,WACA,aAAa,YAAY;AAAA,IACvB,MAAM;AAAA,IACN,MAAM,4BAA4B,MAAM;AAAA,IACxC,QAAQ,EAAE,QAAQ,cAAc,KAAK;AAAA,EACvC,CAAC;AAGH,QAAM,UAAU,MAAM,YAAY,iBAAiB,QAAQ,YAAY;AAGvE,MAAI,aAAa,IAAI;AACnB,YAAQ,WAAW;AAAA,EACrB;AAEA,SAAO,EAAE,aAAa,QAAQ;AAChC;AAKA,eAAe,uBAAuB,aAInC;AACD,QAAM,KAAK,MAAM,aAAa,WAAW;AACzC,QAAM,YAAY,IAAI,iBAAiB,aAAa,EAAE;AACtD,QAAM,eAAe,IAAI,aAAa,IAAI,aAAa,MAAS;AAChE,QAAM,cAAc,IAAI,iBAAiB,WAAW,YAAY;AAEhE,SAAO,EAAE,aAAa,cAAc,UAAU;AAChD;AAKA,eAAe,wBACb,aACA,SACA,oBACe;AACf,UAAQ,IAAI,MAAM,KAAK,0CAAmC,CAAC;AAE3D,MAAI,YAAY;AAChB,MAAI,iBAAiB;AACrB,MAAI,eAAe;AAEnB,SAAO,kBAAkB,YAAY,QAAQ,UAAU;AACrD;AAEA,YAAQ,IAAI,MAAM,KAAK;AAAA,0BAAc,SAAS,IAAI,QAAQ,QAAQ,qBAAM,CAAC;AAGzE,UAAM,SAAS,mBAAmB,WAAW,YAAY;AACzD,YAAQ,IAAI,MAAM,KAAK,SAAS,GAAG,OAAO,UAAU,GAAG,GAAG,IAAI,KAAK;AAGnE,UAAM,UAAU,IAAI,cAAc,EAAE,MAAM;AAE1C,UAAM,SAAS,MAAM,YAAY,YAAY,QAAQ,IAAI,QAAQ;AAAA,MAC/D,YAAY,YAAY;AAAA,MACxB,cAAc,YAAY;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,QAAI,OAAO,SAAS;AAClB,cAAQ,QAAQ,6BAA6B;AAAA,IAC/C,OAAO;AACL,cAAQ,KAAK,4BAA4B;AAAA,IAC3C;AAGA,YAAQ,IAAI,MAAM,OAAO,uBAAgB,CAAC;AAC1C,YAAQ,IAAI,OAAO,QAAQ;AAG3B,QAAI,OAAO,oBAAoB,SAAS,GAAG;AACzC,cAAQ,IAAI,MAAM,KAAK,gCAA2B,CAAC;AACnD,iBAAW,MAAM,OAAO,qBAAqB;AAC3C,cAAM,OAAO,GAAG,SAAS,WAAM;AAC/B,cAAM,QAAQ,GAAG,SAAS,MAAM,QAAQ,MAAM;AAC9C,gBAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,GAAG,UAAU,KAAK,GAAG,OAAO,EAAE,CAAC;AAAA,MAChE;AAAA,IACF;AAEA,qBAAiB,OAAO;AACxB,mBAAe,OAAO;AAGtB,UAAM,MAAM,GAAI;AAAA,EAClB;AAGA,UAAQ,IAAI,MAAM,KAAK,4DAA8B,CAAC;AACtD,UAAQ,IAAI,MAAM,KAAK,cAAc,GAAG,SAAS;AACjD,UAAQ,IAAI,MAAM,KAAK,eAAe,GAAG,QAAQ,MAAM;AACzD;AAKA,SAAS,mBAAmB,MAAc,kBAAkC;AAC1E,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,iBAAiB,SAAS,OAAO,GAAG;AACtC,WAAO,kBAAkB,iBAAiB,UAAU,GAAG,EAAE,CAAC;AAAA,EAC5D;AAEA,SAAO,QAAQ,KAAK,IAAI,OAAO,GAAG,QAAQ,SAAS,CAAC,CAAC;AACvD;AAKA,SAAS,sBACP,OACA,aAMC;AAED,SAAO;AAAA,IACL;AAAA,MACE,OAAO,qBAAqB,KAAK;AAAA,MACjC,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,WAAW,CAAC,oBAAoB;AAAA,IAClC;AAAA,IACA;AAAA,MACE,OAAO,mBAAmB,KAAK;AAAA,MAC/B,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,WAAW,CAAC,aAAa,UAAU,oBAAoB;AAAA,IACzD;AAAA,IACA;AAAA,MACE,OAAO,sBAAsB,KAAK;AAAA,MAClC,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,WAAW,CAAC,eAAe,oBAAoB;AAAA,IACjD;AAAA,IACA;AAAA,MACE,OAAO,wBAAwB,KAAK;AAAA,MACpC,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,WAAW,CAAC,aAAa,QAAQ;AAAA,IACnC;AAAA,EACF;AACF;AAKA,eAAe,aAAa,aAAiD;AAC3E,QAAM,SAAS,KAAK,aAAa,gBAAgB,UAAU;AAE3D,MAAI,CAAC,WAAW,KAAK,aAAa,cAAc,CAAC,GAAG;AAClD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,SAAS,MAAM;AAC5B;AAKA,SAAS,eAAe,QAA0C;AAChE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf;AACE,aAAO,MAAM;AAAA,EACjB;AACF;AAKA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|