tarsk 0.3.43 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/agent/agent.error-utils.d.ts +14 -0
- package/dist/agent/agent.error-utils.js +52 -0
- package/dist/agent/agent.event-transformer.d.ts +55 -0
- package/dist/agent/agent.event-transformer.js +175 -0
- package/dist/agent/agent.executor.d.ts +26 -0
- package/dist/agent/agent.executor.js +286 -0
- package/dist/agent/agent.model-resolver.d.ts +22 -0
- package/dist/agent/agent.model-resolver.js +67 -0
- package/dist/agent/agent.process-manager.d.ts +57 -0
- package/dist/agent/agent.process-manager.js +262 -0
- package/dist/agent/agent.processing-state-manager.d.ts +74 -0
- package/dist/agent/agent.processing-state-manager.js +87 -0
- package/dist/agent/agent.prompt-loader.d.ts +16 -0
- package/dist/agent/agent.prompt-loader.js +227 -0
- package/dist/agent/agent.subagent-executor.d.ts +35 -0
- package/dist/agent/agent.subagent-executor.js +135 -0
- package/dist/bun/index.d.ts +2 -0
- package/dist/bun/index.js +165 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +22 -0
- package/dist/core/crypto.d.ts +29 -0
- package/dist/core/crypto.js +166 -0
- package/dist/core/dev-server-cache.d.ts +46 -0
- package/dist/core/dev-server-cache.js +59 -0
- package/dist/core/env-manager.d.ts +3 -0
- package/dist/core/env-manager.js +60 -0
- package/dist/core/error-responses.d.ts +61 -0
- package/dist/core/error-responses.js +64 -0
- package/dist/core/logger.d.ts +10 -0
- package/dist/core/logger.js +47 -0
- package/dist/core/paths.d.ts +22 -0
- package/dist/core/paths.js +26 -0
- package/dist/core/random-words.d.ts +18 -0
- package/dist/core/random-words.js +135 -0
- package/dist/core/response-builder.d.ts +50 -0
- package/dist/core/response-builder.js +56 -0
- package/dist/core/route-helpers.d.ts +47 -0
- package/dist/core/route-helpers.js +54 -0
- package/dist/core/run-command-detector.d.ts +26 -0
- package/dist/core/run-command-detector.js +98 -0
- package/dist/core/stream-helper.d.ts +44 -0
- package/dist/core/stream-helper.js +50 -0
- package/dist/core/utils.d.ts +43 -0
- package/dist/core/utils.js +113 -0
- package/dist/core/validation.d.ts +10 -0
- package/dist/core/validation.js +20 -0
- package/dist/database/database.d.ts +40 -0
- package/dist/database/database.encryption.d.ts +33 -0
- package/dist/database/database.encryption.js +62 -0
- package/dist/database/database.js +480 -0
- package/dist/database/database.state.d.ts +52 -0
- package/dist/database/database.state.js +119 -0
- package/dist/database/database.test-utils.d.ts +22 -0
- package/dist/database/database.test-utils.js +39 -0
- package/dist/database/database.types.d.ts +3 -0
- package/dist/database/database.types.js +2 -0
- package/dist/features/agents/agents.manager.d.ts +24 -0
- package/dist/features/agents/agents.manager.js +200 -0
- package/dist/features/ask-user/ask-user.routes.d.ts +9 -0
- package/dist/features/ask-user/ask-user.routes.js +35 -0
- package/dist/features/chat/chat-delete.route.d.ts +15 -0
- package/dist/features/chat/chat-delete.route.js +36 -0
- package/dist/features/chat/chat-post.route.d.ts +11 -0
- package/dist/features/chat/chat-post.route.js +270 -0
- package/dist/features/chat/chat-stop.route.d.ts +21 -0
- package/dist/features/chat/chat-stop.route.js +22 -0
- package/dist/features/chat/chat-subscribe.route.d.ts +9 -0
- package/dist/features/chat/chat-subscribe.route.js +71 -0
- package/dist/features/chat/chat.routes.d.ts +22 -0
- package/dist/features/chat/chat.routes.js +29 -0
- package/dist/features/conversations/conversations-delete.route.d.ts +16 -0
- package/dist/features/conversations/conversations-delete.route.js +34 -0
- package/dist/features/conversations/conversations-get-all.route.d.ts +16 -0
- package/dist/features/conversations/conversations-get-all.route.js +39 -0
- package/dist/features/conversations/conversations-get-by-id.route.d.ts +16 -0
- package/dist/features/conversations/conversations-get-by-id.route.js +38 -0
- package/dist/features/conversations/conversations-get-deleted.route.d.ts +15 -0
- package/dist/features/conversations/conversations-get-deleted.route.js +34 -0
- package/dist/features/conversations/conversations-get-messages.route.d.ts +16 -0
- package/dist/features/conversations/conversations-get-messages.route.js +49 -0
- package/dist/features/conversations/conversations.content.d.ts +28 -0
- package/dist/features/conversations/conversations.content.js +142 -0
- package/dist/features/conversations/conversations.database.d.ts +108 -0
- package/dist/features/conversations/conversations.database.js +373 -0
- package/dist/features/conversations/conversations.manager.d.ts +130 -0
- package/dist/features/conversations/conversations.manager.js +162 -0
- package/dist/features/conversations/conversations.routes.d.ts +21 -0
- package/dist/features/conversations/conversations.routes.js +38 -0
- package/dist/features/conversations/token-usage.route.d.ts +41 -0
- package/dist/features/conversations/token-usage.route.js +419 -0
- package/dist/features/git/git-commit.route.d.ts +12 -0
- package/dist/features/git/git-commit.route.js +39 -0
- package/dist/features/git/git-create-branch.route.d.ts +28 -0
- package/dist/features/git/git-create-branch.route.js +119 -0
- package/dist/features/git/git-create-pr.route.d.ts +13 -0
- package/dist/features/git/git-create-pr.route.js +50 -0
- package/dist/features/git/git-create-repo.route.d.ts +14 -0
- package/dist/features/git/git-create-repo.route.js +108 -0
- package/dist/features/git/git-diff.route.d.ts +30 -0
- package/dist/features/git/git-diff.route.js +189 -0
- package/dist/features/git/git-fetch.route.d.ts +12 -0
- package/dist/features/git/git-fetch.route.js +31 -0
- package/dist/features/git/git-generate-commit-message.route.d.ts +12 -0
- package/dist/features/git/git-generate-commit-message.route.js +76 -0
- package/dist/features/git/git-generate-pr-info.route.d.ts +13 -0
- package/dist/features/git/git-generate-pr-info.route.js +147 -0
- package/dist/features/git/git-github-status.route.d.ts +16 -0
- package/dist/features/git/git-github-status.route.js +68 -0
- package/dist/features/git/git-log.route.d.ts +17 -0
- package/dist/features/git/git-log.route.js +33 -0
- package/dist/features/git/git-pr-status.route.d.ts +15 -0
- package/dist/features/git/git-pr-status.route.js +33 -0
- package/dist/features/git/git-pull.route.d.ts +12 -0
- package/dist/features/git/git-pull.route.js +35 -0
- package/dist/features/git/git-push.route.d.ts +12 -0
- package/dist/features/git/git-push.route.js +46 -0
- package/dist/features/git/git-status-cache.database.d.ts +7 -0
- package/dist/features/git/git-status-cache.database.js +53 -0
- package/dist/features/git/git-status.route.d.ts +15 -0
- package/dist/features/git/git-status.route.js +62 -0
- package/dist/features/git/git-sync-branch.route.d.ts +4 -0
- package/dist/features/git/git-sync-branch.route.js +208 -0
- package/dist/features/git/git-unified-status.route.d.ts +30 -0
- package/dist/features/git/git-unified-status.route.js +165 -0
- package/dist/features/git/git-username.route.d.ts +3 -0
- package/dist/features/git/git-username.route.js +24 -0
- package/dist/features/git/git.manager.d.ts +139 -0
- package/dist/features/git/git.manager.js +352 -0
- package/dist/features/git/git.routes.d.ts +4 -0
- package/dist/features/git/git.routes.js +116 -0
- package/dist/features/git/git.utils.d.ts +82 -0
- package/dist/features/git/git.utils.js +1040 -0
- package/dist/features/mcp/mcp.config.d.ts +27 -0
- package/dist/features/mcp/mcp.config.js +148 -0
- package/dist/features/mcp/mcp.manager.d.ts +61 -0
- package/dist/features/mcp/mcp.manager.js +254 -0
- package/dist/features/mcp/mcp.popular.json +103 -0
- package/dist/features/mcp/mcp.routes.d.ts +13 -0
- package/dist/features/mcp/mcp.routes.js +159 -0
- package/dist/features/mcp/mcp.types.d.ts +80 -0
- package/dist/features/mcp/mcp.types.js +8 -0
- package/dist/features/metadata/metadata.manager.d.ts +126 -0
- package/dist/features/metadata/metadata.manager.js +423 -0
- package/dist/features/models/model-info-aihubmix.d.ts +25 -0
- package/dist/features/models/model-info-aihubmix.js +117 -0
- package/dist/features/models/model-info-openrouter.d.ts +25 -0
- package/dist/features/models/model-info-openrouter.js +104 -0
- package/dist/features/models/model-info.d.ts +37 -0
- package/dist/features/models/model-info.js +39 -0
- package/dist/features/models/models-catalog.d.ts +49 -0
- package/dist/features/models/models-catalog.js +80 -0
- package/dist/features/models/models-catalog.route.d.ts +43 -0
- package/dist/features/models/models-catalog.route.js +15 -0
- package/dist/features/models/models-get-available.route.d.ts +36 -0
- package/dist/features/models/models-get-available.route.js +66 -0
- package/dist/features/models/models-get-enabled.route.d.ts +33 -0
- package/dist/features/models/models-get-enabled.route.js +45 -0
- package/dist/features/models/models-get-model-info.route.d.ts +31 -0
- package/dist/features/models/models-get-model-info.route.js +84 -0
- package/dist/features/models/models-model-disable.route.d.ts +15 -0
- package/dist/features/models/models-model-disable.route.js +20 -0
- package/dist/features/models/models-model-enable.route.d.ts +13 -0
- package/dist/features/models/models-model-enable.route.js +20 -0
- package/dist/features/models/models-provider-refresh.route.d.ts +17 -0
- package/dist/features/models/models-provider-refresh.route.js +20 -0
- package/dist/features/models/models.manager.d.ts +58 -0
- package/dist/features/models/models.manager.js +138 -0
- package/dist/features/models/models.routes.d.ts +18 -0
- package/dist/features/models/models.routes.js +83 -0
- package/dist/features/models/open-router-models.d.ts +38 -0
- package/dist/features/models/open-router-models.js +73 -0
- package/dist/features/models/openai-models.d.ts +63 -0
- package/dist/features/models/openai-models.js +150 -0
- package/dist/features/onboarding/onboarding-get-git-check.route.d.ts +11 -0
- package/dist/features/onboarding/onboarding-get-git-check.route.js +28 -0
- package/dist/features/onboarding/onboarding-get-status.route.d.ts +12 -0
- package/dist/features/onboarding/onboarding-get-status.route.js +15 -0
- package/dist/features/onboarding/onboarding-post-complete.route.d.ts +12 -0
- package/dist/features/onboarding/onboarding-post-complete.route.js +15 -0
- package/dist/features/onboarding/onboarding-post-reset.route.d.ts +12 -0
- package/dist/features/onboarding/onboarding-post-reset.route.js +15 -0
- package/dist/features/onboarding/onboarding.routes.d.ts +18 -0
- package/dist/features/onboarding/onboarding.routes.js +28 -0
- package/dist/features/project-todos/project-todos.database.d.ts +38 -0
- package/dist/features/project-todos/project-todos.database.js +91 -0
- package/dist/features/project-todos/project-todos.routes.d.ts +4 -0
- package/dist/features/project-todos/project-todos.routes.js +94 -0
- package/dist/features/projects/projects-ai-files.route.d.ts +148 -0
- package/dist/features/projects/projects-ai-files.route.js +425 -0
- package/dist/features/projects/projects-commands.route.d.ts +27 -0
- package/dist/features/projects/projects-commands.route.js +39 -0
- package/dist/features/projects/projects-create.route.d.ts +19 -0
- package/dist/features/projects/projects-create.route.js +37 -0
- package/dist/features/projects/projects-delete.route.d.ts +24 -0
- package/dist/features/projects/projects-delete.route.js +34 -0
- package/dist/features/projects/projects-get.route.d.ts +47 -0
- package/dist/features/projects/projects-get.route.js +36 -0
- package/dist/features/projects/projects-list.route.d.ts +58 -0
- package/dist/features/projects/projects-list.route.js +59 -0
- package/dist/features/projects/projects-open-folder.route.d.ts +10 -0
- package/dist/features/projects/projects-open-folder.route.js +11 -0
- package/dist/features/projects/projects-open.route.d.ts +26 -0
- package/dist/features/projects/projects-open.route.js +49 -0
- package/dist/features/projects/projects-package-scripts.route.d.ts +15 -0
- package/dist/features/projects/projects-package-scripts.route.js +96 -0
- package/dist/features/projects/projects-run-command.route.d.ts +8 -0
- package/dist/features/projects/projects-run-command.route.js +21 -0
- package/dist/features/projects/projects-run.route.d.ts +51 -0
- package/dist/features/projects/projects-run.route.js +74 -0
- package/dist/features/projects/projects-update.route.d.ts +24 -0
- package/dist/features/projects/projects-update.route.js +81 -0
- package/dist/features/projects/projects.creator.d.ts +33 -0
- package/dist/features/projects/projects.creator.js +555 -0
- package/dist/features/projects/projects.database.d.ts +61 -0
- package/dist/features/projects/projects.database.js +212 -0
- package/dist/features/projects/projects.manager.d.ts +291 -0
- package/dist/features/projects/projects.manager.js +426 -0
- package/dist/features/projects/projects.open-with.d.ts +27 -0
- package/dist/features/projects/projects.open-with.js +156 -0
- package/dist/features/projects/projects.routes.d.ts +20 -0
- package/dist/features/projects/projects.routes.js +255 -0
- package/dist/features/projects/terminal-session-manager.d.ts +55 -0
- package/dist/features/projects/terminal-session-manager.js +90 -0
- package/dist/features/providers/provider-resolver.d.ts +13 -0
- package/dist/features/providers/provider-resolver.js +22 -0
- package/dist/features/providers/providers-get-credits.route.d.ts +15 -0
- package/dist/features/providers/providers-get-credits.route.js +51 -0
- package/dist/features/providers/providers-get.route.d.ts +16 -0
- package/dist/features/providers/providers-get.route.js +32 -0
- package/dist/features/providers/providers-open-external.route.d.ts +15 -0
- package/dist/features/providers/providers-open-external.route.js +49 -0
- package/dist/features/providers/providers-post-bulk-keys.route.d.ts +14 -0
- package/dist/features/providers/providers-post-bulk-keys.route.js +31 -0
- package/dist/features/providers/providers-post-keys.route.d.ts +14 -0
- package/dist/features/providers/providers-post-keys.route.js +25 -0
- package/dist/features/providers/providers.routes.d.ts +19 -0
- package/dist/features/providers/providers.routes.js +31 -0
- package/dist/features/rules/rules-post.route.d.ts +43 -0
- package/dist/features/rules/rules-post.route.js +89 -0
- package/dist/features/rules/rules.manager.d.ts +36 -0
- package/dist/features/rules/rules.manager.js +203 -0
- package/dist/features/rules/rules.routes.d.ts +12 -0
- package/dist/features/rules/rules.routes.js +13 -0
- package/dist/features/run/run-get-running.route.d.ts +15 -0
- package/dist/features/run/run-get-running.route.js +21 -0
- package/dist/features/run/run-post-start.route.d.ts +8 -0
- package/dist/features/run/run-post-start.route.js +21 -0
- package/dist/features/run/run-post-stop.route.d.ts +15 -0
- package/dist/features/run/run-post-stop.route.js +24 -0
- package/dist/features/run/run-post-suggest.route.d.ts +15 -0
- package/dist/features/run/run-post-suggest.route.js +21 -0
- package/dist/features/run/run-put-command.route.d.ts +15 -0
- package/dist/features/run/run-put-command.route.js +24 -0
- package/dist/features/run/run.routes.d.ts +19 -0
- package/dist/features/run/run.routes.js +31 -0
- package/dist/features/scaffold/index.d.ts +7 -0
- package/dist/features/scaffold/index.js +5 -0
- package/dist/features/scaffold/scaffold-get-templates.route.d.ts +27 -0
- package/dist/features/scaffold/scaffold-get-templates.route.js +17 -0
- package/dist/features/scaffold/scaffold-post.route.d.ts +8 -0
- package/dist/features/scaffold/scaffold-post.route.js +30 -0
- package/dist/features/scaffold/scaffold.routes.d.ts +10 -0
- package/dist/features/scaffold/scaffold.routes.js +16 -0
- package/dist/features/scaffold/scaffold.runner.d.ts +48 -0
- package/dist/features/scaffold/scaffold.runner.js +475 -0
- package/dist/features/scaffold/scaffold.types.d.ts +26 -0
- package/dist/features/scaffold/scaffold.types.js +5 -0
- package/dist/features/skills/skills.activation.d.ts +31 -0
- package/dist/features/skills/skills.activation.js +155 -0
- package/dist/features/skills/skills.manager.d.ts +35 -0
- package/dist/features/skills/skills.manager.js +251 -0
- package/dist/features/slash-commands/slash-commands-delete.route.d.ts +23 -0
- package/dist/features/slash-commands/slash-commands-delete.route.js +36 -0
- package/dist/features/slash-commands/slash-commands-get.route.d.ts +53 -0
- package/dist/features/slash-commands/slash-commands-get.route.js +54 -0
- package/dist/features/slash-commands/slash-commands-post.route.d.ts +39 -0
- package/dist/features/slash-commands/slash-commands-post.route.js +70 -0
- package/dist/features/slash-commands/slash-commands-put.route.d.ts +23 -0
- package/dist/features/slash-commands/slash-commands-put.route.js +36 -0
- package/dist/features/slash-commands/slash-commands.manager.d.ts +46 -0
- package/dist/features/slash-commands/slash-commands.manager.js +265 -0
- package/dist/features/slash-commands/slash-commands.routes.d.ts +13 -0
- package/dist/features/slash-commands/slash-commands.routes.js +20 -0
- package/dist/features/threads/threads-ai-files.route.d.ts +153 -0
- package/dist/features/threads/threads-ai-files.route.js +287 -0
- package/dist/features/threads/threads-conversation-folder-path.route.d.ts +14 -0
- package/dist/features/threads/threads-conversation-folder-path.route.js +23 -0
- package/dist/features/threads/threads-create.route.d.ts +22 -0
- package/dist/features/threads/threads-create.route.js +60 -0
- package/dist/features/threads/threads-delete.route.d.ts +25 -0
- package/dist/features/threads/threads-delete.route.js +35 -0
- package/dist/features/threads/threads-files.route.d.ts +15 -0
- package/dist/features/threads/threads-files.route.js +20 -0
- package/dist/features/threads/threads-fix-comments.route.d.ts +26 -0
- package/dist/features/threads/threads-fix-comments.route.js +45 -0
- package/dist/features/threads/threads-get.route.d.ts +30 -0
- package/dist/features/threads/threads-get.route.js +38 -0
- package/dist/features/threads/threads-list.route.d.ts +56 -0
- package/dist/features/threads/threads-list.route.js +58 -0
- package/dist/features/threads/threads-messages.route.d.ts +28 -0
- package/dist/features/threads/threads-messages.route.js +110 -0
- package/dist/features/threads/threads-open.route.d.ts +26 -0
- package/dist/features/threads/threads-open.route.js +62 -0
- package/dist/features/threads/threads-select.route.d.ts +25 -0
- package/dist/features/threads/threads-select.route.js +35 -0
- package/dist/features/threads/threads-update.route.d.ts +15 -0
- package/dist/features/threads/threads-update.route.js +30 -0
- package/dist/features/threads/threads.database.d.ts +68 -0
- package/dist/features/threads/threads.database.js +215 -0
- package/dist/features/threads/threads.manager.d.ts +204 -0
- package/dist/features/threads/threads.manager.js +505 -0
- package/dist/features/threads/threads.routes.d.ts +20 -0
- package/dist/features/threads/threads.routes.js +230 -0
- package/dist/features/todos/todos.database.d.ts +14 -0
- package/dist/features/todos/todos.database.js +31 -0
- package/dist/features/updates/updates.routes.d.ts +13 -0
- package/dist/features/updates/updates.routes.js +40 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +37 -10022
- package/dist/project-analyzer.d.ts +26 -0
- package/dist/project-analyzer.js +307 -0
- package/dist/public/assets/add-agent-view-B9IQjAwU.js +1 -0
- package/dist/public/assets/add-rule-view-BdZHurB3.js +7 -0
- package/dist/public/assets/add-skill-view-Cuu6Z0fr.js +1 -0
- package/dist/public/assets/add-slash-command-view-uW75Jvbh.js +1 -0
- package/dist/public/assets/conversation-history-view-D0OBxJMC.js +1 -0
- package/dist/public/assets/dialogs-config-DiFQjCeA.js +46 -0
- package/dist/public/assets/diff-view-B5XBM5UZ.js +3 -0
- package/dist/public/assets/file-tree-sidebar-DMX7fHi7.js +1 -0
- package/dist/public/assets/files-view-CUZn7G0o.js +1 -0
- package/dist/public/assets/history-view-B8HM78Wa.js +1 -0
- package/dist/public/assets/index-C-p81QYw.js +17 -0
- package/dist/public/assets/index-DhVMb7D6.css +1 -0
- package/dist/public/assets/mcp-manager-CEm1L3dn.js +1 -0
- package/dist/public/assets/mcp-server-edit-view-BAwMNOAH.js +5 -0
- package/dist/public/assets/mcp-servers-sidebar-Ncxq9Oj5.js +1 -0
- package/dist/public/assets/mcp-view-Cz7nelGQ.js +1 -0
- package/dist/public/assets/monaco-DvsnxTfD.js +11 -0
- package/dist/public/assets/onboarding-CvpvkF3X.js +1 -0
- package/dist/public/assets/onboarding-dialog-CKJw0ULj.js +1 -0
- package/dist/public/assets/project-settings-view-DJ1uvrTL.js +1 -0
- package/dist/public/assets/provider-details-view-CkS6WbnK.js +1 -0
- package/dist/public/assets/providers-sidebar-C4MF6i9d.js +1 -0
- package/dist/public/assets/radio-group-BItFbSTw.js +1 -0
- package/dist/public/assets/react-vendor-DkKo9QGO.js +17 -0
- package/dist/public/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
- package/dist/public/assets/settings-view-C45kmAGH.js +2 -0
- package/dist/public/assets/store-BVVGurzl.js +2 -0
- package/dist/public/assets/use-toast-DEJkXPN4.js +1 -0
- package/dist/public/assets/utils-DY_quHB8.js +1 -0
- package/dist/public/fonts/google-sans.ttf +0 -0
- package/dist/public/fonts/zalando.ttf +0 -0
- package/dist/public/ide/android-studio.svg +1 -0
- package/dist/public/ide/cursor.svg +12 -0
- package/dist/public/ide/kiro.svg +11 -0
- package/dist/public/ide/terminal.svg +7 -0
- package/dist/public/ide/vscode.svg +2 -0
- package/dist/public/ide/windsurf.svg +3 -0
- package/dist/public/ide/xcode.svg +2 -0
- package/dist/public/index.html +13 -9
- package/dist/scaffold-templates.json +3 -12
- package/dist/server.d.ts +12 -0
- package/dist/server.js +142 -0
- package/dist/tools/agent-tool.d.ts +49 -0
- package/dist/tools/agent-tool.js +131 -0
- package/dist/tools/ask-user.d.ts +25 -0
- package/dist/tools/ask-user.js +74 -0
- package/dist/tools/ast-grep.d.ts +28 -0
- package/dist/tools/ast-grep.js +273 -0
- package/dist/tools/bash.d.ts +33 -0
- package/dist/tools/bash.js +186 -0
- package/dist/tools/edit-diff.d.ts +24 -0
- package/dist/tools/edit-diff.js +136 -0
- package/dist/tools/edit.d.ts +28 -0
- package/dist/tools/edit.js +78 -0
- package/dist/tools/find.d.ts +31 -0
- package/dist/tools/find.js +117 -0
- package/dist/tools/grep.d.ts +37 -0
- package/dist/tools/grep.js +231 -0
- package/dist/tools/index.d.ts +93 -0
- package/dist/tools/index.js +110 -0
- package/dist/tools/ls.d.ts +31 -0
- package/dist/tools/ls.js +108 -0
- package/dist/tools/mcp-tools.d.ts +31 -0
- package/dist/tools/mcp-tools.js +59 -0
- package/dist/tools/path-utils.d.ts +14 -0
- package/dist/tools/path-utils.js +87 -0
- package/dist/tools/read.d.ts +27 -0
- package/dist/tools/read.js +86 -0
- package/dist/tools/resolve-bin.d.ts +5 -0
- package/dist/tools/resolve-bin.js +28 -0
- package/dist/tools/shell.d.ts +7 -0
- package/dist/tools/shell.js +143 -0
- package/dist/tools/skill-reference-tool.d.ts +30 -0
- package/dist/tools/skill-reference-tool.js +171 -0
- package/dist/tools/skill-tool.d.ts +33 -0
- package/dist/tools/skill-tool.js +213 -0
- package/dist/tools/todo.d.ts +20 -0
- package/dist/tools/todo.js +168 -0
- package/dist/tools/tool-helpers.d.ts +78 -0
- package/dist/tools/tool-helpers.js +109 -0
- package/dist/tools/truncate.d.ts +31 -0
- package/dist/tools/truncate.js +164 -0
- package/dist/tools/write.d.ts +21 -0
- package/dist/tools/write.js +65 -0
- package/package.json +33 -27
- package/dist/public/assets/index-6jySngUQ.css +0 -1
- package/dist/public/assets/index-BjFpLTSj.js +0 -18
- package/dist/public/assets/monaco-w6PwaWGP.js +0 -11
- package/dist/public/assets/radix-ui-e1yigncZ.js +0 -1
- package/dist/public/assets/react-vendor-B6JfXZmN.js +0 -59
- package/dist/public/assets/ui-styling-CyCIFleB.js +0 -1
- package/dist/public/assets/utils-Dd_itR7L.js +0 -1
package/README.md
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error handling utilities for Pi Agent
|
|
3
|
+
* Provides functions for extracting and formatting error information
|
|
4
|
+
*/
|
|
5
|
+
import type { AgentEvent } from "@tarsk/shared";
|
|
6
|
+
/**
|
|
7
|
+
* Extracts error code from an unknown error object
|
|
8
|
+
*/
|
|
9
|
+
export declare function getErrorCode(error: unknown): string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Formats an error into an AgentEvent
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatErrorEvent(error: unknown): AgentEvent;
|
|
14
|
+
//# sourceMappingURL=agent.error-utils.d.ts.map
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error handling utilities for Pi Agent
|
|
3
|
+
* Provides functions for extracting and formatting error information
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extracts error code from an unknown error object
|
|
7
|
+
*/
|
|
8
|
+
export function getErrorCode(error) {
|
|
9
|
+
if (error && typeof error === "object" && "code" in error) {
|
|
10
|
+
const code = error.code;
|
|
11
|
+
if (typeof code === "string")
|
|
12
|
+
return code;
|
|
13
|
+
}
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Formats an error into an AgentEvent
|
|
18
|
+
*/
|
|
19
|
+
export function formatErrorEvent(error) {
|
|
20
|
+
let errCode;
|
|
21
|
+
let errMessage;
|
|
22
|
+
let errStack;
|
|
23
|
+
let errDetails;
|
|
24
|
+
if (error instanceof Error) {
|
|
25
|
+
errMessage = error.message || "Unknown error";
|
|
26
|
+
errStack = error.stack;
|
|
27
|
+
errCode = getErrorCode(error);
|
|
28
|
+
}
|
|
29
|
+
else if (typeof error === "object" && error !== null) {
|
|
30
|
+
errMessage = error.message
|
|
31
|
+
? String(error.message)
|
|
32
|
+
: JSON.stringify(error);
|
|
33
|
+
errCode = getErrorCode(error);
|
|
34
|
+
errDetails = error;
|
|
35
|
+
}
|
|
36
|
+
else if (typeof error === "string") {
|
|
37
|
+
errMessage = error;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
errMessage = String(error);
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
type: "error",
|
|
44
|
+
content: errMessage,
|
|
45
|
+
error: {
|
|
46
|
+
code: errCode ?? "EXECUTION_ERROR",
|
|
47
|
+
message: errMessage ?? "An error occurred during execution",
|
|
48
|
+
details: { stack: errStack, originalError: errDetails },
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=agent.error-utils.js.map
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event transformer for Pi Agent
|
|
3
|
+
* Handles transformation of Pi Agent events to AgentEvent format
|
|
4
|
+
*/
|
|
5
|
+
import type { AgentEvent as PiAgentEvent } from "@mariozechner/pi-agent-core";
|
|
6
|
+
import type { AssistantMessage } from "@mariozechner/pi-ai";
|
|
7
|
+
import type { AgentEvent } from "@tarsk/shared";
|
|
8
|
+
/**
|
|
9
|
+
* Extracts text content from an assistant message
|
|
10
|
+
*/
|
|
11
|
+
export declare function extractTextFromAssistantMessage(msg: AssistantMessage): string;
|
|
12
|
+
/**
|
|
13
|
+
* Event queue manager for handling Pi Agent events
|
|
14
|
+
*/
|
|
15
|
+
export declare class EventQueue {
|
|
16
|
+
private queue;
|
|
17
|
+
private resolver;
|
|
18
|
+
finalContent: string;
|
|
19
|
+
errorOccurred: boolean;
|
|
20
|
+
toolCallCount: number;
|
|
21
|
+
/**
|
|
22
|
+
* Processes Pi Agent events and transforms them into AgentEvent format
|
|
23
|
+
*/
|
|
24
|
+
handlePiEvent(event: PiAgentEvent): void;
|
|
25
|
+
/**
|
|
26
|
+
* Adds an event to the queue
|
|
27
|
+
*/
|
|
28
|
+
push(event: AgentEvent): void;
|
|
29
|
+
/**
|
|
30
|
+
* Removes and returns the next event from the queue
|
|
31
|
+
*/
|
|
32
|
+
shift(): AgentEvent | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Returns the number of events in the queue
|
|
35
|
+
*/
|
|
36
|
+
get length(): number;
|
|
37
|
+
/**
|
|
38
|
+
* Sets a resolver to be called when new events are added
|
|
39
|
+
*/
|
|
40
|
+
setResolver(resolver: () => void): void;
|
|
41
|
+
/**
|
|
42
|
+
* Clears the current resolver
|
|
43
|
+
*/
|
|
44
|
+
clearResolver(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Notifies the resolver if one is set
|
|
47
|
+
*/
|
|
48
|
+
private notifyResolver;
|
|
49
|
+
/**
|
|
50
|
+
* Wakes up any waiting consumer (e.g. when the agent finishes).
|
|
51
|
+
* Call this instead of setResolver(() => {}) so the pending Promise resolves.
|
|
52
|
+
*/
|
|
53
|
+
notify(): void;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=agent.event-transformer.d.ts.map
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event transformer for Pi Agent
|
|
3
|
+
* Handles transformation of Pi Agent events to AgentEvent format
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extracts text content from an assistant message
|
|
7
|
+
*/
|
|
8
|
+
export function extractTextFromAssistantMessage(msg) {
|
|
9
|
+
return msg.content
|
|
10
|
+
.filter((b) => b.type === "text")
|
|
11
|
+
.map((b) => b.text)
|
|
12
|
+
.join("");
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Event queue manager for handling Pi Agent events
|
|
16
|
+
*/
|
|
17
|
+
export class EventQueue {
|
|
18
|
+
queue = [];
|
|
19
|
+
resolver = null;
|
|
20
|
+
finalContent = "";
|
|
21
|
+
errorOccurred = false;
|
|
22
|
+
toolCallCount = 0;
|
|
23
|
+
/**
|
|
24
|
+
* Processes Pi Agent events and transforms them into AgentEvent format
|
|
25
|
+
*/
|
|
26
|
+
handlePiEvent(event) {
|
|
27
|
+
if (event.type === "message_update" && event.assistantMessageEvent.type === "thinking_delta") {
|
|
28
|
+
// Stream thinking/reasoning content in real-time as the model thinks
|
|
29
|
+
const delta = event.assistantMessageEvent.delta;
|
|
30
|
+
this.push({
|
|
31
|
+
type: "message",
|
|
32
|
+
role: "assistant",
|
|
33
|
+
content: delta,
|
|
34
|
+
isThinking: true,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
else if (event.type === "message_update" &&
|
|
38
|
+
event.assistantMessageEvent.type === "text_delta") {
|
|
39
|
+
const delta = event.assistantMessageEvent.delta;
|
|
40
|
+
this.finalContent += delta;
|
|
41
|
+
this.push({
|
|
42
|
+
type: "message",
|
|
43
|
+
role: "assistant",
|
|
44
|
+
content: delta,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
else if (event.type === "message_update" &&
|
|
48
|
+
event.assistantMessageEvent.type === "toolcall_delta") {
|
|
49
|
+
// Handle tool call delta events for progress indication
|
|
50
|
+
const deltaEvent = event.assistantMessageEvent;
|
|
51
|
+
this.push({
|
|
52
|
+
type: "toolcall_delta",
|
|
53
|
+
contentIndex: deltaEvent.contentIndex,
|
|
54
|
+
delta: deltaEvent.delta,
|
|
55
|
+
partial: deltaEvent.partial,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else if (event.type === "message_start") {
|
|
59
|
+
// Handle message_start events - these contain usage information
|
|
60
|
+
this.push({
|
|
61
|
+
type: "message",
|
|
62
|
+
role: "assistant",
|
|
63
|
+
content: "",
|
|
64
|
+
message: event.message, // Store the full message object for usage extraction
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
else if (event.type === "tool_execution_start") {
|
|
68
|
+
this.toolCallCount++;
|
|
69
|
+
this.push({
|
|
70
|
+
type: "message",
|
|
71
|
+
role: "tool",
|
|
72
|
+
content: JSON.stringify([
|
|
73
|
+
{
|
|
74
|
+
type: "tool_use",
|
|
75
|
+
name: event.toolName,
|
|
76
|
+
id: event.toolCallId,
|
|
77
|
+
input: event.args,
|
|
78
|
+
},
|
|
79
|
+
]),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
else if (event.type === "tool_execution_end") {
|
|
83
|
+
const resultContent = event.result?.content
|
|
84
|
+
?.filter((b) => b.type === "text")
|
|
85
|
+
.map((b) => b.text ?? "")
|
|
86
|
+
.join("") ?? JSON.stringify(event.result);
|
|
87
|
+
this.push({
|
|
88
|
+
type: "message",
|
|
89
|
+
role: "tool",
|
|
90
|
+
content: JSON.stringify([
|
|
91
|
+
{
|
|
92
|
+
type: "tool-result",
|
|
93
|
+
toolCallId: event.toolCallId,
|
|
94
|
+
toolName: event.toolName,
|
|
95
|
+
content: resultContent,
|
|
96
|
+
isError: event.isError,
|
|
97
|
+
},
|
|
98
|
+
]),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else if (event.type === "agent_end") {
|
|
102
|
+
const messages = event.messages;
|
|
103
|
+
const lastAssistant = [...messages]
|
|
104
|
+
.reverse()
|
|
105
|
+
.find((m) => "role" in m && m.role === "assistant");
|
|
106
|
+
if (lastAssistant) {
|
|
107
|
+
const extracted = extractTextFromAssistantMessage(lastAssistant);
|
|
108
|
+
if (extracted && extracted !== this.finalContent) {
|
|
109
|
+
this.finalContent = extracted;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const toolCallCount = messages.filter((m) => "role" in m &&
|
|
113
|
+
m.role === "assistant" &&
|
|
114
|
+
"content" in m &&
|
|
115
|
+
Array.isArray(m.content) &&
|
|
116
|
+
m.content.some((b) => b.type === "tool_use")).length;
|
|
117
|
+
console.log(`[ai] agent_end: ${messages.length} messages, ` +
|
|
118
|
+
`finalContent length=${this.finalContent.length}, ` +
|
|
119
|
+
`toolCallRounds=${toolCallCount}` +
|
|
120
|
+
(this.finalContent.length === 0 ? " ⚠️ no text content produced" : ""));
|
|
121
|
+
}
|
|
122
|
+
this.notifyResolver();
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Adds an event to the queue
|
|
126
|
+
*/
|
|
127
|
+
push(event) {
|
|
128
|
+
this.queue.push(event);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Removes and returns the next event from the queue
|
|
132
|
+
*/
|
|
133
|
+
shift() {
|
|
134
|
+
return this.queue.shift();
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Returns the number of events in the queue
|
|
138
|
+
*/
|
|
139
|
+
get length() {
|
|
140
|
+
return this.queue.length;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Sets a resolver to be called when new events are added
|
|
144
|
+
*/
|
|
145
|
+
setResolver(resolver) {
|
|
146
|
+
this.resolver = resolver;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Clears the current resolver
|
|
150
|
+
*/
|
|
151
|
+
clearResolver() {
|
|
152
|
+
this.resolver = null;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Notifies the resolver if one is set
|
|
156
|
+
*/
|
|
157
|
+
notifyResolver() {
|
|
158
|
+
if (this.resolver) {
|
|
159
|
+
this.resolver();
|
|
160
|
+
this.resolver = null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Wakes up any waiting consumer (e.g. when the agent finishes).
|
|
165
|
+
* Call this instead of setResolver(() => {}) so the pending Promise resolves.
|
|
166
|
+
*/
|
|
167
|
+
notify() {
|
|
168
|
+
if (this.resolver) {
|
|
169
|
+
const resolver = this.resolver;
|
|
170
|
+
this.resolver = null;
|
|
171
|
+
resolver();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=agent.event-transformer.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PiExecutor handles execution of agent commands via @mariozechner/pi-agent-core
|
|
3
|
+
*
|
|
4
|
+
* This manager is responsible for:
|
|
5
|
+
* - Executing streaming agent sessions using the Pi Agent
|
|
6
|
+
* - Streaming result messages back to the caller
|
|
7
|
+
* - Handling execution errors
|
|
8
|
+
*/
|
|
9
|
+
import type { ExecutionContext, AgentEvent } from "@tarsk/shared";
|
|
10
|
+
import { MetadataManager } from "../features/metadata/metadata.manager.js";
|
|
11
|
+
/**
|
|
12
|
+
* AgentExecutor interface defines the contract for agent command execution
|
|
13
|
+
*/
|
|
14
|
+
export interface AgentExecutor {
|
|
15
|
+
execute(prompt: string, context: ExecutionContext, signal?: AbortSignal): AsyncGenerator<AgentEvent>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* PiExecutorImpl provides the implementation for agent command execution
|
|
19
|
+
* using the @mariozechner/pi-agent-core Agent with streaming events.
|
|
20
|
+
*/
|
|
21
|
+
export declare class PiExecutorImpl implements AgentExecutor {
|
|
22
|
+
private metadataManager;
|
|
23
|
+
constructor(metadataManager: MetadataManager);
|
|
24
|
+
execute(userPrompt: string, context: ExecutionContext, signal?: AbortSignal): AsyncGenerator<AgentEvent>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=agent.executor.d.ts.map
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PiExecutor handles execution of agent commands via @mariozechner/pi-agent-core
|
|
3
|
+
*
|
|
4
|
+
* This manager is responsible for:
|
|
5
|
+
* - Executing streaming agent sessions using the Pi Agent
|
|
6
|
+
* - Streaming result messages back to the caller
|
|
7
|
+
* - Handling execution errors
|
|
8
|
+
*/
|
|
9
|
+
import { Agent } from "@mariozechner/pi-agent-core";
|
|
10
|
+
import { resolve, isAbsolute } from "path";
|
|
11
|
+
import { createCodingTools } from "../tools/index.js";
|
|
12
|
+
import { createAgentTool } from "../tools/agent-tool.js";
|
|
13
|
+
import { resolveProviderConfig } from "../features/providers/provider-resolver.js";
|
|
14
|
+
import { getDataDir } from "../core/paths.js";
|
|
15
|
+
import { resolveModel } from "./agent.model-resolver.js";
|
|
16
|
+
import { EventQueue } from "./agent.event-transformer.js";
|
|
17
|
+
import { loadAgentSystemPrompt } from "./agent.prompt-loader.js";
|
|
18
|
+
import { getErrorCode, formatErrorEvent } from "./agent.error-utils.js";
|
|
19
|
+
/**
|
|
20
|
+
* PiExecutorImpl provides the implementation for agent command execution
|
|
21
|
+
* using the @mariozechner/pi-agent-core Agent with streaming events.
|
|
22
|
+
*/
|
|
23
|
+
export class PiExecutorImpl {
|
|
24
|
+
metadataManager;
|
|
25
|
+
constructor(metadataManager) {
|
|
26
|
+
this.metadataManager = metadataManager;
|
|
27
|
+
}
|
|
28
|
+
async *execute(userPrompt, context, signal) {
|
|
29
|
+
try {
|
|
30
|
+
const providerName = context.provider;
|
|
31
|
+
if (!providerName) {
|
|
32
|
+
throw new Error("No provider specified in execution context");
|
|
33
|
+
}
|
|
34
|
+
let model = context.model?.trim();
|
|
35
|
+
if (!model) {
|
|
36
|
+
throw new Error("No model specified in execution context");
|
|
37
|
+
}
|
|
38
|
+
model = model.replace(`${providerName.toLowerCase()}/`, "");
|
|
39
|
+
// Ensure threadPath is absolute - if relative, resolve against dataDir
|
|
40
|
+
const cwd = isAbsolute(context.threadPath)
|
|
41
|
+
? context.threadPath
|
|
42
|
+
: resolve(getDataDir(), context.threadPath);
|
|
43
|
+
console.log("[ai] Execution context:", {
|
|
44
|
+
model,
|
|
45
|
+
cwd,
|
|
46
|
+
providerName,
|
|
47
|
+
promptLength: userPrompt.length,
|
|
48
|
+
});
|
|
49
|
+
// Resolve provider config: merges hardcoded PROVIDERS with catalog data (api, keyName, url)
|
|
50
|
+
const providerConfig = await resolveProviderConfig(providerName);
|
|
51
|
+
if (!providerConfig) {
|
|
52
|
+
throw new Error(`Unknown provider: ${providerName}`);
|
|
53
|
+
}
|
|
54
|
+
let apiKey = providerConfig.env && providerConfig.env.length > 0
|
|
55
|
+
? process.env[providerConfig.env[0]]
|
|
56
|
+
: undefined;
|
|
57
|
+
let apiKeySource = "environment";
|
|
58
|
+
if (!apiKey) {
|
|
59
|
+
try {
|
|
60
|
+
const providerKeys = await this.metadataManager.getProviderKeys();
|
|
61
|
+
apiKey = providerKeys[providerConfig.name];
|
|
62
|
+
apiKeySource = "configuration";
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.error(`[ai] Failed to retrieve provider keys from configuration:`, error);
|
|
66
|
+
throw new Error(`Failed to retrieve API key for provider ${providerName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!apiKey) {
|
|
70
|
+
throw new Error(`No API key found for provider: ${providerName}. ` +
|
|
71
|
+
`Set ${providerConfig.env && providerConfig.env.length > 0 ? providerConfig.env[0] : "an API key"} in environment variables or configuration.`);
|
|
72
|
+
}
|
|
73
|
+
// Verify the API key is not still encrypted (should have been decrypted by metadata manager)
|
|
74
|
+
if (apiKey.includes(":") && apiKey.length > 100) {
|
|
75
|
+
console.warn(`[ai] ⚠️ API key appears to still be encrypted. This may indicate a decryption failure.`);
|
|
76
|
+
}
|
|
77
|
+
console.log(`[ai] API key source for ${providerName}: ${apiKeySource}`);
|
|
78
|
+
const resolvedModel = resolveModel(providerName, model, providerConfig);
|
|
79
|
+
console.log("[ai] Resolved model:", {
|
|
80
|
+
id: resolvedModel.id,
|
|
81
|
+
api: resolvedModel.api,
|
|
82
|
+
provider: resolvedModel.provider,
|
|
83
|
+
});
|
|
84
|
+
const tools = await createCodingTools(cwd, {
|
|
85
|
+
skills: context.skills,
|
|
86
|
+
threadId: context.threadId,
|
|
87
|
+
});
|
|
88
|
+
const systemPrompt = await loadAgentSystemPrompt(cwd, context.skills, context.planMode, context.agents);
|
|
89
|
+
console.log("[ai] System prompt loaded from thread path", context.skills && context.skills.length > 0 ? `with ${context.skills.length} skill(s)` : "");
|
|
90
|
+
console.log(`[ai] System prompt: ${systemPrompt}`);
|
|
91
|
+
const eventQueue = new EventQueue();
|
|
92
|
+
// Add agent tool if agents are defined (enables subagent spawning)
|
|
93
|
+
const invocableAgents = (context.agents ?? []).filter((a) => !a.disableModelInvocation);
|
|
94
|
+
if (invocableAgents.length > 0) {
|
|
95
|
+
const agentToolInstance = createAgentTool({
|
|
96
|
+
agents: invocableAgents,
|
|
97
|
+
baseTools: tools,
|
|
98
|
+
metadataManager: this.metadataManager,
|
|
99
|
+
parentModel: `${providerName.toLowerCase()}/${model}`,
|
|
100
|
+
parentProvider: providerName,
|
|
101
|
+
defaultSystemPrompt: systemPrompt,
|
|
102
|
+
onEvent: (event) => eventQueue.push(event),
|
|
103
|
+
signal,
|
|
104
|
+
});
|
|
105
|
+
tools.push(agentToolInstance);
|
|
106
|
+
}
|
|
107
|
+
const agent = new Agent({
|
|
108
|
+
initialState: {
|
|
109
|
+
systemPrompt,
|
|
110
|
+
model: resolvedModel,
|
|
111
|
+
tools,
|
|
112
|
+
},
|
|
113
|
+
getApiKey: async () => apiKey,
|
|
114
|
+
});
|
|
115
|
+
let done = false;
|
|
116
|
+
let aborted = false;
|
|
117
|
+
// Handle abort signal from client disconnect
|
|
118
|
+
const onAbort = () => {
|
|
119
|
+
if (aborted)
|
|
120
|
+
return;
|
|
121
|
+
aborted = true;
|
|
122
|
+
console.log("[ai] Client disconnected, aborting agent execution");
|
|
123
|
+
// Immediately abort the agent to stop ongoing LLM API calls.
|
|
124
|
+
// Must happen here — not in the finally block — otherwise the agent
|
|
125
|
+
// keeps consuming tokens until the current API call completes.
|
|
126
|
+
agent.abort();
|
|
127
|
+
done = true;
|
|
128
|
+
eventQueue.notify();
|
|
129
|
+
};
|
|
130
|
+
if (signal) {
|
|
131
|
+
if (signal.aborted) {
|
|
132
|
+
console.log("[ai] Agent execution aborted before start");
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
136
|
+
}
|
|
137
|
+
console.log(`[ai] Agent prompt request:`, {
|
|
138
|
+
promptLength: userPrompt.length,
|
|
139
|
+
promptPreview: userPrompt.substring(0, 200) + (userPrompt.length > 200 ? "..." : ""),
|
|
140
|
+
});
|
|
141
|
+
let count = 0;
|
|
142
|
+
let lastLogTime = 0;
|
|
143
|
+
const unsubscribe = agent.subscribe((event) => {
|
|
144
|
+
// Throttle logging to prevent spam - only log every 2 seconds or every 100 events
|
|
145
|
+
const now = Date.now();
|
|
146
|
+
const shouldLog = count === 0 || count % 100 === 0 || now - lastLogTime > 2000;
|
|
147
|
+
if (shouldLog) {
|
|
148
|
+
console.log(`[ai] Agent event.${count++}:`, event.type, event.type === "message_update" &&
|
|
149
|
+
event.assistantMessageEvent?.type === "toolcall_delta"
|
|
150
|
+
? `toolcall_delta (delta="${event.assistantMessageEvent.delta}")`
|
|
151
|
+
: JSON.stringify(event).substring(0, 255));
|
|
152
|
+
lastLogTime = now;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
count++;
|
|
156
|
+
}
|
|
157
|
+
eventQueue.handlePiEvent(event);
|
|
158
|
+
});
|
|
159
|
+
const images = (context.attachments ?? [])
|
|
160
|
+
.filter((a) => a.mimeType.startsWith("image/"))
|
|
161
|
+
.map((a) => ({ type: "image", data: a.content, mimeType: a.mimeType }));
|
|
162
|
+
const textAttachments = (context.attachments ?? []).filter((a) => !a.mimeType.startsWith("image/"));
|
|
163
|
+
let finalPrompt = userPrompt;
|
|
164
|
+
if (textAttachments.length > 0) {
|
|
165
|
+
const attachmentBlocks = textAttachments
|
|
166
|
+
.map((a) => {
|
|
167
|
+
const decoded = Buffer.from(a.content, "base64").toString("utf-8");
|
|
168
|
+
return `<file name="${a.name}">\n${decoded}\n</file>`;
|
|
169
|
+
})
|
|
170
|
+
.join("\n\n");
|
|
171
|
+
finalPrompt = `${attachmentBlocks}\n\n${userPrompt}`;
|
|
172
|
+
}
|
|
173
|
+
console.log(`[ai] Attachments: ${context.attachments?.length ?? 0} total, ${images.length} image(s), ${textAttachments.length} text file(s)`, (context.attachments ?? []).map((a) => ({
|
|
174
|
+
name: a.name,
|
|
175
|
+
mimeType: a.mimeType,
|
|
176
|
+
contentLength: a.content?.length ?? 0,
|
|
177
|
+
})), "images →", images.map((img) => ({ mimeType: img.mimeType, dataLength: img.data?.length ?? 0 })));
|
|
178
|
+
const promptDone = agent
|
|
179
|
+
.prompt(finalPrompt, images.length > 0 ? images : undefined)
|
|
180
|
+
.then(() => {
|
|
181
|
+
console.log(`[ai] Agent prompt completed successfully`);
|
|
182
|
+
done = true;
|
|
183
|
+
// Wake up the waiting loop so it can check the done condition and exit.
|
|
184
|
+
// Using notify() instead of setResolver(() => {}) is critical: setResolver
|
|
185
|
+
// would orphan any pending Promise resolver, causing an infinite hang.
|
|
186
|
+
eventQueue.notify();
|
|
187
|
+
})
|
|
188
|
+
.catch((err) => {
|
|
189
|
+
const errMessage = err instanceof Error ? err.message : String(err);
|
|
190
|
+
console.error(`[ai] Agent prompt failed:`, {
|
|
191
|
+
error: errMessage,
|
|
192
|
+
errorType: err instanceof Error ? err.constructor.name : typeof err,
|
|
193
|
+
});
|
|
194
|
+
if (!eventQueue.errorOccurred) {
|
|
195
|
+
eventQueue.errorOccurred = true;
|
|
196
|
+
eventQueue.push({
|
|
197
|
+
type: "error",
|
|
198
|
+
content: errMessage,
|
|
199
|
+
error: {
|
|
200
|
+
code: getErrorCode(err) ?? "EXECUTION_ERROR",
|
|
201
|
+
message: errMessage,
|
|
202
|
+
details: {
|
|
203
|
+
stack: err instanceof Error ? err.stack : undefined,
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
done = true;
|
|
209
|
+
// Same fix: notify instead of replacing the resolver with a no-op.
|
|
210
|
+
eventQueue.notify();
|
|
211
|
+
});
|
|
212
|
+
try {
|
|
213
|
+
while (!done || eventQueue.length > 0) {
|
|
214
|
+
if (eventQueue.length > 0) {
|
|
215
|
+
yield eventQueue.shift();
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
await new Promise((resolve) => {
|
|
219
|
+
eventQueue.setResolver(resolve);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// When aborted, agent.abort() was already called in onAbort — skip waiting
|
|
224
|
+
// for the LLM response since it has been cancelled.
|
|
225
|
+
if (!aborted) {
|
|
226
|
+
await promptDone;
|
|
227
|
+
if (!eventQueue.errorOccurred && eventQueue.finalContent) {
|
|
228
|
+
console.log(`[ai] Yielding result, content length=${eventQueue.finalContent.length}`);
|
|
229
|
+
yield {
|
|
230
|
+
type: "result",
|
|
231
|
+
content: eventQueue.finalContent,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
else if (!eventQueue.errorOccurred) {
|
|
235
|
+
if (eventQueue.toolCallCount > 0) {
|
|
236
|
+
console.log(`[ai] ⚠️ Agent ended with no text content after ${eventQueue.toolCallCount} tool call(s). Emitting error event.`);
|
|
237
|
+
yield {
|
|
238
|
+
type: "error",
|
|
239
|
+
content: "The agent used tools but did not produce a response. The model may have run out of context or terminated unexpectedly. Please try again.",
|
|
240
|
+
error: {
|
|
241
|
+
code: "NO_CONTENT_AFTER_TOOLS",
|
|
242
|
+
message: "Agent terminated after tool calls without producing a text response",
|
|
243
|
+
details: { toolCallCount: eventQueue.toolCallCount },
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
console.log("[ai] ⚠️ Agent ended with no text content and no tool calls.");
|
|
249
|
+
yield {
|
|
250
|
+
type: "error",
|
|
251
|
+
content: `The model ${model} from ${providerName} did not provide a response to your prompt. Check your API key and balance and try again.`,
|
|
252
|
+
error: {
|
|
253
|
+
code: "NO_CONTENT_NO_TOOLS",
|
|
254
|
+
message: `The model ${model} from ${providerName} did not provide a response to your prompt.`,
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
console.error("[ai] eventQueue.errorOccurred", eventQueue.errorOccurred);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
console.log("[ai] Agent aborted by user, skipping result emission");
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
// Clean up signal listener
|
|
269
|
+
if (signal) {
|
|
270
|
+
signal.removeEventListener("abort", onAbort);
|
|
271
|
+
}
|
|
272
|
+
unsubscribe();
|
|
273
|
+
if (signal?.aborted) {
|
|
274
|
+
console.warn("[ai] Agent aborted by user");
|
|
275
|
+
}
|
|
276
|
+
agent.abort();
|
|
277
|
+
eventQueue.clearResolver();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
console.error("[ai] Error during execution:", error);
|
|
282
|
+
yield formatErrorEvent(error);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=agent.executor.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model resolver for Pi Agent
|
|
3
|
+
* Handles provider mapping and model resolution for different AI providers
|
|
4
|
+
*/
|
|
5
|
+
import { type Model, type Api, type KnownProvider } from "@mariozechner/pi-ai";
|
|
6
|
+
/**
|
|
7
|
+
* Maps provider names to Pi AI known provider identifiers
|
|
8
|
+
*/
|
|
9
|
+
export declare const PROVIDER_NAME_TO_PI: Record<string, KnownProvider>;
|
|
10
|
+
/**
|
|
11
|
+
* Determines the API type based on the provider's API URL
|
|
12
|
+
*/
|
|
13
|
+
export declare function determineApiType(apiUrl: string): "openai-completions" | "anthropic-messages";
|
|
14
|
+
/**
|
|
15
|
+
* Resolves a model configuration for the Pi Agent
|
|
16
|
+
* First attempts to use known providers from pi-ai registry,
|
|
17
|
+
* then falls back to creating a custom model configuration
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveModel(providerName: string, modelId: string, providerConfig: {
|
|
20
|
+
api: string | undefined;
|
|
21
|
+
}): Model<Api>;
|
|
22
|
+
//# sourceMappingURL=agent.model-resolver.d.ts.map
|