kemdicode-mcp 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of kemdicode-mcp might be problematic. Click here for more details.
- package/LICENSE +674 -0
- package/README.md +486 -0
- package/dist/ai/agents.d.ts +40 -0
- package/dist/ai/agents.d.ts.map +1 -0
- package/dist/ai/agents.js +164 -0
- package/dist/ai/agents.js.map +1 -0
- package/dist/ai/client.d.ts +73 -0
- package/dist/ai/client.d.ts.map +1 -0
- package/dist/ai/client.js +235 -0
- package/dist/ai/client.js.map +1 -0
- package/dist/ai/execute.d.ts +61 -0
- package/dist/ai/execute.d.ts.map +1 -0
- package/dist/ai/execute.js +98 -0
- package/dist/ai/execute.js.map +1 -0
- package/dist/ai/file-context.d.ts +44 -0
- package/dist/ai/file-context.d.ts.map +1 -0
- package/dist/ai/file-context.js +220 -0
- package/dist/ai/file-context.js.map +1 -0
- package/dist/ai/index.d.ts +14 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +21 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/model-spec.d.ts +33 -0
- package/dist/ai/model-spec.d.ts.map +1 -0
- package/dist/ai/model-spec.js +106 -0
- package/dist/ai/model-spec.js.map +1 -0
- package/dist/ai/providers/anthropic.provider.d.ts +23 -0
- package/dist/ai/providers/anthropic.provider.d.ts.map +1 -0
- package/dist/ai/providers/anthropic.provider.js +135 -0
- package/dist/ai/providers/anthropic.provider.js.map +1 -0
- package/dist/ai/providers/gemini.provider.d.ts +20 -0
- package/dist/ai/providers/gemini.provider.d.ts.map +1 -0
- package/dist/ai/providers/gemini.provider.js +113 -0
- package/dist/ai/providers/gemini.provider.js.map +1 -0
- package/dist/ai/providers/index.d.ts +13 -0
- package/dist/ai/providers/index.d.ts.map +1 -0
- package/dist/ai/providers/index.js +12 -0
- package/dist/ai/providers/index.js.map +1 -0
- package/dist/ai/providers/openai-compat.provider.d.ts +13 -0
- package/dist/ai/providers/openai-compat.provider.d.ts.map +1 -0
- package/dist/ai/providers/openai-compat.provider.js +68 -0
- package/dist/ai/providers/openai-compat.provider.js.map +1 -0
- package/dist/ai/providers/openai-shared.d.ts +41 -0
- package/dist/ai/providers/openai-shared.d.ts.map +1 -0
- package/dist/ai/providers/openai-shared.js +67 -0
- package/dist/ai/providers/openai-shared.js.map +1 -0
- package/dist/ai/providers/openai.provider.d.ts +22 -0
- package/dist/ai/providers/openai.provider.d.ts.map +1 -0
- package/dist/ai/providers/openai.provider.js +74 -0
- package/dist/ai/providers/openai.provider.js.map +1 -0
- package/dist/ai/providers/registry.d.ts +33 -0
- package/dist/ai/providers/registry.d.ts.map +1 -0
- package/dist/ai/providers/registry.js +137 -0
- package/dist/ai/providers/registry.js.map +1 -0
- package/dist/ai/providers/types.d.ts +59 -0
- package/dist/ai/providers/types.d.ts.map +1 -0
- package/dist/ai/providers/types.js +58 -0
- package/dist/ai/providers/types.js.map +1 -0
- package/dist/ai/workspace-editor.d.ts +59 -0
- package/dist/ai/workspace-editor.d.ts.map +1 -0
- package/dist/ai/workspace-editor.js +155 -0
- package/dist/ai/workspace-editor.js.map +1 -0
- package/dist/config/defaults.d.ts +31 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +100 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +45 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +44 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +101 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +338 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/schema.d.ts +382 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +150 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/types.d.ts +189 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +32 -0
- package/dist/config/types.js.map +1 -0
- package/dist/constants.d.ts +92 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +100 -0
- package/dist/constants.js.map +1 -0
- package/dist/context/agent-monitor.d.ts +173 -0
- package/dist/context/agent-monitor.d.ts.map +1 -0
- package/dist/context/agent-monitor.js +958 -0
- package/dist/context/agent-monitor.js.map +1 -0
- package/dist/context/feedback-loop.d.ts +73 -0
- package/dist/context/feedback-loop.d.ts.map +1 -0
- package/dist/context/feedback-loop.js +303 -0
- package/dist/context/feedback-loop.js.map +1 -0
- package/dist/context/index.d.ts +29 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +29 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/integration.d.ts +83 -0
- package/dist/context/integration.d.ts.map +1 -0
- package/dist/context/integration.js +276 -0
- package/dist/context/integration.js.map +1 -0
- package/dist/context/iteration-tracker.d.ts +87 -0
- package/dist/context/iteration-tracker.d.ts.map +1 -0
- package/dist/context/iteration-tracker.js +333 -0
- package/dist/context/iteration-tracker.js.map +1 -0
- package/dist/context/storage.d.ts +234 -0
- package/dist/context/storage.d.ts.map +1 -0
- package/dist/context/storage.js +513 -0
- package/dist/context/storage.js.map +1 -0
- package/dist/context/types.d.ts +396 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +125 -0
- package/dist/context/types.js.map +1 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +207 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/redis/connection.d.ts +111 -0
- package/dist/infrastructure/redis/connection.d.ts.map +1 -0
- package/dist/infrastructure/redis/connection.js +242 -0
- package/dist/infrastructure/redis/connection.js.map +1 -0
- package/dist/infrastructure/redis/index.d.ts +2 -0
- package/dist/infrastructure/redis/index.d.ts.map +1 -0
- package/dist/infrastructure/redis/index.js +2 -0
- package/dist/infrastructure/redis/index.js.map +1 -0
- package/dist/infrastructure/redis/redis-backed-service.d.ts +35 -0
- package/dist/infrastructure/redis/redis-backed-service.d.ts.map +1 -0
- package/dist/infrastructure/redis/redis-backed-service.js +55 -0
- package/dist/infrastructure/redis/redis-backed-service.js.map +1 -0
- package/dist/kanban/board-store.d.ts +222 -0
- package/dist/kanban/board-store.d.ts.map +1 -0
- package/dist/kanban/board-store.js +486 -0
- package/dist/kanban/board-store.js.map +1 -0
- package/dist/kanban/index.d.ts +33 -0
- package/dist/kanban/index.d.ts.map +1 -0
- package/dist/kanban/index.js +37 -0
- package/dist/kanban/index.js.map +1 -0
- package/dist/kanban/kanban-store.d.ts +236 -0
- package/dist/kanban/kanban-store.d.ts.map +1 -0
- package/dist/kanban/kanban-store.js +854 -0
- package/dist/kanban/kanban-store.js.map +1 -0
- package/dist/kanban/membership-store.d.ts +230 -0
- package/dist/kanban/membership-store.d.ts.map +1 -0
- package/dist/kanban/membership-store.js +384 -0
- package/dist/kanban/membership-store.js.map +1 -0
- package/dist/kanban/migration.d.ts +131 -0
- package/dist/kanban/migration.d.ts.map +1 -0
- package/dist/kanban/migration.js +275 -0
- package/dist/kanban/migration.js.map +1 -0
- package/dist/kanban/types.d.ts +314 -0
- package/dist/kanban/types.d.ts.map +1 -0
- package/dist/kanban/types.js +126 -0
- package/dist/kanban/types.js.map +1 -0
- package/dist/kanban/workspace-store.d.ts +193 -0
- package/dist/kanban/workspace-store.d.ts.map +1 -0
- package/dist/kanban/workspace-store.js +386 -0
- package/dist/kanban/workspace-store.js.map +1 -0
- package/dist/loci/graph-storage.d.ts +120 -0
- package/dist/loci/graph-storage.d.ts.map +1 -0
- package/dist/loci/graph-storage.js +489 -0
- package/dist/loci/graph-storage.js.map +1 -0
- package/dist/loci/graph-traversal.d.ts +56 -0
- package/dist/loci/graph-traversal.d.ts.map +1 -0
- package/dist/loci/graph-traversal.js +291 -0
- package/dist/loci/graph-traversal.js.map +1 -0
- package/dist/loci/index.d.ts +30 -0
- package/dist/loci/index.d.ts.map +1 -0
- package/dist/loci/index.js +27 -0
- package/dist/loci/index.js.map +1 -0
- package/dist/loci/loci-manager.d.ts +119 -0
- package/dist/loci/loci-manager.d.ts.map +1 -0
- package/dist/loci/loci-manager.js +435 -0
- package/dist/loci/loci-manager.js.map +1 -0
- package/dist/loci/sequence-tracker.d.ts +89 -0
- package/dist/loci/sequence-tracker.d.ts.map +1 -0
- package/dist/loci/sequence-tracker.js +311 -0
- package/dist/loci/sequence-tracker.js.map +1 -0
- package/dist/loci/types.d.ts +306 -0
- package/dist/loci/types.d.ts.map +1 -0
- package/dist/loci/types.js +143 -0
- package/dist/loci/types.js.map +1 -0
- package/dist/mpc/auth.d.ts +67 -0
- package/dist/mpc/auth.d.ts.map +1 -0
- package/dist/mpc/auth.js +173 -0
- package/dist/mpc/auth.js.map +1 -0
- package/dist/mpc/crypto.d.ts +139 -0
- package/dist/mpc/crypto.d.ts.map +1 -0
- package/dist/mpc/crypto.js +287 -0
- package/dist/mpc/crypto.js.map +1 -0
- package/dist/mpc/index.d.ts +30 -0
- package/dist/mpc/index.d.ts.map +1 -0
- package/dist/mpc/index.js +27 -0
- package/dist/mpc/index.js.map +1 -0
- package/dist/mpc/redis-store.d.ts +88 -0
- package/dist/mpc/redis-store.d.ts.map +1 -0
- package/dist/mpc/redis-store.js +337 -0
- package/dist/mpc/redis-store.js.map +1 -0
- package/dist/mpc/share-manager.d.ts +59 -0
- package/dist/mpc/share-manager.d.ts.map +1 -0
- package/dist/mpc/share-manager.js +254 -0
- package/dist/mpc/share-manager.js.map +1 -0
- package/dist/mpc/types.d.ts +213 -0
- package/dist/mpc/types.d.ts.map +1 -0
- package/dist/mpc/types.js +42 -0
- package/dist/mpc/types.js.map +1 -0
- package/dist/recursive/index.d.ts +27 -0
- package/dist/recursive/index.d.ts.map +1 -0
- package/dist/recursive/index.js +27 -0
- package/dist/recursive/index.js.map +1 -0
- package/dist/recursive/tool-invoker.d.ts +51 -0
- package/dist/recursive/tool-invoker.d.ts.map +1 -0
- package/dist/recursive/tool-invoker.js +293 -0
- package/dist/recursive/tool-invoker.js.map +1 -0
- package/dist/recursive/types.d.ts +110 -0
- package/dist/recursive/types.d.ts.map +1 -0
- package/dist/recursive/types.js +52 -0
- package/dist/recursive/types.js.map +1 -0
- package/dist/rl/dopamine.d.ts +96 -0
- package/dist/rl/dopamine.d.ts.map +1 -0
- package/dist/rl/dopamine.js +242 -0
- package/dist/rl/dopamine.js.map +1 -0
- package/dist/rl/index.d.ts +30 -0
- package/dist/rl/index.d.ts.map +1 -0
- package/dist/rl/index.js +27 -0
- package/dist/rl/index.js.map +1 -0
- package/dist/rl/potential.d.ts +78 -0
- package/dist/rl/potential.d.ts.map +1 -0
- package/dist/rl/potential.js +152 -0
- package/dist/rl/potential.js.map +1 -0
- package/dist/rl/rewards.d.ts +92 -0
- package/dist/rl/rewards.d.ts.map +1 -0
- package/dist/rl/rewards.js +278 -0
- package/dist/rl/rewards.js.map +1 -0
- package/dist/rl/state-tracker.d.ts +107 -0
- package/dist/rl/state-tracker.d.ts.map +1 -0
- package/dist/rl/state-tracker.js +285 -0
- package/dist/rl/state-tracker.js.map +1 -0
- package/dist/rl/types.d.ts +274 -0
- package/dist/rl/types.d.ts.map +1 -0
- package/dist/rl/types.js +145 -0
- package/dist/rl/types.js.map +1 -0
- package/dist/runtime/crypto.d.ts +87 -0
- package/dist/runtime/crypto.d.ts.map +1 -0
- package/dist/runtime/crypto.js +226 -0
- package/dist/runtime/crypto.js.map +1 -0
- package/dist/runtime/http.d.ts +111 -0
- package/dist/runtime/http.d.ts.map +1 -0
- package/dist/runtime/http.js +350 -0
- package/dist/runtime/http.js.map +1 -0
- package/dist/runtime/index.d.ts +48 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +43 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/net.d.ts +42 -0
- package/dist/runtime/net.d.ts.map +1 -0
- package/dist/runtime/net.js +108 -0
- package/dist/runtime/net.js.map +1 -0
- package/dist/runtime/process.d.ts +54 -0
- package/dist/runtime/process.d.ts.map +1 -0
- package/dist/runtime/process.js +247 -0
- package/dist/runtime/process.js.map +1 -0
- package/dist/runtime/types.d.ts +143 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +19 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/server/http-server.d.ts +26 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/http-server.js +290 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/index.d.ts +22 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +25 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/progress.d.ts +74 -0
- package/dist/server/progress.d.ts.map +1 -0
- package/dist/server/progress.js +174 -0
- package/dist/server/progress.js.map +1 -0
- package/dist/server/session-server.d.ts +76 -0
- package/dist/server/session-server.d.ts.map +1 -0
- package/dist/server/session-server.js +186 -0
- package/dist/server/session-server.js.map +1 -0
- package/dist/server/types.d.ts +82 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +25 -0
- package/dist/server/types.js.map +1 -0
- package/dist/session/cwd-resolver.d.ts +136 -0
- package/dist/session/cwd-resolver.d.ts.map +1 -0
- package/dist/session/cwd-resolver.js +715 -0
- package/dist/session/cwd-resolver.js.map +1 -0
- package/dist/session/index.d.ts +27 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +27 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +296 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +605 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/types.d.ts +152 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +60 -0
- package/dist/session/types.js.map +1 -0
- package/dist/tools/agents/agent-alert.tool.d.ts +20 -0
- package/dist/tools/agents/agent-alert.tool.d.ts.map +1 -0
- package/dist/tools/agents/agent-alert.tool.js +103 -0
- package/dist/tools/agents/agent-alert.tool.js.map +1 -0
- package/dist/tools/agents/agent-history.tool.d.ts +20 -0
- package/dist/tools/agents/agent-history.tool.d.ts.map +1 -0
- package/dist/tools/agents/agent-history.tool.js +133 -0
- package/dist/tools/agents/agent-history.tool.js.map +1 -0
- package/dist/tools/agents/agent-inject.tool.d.ts +39 -0
- package/dist/tools/agents/agent-inject.tool.d.ts.map +1 -0
- package/dist/tools/agents/agent-inject.tool.js +121 -0
- package/dist/tools/agents/agent-inject.tool.js.map +1 -0
- package/dist/tools/agents/agent-list.tool.d.ts +20 -0
- package/dist/tools/agents/agent-list.tool.d.ts.map +1 -0
- package/dist/tools/agents/agent-list.tool.js +86 -0
- package/dist/tools/agents/agent-list.tool.js.map +1 -0
- package/dist/tools/agents/agent-register.tool.d.ts +20 -0
- package/dist/tools/agents/agent-register.tool.d.ts.map +1 -0
- package/dist/tools/agents/agent-register.tool.js +114 -0
- package/dist/tools/agents/agent-register.tool.js.map +1 -0
- package/dist/tools/agents/agent-summary.tool.d.ts +20 -0
- package/dist/tools/agents/agent-summary.tool.d.ts.map +1 -0
- package/dist/tools/agents/agent-summary.tool.js +99 -0
- package/dist/tools/agents/agent-summary.tool.js.map +1 -0
- package/dist/tools/agents/agent-watch.tool.d.ts +20 -0
- package/dist/tools/agents/agent-watch.tool.d.ts.map +1 -0
- package/dist/tools/agents/agent-watch.tool.js +56 -0
- package/dist/tools/agents/agent-watch.tool.js.map +1 -0
- package/dist/tools/agents/index.d.ts +41 -0
- package/dist/tools/agents/index.d.ts.map +1 -0
- package/dist/tools/agents/index.js +41 -0
- package/dist/tools/agents/index.js.map +1 -0
- package/dist/tools/agents/monitor.tool.d.ts +20 -0
- package/dist/tools/agents/monitor.tool.d.ts.map +1 -0
- package/dist/tools/agents/monitor.tool.js +314 -0
- package/dist/tools/agents/monitor.tool.js.map +1 -0
- package/dist/tools/agents/queue-message.tool.d.ts +20 -0
- package/dist/tools/agents/queue-message.tool.d.ts.map +1 -0
- package/dist/tools/agents/queue-message.tool.js +176 -0
- package/dist/tools/agents/queue-message.tool.js.map +1 -0
- package/dist/tools/ask-ai.tool.d.ts +20 -0
- package/dist/tools/ask-ai.tool.d.ts.map +1 -0
- package/dist/tools/ask-ai.tool.js +49 -0
- package/dist/tools/ask-ai.tool.js.map +1 -0
- package/dist/tools/batch.tool.d.ts +42 -0
- package/dist/tools/batch.tool.d.ts.map +1 -0
- package/dist/tools/batch.tool.js +146 -0
- package/dist/tools/batch.tool.js.map +1 -0
- package/dist/tools/brainstorm.tool.d.ts +20 -0
- package/dist/tools/brainstorm.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm.tool.js +86 -0
- package/dist/tools/brainstorm.tool.js.map +1 -0
- package/dist/tools/code/code-outline.tool.d.ts +20 -0
- package/dist/tools/code/code-outline.tool.d.ts.map +1 -0
- package/dist/tools/code/code-outline.tool.js +803 -0
- package/dist/tools/code/code-outline.tool.js.map +1 -0
- package/dist/tools/code/find-definition.tool.d.ts +20 -0
- package/dist/tools/code/find-definition.tool.d.ts.map +1 -0
- package/dist/tools/code/find-definition.tool.js +218 -0
- package/dist/tools/code/find-definition.tool.js.map +1 -0
- package/dist/tools/code/find-references.tool.d.ts +20 -0
- package/dist/tools/code/find-references.tool.d.ts.map +1 -0
- package/dist/tools/code/find-references.tool.js +207 -0
- package/dist/tools/code/find-references.tool.js.map +1 -0
- package/dist/tools/code/find-symbols.tool.d.ts +20 -0
- package/dist/tools/code/find-symbols.tool.d.ts.map +1 -0
- package/dist/tools/code/find-symbols.tool.js +367 -0
- package/dist/tools/code/find-symbols.tool.js.map +1 -0
- package/dist/tools/code/index.d.ts +34 -0
- package/dist/tools/code/index.d.ts.map +1 -0
- package/dist/tools/code/index.js +35 -0
- package/dist/tools/code/index.js.map +1 -0
- package/dist/tools/code/insert-after-symbol.tool.d.ts +20 -0
- package/dist/tools/code/insert-after-symbol.tool.d.ts.map +1 -0
- package/dist/tools/code/insert-after-symbol.tool.js +224 -0
- package/dist/tools/code/insert-after-symbol.tool.js.map +1 -0
- package/dist/tools/code/insert-before-symbol.tool.d.ts +20 -0
- package/dist/tools/code/insert-before-symbol.tool.d.ts.map +1 -0
- package/dist/tools/code/insert-before-symbol.tool.js +136 -0
- package/dist/tools/code/insert-before-symbol.tool.js.map +1 -0
- package/dist/tools/code/rename-symbol.tool.d.ts +20 -0
- package/dist/tools/code/rename-symbol.tool.d.ts.map +1 -0
- package/dist/tools/code/rename-symbol.tool.js +255 -0
- package/dist/tools/code/rename-symbol.tool.js.map +1 -0
- package/dist/tools/code/semantic-search.tool.d.ts +20 -0
- package/dist/tools/code/semantic-search.tool.d.ts.map +1 -0
- package/dist/tools/code/semantic-search.tool.js +172 -0
- package/dist/tools/code/semantic-search.tool.js.map +1 -0
- package/dist/tools/code/symbol-search.d.ts +39 -0
- package/dist/tools/code/symbol-search.d.ts.map +1 -0
- package/dist/tools/code/symbol-search.js +118 -0
- package/dist/tools/code/symbol-search.js.map +1 -0
- package/dist/tools/context/feedback.tool.d.ts +20 -0
- package/dist/tools/context/feedback.tool.d.ts.map +1 -0
- package/dist/tools/context/feedback.tool.js +176 -0
- package/dist/tools/context/feedback.tool.js.map +1 -0
- package/dist/tools/context/get-shared-context.tool.d.ts +20 -0
- package/dist/tools/context/get-shared-context.tool.d.ts.map +1 -0
- package/dist/tools/context/get-shared-context.tool.js +83 -0
- package/dist/tools/context/get-shared-context.tool.js.map +1 -0
- package/dist/tools/context/index.d.ts +26 -0
- package/dist/tools/context/index.d.ts.map +1 -0
- package/dist/tools/context/index.js +26 -0
- package/dist/tools/context/index.js.map +1 -0
- package/dist/tools/context/shared-thoughts.tool.d.ts +20 -0
- package/dist/tools/context/shared-thoughts.tool.d.ts.map +1 -0
- package/dist/tools/context/shared-thoughts.tool.js +199 -0
- package/dist/tools/context/shared-thoughts.tool.js.map +1 -0
- package/dist/tools/edit/delete-lines.tool.d.ts +20 -0
- package/dist/tools/edit/delete-lines.tool.d.ts.map +1 -0
- package/dist/tools/edit/delete-lines.tool.js +88 -0
- package/dist/tools/edit/delete-lines.tool.js.map +1 -0
- package/dist/tools/edit/edit-shared.d.ts +55 -0
- package/dist/tools/edit/edit-shared.d.ts.map +1 -0
- package/dist/tools/edit/edit-shared.js +122 -0
- package/dist/tools/edit/edit-shared.js.map +1 -0
- package/dist/tools/edit/index.d.ts +29 -0
- package/dist/tools/edit/index.d.ts.map +1 -0
- package/dist/tools/edit/index.js +29 -0
- package/dist/tools/edit/index.js.map +1 -0
- package/dist/tools/edit/insert-at-line.tool.d.ts +20 -0
- package/dist/tools/edit/insert-at-line.tool.d.ts.map +1 -0
- package/dist/tools/edit/insert-at-line.tool.js +92 -0
- package/dist/tools/edit/insert-at-line.tool.js.map +1 -0
- package/dist/tools/edit/replace-content.tool.d.ts +20 -0
- package/dist/tools/edit/replace-content.tool.d.ts.map +1 -0
- package/dist/tools/edit/replace-content.tool.js +214 -0
- package/dist/tools/edit/replace-content.tool.js.map +1 -0
- package/dist/tools/edit/replace-lines.tool.d.ts +20 -0
- package/dist/tools/edit/replace-lines.tool.d.ts.map +1 -0
- package/dist/tools/edit/replace-lines.tool.js +97 -0
- package/dist/tools/edit/replace-lines.tool.js.map +1 -0
- package/dist/tools/file/file-diff.tool.d.ts +20 -0
- package/dist/tools/file/file-diff.tool.d.ts.map +1 -0
- package/dist/tools/file/file-diff.tool.js +359 -0
- package/dist/tools/file/file-diff.tool.js.map +1 -0
- package/dist/tools/file/file-read.tool.d.ts +20 -0
- package/dist/tools/file/file-read.tool.d.ts.map +1 -0
- package/dist/tools/file/file-read.tool.js +270 -0
- package/dist/tools/file/file-read.tool.js.map +1 -0
- package/dist/tools/file/file-search.tool.d.ts +20 -0
- package/dist/tools/file/file-search.tool.d.ts.map +1 -0
- package/dist/tools/file/file-search.tool.js +339 -0
- package/dist/tools/file/file-search.tool.js.map +1 -0
- package/dist/tools/file/file-tree.tool.d.ts +49 -0
- package/dist/tools/file/file-tree.tool.d.ts.map +1 -0
- package/dist/tools/file/file-tree.tool.js +398 -0
- package/dist/tools/file/file-tree.tool.js.map +1 -0
- package/dist/tools/file/file-write.tool.d.ts +20 -0
- package/dist/tools/file/file-write.tool.d.ts.map +1 -0
- package/dist/tools/file/file-write.tool.js +204 -0
- package/dist/tools/file/file-write.tool.js.map +1 -0
- package/dist/tools/file/index.d.ts +31 -0
- package/dist/tools/file/index.d.ts.map +1 -0
- package/dist/tools/file/index.js +31 -0
- package/dist/tools/file/index.js.map +1 -0
- package/dist/tools/git/git-blame.tool.d.ts +20 -0
- package/dist/tools/git/git-blame.tool.d.ts.map +1 -0
- package/dist/tools/git/git-blame.tool.js +138 -0
- package/dist/tools/git/git-blame.tool.js.map +1 -0
- package/dist/tools/git/git-branch.tool.d.ts +20 -0
- package/dist/tools/git/git-branch.tool.d.ts.map +1 -0
- package/dist/tools/git/git-branch.tool.js +158 -0
- package/dist/tools/git/git-branch.tool.js.map +1 -0
- package/dist/tools/git/git-diff.tool.d.ts +20 -0
- package/dist/tools/git/git-diff.tool.d.ts.map +1 -0
- package/dist/tools/git/git-diff.tool.js +117 -0
- package/dist/tools/git/git-diff.tool.js.map +1 -0
- package/dist/tools/git/git-log.tool.d.ts +20 -0
- package/dist/tools/git/git-log.tool.d.ts.map +1 -0
- package/dist/tools/git/git-log.tool.js +150 -0
- package/dist/tools/git/git-log.tool.js.map +1 -0
- package/dist/tools/git/git-status.tool.d.ts +20 -0
- package/dist/tools/git/git-status.tool.d.ts.map +1 -0
- package/dist/tools/git/git-status.tool.js +81 -0
- package/dist/tools/git/git-status.tool.js.map +1 -0
- package/dist/tools/git/index.d.ts +31 -0
- package/dist/tools/git/index.d.ts.map +1 -0
- package/dist/tools/git/index.js +32 -0
- package/dist/tools/git/index.js.map +1 -0
- package/dist/tools/index.d.ts +19 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +170 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/kanban/board-create.tool.d.ts +20 -0
- package/dist/tools/kanban/board-create.tool.d.ts.map +1 -0
- package/dist/tools/kanban/board-create.tool.js +92 -0
- package/dist/tools/kanban/board-create.tool.js.map +1 -0
- package/dist/tools/kanban/board-invite.tool.d.ts +20 -0
- package/dist/tools/kanban/board-invite.tool.d.ts.map +1 -0
- package/dist/tools/kanban/board-invite.tool.js +96 -0
- package/dist/tools/kanban/board-invite.tool.js.map +1 -0
- package/dist/tools/kanban/board-list.tool.d.ts +20 -0
- package/dist/tools/kanban/board-list.tool.d.ts.map +1 -0
- package/dist/tools/kanban/board-list.tool.js +94 -0
- package/dist/tools/kanban/board-list.tool.js.map +1 -0
- package/dist/tools/kanban/board-members.tool.d.ts +20 -0
- package/dist/tools/kanban/board-members.tool.d.ts.map +1 -0
- package/dist/tools/kanban/board-members.tool.js +153 -0
- package/dist/tools/kanban/board-members.tool.js.map +1 -0
- package/dist/tools/kanban/board-share.tool.d.ts +20 -0
- package/dist/tools/kanban/board-share.tool.d.ts.map +1 -0
- package/dist/tools/kanban/board-share.tool.js +91 -0
- package/dist/tools/kanban/board-share.tool.js.map +1 -0
- package/dist/tools/kanban/board-status.tool.d.ts +20 -0
- package/dist/tools/kanban/board-status.tool.d.ts.map +1 -0
- package/dist/tools/kanban/board-status.tool.js +79 -0
- package/dist/tools/kanban/board-status.tool.js.map +1 -0
- package/dist/tools/kanban/index.d.ts +42 -0
- package/dist/tools/kanban/index.d.ts.map +1 -0
- package/dist/tools/kanban/index.js +46 -0
- package/dist/tools/kanban/index.js.map +1 -0
- package/dist/tools/kanban/task-assign.tool.d.ts +20 -0
- package/dist/tools/kanban/task-assign.tool.d.ts.map +1 -0
- package/dist/tools/kanban/task-assign.tool.js +103 -0
- package/dist/tools/kanban/task-assign.tool.js.map +1 -0
- package/dist/tools/kanban/task-claim.tool.d.ts +20 -0
- package/dist/tools/kanban/task-claim.tool.d.ts.map +1 -0
- package/dist/tools/kanban/task-claim.tool.js +107 -0
- package/dist/tools/kanban/task-claim.tool.js.map +1 -0
- package/dist/tools/kanban/task-create.tool.d.ts +20 -0
- package/dist/tools/kanban/task-create.tool.d.ts.map +1 -0
- package/dist/tools/kanban/task-create.tool.js +123 -0
- package/dist/tools/kanban/task-create.tool.js.map +1 -0
- package/dist/tools/kanban/task-list.tool.d.ts +20 -0
- package/dist/tools/kanban/task-list.tool.d.ts.map +1 -0
- package/dist/tools/kanban/task-list.tool.js +95 -0
- package/dist/tools/kanban/task-list.tool.js.map +1 -0
- package/dist/tools/kanban/task-push-multi.tool.d.ts +20 -0
- package/dist/tools/kanban/task-push-multi.tool.d.ts.map +1 -0
- package/dist/tools/kanban/task-push-multi.tool.js +273 -0
- package/dist/tools/kanban/task-push-multi.tool.js.map +1 -0
- package/dist/tools/kanban/task-update.tool.d.ts +20 -0
- package/dist/tools/kanban/task-update.tool.d.ts.map +1 -0
- package/dist/tools/kanban/task-update.tool.js +173 -0
- package/dist/tools/kanban/task-update.tool.js.map +1 -0
- package/dist/tools/kanban/workspace-create.tool.d.ts +20 -0
- package/dist/tools/kanban/workspace-create.tool.d.ts.map +1 -0
- package/dist/tools/kanban/workspace-create.tool.js +84 -0
- package/dist/tools/kanban/workspace-create.tool.js.map +1 -0
- package/dist/tools/kanban/workspace-join.tool.d.ts +20 -0
- package/dist/tools/kanban/workspace-join.tool.d.ts.map +1 -0
- package/dist/tools/kanban/workspace-join.tool.js +76 -0
- package/dist/tools/kanban/workspace-join.tool.js.map +1 -0
- package/dist/tools/kanban/workspace-leave.tool.d.ts +20 -0
- package/dist/tools/kanban/workspace-leave.tool.d.ts.map +1 -0
- package/dist/tools/kanban/workspace-leave.tool.js +74 -0
- package/dist/tools/kanban/workspace-leave.tool.js.map +1 -0
- package/dist/tools/kanban/workspace-list.tool.d.ts +20 -0
- package/dist/tools/kanban/workspace-list.tool.d.ts.map +1 -0
- package/dist/tools/kanban/workspace-list.tool.js +75 -0
- package/dist/tools/kanban/workspace-list.tool.js.map +1 -0
- package/dist/tools/loci/graph-find-path.tool.d.ts +38 -0
- package/dist/tools/loci/graph-find-path.tool.d.ts.map +1 -0
- package/dist/tools/loci/graph-find-path.tool.js +133 -0
- package/dist/tools/loci/graph-find-path.tool.js.map +1 -0
- package/dist/tools/loci/graph-query.tool.d.ts +55 -0
- package/dist/tools/loci/graph-query.tool.d.ts.map +1 -0
- package/dist/tools/loci/graph-query.tool.js +98 -0
- package/dist/tools/loci/graph-query.tool.js.map +1 -0
- package/dist/tools/loci/index.d.ts +27 -0
- package/dist/tools/loci/index.d.ts.map +1 -0
- package/dist/tools/loci/index.js +27 -0
- package/dist/tools/loci/index.js.map +1 -0
- package/dist/tools/loci/loci-recall.tool.d.ts +33 -0
- package/dist/tools/loci/loci-recall.tool.d.ts.map +1 -0
- package/dist/tools/loci/loci-recall.tool.js +156 -0
- package/dist/tools/loci/loci-recall.tool.js.map +1 -0
- package/dist/tools/loci/sequence-recommend.tool.d.ts +33 -0
- package/dist/tools/loci/sequence-recommend.tool.d.ts.map +1 -0
- package/dist/tools/loci/sequence-recommend.tool.js +114 -0
- package/dist/tools/loci/sequence-recommend.tool.js.map +1 -0
- package/dist/tools/memory/delete-memory.tool.d.ts +20 -0
- package/dist/tools/memory/delete-memory.tool.d.ts.map +1 -0
- package/dist/tools/memory/delete-memory.tool.js +96 -0
- package/dist/tools/memory/delete-memory.tool.js.map +1 -0
- package/dist/tools/memory/edit-memory.tool.d.ts +20 -0
- package/dist/tools/memory/edit-memory.tool.d.ts.map +1 -0
- package/dist/tools/memory/edit-memory.tool.js +172 -0
- package/dist/tools/memory/edit-memory.tool.js.map +1 -0
- package/dist/tools/memory/index.d.ts +31 -0
- package/dist/tools/memory/index.d.ts.map +1 -0
- package/dist/tools/memory/index.js +31 -0
- package/dist/tools/memory/index.js.map +1 -0
- package/dist/tools/memory/list-memories.tool.d.ts +20 -0
- package/dist/tools/memory/list-memories.tool.d.ts.map +1 -0
- package/dist/tools/memory/list-memories.tool.js +142 -0
- package/dist/tools/memory/list-memories.tool.js.map +1 -0
- package/dist/tools/memory/read-memory.tool.d.ts +20 -0
- package/dist/tools/memory/read-memory.tool.d.ts.map +1 -0
- package/dist/tools/memory/read-memory.tool.js +98 -0
- package/dist/tools/memory/read-memory.tool.js.map +1 -0
- package/dist/tools/memory/write-memory.tool.d.ts +20 -0
- package/dist/tools/memory/write-memory.tool.d.ts.map +1 -0
- package/dist/tools/memory/write-memory.tool.js +162 -0
- package/dist/tools/memory/write-memory.tool.js.map +1 -0
- package/dist/tools/mpc/index.d.ts +27 -0
- package/dist/tools/mpc/index.d.ts.map +1 -0
- package/dist/tools/mpc/index.js +27 -0
- package/dist/tools/mpc/index.js.map +1 -0
- package/dist/tools/mpc/mpc-distribute.tool.d.ts +36 -0
- package/dist/tools/mpc/mpc-distribute.tool.d.ts.map +1 -0
- package/dist/tools/mpc/mpc-distribute.tool.js +129 -0
- package/dist/tools/mpc/mpc-distribute.tool.js.map +1 -0
- package/dist/tools/mpc/mpc-reconstruct.tool.d.ts +28 -0
- package/dist/tools/mpc/mpc-reconstruct.tool.d.ts.map +1 -0
- package/dist/tools/mpc/mpc-reconstruct.tool.js +125 -0
- package/dist/tools/mpc/mpc-reconstruct.tool.js.map +1 -0
- package/dist/tools/mpc/mpc-split.tool.d.ts +43 -0
- package/dist/tools/mpc/mpc-split.tool.d.ts.map +1 -0
- package/dist/tools/mpc/mpc-split.tool.js +120 -0
- package/dist/tools/mpc/mpc-split.tool.js.map +1 -0
- package/dist/tools/mpc/mpc-status.tool.d.ts +33 -0
- package/dist/tools/mpc/mpc-status.tool.d.ts.map +1 -0
- package/dist/tools/mpc/mpc-status.tool.js +129 -0
- package/dist/tools/mpc/mpc-status.tool.js.map +1 -0
- package/dist/tools/multi-llm/consensus-prompt.tool.d.ts +9 -0
- package/dist/tools/multi-llm/consensus-prompt.tool.d.ts.map +1 -0
- package/dist/tools/multi-llm/consensus-prompt.tool.js +165 -0
- package/dist/tools/multi-llm/consensus-prompt.tool.js.map +1 -0
- package/dist/tools/multi-llm/index.d.ts +8 -0
- package/dist/tools/multi-llm/index.d.ts.map +1 -0
- package/dist/tools/multi-llm/index.js +8 -0
- package/dist/tools/multi-llm/index.js.map +1 -0
- package/dist/tools/multi-llm/multi-prompt.tool.d.ts +9 -0
- package/dist/tools/multi-llm/multi-prompt.tool.d.ts.map +1 -0
- package/dist/tools/multi-llm/multi-prompt.tool.js +90 -0
- package/dist/tools/multi-llm/multi-prompt.tool.js.map +1 -0
- package/dist/tools/project/check-types.tool.d.ts +20 -0
- package/dist/tools/project/check-types.tool.d.ts.map +1 -0
- package/dist/tools/project/check-types.tool.js +254 -0
- package/dist/tools/project/check-types.tool.js.map +1 -0
- package/dist/tools/project/index.d.ts +35 -0
- package/dist/tools/project/index.d.ts.map +1 -0
- package/dist/tools/project/index.js +35 -0
- package/dist/tools/project/index.js.map +1 -0
- package/dist/tools/project/project-info.tool.d.ts +20 -0
- package/dist/tools/project/project-info.tool.d.ts.map +1 -0
- package/dist/tools/project/project-info.tool.js +364 -0
- package/dist/tools/project/project-info.tool.js.map +1 -0
- package/dist/tools/project/run-lint.tool.d.ts +20 -0
- package/dist/tools/project/run-lint.tool.d.ts.map +1 -0
- package/dist/tools/project/run-lint.tool.js +279 -0
- package/dist/tools/project/run-lint.tool.js.map +1 -0
- package/dist/tools/project/run-script.tool.d.ts +20 -0
- package/dist/tools/project/run-script.tool.d.ts.map +1 -0
- package/dist/tools/project/run-script.tool.js +141 -0
- package/dist/tools/project/run-script.tool.js.map +1 -0
- package/dist/tools/project/run-tests.tool.d.ts +20 -0
- package/dist/tools/project/run-tests.tool.d.ts.map +1 -0
- package/dist/tools/project/run-tests.tool.js +357 -0
- package/dist/tools/project/run-tests.tool.js.map +1 -0
- package/dist/tools/recursive/index.d.ts +28 -0
- package/dist/tools/recursive/index.d.ts.map +1 -0
- package/dist/tools/recursive/index.js +28 -0
- package/dist/tools/recursive/index.js.map +1 -0
- package/dist/tools/recursive/invocation-log.tool.d.ts +20 -0
- package/dist/tools/recursive/invocation-log.tool.d.ts.map +1 -0
- package/dist/tools/recursive/invocation-log.tool.js +110 -0
- package/dist/tools/recursive/invocation-log.tool.js.map +1 -0
- package/dist/tools/recursive/invoke-batch.tool.d.ts +20 -0
- package/dist/tools/recursive/invoke-batch.tool.d.ts.map +1 -0
- package/dist/tools/recursive/invoke-batch.tool.js +99 -0
- package/dist/tools/recursive/invoke-batch.tool.js.map +1 -0
- package/dist/tools/recursive/invoke-tool.tool.d.ts +20 -0
- package/dist/tools/recursive/invoke-tool.tool.d.ts.map +1 -0
- package/dist/tools/recursive/invoke-tool.tool.js +100 -0
- package/dist/tools/recursive/invoke-tool.tool.js.map +1 -0
- package/dist/tools/registry.d.ts +261 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +462 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/rl/index.d.ts +25 -0
- package/dist/tools/rl/index.d.ts.map +1 -0
- package/dist/tools/rl/index.js +25 -0
- package/dist/tools/rl/index.js.map +1 -0
- package/dist/tools/rl/rl-dopamine-log.tool.d.ts +32 -0
- package/dist/tools/rl/rl-dopamine-log.tool.d.ts.map +1 -0
- package/dist/tools/rl/rl-dopamine-log.tool.js +112 -0
- package/dist/tools/rl/rl-dopamine-log.tool.js.map +1 -0
- package/dist/tools/rl/rl-reward-stats.tool.d.ts +33 -0
- package/dist/tools/rl/rl-reward-stats.tool.d.ts.map +1 -0
- package/dist/tools/rl/rl-reward-stats.tool.js +100 -0
- package/dist/tools/rl/rl-reward-stats.tool.js.map +1 -0
- package/dist/tools/session/index.d.ts +28 -0
- package/dist/tools/session/index.d.ts.map +1 -0
- package/dist/tools/session/index.js +28 -0
- package/dist/tools/session/index.js.map +1 -0
- package/dist/tools/session/session-create.tool.d.ts +35 -0
- package/dist/tools/session/session-create.tool.d.ts.map +1 -0
- package/dist/tools/session/session-create.tool.js +74 -0
- package/dist/tools/session/session-create.tool.js.map +1 -0
- package/dist/tools/session/session-delete.tool.d.ts +32 -0
- package/dist/tools/session/session-delete.tool.d.ts.map +1 -0
- package/dist/tools/session/session-delete.tool.js +94 -0
- package/dist/tools/session/session-delete.tool.js.map +1 -0
- package/dist/tools/session/session-info.tool.d.ts +30 -0
- package/dist/tools/session/session-info.tool.d.ts.map +1 -0
- package/dist/tools/session/session-info.tool.js +89 -0
- package/dist/tools/session/session-info.tool.js.map +1 -0
- package/dist/tools/session/session-list.tool.d.ts +43 -0
- package/dist/tools/session/session-list.tool.d.ts.map +1 -0
- package/dist/tools/session/session-list.tool.js +85 -0
- package/dist/tools/session/session-list.tool.js.map +1 -0
- package/dist/tools/session/session-switch.tool.d.ts +32 -0
- package/dist/tools/session/session-switch.tool.d.ts.map +1 -0
- package/dist/tools/session/session-switch.tool.js +75 -0
- package/dist/tools/session/session-switch.tool.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +23 -0
- package/dist/tools/simple-tools.d.ts.map +1 -0
- package/dist/tools/simple-tools.js +73 -0
- package/dist/tools/simple-tools.js.map +1 -0
- package/dist/tools/specialized/analyze-deps.tool.d.ts +20 -0
- package/dist/tools/specialized/analyze-deps.tool.d.ts.map +1 -0
- package/dist/tools/specialized/analyze-deps.tool.js +102 -0
- package/dist/tools/specialized/analyze-deps.tool.js.map +1 -0
- package/dist/tools/specialized/auto-fix-agent.tool.d.ts +12 -0
- package/dist/tools/specialized/auto-fix-agent.tool.d.ts.map +1 -0
- package/dist/tools/specialized/auto-fix-agent.tool.js +154 -0
- package/dist/tools/specialized/auto-fix-agent.tool.js.map +1 -0
- package/dist/tools/specialized/auto-fix.tool.d.ts +20 -0
- package/dist/tools/specialized/auto-fix.tool.d.ts.map +1 -0
- package/dist/tools/specialized/auto-fix.tool.js +264 -0
- package/dist/tools/specialized/auto-fix.tool.js.map +1 -0
- package/dist/tools/specialized/code-review.tool.d.ts +20 -0
- package/dist/tools/specialized/code-review.tool.d.ts.map +1 -0
- package/dist/tools/specialized/code-review.tool.js +140 -0
- package/dist/tools/specialized/code-review.tool.js.map +1 -0
- package/dist/tools/specialized/explain-code.tool.d.ts +20 -0
- package/dist/tools/specialized/explain-code.tool.d.ts.map +1 -0
- package/dist/tools/specialized/explain-code.tool.js +90 -0
- package/dist/tools/specialized/explain-code.tool.js.map +1 -0
- package/dist/tools/specialized/fix-bug.tool.d.ts +20 -0
- package/dist/tools/specialized/fix-bug.tool.d.ts.map +1 -0
- package/dist/tools/specialized/fix-bug.tool.js +107 -0
- package/dist/tools/specialized/fix-bug.tool.js.map +1 -0
- package/dist/tools/specialized/index.d.ts +26 -0
- package/dist/tools/specialized/index.d.ts.map +1 -0
- package/dist/tools/specialized/index.js +26 -0
- package/dist/tools/specialized/index.js.map +1 -0
- package/dist/tools/specialized/refactor.tool.d.ts +20 -0
- package/dist/tools/specialized/refactor.tool.d.ts.map +1 -0
- package/dist/tools/specialized/refactor.tool.js +115 -0
- package/dist/tools/specialized/refactor.tool.js.map +1 -0
- package/dist/tools/specialized/write-tests.tool.d.ts +20 -0
- package/dist/tools/specialized/write-tests.tool.d.ts.map +1 -0
- package/dist/tools/specialized/write-tests.tool.js +115 -0
- package/dist/tools/specialized/write-tests.tool.js.map +1 -0
- package/dist/tools/system/ai-config.tool.d.ts +13 -0
- package/dist/tools/system/ai-config.tool.d.ts.map +1 -0
- package/dist/tools/system/ai-config.tool.js +252 -0
- package/dist/tools/system/ai-config.tool.js.map +1 -0
- package/dist/tools/system/ai-models.tool.d.ts +45 -0
- package/dist/tools/system/ai-models.tool.d.ts.map +1 -0
- package/dist/tools/system/ai-models.tool.js +194 -0
- package/dist/tools/system/ai-models.tool.js.map +1 -0
- package/dist/tools/system/config.tool.d.ts +57 -0
- package/dist/tools/system/config.tool.d.ts.map +1 -0
- package/dist/tools/system/config.tool.js +320 -0
- package/dist/tools/system/config.tool.js.map +1 -0
- package/dist/tools/system/env-info.tool.d.ts +20 -0
- package/dist/tools/system/env-info.tool.d.ts.map +1 -0
- package/dist/tools/system/env-info.tool.js +228 -0
- package/dist/tools/system/env-info.tool.js.map +1 -0
- package/dist/tools/system/index.d.ts +37 -0
- package/dist/tools/system/index.d.ts.map +1 -0
- package/dist/tools/system/index.js +37 -0
- package/dist/tools/system/index.js.map +1 -0
- package/dist/tools/system/memory-usage.tool.d.ts +20 -0
- package/dist/tools/system/memory-usage.tool.d.ts.map +1 -0
- package/dist/tools/system/memory-usage.tool.js +223 -0
- package/dist/tools/system/memory-usage.tool.js.map +1 -0
- package/dist/tools/system/process-list.tool.d.ts +20 -0
- package/dist/tools/system/process-list.tool.d.ts.map +1 -0
- package/dist/tools/system/process-list.tool.js +202 -0
- package/dist/tools/system/process-list.tool.js.map +1 -0
- package/dist/tools/system/shell-exec.tool.d.ts +20 -0
- package/dist/tools/system/shell-exec.tool.d.ts.map +1 -0
- package/dist/tools/system/shell-exec.tool.js +293 -0
- package/dist/tools/system/shell-exec.tool.js.map +1 -0
- package/dist/tools/timeout-test.tool.d.ts +20 -0
- package/dist/tools/timeout-test.tool.d.ts.map +1 -0
- package/dist/tools/timeout-test.tool.js +46 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/tree-sitter/index.d.ts +27 -0
- package/dist/tree-sitter/index.d.ts.map +1 -0
- package/dist/tree-sitter/index.js +27 -0
- package/dist/tree-sitter/index.js.map +1 -0
- package/dist/tree-sitter/parser-manager.d.ts +83 -0
- package/dist/tree-sitter/parser-manager.d.ts.map +1 -0
- package/dist/tree-sitter/parser-manager.js +430 -0
- package/dist/tree-sitter/parser-manager.js.map +1 -0
- package/dist/tree-sitter/types.d.ts +117 -0
- package/dist/tree-sitter/types.d.ts.map +1 -0
- package/dist/tree-sitter/types.js +375 -0
- package/dist/tree-sitter/types.js.map +1 -0
- package/dist/types/file-types.d.ts +277 -0
- package/dist/types/file-types.d.ts.map +1 -0
- package/dist/types/file-types.js +75 -0
- package/dist/types/file-types.js.map +1 -0
- package/dist/types/git-types.d.ts +270 -0
- package/dist/types/git-types.d.ts.map +1 -0
- package/dist/types/git-types.js +26 -0
- package/dist/types/git-types.js.map +1 -0
- package/dist/types/index.d.ts +28 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +31 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/tool-types.d.ts +231 -0
- package/dist/types/tool-types.d.ts.map +1 -0
- package/dist/types/tool-types.js +30 -0
- package/dist/types/tool-types.js.map +1 -0
- package/dist/utils/bun-file.d.ts +99 -0
- package/dist/utils/bun-file.d.ts.map +1 -0
- package/dist/utils/bun-file.js +393 -0
- package/dist/utils/bun-file.js.map +1 -0
- package/dist/utils/cache.d.ts +124 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +228 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +54 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +165 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/edit-utils.d.ts +72 -0
- package/dist/utils/edit-utils.d.ts.map +1 -0
- package/dist/utils/edit-utils.js +129 -0
- package/dist/utils/edit-utils.js.map +1 -0
- package/dist/utils/errors.d.ts +170 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +304 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/file-utils.d.ts +195 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +401 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/git-utils.d.ts +204 -0
- package/dist/utils/git-utils.d.ts.map +1 -0
- package/dist/utils/git-utils.js +352 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/languageDetection.d.ts +54 -0
- package/dist/utils/languageDetection.d.ts.map +1 -0
- package/dist/utils/languageDetection.js +340 -0
- package/dist/utils/languageDetection.js.map +1 -0
- package/dist/utils/logger.d.ts +207 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +484 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/process-utils.d.ts +196 -0
- package/dist/utils/process-utils.d.ts.map +1 -0
- package/dist/utils/process-utils.js +302 -0
- package/dist/utils/process-utils.js.map +1 -0
- package/dist/utils/projectContext.enhanced.d.ts +71 -0
- package/dist/utils/projectContext.enhanced.d.ts.map +1 -0
- package/dist/utils/projectContext.enhanced.js +816 -0
- package/dist/utils/projectContext.enhanced.js.map +1 -0
- package/dist/utils/security.d.ts +123 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +337 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/validation.d.ts +163 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +558 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/version.d.ts +17 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +17 -0
- package/dist/version.js.map +1 -0
- package/kemdi-code-mcp-logo.png +0 -0
- package/package.json +136 -0
|
@@ -0,0 +1,854 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KemdiCode MCP Server
|
|
3
|
+
* Copyright (C) 2025-2026 Kemdi Sp. z o.o.
|
|
4
|
+
*
|
|
5
|
+
* This program is free software: you can redistribute it and/or modify
|
|
6
|
+
* it under the terms of the GNU General Public License as published by
|
|
7
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
* (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* This program is distributed in the hope that it will be useful,
|
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
* GNU General Public License for more details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU General Public License
|
|
16
|
+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Kanban Store
|
|
20
|
+
*
|
|
21
|
+
* Redis-based persistence layer for the Kanban system.
|
|
22
|
+
*
|
|
23
|
+
* @module kanban/kanban-store
|
|
24
|
+
*/
|
|
25
|
+
import { Redis } from 'ioredis';
|
|
26
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
27
|
+
import { Logger } from '../utils/logger.js';
|
|
28
|
+
import { getSharedRedis } from '../infrastructure/redis/connection.js';
|
|
29
|
+
import { KANBAN_KEYS, PRIORITY_SCORES, DEFAULT_TASK_TTL, COMPLETED_TASK_TTL, MAX_EVENTS, } from './types.js';
|
|
30
|
+
const getRedis = getSharedRedis;
|
|
31
|
+
function safeParseJsonArray(value) {
|
|
32
|
+
try {
|
|
33
|
+
const parsed = JSON.parse(value || '[]');
|
|
34
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function safeParseInt(value, fallback) {
|
|
41
|
+
const parsed = parseInt(value || '', 10);
|
|
42
|
+
return isNaN(parsed) ? (fallback ?? 0) : parsed;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create a new task on the Kanban board
|
|
46
|
+
*
|
|
47
|
+
* @description Creates a new task with the provided input, stores it in Redis,
|
|
48
|
+
* sets up blocking relationships, and emits a task-created event
|
|
49
|
+
* @param {CreateTaskInput} input - Task creation parameters
|
|
50
|
+
* @param {string} input.sessionId - Session ID for the task
|
|
51
|
+
* @param {string} input.title - Task title (max 200 chars)
|
|
52
|
+
* @param {string} [input.description] - Detailed task description
|
|
53
|
+
* @param {TaskPriority} [input.priority='normal'] - Task priority level
|
|
54
|
+
* @param {string} input.createdBy - Agent ID creating the task
|
|
55
|
+
* @param {string[]} [input.blockedBy] - Task IDs that block this task
|
|
56
|
+
* @param {string[]} [input.relatedFiles] - Related file paths
|
|
57
|
+
* @param {string[]} [input.labels] - Task labels for categorization
|
|
58
|
+
* @param {number} [input.estimatedMinutes] - Estimated completion time
|
|
59
|
+
* @returns {Promise<KanbanTask>} The created task with generated ID and timestamps
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const task = await createTask({
|
|
64
|
+
* sessionId: 'session-123',
|
|
65
|
+
* title: 'Implement authentication',
|
|
66
|
+
* priority: 'high',
|
|
67
|
+
* createdBy: 'agent-1',
|
|
68
|
+
* labels: ['feature', 'auth'],
|
|
69
|
+
* });
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export async function createTask(input) {
|
|
73
|
+
const client = await getRedis();
|
|
74
|
+
const taskId = uuidv4();
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
const task = {
|
|
77
|
+
id: taskId,
|
|
78
|
+
sessionId: input.sessionId,
|
|
79
|
+
title: input.title,
|
|
80
|
+
description: input.description,
|
|
81
|
+
status: 'backlog',
|
|
82
|
+
priority: input.priority || 'normal',
|
|
83
|
+
createdBy: input.createdBy,
|
|
84
|
+
blockedBy: input.blockedBy || [],
|
|
85
|
+
blocks: [],
|
|
86
|
+
relatedFiles: input.relatedFiles || [],
|
|
87
|
+
labels: input.labels || [],
|
|
88
|
+
createdAt: now,
|
|
89
|
+
updatedAt: now,
|
|
90
|
+
estimatedMinutes: input.estimatedMinutes,
|
|
91
|
+
};
|
|
92
|
+
// Calculate score for sorting (priority + time)
|
|
93
|
+
const score = PRIORITY_SCORES[task.priority] * 1000000000 + (1000000000 - now / 1000);
|
|
94
|
+
// Store task data
|
|
95
|
+
await client.hset(KANBAN_KEYS.task(taskId), {
|
|
96
|
+
...task,
|
|
97
|
+
blockedBy: JSON.stringify(task.blockedBy),
|
|
98
|
+
blocks: JSON.stringify(task.blocks),
|
|
99
|
+
relatedFiles: JSON.stringify(task.relatedFiles),
|
|
100
|
+
labels: JSON.stringify(task.labels),
|
|
101
|
+
});
|
|
102
|
+
// Add to session tasks ZSET
|
|
103
|
+
await client.zadd(KANBAN_KEYS.tasks(input.sessionId), score, taskId);
|
|
104
|
+
// Add to status index
|
|
105
|
+
await client.sadd(KANBAN_KEYS.byStatus(input.sessionId, 'backlog'), taskId);
|
|
106
|
+
// Set TTL
|
|
107
|
+
await client.expire(KANBAN_KEYS.task(taskId), DEFAULT_TASK_TTL);
|
|
108
|
+
// Emit event
|
|
109
|
+
await emitEvent({
|
|
110
|
+
type: 'task-created',
|
|
111
|
+
taskId,
|
|
112
|
+
agentId: input.createdBy,
|
|
113
|
+
sessionId: input.sessionId,
|
|
114
|
+
timestamp: now,
|
|
115
|
+
data: { title: task.title, priority: task.priority },
|
|
116
|
+
});
|
|
117
|
+
// Update blockedBy relationships
|
|
118
|
+
for (const blockingId of task.blockedBy) {
|
|
119
|
+
await addBlocksRelation(blockingId, taskId);
|
|
120
|
+
}
|
|
121
|
+
Logger.debug(`kanban: created task ${taskId}: ${task.title}`);
|
|
122
|
+
return task;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Retrieve a task by its unique identifier
|
|
126
|
+
*
|
|
127
|
+
* @description Fetches a task from Redis by ID, deserializing JSON fields
|
|
128
|
+
* (blockedBy, blocks, relatedFiles, labels)
|
|
129
|
+
* @param {string} taskId - Unique task identifier (UUID)
|
|
130
|
+
* @returns {Promise<KanbanTask | null>} The task if found, null otherwise
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```typescript
|
|
134
|
+
* const task = await getTask('550e8400-e29b-41d4-a716-446655440000');
|
|
135
|
+
* if (task) {
|
|
136
|
+
* console.log(`Task: ${task.title}, Status: ${task.status}`);
|
|
137
|
+
* }
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export async function getTask(taskId) {
|
|
141
|
+
const client = await getRedis();
|
|
142
|
+
const data = await client.hgetall(KANBAN_KEYS.task(taskId));
|
|
143
|
+
if (!data || Object.keys(data).length === 0) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
id: data.id,
|
|
148
|
+
sessionId: data.sessionId,
|
|
149
|
+
title: data.title,
|
|
150
|
+
description: data.description || undefined,
|
|
151
|
+
status: data.status,
|
|
152
|
+
priority: data.priority,
|
|
153
|
+
assignee: data.assignee || undefined,
|
|
154
|
+
createdBy: data.createdBy,
|
|
155
|
+
blockedBy: safeParseJsonArray(data.blockedBy),
|
|
156
|
+
blocks: safeParseJsonArray(data.blocks),
|
|
157
|
+
relatedFiles: safeParseJsonArray(data.relatedFiles),
|
|
158
|
+
labels: safeParseJsonArray(data.labels),
|
|
159
|
+
createdAt: safeParseInt(data.createdAt, 0),
|
|
160
|
+
updatedAt: safeParseInt(data.updatedAt, 0),
|
|
161
|
+
startedAt: data.startedAt ? safeParseInt(data.startedAt) : undefined,
|
|
162
|
+
completedAt: data.completedAt ? safeParseInt(data.completedAt) : undefined,
|
|
163
|
+
estimatedMinutes: data.estimatedMinutes ? safeParseInt(data.estimatedMinutes) : undefined,
|
|
164
|
+
actualMinutes: data.actualMinutes ? safeParseInt(data.actualMinutes) : undefined,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Update an existing task with new values
|
|
169
|
+
*
|
|
170
|
+
* @description Updates task fields, handles status transitions (emitting events),
|
|
171
|
+
* manages blocking relationships, and persists changes to Redis
|
|
172
|
+
* @param {string} taskId - Unique task identifier
|
|
173
|
+
* @param {UpdateTaskInput} update - Fields to update
|
|
174
|
+
* @param {string} agentId - Agent ID performing the update
|
|
175
|
+
* @returns {Promise<KanbanTask | null>} Updated task or null if not found
|
|
176
|
+
* @throws {Error} Never throws - returns null on failure
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* const updated = await updateTask('task-123', {
|
|
181
|
+
* status: 'in_progress',
|
|
182
|
+
* priority: 'high',
|
|
183
|
+
* }, 'agent-1');
|
|
184
|
+
* ```
|
|
185
|
+
*/
|
|
186
|
+
export async function updateTask(taskId, update, agentId) {
|
|
187
|
+
const client = await getRedis();
|
|
188
|
+
const task = await getTask(taskId);
|
|
189
|
+
if (!task)
|
|
190
|
+
return null;
|
|
191
|
+
const now = Date.now();
|
|
192
|
+
const oldStatus = task.status;
|
|
193
|
+
// Apply updates
|
|
194
|
+
if (update.title !== undefined)
|
|
195
|
+
task.title = update.title;
|
|
196
|
+
if (update.description !== undefined)
|
|
197
|
+
task.description = update.description;
|
|
198
|
+
if (update.priority !== undefined)
|
|
199
|
+
task.priority = update.priority;
|
|
200
|
+
if (update.assignee !== undefined)
|
|
201
|
+
task.assignee = update.assignee || undefined;
|
|
202
|
+
if (update.relatedFiles !== undefined)
|
|
203
|
+
task.relatedFiles = update.relatedFiles;
|
|
204
|
+
if (update.labels !== undefined)
|
|
205
|
+
task.labels = update.labels;
|
|
206
|
+
if (update.estimatedMinutes !== undefined)
|
|
207
|
+
task.estimatedMinutes = update.estimatedMinutes;
|
|
208
|
+
// Handle status change
|
|
209
|
+
let statusChanged = false;
|
|
210
|
+
if (update.status !== undefined && update.status !== oldStatus) {
|
|
211
|
+
task.status = update.status;
|
|
212
|
+
statusChanged = true;
|
|
213
|
+
// Handle status-specific updates (outside transaction - events should not be rolled back)
|
|
214
|
+
if (update.status === 'in_progress' && !task.startedAt) {
|
|
215
|
+
task.startedAt = now;
|
|
216
|
+
await emitEvent({
|
|
217
|
+
type: 'task-started',
|
|
218
|
+
taskId,
|
|
219
|
+
agentId,
|
|
220
|
+
sessionId: task.sessionId,
|
|
221
|
+
timestamp: now,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
if (update.status === 'done') {
|
|
225
|
+
task.completedAt = now;
|
|
226
|
+
if (task.startedAt) {
|
|
227
|
+
task.actualMinutes = Math.round((now - task.startedAt) / 60000);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Handle blockedBy changes (outside transaction - separate task updates)
|
|
232
|
+
if (update.blockedBy !== undefined) {
|
|
233
|
+
const oldBlockedBy = new Set(task.blockedBy);
|
|
234
|
+
const newBlockedBy = new Set(update.blockedBy);
|
|
235
|
+
// Remove old relations
|
|
236
|
+
for (const old of oldBlockedBy) {
|
|
237
|
+
if (!newBlockedBy.has(old)) {
|
|
238
|
+
await removeBlocksRelation(old, taskId);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Add new relations
|
|
242
|
+
for (const newId of newBlockedBy) {
|
|
243
|
+
if (!oldBlockedBy.has(newId)) {
|
|
244
|
+
await addBlocksRelation(newId, taskId);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
task.blockedBy = update.blockedBy;
|
|
248
|
+
}
|
|
249
|
+
task.updatedAt = now;
|
|
250
|
+
// ATOMIC UPDATE: Use MULTI/EXEC for status indices and task data
|
|
251
|
+
// This ensures consistency between status indices and task data
|
|
252
|
+
const multi = client.multi();
|
|
253
|
+
if (statusChanged) {
|
|
254
|
+
// Update status indices atomically
|
|
255
|
+
multi.srem(KANBAN_KEYS.byStatus(task.sessionId, oldStatus), taskId);
|
|
256
|
+
multi.sadd(KANBAN_KEYS.byStatus(task.sessionId, task.status), taskId);
|
|
257
|
+
}
|
|
258
|
+
// Store updated task
|
|
259
|
+
multi.hset(KANBAN_KEYS.task(taskId), {
|
|
260
|
+
...task,
|
|
261
|
+
blockedBy: JSON.stringify(task.blockedBy),
|
|
262
|
+
blocks: JSON.stringify(task.blocks),
|
|
263
|
+
relatedFiles: JSON.stringify(task.relatedFiles),
|
|
264
|
+
labels: JSON.stringify(task.labels),
|
|
265
|
+
assignee: task.assignee || '',
|
|
266
|
+
description: task.description || '',
|
|
267
|
+
startedAt: task.startedAt?.toString() || '',
|
|
268
|
+
completedAt: task.completedAt?.toString() || '',
|
|
269
|
+
estimatedMinutes: task.estimatedMinutes?.toString() || '',
|
|
270
|
+
actualMinutes: task.actualMinutes?.toString() || '',
|
|
271
|
+
});
|
|
272
|
+
// Set shorter TTL for completed tasks
|
|
273
|
+
if (task.status === 'done') {
|
|
274
|
+
multi.expire(KANBAN_KEYS.task(taskId), COMPLETED_TASK_TTL);
|
|
275
|
+
}
|
|
276
|
+
// Execute all operations atomically
|
|
277
|
+
const results = await multi.exec();
|
|
278
|
+
// Check for errors in transaction
|
|
279
|
+
if (results) {
|
|
280
|
+
const errors = results.filter(([, err]) => err !== null);
|
|
281
|
+
if (errors.length > 0) {
|
|
282
|
+
throw new Error(`Redis transaction failed: ${errors.map(([, err]) => err).join(', ')}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Emit events outside transaction (they shouldn't be rolled back)
|
|
286
|
+
if (statusChanged && task.status === 'done') {
|
|
287
|
+
await emitEvent({
|
|
288
|
+
type: 'task-completed',
|
|
289
|
+
taskId,
|
|
290
|
+
agentId,
|
|
291
|
+
sessionId: task.sessionId,
|
|
292
|
+
timestamp: now,
|
|
293
|
+
data: { actualMinutes: task.actualMinutes },
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
await emitEvent({
|
|
297
|
+
type: 'task-updated',
|
|
298
|
+
taskId,
|
|
299
|
+
agentId,
|
|
300
|
+
sessionId: task.sessionId,
|
|
301
|
+
timestamp: now,
|
|
302
|
+
data: update,
|
|
303
|
+
});
|
|
304
|
+
Logger.debug(`kanban: updated task ${taskId}`);
|
|
305
|
+
return task;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Claim a task for an agent (self-assignment)
|
|
309
|
+
*
|
|
310
|
+
* @description Allows an agent to claim an unassigned, unblocked task.
|
|
311
|
+
* Sets the agent as assignee and transitions status to 'in_progress'.
|
|
312
|
+
* Verifies blocking tasks are completed before allowing claim.
|
|
313
|
+
* Uses atomic Lua script to prevent race conditions.
|
|
314
|
+
* @param {string} taskId - Task ID to claim
|
|
315
|
+
* @param {string} agentId - Agent ID claiming the task
|
|
316
|
+
* @returns {Promise<KanbanTask | null>} Claimed task or null if not found
|
|
317
|
+
* @throws {Error} If task is already assigned to another agent
|
|
318
|
+
* @throws {Error} If task is blocked by incomplete tasks
|
|
319
|
+
*
|
|
320
|
+
* @example
|
|
321
|
+
* ```typescript
|
|
322
|
+
* try {
|
|
323
|
+
* const task = await claimTask('task-123', 'agent-1');
|
|
324
|
+
* console.log(`Claimed: ${task?.title}`);
|
|
325
|
+
* } catch (error) {
|
|
326
|
+
* console.error('Cannot claim:', error.message);
|
|
327
|
+
* }
|
|
328
|
+
* ```
|
|
329
|
+
*/
|
|
330
|
+
export async function claimTask(taskId, agentId) {
|
|
331
|
+
const client = await getRedis();
|
|
332
|
+
// First, get task data and validate blocking conditions (non-atomic check)
|
|
333
|
+
const task = await getTask(taskId);
|
|
334
|
+
if (!task) {
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
// Check if task is already assigned to another agent (early validation)
|
|
338
|
+
if (task.assignee && task.assignee !== agentId) {
|
|
339
|
+
throw new Error(`Task already assigned to ${task.assignee}`);
|
|
340
|
+
}
|
|
341
|
+
// Check blocking tasks (requires reading other tasks - cannot be atomic)
|
|
342
|
+
if (task.blockedBy.length > 0) {
|
|
343
|
+
for (const blockerId of task.blockedBy) {
|
|
344
|
+
const blocker = await getTask(blockerId);
|
|
345
|
+
if (blocker && blocker.status !== 'done') {
|
|
346
|
+
throw new Error(`Task blocked by ${blockerId} (${blocker.title})`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const now = Date.now();
|
|
351
|
+
const startedAt = task.startedAt || now;
|
|
352
|
+
// Atomically claim the task only if assignee hasn't changed
|
|
353
|
+
// Using HSETNX pattern: claim only if assignee field is empty or equals current agent
|
|
354
|
+
const luaScript = `
|
|
355
|
+
local taskKey = KEYS[1]
|
|
356
|
+
local byAgentKey = KEYS[2]
|
|
357
|
+
local oldStatusKey = KEYS[3]
|
|
358
|
+
local newStatusKey = KEYS[4]
|
|
359
|
+
local agentId = ARGV[1]
|
|
360
|
+
local taskId = ARGV[2]
|
|
361
|
+
local now = ARGV[3]
|
|
362
|
+
local startedAt = ARGV[4]
|
|
363
|
+
local sessionId = ARGV[5]
|
|
364
|
+
|
|
365
|
+
-- Check current assignee atomically
|
|
366
|
+
local currentAssignee = redis.call('hget', taskKey, 'assignee')
|
|
367
|
+
|
|
368
|
+
-- If already assigned to someone else, return error code
|
|
369
|
+
if currentAssignee and currentAssignee ~= '' and currentAssignee ~= agentId then
|
|
370
|
+
return {-1, currentAssignee}
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
-- If already assigned to this agent, return success (idempotent)
|
|
374
|
+
if currentAssignee == agentId then
|
|
375
|
+
return {1}
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
-- Atomically update task fields
|
|
379
|
+
redis.call('hset', taskKey, 'assignee', agentId)
|
|
380
|
+
redis.call('hset', taskKey, 'status', 'in_progress')
|
|
381
|
+
redis.call('hset', taskKey, 'updatedAt', now)
|
|
382
|
+
redis.call('hset', taskKey, 'startedAt', startedAt)
|
|
383
|
+
|
|
384
|
+
-- Update agent index
|
|
385
|
+
redis.call('sadd', byAgentKey, taskId)
|
|
386
|
+
|
|
387
|
+
-- Update status indices
|
|
388
|
+
redis.call('srem', oldStatusKey, taskId)
|
|
389
|
+
redis.call('sadd', newStatusKey, taskId)
|
|
390
|
+
|
|
391
|
+
return {0}
|
|
392
|
+
`;
|
|
393
|
+
const taskKey = KANBAN_KEYS.task(taskId);
|
|
394
|
+
const byAgentKey = KANBAN_KEYS.byAgent(agentId);
|
|
395
|
+
const oldStatusKey = KANBAN_KEYS.byStatus(task.sessionId, task.status);
|
|
396
|
+
const newStatusKey = KANBAN_KEYS.byStatus(task.sessionId, 'in_progress');
|
|
397
|
+
const result = (await client.eval(luaScript, 4, // number of keys
|
|
398
|
+
taskKey, byAgentKey, oldStatusKey, newStatusKey, agentId, taskId, now.toString(), startedAt.toString(), task.sessionId));
|
|
399
|
+
const statusCode = result[0];
|
|
400
|
+
// Handle results
|
|
401
|
+
if (statusCode === -1) {
|
|
402
|
+
// Task was assigned to someone else during our check
|
|
403
|
+
const otherAssignee = result[1];
|
|
404
|
+
throw new Error(`Task already assigned to ${otherAssignee}`);
|
|
405
|
+
}
|
|
406
|
+
if (statusCode === 0 || statusCode === 1) {
|
|
407
|
+
// Success (0 = newly claimed, 1 = already claimed by this agent)
|
|
408
|
+
if (statusCode === 0) {
|
|
409
|
+
// Emit event only on actual claim (not idempotent re-claim)
|
|
410
|
+
await emitEvent({
|
|
411
|
+
type: 'task-claimed',
|
|
412
|
+
taskId,
|
|
413
|
+
agentId,
|
|
414
|
+
sessionId: task.sessionId,
|
|
415
|
+
timestamp: now,
|
|
416
|
+
});
|
|
417
|
+
Logger.debug(`kanban: agent ${agentId} claimed task ${taskId}`);
|
|
418
|
+
}
|
|
419
|
+
// Return updated task
|
|
420
|
+
return {
|
|
421
|
+
...task,
|
|
422
|
+
assignee: agentId,
|
|
423
|
+
status: 'in_progress',
|
|
424
|
+
startedAt,
|
|
425
|
+
updatedAt: now,
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
// Unexpected result
|
|
429
|
+
throw new Error('Unexpected result from claim operation');
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Assign a task to a specific agent (supervisor action)
|
|
433
|
+
*
|
|
434
|
+
* @description Supervisors can assign tasks to any agent, overriding current assignment.
|
|
435
|
+
* Updates agent indices and emits task-assigned event.
|
|
436
|
+
* @param {string} taskId - Task ID to assign
|
|
437
|
+
* @param {string} assigneeId - Target agent ID to assign the task to
|
|
438
|
+
* @param {string} supervisorId - Supervisor agent ID making the assignment
|
|
439
|
+
* @returns {Promise<KanbanTask | null>} Assigned task or null if not found
|
|
440
|
+
*
|
|
441
|
+
* @example
|
|
442
|
+
* ```typescript
|
|
443
|
+
* const task = await assignTask('task-123', 'worker-agent', 'supervisor-agent');
|
|
444
|
+
* ```
|
|
445
|
+
*/
|
|
446
|
+
export async function assignTask(taskId, assigneeId, supervisorId) {
|
|
447
|
+
const task = await getTask(taskId);
|
|
448
|
+
if (!task)
|
|
449
|
+
return null;
|
|
450
|
+
const client = await getRedis();
|
|
451
|
+
// Remove from old assignee
|
|
452
|
+
if (task.assignee) {
|
|
453
|
+
await client.srem(KANBAN_KEYS.byAgent(task.assignee), taskId);
|
|
454
|
+
}
|
|
455
|
+
// Add to new assignee
|
|
456
|
+
await client.sadd(KANBAN_KEYS.byAgent(assigneeId), taskId);
|
|
457
|
+
await emitEvent({
|
|
458
|
+
type: 'task-assigned',
|
|
459
|
+
taskId,
|
|
460
|
+
agentId: supervisorId,
|
|
461
|
+
sessionId: task.sessionId,
|
|
462
|
+
timestamp: Date.now(),
|
|
463
|
+
data: { assignee: assigneeId },
|
|
464
|
+
});
|
|
465
|
+
return updateTask(taskId, { assignee: assigneeId }, supervisorId);
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* List tasks from a session with optional filtering
|
|
469
|
+
*
|
|
470
|
+
* @description Retrieves tasks sorted by priority, applying optional filters
|
|
471
|
+
* for status, priority, assignee, blocked state, and labels
|
|
472
|
+
* @param {string} sessionId - Session ID to list tasks from
|
|
473
|
+
* @param {TaskFilter} [filter] - Optional filter criteria
|
|
474
|
+
* @param {TaskStatus|TaskStatus[]} [filter.status] - Filter by status(es)
|
|
475
|
+
* @param {TaskPriority|TaskPriority[]} [filter.priority] - Filter by priority(ies)
|
|
476
|
+
* @param {string} [filter.assignee] - Filter by assigned agent
|
|
477
|
+
* @param {boolean} [filter.unassigned] - Show only unassigned tasks
|
|
478
|
+
* @param {boolean} [filter.blocked] - Filter by blocked state
|
|
479
|
+
* @param {string[]} [filter.labels] - Filter by labels (any match)
|
|
480
|
+
* @param {number} [limit=50] - Maximum number of tasks to return
|
|
481
|
+
* @returns {Promise<KanbanTask[]>} Array of matching tasks sorted by priority
|
|
482
|
+
*
|
|
483
|
+
* @example
|
|
484
|
+
* ```typescript
|
|
485
|
+
* // Get all high-priority unassigned tasks
|
|
486
|
+
* const tasks = await listTasks('session-123', {
|
|
487
|
+
* priority: 'high',
|
|
488
|
+
* unassigned: true,
|
|
489
|
+
* blocked: false,
|
|
490
|
+
* });
|
|
491
|
+
* ```
|
|
492
|
+
*/
|
|
493
|
+
export async function listTasks(sessionId, filter, limit = 50) {
|
|
494
|
+
const client = await getRedis();
|
|
495
|
+
// Get all task IDs for session (sorted by priority)
|
|
496
|
+
const taskIds = await client.zrevrange(KANBAN_KEYS.tasks(sessionId), 0, limit * 2);
|
|
497
|
+
const tasks = [];
|
|
498
|
+
for (const taskId of taskIds) {
|
|
499
|
+
if (tasks.length >= limit)
|
|
500
|
+
break;
|
|
501
|
+
const task = await getTask(taskId);
|
|
502
|
+
if (!task)
|
|
503
|
+
continue;
|
|
504
|
+
// Apply filters
|
|
505
|
+
if (filter) {
|
|
506
|
+
if (filter.status) {
|
|
507
|
+
const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
|
|
508
|
+
if (!statuses.includes(task.status))
|
|
509
|
+
continue;
|
|
510
|
+
}
|
|
511
|
+
if (filter.priority) {
|
|
512
|
+
const priorities = Array.isArray(filter.priority) ? filter.priority : [filter.priority];
|
|
513
|
+
if (!priorities.includes(task.priority))
|
|
514
|
+
continue;
|
|
515
|
+
}
|
|
516
|
+
if (filter.assignee && task.assignee !== filter.assignee)
|
|
517
|
+
continue;
|
|
518
|
+
if (filter.unassigned && task.assignee)
|
|
519
|
+
continue;
|
|
520
|
+
if (filter.blocked !== undefined) {
|
|
521
|
+
const isBlocked = task.blockedBy.length > 0;
|
|
522
|
+
if (filter.blocked !== isBlocked)
|
|
523
|
+
continue;
|
|
524
|
+
}
|
|
525
|
+
if (filter.labels && filter.labels.length > 0) {
|
|
526
|
+
const hasLabel = filter.labels.some((l) => task.labels.includes(l));
|
|
527
|
+
if (!hasLabel)
|
|
528
|
+
continue;
|
|
529
|
+
}
|
|
530
|
+
if (filter.createdBy && task.createdBy !== filter.createdBy)
|
|
531
|
+
continue;
|
|
532
|
+
// Board ID filtering (multi-board support)
|
|
533
|
+
if (filter.boardId && task.boardId !== filter.boardId)
|
|
534
|
+
continue;
|
|
535
|
+
if (filter.boardIds && filter.boardIds.length > 0) {
|
|
536
|
+
if (!task.boardId || !filter.boardIds.includes(task.boardId))
|
|
537
|
+
continue;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
tasks.push(task);
|
|
541
|
+
}
|
|
542
|
+
return tasks;
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Get comprehensive Kanban board summary statistics
|
|
546
|
+
*
|
|
547
|
+
* @description Aggregates task data to provide board overview including
|
|
548
|
+
* counts by status/priority, agent workload, and recent activity
|
|
549
|
+
* @param {string} sessionId - Session ID to get summary for
|
|
550
|
+
* @returns {Promise<BoardSummary>} Board summary with statistics and recent events
|
|
551
|
+
*
|
|
552
|
+
* @example
|
|
553
|
+
* ```typescript
|
|
554
|
+
* const summary = await getBoardSummary('session-123');
|
|
555
|
+
* console.log(`Total: ${summary.totalTasks}, In Progress: ${summary.byStatus.in_progress}`);
|
|
556
|
+
* console.log(`Blocked: ${summary.blockedTasks}, Unassigned: ${summary.unassignedTasks}`);
|
|
557
|
+
* ```
|
|
558
|
+
*/
|
|
559
|
+
export async function getBoardSummary(sessionId) {
|
|
560
|
+
const client = await getRedis();
|
|
561
|
+
const tasks = await listTasks(sessionId, undefined, 1000);
|
|
562
|
+
const byStatus = {
|
|
563
|
+
backlog: 0,
|
|
564
|
+
in_progress: 0,
|
|
565
|
+
review: 0,
|
|
566
|
+
done: 0,
|
|
567
|
+
};
|
|
568
|
+
const byPriority = {
|
|
569
|
+
critical: 0,
|
|
570
|
+
high: 0,
|
|
571
|
+
normal: 0,
|
|
572
|
+
low: 0,
|
|
573
|
+
};
|
|
574
|
+
const agentStats = new Map();
|
|
575
|
+
let blockedTasks = 0;
|
|
576
|
+
let assignedTasks = 0;
|
|
577
|
+
let unassignedTasks = 0;
|
|
578
|
+
for (const task of tasks) {
|
|
579
|
+
byStatus[task.status]++;
|
|
580
|
+
byPriority[task.priority]++;
|
|
581
|
+
if (task.blockedBy.length > 0)
|
|
582
|
+
blockedTasks++;
|
|
583
|
+
if (task.assignee) {
|
|
584
|
+
assignedTasks++;
|
|
585
|
+
const stats = agentStats.get(task.assignee) || { taskCount: 0, inProgress: 0 };
|
|
586
|
+
stats.taskCount++;
|
|
587
|
+
if (task.status === 'in_progress')
|
|
588
|
+
stats.inProgress++;
|
|
589
|
+
agentStats.set(task.assignee, stats);
|
|
590
|
+
}
|
|
591
|
+
else {
|
|
592
|
+
unassignedTasks++;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
// Get recent events
|
|
596
|
+
const eventData = await client.lrange(KANBAN_KEYS.events(sessionId), 0, 9);
|
|
597
|
+
const recentActivity = eventData
|
|
598
|
+
.map((e) => { try {
|
|
599
|
+
return JSON.parse(e);
|
|
600
|
+
}
|
|
601
|
+
catch {
|
|
602
|
+
return null;
|
|
603
|
+
} })
|
|
604
|
+
.filter((e) => e !== null);
|
|
605
|
+
return {
|
|
606
|
+
sessionId,
|
|
607
|
+
totalTasks: tasks.length,
|
|
608
|
+
byStatus,
|
|
609
|
+
byPriority,
|
|
610
|
+
blockedTasks,
|
|
611
|
+
assignedTasks,
|
|
612
|
+
unassignedTasks,
|
|
613
|
+
agents: Array.from(agentStats.entries()).map(([agentId, stats]) => ({
|
|
614
|
+
agentId,
|
|
615
|
+
...stats,
|
|
616
|
+
})),
|
|
617
|
+
recentActivity,
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Permanently delete a task from the Kanban board
|
|
622
|
+
*
|
|
623
|
+
* @description Removes task data, updates all indices, and cleans up
|
|
624
|
+
* blocking relationships with other tasks
|
|
625
|
+
* @param {string} taskId - Task ID to delete
|
|
626
|
+
* @returns {Promise<boolean>} True if task was deleted, false if not found
|
|
627
|
+
*
|
|
628
|
+
* @example
|
|
629
|
+
* ```typescript
|
|
630
|
+
* const deleted = await deleteTask('task-123');
|
|
631
|
+
* if (deleted) {
|
|
632
|
+
* console.log('Task removed');
|
|
633
|
+
* }
|
|
634
|
+
* ```
|
|
635
|
+
*/
|
|
636
|
+
export async function deleteTask(taskId) {
|
|
637
|
+
const client = await getRedis();
|
|
638
|
+
const task = await getTask(taskId);
|
|
639
|
+
if (!task)
|
|
640
|
+
return false;
|
|
641
|
+
// Remove from all indices
|
|
642
|
+
await client.del(KANBAN_KEYS.task(taskId));
|
|
643
|
+
await client.zrem(KANBAN_KEYS.tasks(task.sessionId), taskId);
|
|
644
|
+
await client.srem(KANBAN_KEYS.byStatus(task.sessionId, task.status), taskId);
|
|
645
|
+
if (task.assignee) {
|
|
646
|
+
await client.srem(KANBAN_KEYS.byAgent(task.assignee), taskId);
|
|
647
|
+
}
|
|
648
|
+
// Remove blocking relationships
|
|
649
|
+
for (const blockerId of task.blockedBy) {
|
|
650
|
+
await removeBlocksRelation(blockerId, taskId);
|
|
651
|
+
}
|
|
652
|
+
for (const blockedId of task.blocks) {
|
|
653
|
+
const blockedTask = await getTask(blockedId);
|
|
654
|
+
if (blockedTask) {
|
|
655
|
+
const newBlockedBy = blockedTask.blockedBy.filter((id) => id !== taskId);
|
|
656
|
+
await updateTask(blockedId, { blockedBy: newBlockedBy }, 'system');
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
Logger.debug(`kanban: deleted task ${taskId}`);
|
|
660
|
+
return true;
|
|
661
|
+
}
|
|
662
|
+
/**
|
|
663
|
+
* Add a blocking relationship between two tasks
|
|
664
|
+
*
|
|
665
|
+
* @description Adds blockedId to the blocker task's "blocks" array,
|
|
666
|
+
* establishing a dependency relationship
|
|
667
|
+
* @param {string} blockerId - Task ID that blocks another task
|
|
668
|
+
* @param {string} blockedId - Task ID that is being blocked
|
|
669
|
+
* @internal
|
|
670
|
+
*/
|
|
671
|
+
async function addBlocksRelation(blockerId, blockedId) {
|
|
672
|
+
const client = await getRedis();
|
|
673
|
+
const blocker = await getTask(blockerId);
|
|
674
|
+
if (blocker && !blocker.blocks.includes(blockedId)) {
|
|
675
|
+
blocker.blocks.push(blockedId);
|
|
676
|
+
await client.hset(KANBAN_KEYS.task(blockerId), 'blocks', JSON.stringify(blocker.blocks));
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* Remove a blocking relationship between two tasks
|
|
681
|
+
*
|
|
682
|
+
* @description Removes blockedId from the blocker task's "blocks" array
|
|
683
|
+
* @param {string} blockerId - Task ID that was blocking
|
|
684
|
+
* @param {string} blockedId - Task ID that was blocked
|
|
685
|
+
* @internal
|
|
686
|
+
*/
|
|
687
|
+
async function removeBlocksRelation(blockerId, blockedId) {
|
|
688
|
+
const client = await getRedis();
|
|
689
|
+
const blocker = await getTask(blockerId);
|
|
690
|
+
if (blocker) {
|
|
691
|
+
blocker.blocks = blocker.blocks.filter((id) => id !== blockedId);
|
|
692
|
+
await client.hset(KANBAN_KEYS.task(blockerId), 'blocks', JSON.stringify(blocker.blocks));
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* Emit a task event to Redis
|
|
697
|
+
*
|
|
698
|
+
* @description Stores event in the events list (capped at MAX_EVENTS)
|
|
699
|
+
* and publishes to the Kanban Pub/Sub channel
|
|
700
|
+
* @param {TaskEvent} event - Event to emit
|
|
701
|
+
* @internal
|
|
702
|
+
*/
|
|
703
|
+
async function emitEvent(event) {
|
|
704
|
+
const client = await getRedis();
|
|
705
|
+
// Store in events list
|
|
706
|
+
await client.lpush(KANBAN_KEYS.events(event.sessionId), JSON.stringify(event));
|
|
707
|
+
await client.ltrim(KANBAN_KEYS.events(event.sessionId), 0, MAX_EVENTS - 1);
|
|
708
|
+
// Publish to channel
|
|
709
|
+
await client.publish(KANBAN_KEYS.channel, JSON.stringify(event));
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* Subscribe to real-time Kanban board events
|
|
713
|
+
*
|
|
714
|
+
* @description Creates a Redis Pub/Sub subscription for task events.
|
|
715
|
+
* Returns an unsubscribe function for cleanup.
|
|
716
|
+
* @param {Function} callback - Function called with each TaskEvent
|
|
717
|
+
* @returns {Function} Unsubscribe function to stop receiving events
|
|
718
|
+
*
|
|
719
|
+
* @example
|
|
720
|
+
* ```typescript
|
|
721
|
+
* const unsubscribe = subscribeToEvents((event) => {
|
|
722
|
+
* console.log(`Event: ${event.type} on task ${event.taskId}`);
|
|
723
|
+
* });
|
|
724
|
+
*
|
|
725
|
+
* // Later, to stop listening:
|
|
726
|
+
* unsubscribe();
|
|
727
|
+
* ```
|
|
728
|
+
*/
|
|
729
|
+
export function subscribeToEvents(callback) {
|
|
730
|
+
let subscriber = null;
|
|
731
|
+
let isCleanedUp = false;
|
|
732
|
+
let cleanupTimeout = null;
|
|
733
|
+
const cleanup = async () => {
|
|
734
|
+
if (isCleanedUp || !subscriber)
|
|
735
|
+
return;
|
|
736
|
+
isCleanedUp = true;
|
|
737
|
+
if (cleanupTimeout) {
|
|
738
|
+
clearTimeout(cleanupTimeout);
|
|
739
|
+
cleanupTimeout = null;
|
|
740
|
+
}
|
|
741
|
+
try {
|
|
742
|
+
await subscriber.unsubscribe(KANBAN_KEYS.channel);
|
|
743
|
+
}
|
|
744
|
+
catch (error) {
|
|
745
|
+
Logger.debug(`kanban: unsubscribe error during cleanup: ${error}`);
|
|
746
|
+
}
|
|
747
|
+
try {
|
|
748
|
+
subscriber.disconnect();
|
|
749
|
+
}
|
|
750
|
+
catch (error) {
|
|
751
|
+
Logger.debug(`kanban: disconnect error during cleanup: ${error}`);
|
|
752
|
+
}
|
|
753
|
+
};
|
|
754
|
+
const forceCleanup = () => {
|
|
755
|
+
if (subscriber && !isCleanedUp) {
|
|
756
|
+
Logger.warn('kanban: forcing Redis subscriber cleanup after timeout');
|
|
757
|
+
try {
|
|
758
|
+
subscriber.disconnect();
|
|
759
|
+
}
|
|
760
|
+
catch {
|
|
761
|
+
// Ignore errors during forced cleanup
|
|
762
|
+
}
|
|
763
|
+
isCleanedUp = true;
|
|
764
|
+
}
|
|
765
|
+
};
|
|
766
|
+
try {
|
|
767
|
+
subscriber = new Redis({
|
|
768
|
+
host: process.env.REDIS_HOST || '127.0.0.1',
|
|
769
|
+
port: parseInt(process.env.REDIS_PORT || '6379'),
|
|
770
|
+
password: process.env.REDIS_PASSWORD || undefined,
|
|
771
|
+
db: 2,
|
|
772
|
+
});
|
|
773
|
+
// Set up error handler before any async operations
|
|
774
|
+
subscriber.on('error', (error) => {
|
|
775
|
+
Logger.error(`kanban: Redis subscriber error: ${error}`);
|
|
776
|
+
void cleanup();
|
|
777
|
+
});
|
|
778
|
+
// Subscribe with error handling
|
|
779
|
+
subscriber.subscribe(KANBAN_KEYS.channel, (error) => {
|
|
780
|
+
if (error) {
|
|
781
|
+
Logger.error(`kanban: failed to subscribe to channel: ${error}`);
|
|
782
|
+
void cleanup();
|
|
783
|
+
return;
|
|
784
|
+
}
|
|
785
|
+
});
|
|
786
|
+
subscriber.on('message', (_channel, message) => {
|
|
787
|
+
try {
|
|
788
|
+
const event = JSON.parse(message);
|
|
789
|
+
callback(event);
|
|
790
|
+
}
|
|
791
|
+
catch (error) {
|
|
792
|
+
Logger.error(`kanban: failed to parse event: ${error}`);
|
|
793
|
+
}
|
|
794
|
+
});
|
|
795
|
+
// Set up forced cleanup timeout (30 seconds)
|
|
796
|
+
cleanupTimeout = setTimeout(forceCleanup, 30000);
|
|
797
|
+
return () => {
|
|
798
|
+
void cleanup();
|
|
799
|
+
};
|
|
800
|
+
}
|
|
801
|
+
catch (error) {
|
|
802
|
+
Logger.error(`kanban: failed to create Redis subscriber: ${error}`);
|
|
803
|
+
void cleanup();
|
|
804
|
+
// Return no-op unsubscribe function
|
|
805
|
+
return () => {
|
|
806
|
+
// No-op - already cleaned up or failed to initialize
|
|
807
|
+
};
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
/**
|
|
811
|
+
* Get all tasks assigned to a specific agent
|
|
812
|
+
*
|
|
813
|
+
* @description Retrieves all tasks currently assigned to the given agent
|
|
814
|
+
* across all sessions
|
|
815
|
+
* @param {string} agentId - Agent ID to get tasks for
|
|
816
|
+
* @returns {Promise<KanbanTask[]>} Array of tasks assigned to the agent
|
|
817
|
+
*
|
|
818
|
+
* @example
|
|
819
|
+
* ```typescript
|
|
820
|
+
* const myTasks = await getAgentTasks('agent-1');
|
|
821
|
+
* const inProgress = myTasks.filter(t => t.status === 'in_progress');
|
|
822
|
+
* ```
|
|
823
|
+
*/
|
|
824
|
+
export async function getAgentTasks(agentId) {
|
|
825
|
+
const client = await getRedis();
|
|
826
|
+
const taskIds = await client.smembers(KANBAN_KEYS.byAgent(agentId));
|
|
827
|
+
const tasks = [];
|
|
828
|
+
for (const taskId of taskIds) {
|
|
829
|
+
const task = await getTask(taskId);
|
|
830
|
+
if (task)
|
|
831
|
+
tasks.push(task);
|
|
832
|
+
}
|
|
833
|
+
return tasks;
|
|
834
|
+
}
|
|
835
|
+
/**
|
|
836
|
+
* Get tasks available for claiming (unassigned, unblocked, in backlog)
|
|
837
|
+
*
|
|
838
|
+
* @description Convenience method to find tasks that agents can immediately
|
|
839
|
+
* claim and start working on
|
|
840
|
+
* @param {string} sessionId - Session ID to search in
|
|
841
|
+
* @returns {Promise<KanbanTask[]>} Array of available tasks sorted by priority
|
|
842
|
+
*
|
|
843
|
+
* @example
|
|
844
|
+
* ```typescript
|
|
845
|
+
* const available = await getAvailableTasks('session-123');
|
|
846
|
+
* if (available.length > 0) {
|
|
847
|
+
* await claimTask(available[0].id, 'agent-1');
|
|
848
|
+
* }
|
|
849
|
+
* ```
|
|
850
|
+
*/
|
|
851
|
+
export async function getAvailableTasks(sessionId) {
|
|
852
|
+
return listTasks(sessionId, { unassigned: true, blocked: false, status: 'backlog' });
|
|
853
|
+
}
|
|
854
|
+
//# sourceMappingURL=kanban-store.js.map
|