agiagent-dev 2026.1.36 → 2026.1.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/agiagent-tools.js +1 -0
- package/dist/agents/system-prompt.js +104 -1
- package/dist/agents/tools/browser-tool.d.ts +2 -0
- package/dist/agents/tools/browser-tool.js +24 -5
- package/dist/agents/workspace.d.ts +3 -1
- package/dist/agents/workspace.js +5 -0
- package/dist/auto-reply/reply/mentions.js +5 -1
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/cli/program/command-registry.js +5 -0
- package/dist/cli/program/register.connect-gmail.d.ts +2 -0
- package/dist/cli/program/register.connect-gmail.js +89 -0
- package/dist/cli/run-main.js +21 -1
- package/dist/config/plugin-auto-enable.js +5 -14
- package/dist/gateway/hosted-db.d.ts +29 -0
- package/dist/gateway/hosted-db.js +73 -0
- package/dist/gateway/hosted-telegram.js +5 -1
- package/dist/gateway/hosted-whatsapp.js +2 -3
- package/dist/gateway/server-methods/composio.d.ts +2 -0
- package/dist/gateway/server-methods/composio.js +120 -0
- package/dist/gateway/server-methods-list.js +2 -0
- package/dist/gateway/server-methods.js +4 -0
- package/dist/infra/composio.d.ts +21 -0
- package/dist/infra/composio.js +76 -0
- package/dist/infra/node-shell.js +6 -1
- package/extensions/bluebubbles/agiagent.plugin.json +9 -0
- package/extensions/bluebubbles/index.ts +19 -0
- package/extensions/bluebubbles/node_modules/.bin/agiagent +21 -0
- package/extensions/bluebubbles/package.json +36 -0
- package/extensions/bluebubbles/src/accounts.ts +88 -0
- package/extensions/bluebubbles/src/actions.test.ts +650 -0
- package/extensions/bluebubbles/src/actions.ts +438 -0
- package/extensions/bluebubbles/src/attachments.test.ts +345 -0
- package/extensions/bluebubbles/src/attachments.ts +300 -0
- package/extensions/bluebubbles/src/channel.ts +414 -0
- package/extensions/bluebubbles/src/chat.test.ts +461 -0
- package/extensions/bluebubbles/src/chat.ts +378 -0
- package/extensions/bluebubbles/src/config-schema.ts +51 -0
- package/extensions/bluebubbles/src/media-send.ts +174 -0
- package/extensions/bluebubbles/src/monitor.test.ts +2340 -0
- package/extensions/bluebubbles/src/monitor.ts +2469 -0
- package/extensions/bluebubbles/src/onboarding.ts +352 -0
- package/extensions/bluebubbles/src/probe.ts +135 -0
- package/extensions/bluebubbles/src/reactions.test.ts +392 -0
- package/extensions/bluebubbles/src/reactions.ts +188 -0
- package/extensions/bluebubbles/src/runtime.ts +14 -0
- package/extensions/bluebubbles/src/send.test.ts +808 -0
- package/extensions/bluebubbles/src/send.ts +467 -0
- package/extensions/bluebubbles/src/targets.test.ts +183 -0
- package/extensions/bluebubbles/src/targets.ts +422 -0
- package/extensions/bluebubbles/src/types.ts +127 -0
- package/extensions/copilot-proxy/README.md +24 -0
- package/extensions/copilot-proxy/agiagent.plugin.json +9 -0
- package/extensions/copilot-proxy/index.ts +148 -0
- package/extensions/copilot-proxy/node_modules/.bin/agiagent +21 -0
- package/extensions/copilot-proxy/package.json +14 -0
- package/extensions/diagnostics-otel/agiagent.plugin.json +8 -0
- package/extensions/diagnostics-otel/index.ts +15 -0
- package/extensions/diagnostics-otel/node_modules/.bin/agiagent +21 -0
- package/extensions/diagnostics-otel/package.json +27 -0
- package/extensions/diagnostics-otel/src/service.test.ts +226 -0
- package/extensions/diagnostics-otel/src/service.ts +635 -0
- package/extensions/discord/agiagent.plugin.json +9 -0
- package/extensions/discord/index.ts +17 -0
- package/extensions/discord/node_modules/.bin/agiagent +21 -0
- package/extensions/discord/package.json +14 -0
- package/extensions/discord/src/channel.ts +422 -0
- package/extensions/discord/src/runtime.ts +14 -0
- package/extensions/google-antigravity-auth/README.md +24 -0
- package/extensions/google-antigravity-auth/agiagent.plugin.json +9 -0
- package/extensions/google-antigravity-auth/index.ts +461 -0
- package/extensions/google-antigravity-auth/node_modules/.bin/agiagent +21 -0
- package/extensions/google-antigravity-auth/package.json +14 -0
- package/extensions/google-gemini-cli-auth/README.md +35 -0
- package/extensions/google-gemini-cli-auth/agiagent.plugin.json +9 -0
- package/extensions/google-gemini-cli-auth/index.ts +88 -0
- package/extensions/google-gemini-cli-auth/node_modules/.bin/agiagent +21 -0
- package/extensions/google-gemini-cli-auth/oauth.test.ts +240 -0
- package/extensions/google-gemini-cli-auth/oauth.ts +662 -0
- package/extensions/google-gemini-cli-auth/package.json +14 -0
- package/extensions/googlechat/agiagent.plugin.json +9 -0
- package/extensions/googlechat/index.ts +19 -0
- package/extensions/googlechat/node_modules/.bin/agiagent +21 -0
- package/extensions/googlechat/package.json +39 -0
- package/extensions/googlechat/src/accounts.ts +147 -0
- package/extensions/googlechat/src/actions.ts +181 -0
- package/extensions/googlechat/src/api.test.ts +61 -0
- package/extensions/googlechat/src/api.ts +282 -0
- package/extensions/googlechat/src/auth.ts +123 -0
- package/extensions/googlechat/src/channel.ts +583 -0
- package/extensions/googlechat/src/monitor.test.ts +22 -0
- package/extensions/googlechat/src/monitor.ts +949 -0
- package/extensions/googlechat/src/onboarding.ts +269 -0
- package/extensions/googlechat/src/runtime.ts +14 -0
- package/extensions/googlechat/src/targets.test.ts +32 -0
- package/extensions/googlechat/src/targets.ts +65 -0
- package/extensions/googlechat/src/types.config.ts +3 -0
- package/extensions/googlechat/src/types.ts +73 -0
- package/extensions/imessage/agiagent.plugin.json +9 -0
- package/extensions/imessage/index.ts +17 -0
- package/extensions/imessage/node_modules/.bin/agiagent +21 -0
- package/extensions/imessage/package.json +14 -0
- package/extensions/imessage/src/channel.ts +294 -0
- package/extensions/imessage/src/runtime.ts +14 -0
- package/extensions/line/agiagent.plugin.json +9 -0
- package/extensions/line/index.ts +19 -0
- package/extensions/line/node_modules/.bin/agiagent +21 -0
- package/extensions/line/package.json +29 -0
- package/extensions/line/src/card-command.ts +344 -0
- package/extensions/line/src/channel.logout.test.ts +97 -0
- package/extensions/line/src/channel.sendPayload.test.ts +306 -0
- package/extensions/line/src/channel.ts +781 -0
- package/extensions/line/src/runtime.ts +14 -0
- package/extensions/llm-task/README.md +97 -0
- package/extensions/llm-task/agiagent.plugin.json +21 -0
- package/extensions/llm-task/index.ts +6 -0
- package/extensions/llm-task/node_modules/.bin/agiagent +21 -0
- package/extensions/llm-task/package.json +14 -0
- package/extensions/llm-task/src/llm-task-tool.test.ts +124 -0
- package/extensions/llm-task/src/llm-task-tool.ts +237 -0
- package/extensions/lobster/README.md +75 -0
- package/extensions/lobster/SKILL.md +97 -0
- package/extensions/lobster/agiagent.plugin.json +10 -0
- package/extensions/lobster/index.ts +14 -0
- package/extensions/lobster/node_modules/.bin/agiagent +21 -0
- package/extensions/lobster/package.json +14 -0
- package/extensions/lobster/src/lobster-tool.test.ts +246 -0
- package/extensions/lobster/src/lobster-tool.ts +328 -0
- package/extensions/matrix/CHANGELOG.md +75 -0
- package/extensions/matrix/agiagent.plugin.json +9 -0
- package/extensions/matrix/index.ts +17 -0
- package/extensions/matrix/node_modules/.bin/agiagent +21 -0
- package/extensions/matrix/node_modules/.bin/markdown-it +21 -0
- package/extensions/matrix/package.json +36 -0
- package/extensions/matrix/src/actions.ts +195 -0
- package/extensions/matrix/src/channel.directory.test.ts +64 -0
- package/extensions/matrix/src/channel.ts +443 -0
- package/extensions/matrix/src/config-schema.ts +62 -0
- package/extensions/matrix/src/directory-live.ts +188 -0
- package/extensions/matrix/src/group-mentions.ts +66 -0
- package/extensions/matrix/src/matrix/accounts.test.ts +82 -0
- package/extensions/matrix/src/matrix/accounts.ts +65 -0
- package/extensions/matrix/src/matrix/actions/client.ts +57 -0
- package/extensions/matrix/src/matrix/actions/messages.ts +128 -0
- package/extensions/matrix/src/matrix/actions/pins.ts +76 -0
- package/extensions/matrix/src/matrix/actions/reactions.ts +96 -0
- package/extensions/matrix/src/matrix/actions/room.ts +85 -0
- package/extensions/matrix/src/matrix/actions/summary.ts +75 -0
- package/extensions/matrix/src/matrix/actions/types.ts +84 -0
- package/extensions/matrix/src/matrix/actions.ts +15 -0
- package/extensions/matrix/src/matrix/active-client.ts +11 -0
- package/extensions/matrix/src/matrix/client/config.ts +160 -0
- package/extensions/matrix/src/matrix/client/create-client.ts +123 -0
- package/extensions/matrix/src/matrix/client/logging.ts +36 -0
- package/extensions/matrix/src/matrix/client/runtime.ts +4 -0
- package/extensions/matrix/src/matrix/client/shared.ts +170 -0
- package/extensions/matrix/src/matrix/client/storage.ts +131 -0
- package/extensions/matrix/src/matrix/client/types.ts +34 -0
- package/extensions/matrix/src/matrix/client.test.ts +56 -0
- package/extensions/matrix/src/matrix/client.ts +5 -0
- package/extensions/matrix/src/matrix/credentials.ts +105 -0
- package/extensions/matrix/src/matrix/deps.ts +60 -0
- package/extensions/matrix/src/matrix/format.test.ts +33 -0
- package/extensions/matrix/src/matrix/format.ts +22 -0
- package/extensions/matrix/src/matrix/index.ts +11 -0
- package/extensions/matrix/src/matrix/monitor/allowlist.ts +62 -0
- package/extensions/matrix/src/matrix/monitor/auto-join.ts +71 -0
- package/extensions/matrix/src/matrix/monitor/direct.ts +104 -0
- package/extensions/matrix/src/matrix/monitor/events.ts +101 -0
- package/extensions/matrix/src/matrix/monitor/handler.ts +670 -0
- package/extensions/matrix/src/matrix/monitor/index.ts +291 -0
- package/extensions/matrix/src/matrix/monitor/location.ts +100 -0
- package/extensions/matrix/src/matrix/monitor/media.test.ts +102 -0
- package/extensions/matrix/src/matrix/monitor/media.ts +113 -0
- package/extensions/matrix/src/matrix/monitor/mentions.ts +31 -0
- package/extensions/matrix/src/matrix/monitor/replies.ts +97 -0
- package/extensions/matrix/src/matrix/monitor/room-info.ts +55 -0
- package/extensions/matrix/src/matrix/monitor/rooms.ts +48 -0
- package/extensions/matrix/src/matrix/monitor/threads.ts +68 -0
- package/extensions/matrix/src/matrix/monitor/types.ts +39 -0
- package/extensions/matrix/src/matrix/poll-types.test.ts +21 -0
- package/extensions/matrix/src/matrix/poll-types.ts +166 -0
- package/extensions/matrix/src/matrix/probe.ts +70 -0
- package/extensions/matrix/src/matrix/send/client.ts +66 -0
- package/extensions/matrix/src/matrix/send/formatting.ts +89 -0
- package/extensions/matrix/src/matrix/send/media.ts +229 -0
- package/extensions/matrix/src/matrix/send/targets.test.ts +98 -0
- package/extensions/matrix/src/matrix/send/targets.ts +136 -0
- package/extensions/matrix/src/matrix/send/types.ts +109 -0
- package/extensions/matrix/src/matrix/send.test.ts +171 -0
- package/extensions/matrix/src/matrix/send.ts +260 -0
- package/extensions/matrix/src/onboarding.ts +442 -0
- package/extensions/matrix/src/outbound.ts +52 -0
- package/extensions/matrix/src/resolve-targets.ts +89 -0
- package/extensions/matrix/src/runtime.ts +14 -0
- package/extensions/matrix/src/tool-actions.ts +164 -0
- package/extensions/matrix/src/types.ts +95 -0
- package/extensions/mattermost/agiagent.plugin.json +9 -0
- package/extensions/mattermost/index.ts +17 -0
- package/extensions/mattermost/node_modules/.bin/agiagent +21 -0
- package/extensions/mattermost/package.json +28 -0
- package/extensions/mattermost/src/channel.test.ts +48 -0
- package/extensions/mattermost/src/channel.ts +337 -0
- package/extensions/mattermost/src/config-schema.ts +55 -0
- package/extensions/mattermost/src/group-mentions.ts +15 -0
- package/extensions/mattermost/src/mattermost/accounts.ts +128 -0
- package/extensions/mattermost/src/mattermost/client.ts +220 -0
- package/extensions/mattermost/src/mattermost/index.ts +9 -0
- package/extensions/mattermost/src/mattermost/monitor-helpers.ts +166 -0
- package/extensions/mattermost/src/mattermost/monitor.ts +987 -0
- package/extensions/mattermost/src/mattermost/probe.ts +74 -0
- package/extensions/mattermost/src/mattermost/send.ts +231 -0
- package/extensions/mattermost/src/normalize.ts +46 -0
- package/extensions/mattermost/src/onboarding-helpers.ts +44 -0
- package/extensions/mattermost/src/onboarding.ts +186 -0
- package/extensions/mattermost/src/runtime.ts +14 -0
- package/extensions/mattermost/src/types.ts +50 -0
- package/extensions/memory-core/agiagent.plugin.json +9 -0
- package/extensions/memory-core/index.ts +38 -0
- package/extensions/memory-core/node_modules/.bin/agiagent +21 -0
- package/extensions/memory-core/package.json +17 -0
- package/extensions/memory-lancedb/agiagent.plugin.json +60 -0
- package/extensions/memory-lancedb/config.ts +139 -0
- package/extensions/memory-lancedb/index.test.ts +286 -0
- package/extensions/memory-lancedb/index.ts +608 -0
- package/extensions/memory-lancedb/node_modules/.bin/agiagent +21 -0
- package/extensions/memory-lancedb/node_modules/.bin/openai +21 -0
- package/extensions/memory-lancedb/package.json +19 -0
- package/extensions/minimax-portal-auth/README.md +33 -0
- package/extensions/minimax-portal-auth/agiagent.plugin.json +9 -0
- package/extensions/minimax-portal-auth/index.ts +155 -0
- package/extensions/minimax-portal-auth/node_modules/.bin/agiagent +21 -0
- package/extensions/minimax-portal-auth/oauth.ts +247 -0
- package/extensions/minimax-portal-auth/package.json +14 -0
- package/extensions/msteams/CHANGELOG.md +71 -0
- package/extensions/msteams/agiagent.plugin.json +9 -0
- package/extensions/msteams/index.ts +17 -0
- package/extensions/msteams/node_modules/.bin/agiagent +21 -0
- package/extensions/msteams/package.json +39 -0
- package/extensions/msteams/src/attachments/download.ts +238 -0
- package/extensions/msteams/src/attachments/graph.ts +351 -0
- package/extensions/msteams/src/attachments/html.ts +90 -0
- package/extensions/msteams/src/attachments/payload.ts +22 -0
- package/extensions/msteams/src/attachments/shared.ts +271 -0
- package/extensions/msteams/src/attachments/types.ts +37 -0
- package/extensions/msteams/src/attachments.test.ts +423 -0
- package/extensions/msteams/src/attachments.ts +18 -0
- package/extensions/msteams/src/channel.directory.test.ts +48 -0
- package/extensions/msteams/src/channel.ts +459 -0
- package/extensions/msteams/src/conversation-store-fs.test.ts +88 -0
- package/extensions/msteams/src/conversation-store-fs.ts +165 -0
- package/extensions/msteams/src/conversation-store-memory.ts +47 -0
- package/extensions/msteams/src/conversation-store.ts +41 -0
- package/extensions/msteams/src/directory-live.ts +205 -0
- package/extensions/msteams/src/errors.test.ts +45 -0
- package/extensions/msteams/src/errors.ts +190 -0
- package/extensions/msteams/src/file-consent-helpers.test.ts +243 -0
- package/extensions/msteams/src/file-consent-helpers.ts +73 -0
- package/extensions/msteams/src/file-consent.ts +126 -0
- package/extensions/msteams/src/graph-chat.ts +53 -0
- package/extensions/msteams/src/graph-upload.ts +453 -0
- package/extensions/msteams/src/inbound.test.ts +66 -0
- package/extensions/msteams/src/inbound.ts +48 -0
- package/extensions/msteams/src/index.ts +4 -0
- package/extensions/msteams/src/media-helpers.test.ts +189 -0
- package/extensions/msteams/src/media-helpers.ts +86 -0
- package/extensions/msteams/src/messenger.test.ts +248 -0
- package/extensions/msteams/src/messenger.ts +495 -0
- package/extensions/msteams/src/monitor-handler/inbound-media.ts +125 -0
- package/extensions/msteams/src/monitor-handler/message-handler.ts +639 -0
- package/extensions/msteams/src/monitor-handler.ts +162 -0
- package/extensions/msteams/src/monitor-types.ts +5 -0
- package/extensions/msteams/src/monitor.ts +295 -0
- package/extensions/msteams/src/onboarding.ts +431 -0
- package/extensions/msteams/src/outbound.ts +46 -0
- package/extensions/msteams/src/pending-uploads.ts +89 -0
- package/extensions/msteams/src/policy.test.ts +209 -0
- package/extensions/msteams/src/policy.ts +273 -0
- package/extensions/msteams/src/polls-store-memory.ts +32 -0
- package/extensions/msteams/src/polls-store.test.ts +38 -0
- package/extensions/msteams/src/polls.test.ts +72 -0
- package/extensions/msteams/src/polls.ts +315 -0
- package/extensions/msteams/src/probe.test.ts +58 -0
- package/extensions/msteams/src/probe.ts +107 -0
- package/extensions/msteams/src/reply-dispatcher.ts +130 -0
- package/extensions/msteams/src/resolve-allowlist.ts +297 -0
- package/extensions/msteams/src/runtime.ts +14 -0
- package/extensions/msteams/src/sdk-types.ts +19 -0
- package/extensions/msteams/src/sdk.ts +33 -0
- package/extensions/msteams/src/send-context.ts +164 -0
- package/extensions/msteams/src/send.ts +519 -0
- package/extensions/msteams/src/sent-message-cache.test.ts +15 -0
- package/extensions/msteams/src/sent-message-cache.ts +47 -0
- package/extensions/msteams/src/storage.ts +25 -0
- package/extensions/msteams/src/store-fs.ts +83 -0
- package/extensions/msteams/src/token.ts +19 -0
- package/extensions/nextcloud-talk/agiagent.plugin.json +9 -0
- package/extensions/nextcloud-talk/index.ts +17 -0
- package/extensions/nextcloud-talk/node_modules/.bin/agiagent +21 -0
- package/extensions/nextcloud-talk/package.json +33 -0
- package/extensions/nextcloud-talk/src/accounts.ts +174 -0
- package/extensions/nextcloud-talk/src/channel.ts +409 -0
- package/extensions/nextcloud-talk/src/config-schema.ts +78 -0
- package/extensions/nextcloud-talk/src/format.ts +79 -0
- package/extensions/nextcloud-talk/src/inbound.ts +320 -0
- package/extensions/nextcloud-talk/src/monitor.ts +246 -0
- package/extensions/nextcloud-talk/src/normalize.ts +39 -0
- package/extensions/nextcloud-talk/src/onboarding.ts +343 -0
- package/extensions/nextcloud-talk/src/policy.ts +188 -0
- package/extensions/nextcloud-talk/src/room-info.ts +125 -0
- package/extensions/nextcloud-talk/src/runtime.ts +14 -0
- package/extensions/nextcloud-talk/src/send.ts +210 -0
- package/extensions/nextcloud-talk/src/signature.ts +72 -0
- package/extensions/nextcloud-talk/src/types.ts +179 -0
- package/extensions/nostr/CHANGELOG.md +62 -0
- package/extensions/nostr/README.md +136 -0
- package/extensions/nostr/agiagent.plugin.json +9 -0
- package/extensions/nostr/index.ts +68 -0
- package/extensions/nostr/node_modules/.bin/agiagent +21 -0
- package/extensions/nostr/package.json +34 -0
- package/extensions/nostr/src/channel.test.ts +151 -0
- package/extensions/nostr/src/channel.ts +353 -0
- package/extensions/nostr/src/config-schema.ts +90 -0
- package/extensions/nostr/src/metrics.ts +478 -0
- package/extensions/nostr/src/nostr-bus.fuzz.test.ts +533 -0
- package/extensions/nostr/src/nostr-bus.integration.test.ts +448 -0
- package/extensions/nostr/src/nostr-bus.test.ts +199 -0
- package/extensions/nostr/src/nostr-bus.ts +715 -0
- package/extensions/nostr/src/nostr-profile-http.test.ts +378 -0
- package/extensions/nostr/src/nostr-profile-http.ts +519 -0
- package/extensions/nostr/src/nostr-profile-import.test.ts +119 -0
- package/extensions/nostr/src/nostr-profile-import.ts +262 -0
- package/extensions/nostr/src/nostr-profile.fuzz.test.ts +477 -0
- package/extensions/nostr/src/nostr-profile.test.ts +410 -0
- package/extensions/nostr/src/nostr-profile.ts +277 -0
- package/extensions/nostr/src/nostr-state-store.test.ts +131 -0
- package/extensions/nostr/src/nostr-state-store.ts +226 -0
- package/extensions/nostr/src/runtime.ts +14 -0
- package/extensions/nostr/src/seen-tracker.ts +303 -0
- package/extensions/nostr/src/types.test.ts +157 -0
- package/extensions/nostr/src/types.ts +101 -0
- package/extensions/nostr/test/setup.ts +5 -0
- package/extensions/open-prose/README.md +25 -0
- package/extensions/open-prose/agiagent.plugin.json +11 -0
- package/extensions/open-prose/index.ts +5 -0
- package/extensions/open-prose/node_modules/.bin/agiagent +21 -0
- package/extensions/open-prose/package.json +14 -0
- package/extensions/open-prose/skills/prose/LICENSE +21 -0
- package/extensions/open-prose/skills/prose/SKILL.md +323 -0
- package/extensions/open-prose/skills/prose/alt-borges.md +141 -0
- package/extensions/open-prose/skills/prose/alts/arabian-nights.md +358 -0
- package/extensions/open-prose/skills/prose/alts/borges.md +360 -0
- package/extensions/open-prose/skills/prose/alts/folk.md +322 -0
- package/extensions/open-prose/skills/prose/alts/homer.md +346 -0
- package/extensions/open-prose/skills/prose/alts/kafka.md +373 -0
- package/extensions/open-prose/skills/prose/compiler.md +2971 -0
- package/extensions/open-prose/skills/prose/examples/01-hello-world.prose +4 -0
- package/extensions/open-prose/skills/prose/examples/02-research-and-summarize.prose +6 -0
- package/extensions/open-prose/skills/prose/examples/03-code-review.prose +17 -0
- package/extensions/open-prose/skills/prose/examples/04-write-and-refine.prose +14 -0
- package/extensions/open-prose/skills/prose/examples/05-debug-issue.prose +20 -0
- package/extensions/open-prose/skills/prose/examples/06-explain-codebase.prose +17 -0
- package/extensions/open-prose/skills/prose/examples/07-refactor.prose +20 -0
- package/extensions/open-prose/skills/prose/examples/08-blog-post.prose +20 -0
- package/extensions/open-prose/skills/prose/examples/09-research-with-agents.prose +25 -0
- package/extensions/open-prose/skills/prose/examples/10-code-review-agents.prose +32 -0
- package/extensions/open-prose/skills/prose/examples/11-skills-and-imports.prose +27 -0
- package/extensions/open-prose/skills/prose/examples/12-secure-agent-permissions.prose +43 -0
- package/extensions/open-prose/skills/prose/examples/13-variables-and-context.prose +51 -0
- package/extensions/open-prose/skills/prose/examples/14-composition-blocks.prose +48 -0
- package/extensions/open-prose/skills/prose/examples/15-inline-sequences.prose +23 -0
- package/extensions/open-prose/skills/prose/examples/16-parallel-reviews.prose +19 -0
- package/extensions/open-prose/skills/prose/examples/17-parallel-research.prose +19 -0
- package/extensions/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose +36 -0
- package/extensions/open-prose/skills/prose/examples/19-advanced-parallel.prose +71 -0
- package/extensions/open-prose/skills/prose/examples/20-fixed-loops.prose +20 -0
- package/extensions/open-prose/skills/prose/examples/21-pipeline-operations.prose +35 -0
- package/extensions/open-prose/skills/prose/examples/22-error-handling.prose +51 -0
- package/extensions/open-prose/skills/prose/examples/23-retry-with-backoff.prose +63 -0
- package/extensions/open-prose/skills/prose/examples/24-choice-blocks.prose +86 -0
- package/extensions/open-prose/skills/prose/examples/25-conditionals.prose +114 -0
- package/extensions/open-prose/skills/prose/examples/26-parameterized-blocks.prose +100 -0
- package/extensions/open-prose/skills/prose/examples/27-string-interpolation.prose +105 -0
- package/extensions/open-prose/skills/prose/examples/28-automated-pr-review.prose +37 -0
- package/extensions/open-prose/skills/prose/examples/28-gas-town.prose +1572 -0
- package/extensions/open-prose/skills/prose/examples/29-captains-chair.prose +218 -0
- package/extensions/open-prose/skills/prose/examples/30-captains-chair-simple.prose +42 -0
- package/extensions/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose +145 -0
- package/extensions/open-prose/skills/prose/examples/33-pr-review-autofix.prose +168 -0
- package/extensions/open-prose/skills/prose/examples/34-content-pipeline.prose +204 -0
- package/extensions/open-prose/skills/prose/examples/35-feature-factory.prose +296 -0
- package/extensions/open-prose/skills/prose/examples/36-bug-hunter.prose +237 -0
- package/extensions/open-prose/skills/prose/examples/37-the-forge.prose +1474 -0
- package/extensions/open-prose/skills/prose/examples/38-skill-scan.prose +455 -0
- package/extensions/open-prose/skills/prose/examples/39-architect-by-simulation.prose +277 -0
- package/extensions/open-prose/skills/prose/examples/40-rlm-self-refine.prose +32 -0
- package/extensions/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose +38 -0
- package/extensions/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose +46 -0
- package/extensions/open-prose/skills/prose/examples/43-rlm-pairwise.prose +50 -0
- package/extensions/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose +261 -0
- package/extensions/open-prose/skills/prose/examples/45-plugin-release.prose +159 -0
- package/extensions/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose +637 -0
- package/extensions/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose +148 -0
- package/extensions/open-prose/skills/prose/examples/46-workflow-crystallizer.prose +225 -0
- package/extensions/open-prose/skills/prose/examples/47-language-self-improvement.prose +356 -0
- package/extensions/open-prose/skills/prose/examples/48-habit-miner.prose +445 -0
- package/extensions/open-prose/skills/prose/examples/49-prose-run-retrospective.prose +210 -0
- package/extensions/open-prose/skills/prose/examples/README.md +391 -0
- package/extensions/open-prose/skills/prose/examples/roadmap/README.md +22 -0
- package/extensions/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose +20 -0
- package/extensions/open-prose/skills/prose/examples/roadmap/parallel-review.prose +18 -0
- package/extensions/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose +17 -0
- package/extensions/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose +223 -0
- package/extensions/open-prose/skills/prose/guidance/antipatterns.md +951 -0
- package/extensions/open-prose/skills/prose/guidance/patterns.md +700 -0
- package/extensions/open-prose/skills/prose/guidance/system-prompt.md +180 -0
- package/extensions/open-prose/skills/prose/help.md +144 -0
- package/extensions/open-prose/skills/prose/lib/README.md +108 -0
- package/extensions/open-prose/skills/prose/lib/calibrator.prose +215 -0
- package/extensions/open-prose/skills/prose/lib/cost-analyzer.prose +174 -0
- package/extensions/open-prose/skills/prose/lib/error-forensics.prose +250 -0
- package/extensions/open-prose/skills/prose/lib/inspector.prose +196 -0
- package/extensions/open-prose/skills/prose/lib/profiler.prose +460 -0
- package/extensions/open-prose/skills/prose/lib/program-improver.prose +275 -0
- package/extensions/open-prose/skills/prose/lib/project-memory.prose +118 -0
- package/extensions/open-prose/skills/prose/lib/user-memory.prose +93 -0
- package/extensions/open-prose/skills/prose/lib/vm-improver.prose +243 -0
- package/extensions/open-prose/skills/prose/primitives/session.md +593 -0
- package/extensions/open-prose/skills/prose/prose.md +1237 -0
- package/extensions/open-prose/skills/prose/state/filesystem.md +498 -0
- package/extensions/open-prose/skills/prose/state/in-context.md +384 -0
- package/extensions/open-prose/skills/prose/state/postgres.md +880 -0
- package/extensions/open-prose/skills/prose/state/sqlite.md +574 -0
- package/extensions/qwen-portal-auth/README.md +24 -0
- package/extensions/qwen-portal-auth/agiagent.plugin.json +9 -0
- package/extensions/qwen-portal-auth/index.ts +130 -0
- package/extensions/qwen-portal-auth/oauth.ts +190 -0
- package/extensions/signal/agiagent.plugin.json +9 -0
- package/extensions/signal/index.ts +17 -0
- package/extensions/signal/node_modules/.bin/agiagent +21 -0
- package/extensions/signal/package.json +14 -0
- package/extensions/signal/src/channel.ts +315 -0
- package/extensions/signal/src/runtime.ts +14 -0
- package/extensions/slack/agiagent.plugin.json +9 -0
- package/extensions/slack/index.ts +17 -0
- package/extensions/slack/node_modules/.bin/agiagent +21 -0
- package/extensions/slack/package.json +14 -0
- package/extensions/slack/src/channel.ts +604 -0
- package/extensions/slack/src/runtime.ts +14 -0
- package/extensions/telegram/agiagent.plugin.json +9 -0
- package/extensions/telegram/index.ts +17 -0
- package/extensions/telegram/node_modules/.bin/agiagent +21 -0
- package/extensions/telegram/package.json +14 -0
- package/extensions/telegram/src/channel.ts +491 -0
- package/extensions/telegram/src/runtime.ts +14 -0
- package/extensions/tlon/README.md +5 -0
- package/extensions/tlon/agiagent.plugin.json +9 -0
- package/extensions/tlon/index.ts +17 -0
- package/extensions/tlon/node_modules/.bin/agiagent +21 -0
- package/extensions/tlon/package.json +33 -0
- package/extensions/tlon/src/channel.ts +392 -0
- package/extensions/tlon/src/config-schema.test.ts +31 -0
- package/extensions/tlon/src/config-schema.ts +43 -0
- package/extensions/tlon/src/monitor/discovery.ts +74 -0
- package/extensions/tlon/src/monitor/history.ts +88 -0
- package/extensions/tlon/src/monitor/index.ts +551 -0
- package/extensions/tlon/src/monitor/processed-messages.test.ts +23 -0
- package/extensions/tlon/src/monitor/processed-messages.ts +46 -0
- package/extensions/tlon/src/monitor/utils.ts +99 -0
- package/extensions/tlon/src/onboarding.ts +214 -0
- package/extensions/tlon/src/runtime.ts +14 -0
- package/extensions/tlon/src/targets.ts +89 -0
- package/extensions/tlon/src/types.ts +92 -0
- package/extensions/tlon/src/urbit/auth.ts +18 -0
- package/extensions/tlon/src/urbit/http-api.ts +38 -0
- package/extensions/tlon/src/urbit/send.test.ts +38 -0
- package/extensions/tlon/src/urbit/send.ts +131 -0
- package/extensions/tlon/src/urbit/sse-client.test.ts +40 -0
- package/extensions/tlon/src/urbit/sse-client.ts +379 -0
- package/extensions/twitch/CHANGELOG.md +33 -0
- package/extensions/twitch/README.md +89 -0
- package/extensions/twitch/agiagent.plugin.json +9 -0
- package/extensions/twitch/index.ts +19 -0
- package/extensions/twitch/node_modules/.bin/agiagent +21 -0
- package/extensions/twitch/package.json +20 -0
- package/extensions/twitch/src/access-control.test.ts +489 -0
- package/extensions/twitch/src/access-control.ts +162 -0
- package/extensions/twitch/src/actions.ts +173 -0
- package/extensions/twitch/src/client-manager-registry.ts +115 -0
- package/extensions/twitch/src/config-schema.ts +82 -0
- package/extensions/twitch/src/config.test.ts +87 -0
- package/extensions/twitch/src/config.ts +116 -0
- package/extensions/twitch/src/monitor.ts +261 -0
- package/extensions/twitch/src/onboarding.test.ts +311 -0
- package/extensions/twitch/src/onboarding.ts +417 -0
- package/extensions/twitch/src/outbound.test.ts +373 -0
- package/extensions/twitch/src/outbound.ts +186 -0
- package/extensions/twitch/src/plugin.test.ts +39 -0
- package/extensions/twitch/src/plugin.ts +274 -0
- package/extensions/twitch/src/probe.test.ts +195 -0
- package/extensions/twitch/src/probe.ts +120 -0
- package/extensions/twitch/src/resolver.ts +137 -0
- package/extensions/twitch/src/runtime.ts +14 -0
- package/extensions/twitch/src/send.test.ts +289 -0
- package/extensions/twitch/src/send.ts +136 -0
- package/extensions/twitch/src/status.test.ts +270 -0
- package/extensions/twitch/src/status.ts +178 -0
- package/extensions/twitch/src/token.test.ts +171 -0
- package/extensions/twitch/src/token.ts +91 -0
- package/extensions/twitch/src/twitch-client.test.ts +580 -0
- package/extensions/twitch/src/twitch-client.ts +277 -0
- package/extensions/twitch/src/types.ts +141 -0
- package/extensions/twitch/src/utils/markdown.ts +98 -0
- package/extensions/twitch/src/utils/twitch.ts +78 -0
- package/extensions/twitch/test/setup.ts +7 -0
- package/extensions/voice-call/CHANGELOG.md +97 -0
- package/extensions/voice-call/README.md +139 -0
- package/extensions/voice-call/agiagent.plugin.json +559 -0
- package/extensions/voice-call/index.ts +493 -0
- package/extensions/voice-call/node_modules/.bin/agiagent +21 -0
- package/extensions/voice-call/package.json +19 -0
- package/extensions/voice-call/src/cli.ts +279 -0
- package/extensions/voice-call/src/config.test.ts +201 -0
- package/extensions/voice-call/src/config.ts +480 -0
- package/extensions/voice-call/src/core-bridge.ts +200 -0
- package/extensions/voice-call/src/manager/context.ts +21 -0
- package/extensions/voice-call/src/manager/events.ts +186 -0
- package/extensions/voice-call/src/manager/lookup.ts +35 -0
- package/extensions/voice-call/src/manager/outbound.ts +275 -0
- package/extensions/voice-call/src/manager/state.ts +48 -0
- package/extensions/voice-call/src/manager/store.ts +91 -0
- package/extensions/voice-call/src/manager/timers.ts +89 -0
- package/extensions/voice-call/src/manager/twiml.ts +9 -0
- package/extensions/voice-call/src/manager.test.ts +105 -0
- package/extensions/voice-call/src/manager.ts +866 -0
- package/extensions/voice-call/src/media-stream.test.ts +96 -0
- package/extensions/voice-call/src/media-stream.ts +379 -0
- package/extensions/voice-call/src/providers/base.ts +67 -0
- package/extensions/voice-call/src/providers/index.ts +10 -0
- package/extensions/voice-call/src/providers/mock.ts +165 -0
- package/extensions/voice-call/src/providers/plivo.test.ts +27 -0
- package/extensions/voice-call/src/providers/plivo.ts +502 -0
- package/extensions/voice-call/src/providers/stt-openai-realtime.ts +311 -0
- package/extensions/voice-call/src/providers/telnyx.ts +358 -0
- package/extensions/voice-call/src/providers/tts-openai.ts +259 -0
- package/extensions/voice-call/src/providers/twilio/api.ts +42 -0
- package/extensions/voice-call/src/providers/twilio/webhook.ts +28 -0
- package/extensions/voice-call/src/providers/twilio.test.ts +60 -0
- package/extensions/voice-call/src/providers/twilio.ts +583 -0
- package/extensions/voice-call/src/response-generator.ts +158 -0
- package/extensions/voice-call/src/runtime.ts +204 -0
- package/extensions/voice-call/src/telephony-audio.ts +90 -0
- package/extensions/voice-call/src/telephony-tts.ts +104 -0
- package/extensions/voice-call/src/tunnel.ts +314 -0
- package/extensions/voice-call/src/types.ts +272 -0
- package/extensions/voice-call/src/utils.ts +14 -0
- package/extensions/voice-call/src/voice-mapping.ts +67 -0
- package/extensions/voice-call/src/webhook-security.test.ts +251 -0
- package/extensions/voice-call/src/webhook-security.ts +465 -0
- package/extensions/voice-call/src/webhook.ts +456 -0
- package/extensions/whatsapp/agiagent.plugin.json +9 -0
- package/extensions/whatsapp/index.ts +17 -0
- package/extensions/whatsapp/node_modules/.bin/agiagent +21 -0
- package/extensions/whatsapp/package.json +14 -0
- package/extensions/whatsapp/src/channel.ts +508 -0
- package/extensions/whatsapp/src/runtime.ts +14 -0
- package/extensions/zalo/CHANGELOG.md +77 -0
- package/extensions/zalo/README.md +50 -0
- package/extensions/zalo/agiagent.plugin.json +9 -0
- package/extensions/zalo/index.ts +19 -0
- package/extensions/zalo/node_modules/.bin/agiagent +21 -0
- package/extensions/zalo/package.json +36 -0
- package/extensions/zalo/src/accounts.ts +80 -0
- package/extensions/zalo/src/actions.ts +67 -0
- package/extensions/zalo/src/api.ts +208 -0
- package/extensions/zalo/src/channel.directory.test.ts +43 -0
- package/extensions/zalo/src/channel.ts +414 -0
- package/extensions/zalo/src/config-schema.ts +24 -0
- package/extensions/zalo/src/monitor.ts +753 -0
- package/extensions/zalo/src/monitor.webhook.test.ts +73 -0
- package/extensions/zalo/src/onboarding.ts +401 -0
- package/extensions/zalo/src/probe.ts +46 -0
- package/extensions/zalo/src/proxy.ts +21 -0
- package/extensions/zalo/src/runtime.ts +14 -0
- package/extensions/zalo/src/send.ts +124 -0
- package/extensions/zalo/src/status-issues.ts +53 -0
- package/extensions/zalo/src/token.ts +63 -0
- package/extensions/zalo/src/types.ts +42 -0
- package/extensions/zalouser/CHANGELOG.md +49 -0
- package/extensions/zalouser/README.md +225 -0
- package/extensions/zalouser/agiagent.plugin.json +9 -0
- package/extensions/zalouser/index.ts +31 -0
- package/extensions/zalouser/node_modules/.bin/agiagent +21 -0
- package/extensions/zalouser/package.json +36 -0
- package/extensions/zalouser/src/accounts.ts +135 -0
- package/extensions/zalouser/src/channel.test.ts +18 -0
- package/extensions/zalouser/src/channel.ts +686 -0
- package/extensions/zalouser/src/config-schema.ts +27 -0
- package/extensions/zalouser/src/monitor.ts +590 -0
- package/extensions/zalouser/src/onboarding.ts +504 -0
- package/extensions/zalouser/src/probe.ts +28 -0
- package/extensions/zalouser/src/runtime.ts +14 -0
- package/extensions/zalouser/src/send.ts +160 -0
- package/extensions/zalouser/src/status-issues.test.ts +57 -0
- package/extensions/zalouser/src/status-issues.ts +89 -0
- package/extensions/zalouser/src/tool.ts +164 -0
- package/extensions/zalouser/src/types.ts +108 -0
- package/extensions/zalouser/src/zca.ts +202 -0
- package/package.json +2 -1
|
@@ -72,6 +72,20 @@ function buildReplyTagsSection(isMinimal) {
|
|
|
72
72
|
"",
|
|
73
73
|
];
|
|
74
74
|
}
|
|
75
|
+
function buildOutputFormattingSection(params) {
|
|
76
|
+
if (params.isMinimal) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
return [
|
|
80
|
+
"## Output Formatting (mandatory)",
|
|
81
|
+
"User-visible replies must be plain, easy-to-render text:",
|
|
82
|
+
"- ASCII only (no emojis, no Unicode bullets, no special symbols).",
|
|
83
|
+
"- Avoid Markdown formatting (no bold/italics/headers/tables).",
|
|
84
|
+
"- Prefer short paragraphs and simple lists using `1.` / `2.` or `-` (ASCII hyphen).",
|
|
85
|
+
'- Use normal quotes and dashes only: `"` and `-` (avoid smart quotes and en/em dashes).',
|
|
86
|
+
"",
|
|
87
|
+
];
|
|
88
|
+
}
|
|
75
89
|
function buildMessagingSection(params) {
|
|
76
90
|
if (params.isMinimal) {
|
|
77
91
|
return [];
|
|
@@ -129,6 +143,85 @@ function buildDocsSection(params) {
|
|
|
129
143
|
"",
|
|
130
144
|
];
|
|
131
145
|
}
|
|
146
|
+
function buildResumeTailoringSection(params) {
|
|
147
|
+
if (params.isMinimal) {
|
|
148
|
+
return [];
|
|
149
|
+
}
|
|
150
|
+
return [
|
|
151
|
+
"## Resume Tailoring (mandatory)",
|
|
152
|
+
"When the user asks to tailor/customize/update a resume (.docx) for a job description/link:",
|
|
153
|
+
`- ALWAYS use the \`resume-docx\` skill if available. First, read its SKILL.md with \`${params.readToolName}\`, then follow it exactly (extract -> patch -> apply).`,
|
|
154
|
+
"- NEVER use the generic `docx` skill for resume tailoring. If you did, that is a mistake; redo using `resume-docx`.",
|
|
155
|
+
"- Goal: maximize ATS match while preserving the resume's structure and the candidate's overall identity (do not rewrite the entire resume into a different persona).",
|
|
156
|
+
"",
|
|
157
|
+
"Hard rules:",
|
|
158
|
+
"- Do NOT rewrite ABOUT ME, the title/header, or any existing bullets unless the user explicitly asks for a rewrite.",
|
|
159
|
+
"- Do NOT create new tables/sections. Do NOT add a second Category|Skills header row.",
|
|
160
|
+
"- Do NOT shorten existing bullets. New bullets must be similar in length/style to nearby bullets (avoid short one-liners).",
|
|
161
|
+
"- New bullets MUST be real list items (numbered/bulleted). If additions appear as plain paragraphs, redo using `resume-docx` so list numbering is cloned correctly.",
|
|
162
|
+
"- Tailoring is additive: keep all existing content, and append a small number of JD-aligned additions.",
|
|
163
|
+
"",
|
|
164
|
+
"Allowed changes (additive only):",
|
|
165
|
+
"- Skills table: add missing skills by merging into existing categories or appending normal rows to the existing skills table.",
|
|
166
|
+
"- PROFESSIONAL SUMMARY: append up to 4 new bullets (keep all existing bullets; do not replace).",
|
|
167
|
+
"- PROFESSIONAL EXPERIENCE: append up to 4 new bullets per relevant experience block (keep all existing bullets; do not replace).",
|
|
168
|
+
'- Do not ask the user to say "rewrite bullets". If they asked to tailor the resume, update skills + summary bullets + experience bullets by default.',
|
|
169
|
+
"- ATS: include key JD skills/keywords even if the original resume did not mention them; add them to the skills table and add corresponding experience bullets.",
|
|
170
|
+
"",
|
|
171
|
+
];
|
|
172
|
+
}
|
|
173
|
+
function buildJobApplicationsSection(params) {
|
|
174
|
+
if (params.isMinimal) {
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
const hasBrowser = params.availableTools.has("browser");
|
|
178
|
+
return [
|
|
179
|
+
"## Job Applications (mandatory)",
|
|
180
|
+
"AGIAgent is a job-seeker assistant. Treat user messages as application workflow triggers.",
|
|
181
|
+
"",
|
|
182
|
+
"### Normalize the user's input (required)",
|
|
183
|
+
"User input can be any combination of:",
|
|
184
|
+
"- A job description (JD) pasted as text",
|
|
185
|
+
"- An email thread/paste (the JD is embedded)",
|
|
186
|
+
"- A job link (open it, read the JD)",
|
|
187
|
+
'- A directive like "apply to the latest jobs on <site> with these filters"',
|
|
188
|
+
"",
|
|
189
|
+
"Always produce a short plan with the minimum missing inputs, then execute.",
|
|
190
|
+
"",
|
|
191
|
+
"### Required inputs (ask only if missing)",
|
|
192
|
+
"- Resume path (.docx) OR ask the user to provide it.",
|
|
193
|
+
"- Confirmation policy: If user intent is clearly to submit/apply/send, proceed. If ambiguous, ask a 1-line confirmation.",
|
|
194
|
+
"",
|
|
195
|
+
"### Intent rules for auto-submit",
|
|
196
|
+
"Proceed without extra confirmation when the user says (or clearly implies) any of:",
|
|
197
|
+
'- "apply", "submit", "go ahead", "send it", "do it", "yes proceed", "go ahead and apply"',
|
|
198
|
+
"If the user is not explicit, stop at a draft/ready-to-submit state and ask.",
|
|
199
|
+
"",
|
|
200
|
+
"### Execution defaults",
|
|
201
|
+
"- Always tailor the resume to the JD (use the resume-docx skill; see Resume Tailoring section).",
|
|
202
|
+
"- If the JD includes a recruiter email: draft the email in Gmail and attach the tailored resume.",
|
|
203
|
+
"- If the link is an application form: fill the form, attach the tailored resume, and submit based on intent rules.",
|
|
204
|
+
"",
|
|
205
|
+
"### Missing form fields",
|
|
206
|
+
"If you do not know an answer for an application field:",
|
|
207
|
+
"- Ask the user the smallest possible set of questions to continue (batch them).",
|
|
208
|
+
"- Remember durable answers in a workspace file `CAREER_PROFILE.json` (main session only).",
|
|
209
|
+
"- Never guess sensitive facts (legal name, address, work authorization, compensation). Ask.",
|
|
210
|
+
"",
|
|
211
|
+
...(hasBrowser
|
|
212
|
+
? [
|
|
213
|
+
"### Browser requirements",
|
|
214
|
+
"- Use the browser tool to open links, read JDs, draft Gmail, and fill portals.",
|
|
215
|
+
"- For file uploads: arm upload via the browser upload hook, then click the site upload control.",
|
|
216
|
+
"",
|
|
217
|
+
]
|
|
218
|
+
: [
|
|
219
|
+
"### Browser requirements",
|
|
220
|
+
"- Browser tool is unavailable in this session. You can still tailor the resume, but you must ask the user to handle drafting/submission manually or switch to a session with browser access.",
|
|
221
|
+
"",
|
|
222
|
+
]),
|
|
223
|
+
];
|
|
224
|
+
}
|
|
132
225
|
export function buildAgentSystemPrompt(params) {
|
|
133
226
|
const coreToolSummaries = {
|
|
134
227
|
read: "Read file contents",
|
|
@@ -264,6 +357,13 @@ export function buildAgentSystemPrompt(params) {
|
|
|
264
357
|
isMinimal,
|
|
265
358
|
readToolName,
|
|
266
359
|
});
|
|
360
|
+
const resumeTailoringSection = buildResumeTailoringSection({ isMinimal, readToolName });
|
|
361
|
+
const jobApplicationsSection = buildJobApplicationsSection({
|
|
362
|
+
isMinimal,
|
|
363
|
+
availableTools,
|
|
364
|
+
readToolName,
|
|
365
|
+
});
|
|
366
|
+
const outputFormattingSection = buildOutputFormattingSection({ isMinimal });
|
|
267
367
|
const workspaceNotes = (params.workspaceNotes ?? []).map((note) => note.trim()).filter(Boolean);
|
|
268
368
|
// For "none" mode, return just the basic identity line
|
|
269
369
|
if (promptMode === "none") {
|
|
@@ -314,6 +414,9 @@ export function buildAgentSystemPrompt(params) {
|
|
|
314
414
|
"",
|
|
315
415
|
...skillsSection,
|
|
316
416
|
...memorySection,
|
|
417
|
+
...resumeTailoringSection,
|
|
418
|
+
...jobApplicationsSection,
|
|
419
|
+
...outputFormattingSection,
|
|
317
420
|
// File type guidance for document handling
|
|
318
421
|
!isMinimal ? "## File Type Guidance" : "",
|
|
319
422
|
!isMinimal
|
|
@@ -466,7 +569,7 @@ export function buildAgentSystemPrompt(params) {
|
|
|
466
569
|
}
|
|
467
570
|
// Skip silent replies for subagent/none modes
|
|
468
571
|
if (!isMinimal) {
|
|
469
|
-
lines.push("## Silent Replies", `When you have nothing to say, respond with ONLY: ${SILENT_REPLY_TOKEN}`, "", "
|
|
572
|
+
lines.push("## Silent Replies", `When you have nothing to say, respond with ONLY: ${SILENT_REPLY_TOKEN}`, "", "Rules:", "- It must be your ENTIRE message - nothing else", `- Never append it to an actual response (never include "${SILENT_REPLY_TOKEN}" in real replies)`, "- Never wrap it in markdown or code blocks", "", `Wrong: "Here's help... ${SILENT_REPLY_TOKEN}"`, `Wrong: "${SILENT_REPLY_TOKEN}"`, `Right: ${SILENT_REPLY_TOKEN}`, "");
|
|
470
573
|
}
|
|
471
574
|
// Skip heartbeats for subagent/none modes
|
|
472
575
|
if (!isMinimal) {
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { type AGIAgentConfig } from "../../config/config.js";
|
|
1
2
|
import { type AnyAgentTool } from "./common.js";
|
|
2
3
|
export declare function createBrowserTool(opts?: {
|
|
3
4
|
sandboxBridgeUrl?: string;
|
|
4
5
|
allowHostControl?: boolean;
|
|
6
|
+
config?: AGIAgentConfig;
|
|
5
7
|
}): AnyAgentTool;
|
|
@@ -15,8 +15,9 @@ function isBrowserNode(node) {
|
|
|
15
15
|
const commands = Array.isArray(node.commands) ? node.commands : [];
|
|
16
16
|
return caps.includes("browser") || commands.includes("browser.proxy");
|
|
17
17
|
}
|
|
18
|
+
const HOSTED_BROWSER_REQUIRED_MESSAGE = "No connected device for browser control. Ask the user to run `agiagent connect --token <token>` on their device and keep it running.";
|
|
18
19
|
async function resolveBrowserNodeTarget(params) {
|
|
19
|
-
const cfg = loadConfig();
|
|
20
|
+
const cfg = params.config ?? loadConfig();
|
|
20
21
|
const policy = cfg.gateway?.nodes?.browser;
|
|
21
22
|
const mode = policy?.mode ?? "auto";
|
|
22
23
|
// In hosted mode, prefer node browser since there's no local browser on the gateway
|
|
@@ -57,13 +58,25 @@ async function resolveBrowserNodeTarget(params) {
|
|
|
57
58
|
}
|
|
58
59
|
// In hosted mode, we need a node browser but none available
|
|
59
60
|
if (isHostedMode) {
|
|
60
|
-
throw new Error(
|
|
61
|
+
throw new Error(HOSTED_BROWSER_REQUIRED_MESSAGE);
|
|
61
62
|
}
|
|
62
63
|
return null;
|
|
63
64
|
}
|
|
64
65
|
const requested = params.requestedNode?.trim() || policy?.node?.trim();
|
|
66
|
+
if (isHostedMode && !requested) {
|
|
67
|
+
throw new Error(HOSTED_BROWSER_REQUIRED_MESSAGE);
|
|
68
|
+
}
|
|
65
69
|
if (requested) {
|
|
66
|
-
|
|
70
|
+
let nodeId;
|
|
71
|
+
try {
|
|
72
|
+
nodeId = resolveNodeIdFromList(browserNodes, requested, false);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
if (isHostedMode) {
|
|
76
|
+
throw new Error(HOSTED_BROWSER_REQUIRED_MESSAGE, { cause: err });
|
|
77
|
+
}
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
67
80
|
const node = browserNodes.find((entry) => entry.nodeId === nodeId);
|
|
68
81
|
return { nodeId, label: node?.displayName ?? node?.remoteIp ?? nodeId };
|
|
69
82
|
}
|
|
@@ -141,10 +154,13 @@ function applyProxyPaths(result, mapping) {
|
|
|
141
154
|
}
|
|
142
155
|
}
|
|
143
156
|
function resolveBrowserBaseUrl(params) {
|
|
144
|
-
const cfg = loadConfig();
|
|
157
|
+
const cfg = params.config ?? loadConfig();
|
|
145
158
|
const resolved = resolveBrowserConfig(cfg.browser, cfg);
|
|
146
159
|
const normalizedSandbox = params.sandboxBridgeUrl?.trim() ?? "";
|
|
147
160
|
const target = params.target ?? (normalizedSandbox ? "sandbox" : "host");
|
|
161
|
+
if (process.env.AGIAGENT_HOSTED_MODE === "1" && target === "host") {
|
|
162
|
+
throw new Error(HOSTED_BROWSER_REQUIRED_MESSAGE);
|
|
163
|
+
}
|
|
148
164
|
if (target === "sandbox") {
|
|
149
165
|
if (!normalizedSandbox) {
|
|
150
166
|
throw new Error('Sandbox browser is unavailable. Enable agents.defaults.sandbox.browser.enabled or use target="host" if allowed.');
|
|
@@ -167,7 +183,8 @@ export function createBrowserTool(opts) {
|
|
|
167
183
|
name: "browser",
|
|
168
184
|
description: [
|
|
169
185
|
"Control the browser via AGIAgent's browser control server (status/start/stop/profiles/tabs/open/snapshot/screenshot/actions/list_upload_inputs/attach_file).",
|
|
170
|
-
'
|
|
186
|
+
'Default profile: profile="agiagent" (isolated agiagent-managed browser).',
|
|
187
|
+
'Chrome extension relay profile: profile="chrome" (attach to an existing Chrome tab via the AGIAgent Chrome extension). Use only when explicitly needed.',
|
|
171
188
|
'When a node-hosted browser proxy is available, the tool may auto-route to it. Pin a node with node=<id|name> or target="node".',
|
|
172
189
|
"When using refs from snapshot (e.g. e12), keep the same tab: prefer passing targetId from the snapshot response into subsequent actions (act/click/type/etc).",
|
|
173
190
|
'For stable, self-resolving refs across calls, use snapshot with refs="aria" (Playwright aria-ref ids). Default refs="role" are role+name-based.',
|
|
@@ -193,6 +210,7 @@ export function createBrowserTool(opts) {
|
|
|
193
210
|
requestedNode: requestedNode ?? undefined,
|
|
194
211
|
target,
|
|
195
212
|
sandboxBridgeUrl: opts?.sandboxBridgeUrl,
|
|
213
|
+
config: opts?.config,
|
|
196
214
|
});
|
|
197
215
|
const resolvedTarget = target === "node" ? undefined : target;
|
|
198
216
|
const baseUrl = nodeTarget
|
|
@@ -201,6 +219,7 @@ export function createBrowserTool(opts) {
|
|
|
201
219
|
target: resolvedTarget,
|
|
202
220
|
sandboxBridgeUrl: opts?.sandboxBridgeUrl,
|
|
203
221
|
allowHostControl: opts?.allowHostControl,
|
|
222
|
+
config: opts?.config,
|
|
204
223
|
});
|
|
205
224
|
const proxyRequest = nodeTarget
|
|
206
225
|
? async (opts) => {
|
|
@@ -9,7 +9,8 @@ export declare const DEFAULT_HEARTBEAT_FILENAME = "HEARTBEAT.md";
|
|
|
9
9
|
export declare const DEFAULT_BOOTSTRAP_FILENAME = "BOOTSTRAP.md";
|
|
10
10
|
export declare const DEFAULT_MEMORY_FILENAME = "MEMORY.md";
|
|
11
11
|
export declare const DEFAULT_MEMORY_ALT_FILENAME = "memory.md";
|
|
12
|
-
export
|
|
12
|
+
export declare const DEFAULT_CAREER_PROFILE_FILENAME = "CAREER_PROFILE.json";
|
|
13
|
+
export type WorkspaceBootstrapFileName = typeof DEFAULT_AGENTS_FILENAME | typeof DEFAULT_SOUL_FILENAME | typeof DEFAULT_TOOLS_FILENAME | typeof DEFAULT_IDENTITY_FILENAME | typeof DEFAULT_USER_FILENAME | typeof DEFAULT_HEARTBEAT_FILENAME | typeof DEFAULT_BOOTSTRAP_FILENAME | typeof DEFAULT_MEMORY_FILENAME | typeof DEFAULT_MEMORY_ALT_FILENAME | typeof DEFAULT_CAREER_PROFILE_FILENAME;
|
|
13
14
|
export type WorkspaceBootstrapFile = {
|
|
14
15
|
name: WorkspaceBootstrapFileName;
|
|
15
16
|
path: string;
|
|
@@ -28,6 +29,7 @@ export declare function ensureAgentWorkspace(params?: {
|
|
|
28
29
|
userPath?: string;
|
|
29
30
|
heartbeatPath?: string;
|
|
30
31
|
bootstrapPath?: string;
|
|
32
|
+
careerProfilePath?: string;
|
|
31
33
|
}>;
|
|
32
34
|
export declare function loadWorkspaceBootstrapFiles(dir: string): Promise<WorkspaceBootstrapFile[]>;
|
|
33
35
|
export declare function filterBootstrapFilesForSession(files: WorkspaceBootstrapFile[], sessionKey?: string): WorkspaceBootstrapFile[];
|
package/dist/agents/workspace.js
CHANGED
|
@@ -22,6 +22,7 @@ export const DEFAULT_HEARTBEAT_FILENAME = "HEARTBEAT.md";
|
|
|
22
22
|
export const DEFAULT_BOOTSTRAP_FILENAME = "BOOTSTRAP.md";
|
|
23
23
|
export const DEFAULT_MEMORY_FILENAME = "MEMORY.md";
|
|
24
24
|
export const DEFAULT_MEMORY_ALT_FILENAME = "memory.md";
|
|
25
|
+
export const DEFAULT_CAREER_PROFILE_FILENAME = "CAREER_PROFILE.json";
|
|
25
26
|
function stripFrontMatter(content) {
|
|
26
27
|
if (!content.startsWith("---")) {
|
|
27
28
|
return content;
|
|
@@ -109,6 +110,7 @@ export async function ensureAgentWorkspace(params) {
|
|
|
109
110
|
const userPath = path.join(dir, DEFAULT_USER_FILENAME);
|
|
110
111
|
const heartbeatPath = path.join(dir, DEFAULT_HEARTBEAT_FILENAME);
|
|
111
112
|
const bootstrapPath = path.join(dir, DEFAULT_BOOTSTRAP_FILENAME);
|
|
113
|
+
const careerProfilePath = path.join(dir, DEFAULT_CAREER_PROFILE_FILENAME);
|
|
112
114
|
const isBrandNewWorkspace = await (async () => {
|
|
113
115
|
const paths = [agentsPath, soulPath, toolsPath, identityPath, userPath, heartbeatPath];
|
|
114
116
|
const existing = await Promise.all(paths.map(async (p) => {
|
|
@@ -129,12 +131,14 @@ export async function ensureAgentWorkspace(params) {
|
|
|
129
131
|
const userTemplate = await loadTemplate(DEFAULT_USER_FILENAME);
|
|
130
132
|
const heartbeatTemplate = await loadTemplate(DEFAULT_HEARTBEAT_FILENAME);
|
|
131
133
|
const bootstrapTemplate = await loadTemplate(DEFAULT_BOOTSTRAP_FILENAME);
|
|
134
|
+
const careerProfileTemplate = await loadTemplate(DEFAULT_CAREER_PROFILE_FILENAME);
|
|
132
135
|
await writeFileIfMissing(agentsPath, agentsTemplate);
|
|
133
136
|
await writeFileIfMissing(soulPath, soulTemplate);
|
|
134
137
|
await writeFileIfMissing(toolsPath, toolsTemplate);
|
|
135
138
|
await writeFileIfMissing(identityPath, identityTemplate);
|
|
136
139
|
await writeFileIfMissing(userPath, userTemplate);
|
|
137
140
|
await writeFileIfMissing(heartbeatPath, heartbeatTemplate);
|
|
141
|
+
await writeFileIfMissing(careerProfilePath, careerProfileTemplate);
|
|
138
142
|
if (isBrandNewWorkspace) {
|
|
139
143
|
await writeFileIfMissing(bootstrapPath, bootstrapTemplate);
|
|
140
144
|
}
|
|
@@ -148,6 +152,7 @@ export async function ensureAgentWorkspace(params) {
|
|
|
148
152
|
userPath,
|
|
149
153
|
heartbeatPath,
|
|
150
154
|
bootstrapPath,
|
|
155
|
+
careerProfilePath,
|
|
151
156
|
};
|
|
152
157
|
}
|
|
153
158
|
async function resolveMemoryBootstrapEntries(resolvedDir) {
|
|
@@ -59,7 +59,11 @@ export function buildMentionRegexes(cfg, agentId) {
|
|
|
59
59
|
.filter((value) => Boolean(value));
|
|
60
60
|
}
|
|
61
61
|
export function normalizeMentionText(text) {
|
|
62
|
-
|
|
62
|
+
const cleaned = (text ?? "")
|
|
63
|
+
.replace(/[\u200b-\u200f\u202a-\u202e\u2060-\u206f]/g, "")
|
|
64
|
+
.toLowerCase();
|
|
65
|
+
// Back-compat: legacy name used in older configs/patterns.
|
|
66
|
+
return cleaned.replace(/\bopenclaw\b/g, "agiagent");
|
|
63
67
|
}
|
|
64
68
|
export function matchesMentionPatterns(text, mentionRegexes) {
|
|
65
69
|
if (mentionRegexes.length === 0) {
|
package/dist/build-info.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
cbf54e0ae626d938f4667e93e788fd7ea04b7dac63d934f0c14d3ab4930fdbb4
|
|
@@ -9,6 +9,7 @@ import { registerConfigCli } from "../config-cli.js";
|
|
|
9
9
|
import { registerMemoryCli, runMemoryStatus } from "../memory-cli.js";
|
|
10
10
|
import { registerAgentCommands } from "./register.agent.js";
|
|
11
11
|
import { registerConfigureCommand } from "./register.configure.js";
|
|
12
|
+
import { registerConnectGmailCommand } from "./register.connect-gmail.js";
|
|
12
13
|
import { registerMaintenanceCommands } from "./register.maintenance.js";
|
|
13
14
|
import { registerMessageCommands } from "./register.message.js";
|
|
14
15
|
import { registerOnboardCommand } from "./register.onboard.js";
|
|
@@ -87,6 +88,10 @@ const routeMemoryStatus = {
|
|
|
87
88
|
},
|
|
88
89
|
};
|
|
89
90
|
export const commandRegistry = [
|
|
91
|
+
{
|
|
92
|
+
id: "connect-gmail",
|
|
93
|
+
register: ({ program }) => registerConnectGmailCommand(program),
|
|
94
|
+
},
|
|
90
95
|
{
|
|
91
96
|
id: "setup",
|
|
92
97
|
register: ({ program }) => registerSetupCommand(program),
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { callGatewayFromCli } from "../gateway-rpc.js";
|
|
2
|
+
import { theme } from "../../terminal/theme.js";
|
|
3
|
+
const DEFAULT_HOSTED_GATEWAY_URL = "wss://agiagent-hosted.fly.dev";
|
|
4
|
+
function formatStatus(status) {
|
|
5
|
+
const key = status.trim().toUpperCase();
|
|
6
|
+
if (key === "ACTIVE") {
|
|
7
|
+
return theme.success(key);
|
|
8
|
+
}
|
|
9
|
+
if (key === "FAILED" || key === "ERROR" || key === "DISABLED") {
|
|
10
|
+
return theme.error(key);
|
|
11
|
+
}
|
|
12
|
+
return theme.muted(key);
|
|
13
|
+
}
|
|
14
|
+
export function registerConnectGmailCommand(program) {
|
|
15
|
+
program
|
|
16
|
+
.command("connect-gmail")
|
|
17
|
+
.description("Connect Gmail via Composio OAuth (hosted mode)")
|
|
18
|
+
.requiredOption("--token <token>", "Hosted connection token")
|
|
19
|
+
.option("--url <url>", "Gateway WebSocket URL (optional)")
|
|
20
|
+
.option("--timeout <ms>", "Gateway call timeout in ms", "10000")
|
|
21
|
+
.option("--json", "Output machine-readable JSON", false)
|
|
22
|
+
.option("--no-wait", "Only print the OAuth URL (do not wait for completion)")
|
|
23
|
+
.action(async (optsRaw) => {
|
|
24
|
+
const opts = {
|
|
25
|
+
...optsRaw,
|
|
26
|
+
url: optsRaw.url?.trim() ? optsRaw.url : DEFAULT_HOSTED_GATEWAY_URL,
|
|
27
|
+
};
|
|
28
|
+
const link = (await callGatewayFromCli("integrations.composio.gmail.link", {
|
|
29
|
+
url: opts.url,
|
|
30
|
+
token: opts.token,
|
|
31
|
+
timeout: opts.timeout,
|
|
32
|
+
json: opts.json,
|
|
33
|
+
}, {}));
|
|
34
|
+
if (opts.json) {
|
|
35
|
+
// Keep it stable for scripting.
|
|
36
|
+
console.log(JSON.stringify({
|
|
37
|
+
redirectUrl: link.redirectUrl,
|
|
38
|
+
expiresAt: link.expiresAt,
|
|
39
|
+
connectedAccountId: link.connectedAccountId,
|
|
40
|
+
}, null, 2));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.log(`${theme.heading("Gmail OAuth URL")}`);
|
|
44
|
+
console.log(link.redirectUrl);
|
|
45
|
+
console.log(theme.muted(`Expires: ${link.expiresAt}`));
|
|
46
|
+
}
|
|
47
|
+
if (opts.wait === false) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const start = Date.now();
|
|
51
|
+
const maxWaitMs = 5 * 60_000;
|
|
52
|
+
const pollEveryMs = 2000;
|
|
53
|
+
const terminal = new Set(["ACTIVE", "FAILED", "ERROR", "DISABLED"]);
|
|
54
|
+
let lastStatus = null;
|
|
55
|
+
for (;;) {
|
|
56
|
+
const statusRes = (await callGatewayFromCli("integrations.composio.gmail.status", {
|
|
57
|
+
url: opts.url,
|
|
58
|
+
token: opts.token,
|
|
59
|
+
timeout: opts.timeout,
|
|
60
|
+
json: true, // always quiet polling; we render ourselves
|
|
61
|
+
}, {}, { progress: false }));
|
|
62
|
+
const statusKey = (statusRes.status ?? "").trim().toUpperCase();
|
|
63
|
+
if (!opts.json && statusKey && statusKey !== lastStatus) {
|
|
64
|
+
lastStatus = statusKey;
|
|
65
|
+
const reason = statusRes.statusReason?.trim();
|
|
66
|
+
const suffix = reason ? ` (${reason})` : "";
|
|
67
|
+
console.log(`${theme.muted("Status:")} ${formatStatus(statusKey)}${suffix}`);
|
|
68
|
+
}
|
|
69
|
+
if (terminal.has(statusKey)) {
|
|
70
|
+
if (!opts.json) {
|
|
71
|
+
if (statusKey === "ACTIVE") {
|
|
72
|
+
console.log(theme.success("Gmail connected."));
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.log(theme.error(`Gmail connection ended with status: ${statusKey}`));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (Date.now() - start > maxWaitMs) {
|
|
81
|
+
if (!opts.json) {
|
|
82
|
+
console.log(theme.error("Timed out waiting for Gmail connection to complete."));
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
await new Promise((r) => setTimeout(r, pollEveryMs));
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
package/dist/cli/run-main.js
CHANGED
|
@@ -21,6 +21,26 @@ export function rewriteUpdateFlagArgv(argv) {
|
|
|
21
21
|
next.splice(index, 1, "update");
|
|
22
22
|
return next;
|
|
23
23
|
}
|
|
24
|
+
function rewriteConnectGmailFlagArgv(argv) {
|
|
25
|
+
const flagIndex = argv.indexOf("--connect-gmail");
|
|
26
|
+
if (flagIndex === -1) {
|
|
27
|
+
return argv;
|
|
28
|
+
}
|
|
29
|
+
// Transform:
|
|
30
|
+
// agiagent --token XYZ --connect-gmail
|
|
31
|
+
// into:
|
|
32
|
+
// agiagent connect-gmail --token XYZ
|
|
33
|
+
//
|
|
34
|
+
// This keeps the requested UX while fitting Commander (commands before options).
|
|
35
|
+
const next = argv.filter((_, idx) => idx !== flagIndex);
|
|
36
|
+
if (next.length < 2) {
|
|
37
|
+
return next;
|
|
38
|
+
}
|
|
39
|
+
if (next[2] !== "connect-gmail") {
|
|
40
|
+
next.splice(2, 0, "connect-gmail");
|
|
41
|
+
}
|
|
42
|
+
return next;
|
|
43
|
+
}
|
|
24
44
|
export async function runCli(argv = process.argv) {
|
|
25
45
|
const normalizedArgv = stripWindowsNodeExec(argv);
|
|
26
46
|
loadDotEnv({ quiet: true });
|
|
@@ -42,7 +62,7 @@ export async function runCli(argv = process.argv) {
|
|
|
42
62
|
console.error("[agiagent] Uncaught exception:", formatUncaughtError(error));
|
|
43
63
|
process.exit(1);
|
|
44
64
|
});
|
|
45
|
-
const parseArgv = rewriteUpdateFlagArgv(normalizedArgv);
|
|
65
|
+
const parseArgv = rewriteUpdateFlagArgv(rewriteConnectGmailFlagArgv(normalizedArgv));
|
|
46
66
|
// Register the primary subcommand if one exists (for lazy-loading)
|
|
47
67
|
const primary = getPrimaryCommand(parseArgv);
|
|
48
68
|
if (primary) {
|
|
@@ -2,11 +2,8 @@ import { normalizeProviderId } from "../agents/model-selection.js";
|
|
|
2
2
|
import { getChannelPluginCatalogEntry, listChannelPluginCatalogEntries, } from "../channels/plugins/catalog.js";
|
|
3
3
|
import { CHAT_CHANNEL_ORDER, getChatChannelMeta, normalizeChatChannelId, } from "../channels/registry.js";
|
|
4
4
|
import { hasAnyWhatsAppAuth } from "../web/accounts.js";
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
const CORE_CHANNEL_IDS = new Set(CHAT_CHANNEL_ORDER);
|
|
8
|
-
// Extension channel plugins that can be auto-enabled
|
|
9
|
-
const CHANNEL_PLUGIN_IDS = Array.from(new Set([...listChannelPluginCatalogEntries().map((entry) => entry.id)]));
|
|
5
|
+
// Channel plugins that can be auto-enabled (bundled or external).
|
|
6
|
+
const CHANNEL_PLUGIN_IDS = Array.from(new Set(listChannelPluginCatalogEntries().map((entry) => entry.id)));
|
|
10
7
|
const PROVIDER_PLUGIN_IDS = [
|
|
11
8
|
{ pluginId: "google-antigravity-auth", providerId: "google-antigravity" },
|
|
12
9
|
{ pluginId: "google-gemini-cli-auth", providerId: "google-gemini-cli" },
|
|
@@ -239,27 +236,21 @@ function isProviderConfigured(cfg, providerId) {
|
|
|
239
236
|
}
|
|
240
237
|
function resolveConfiguredPlugins(cfg, env) {
|
|
241
238
|
const changes = [];
|
|
242
|
-
const channelIds = new Set(CHANNEL_PLUGIN_IDS);
|
|
239
|
+
const channelIds = new Set([...CHAT_CHANNEL_ORDER, ...CHANNEL_PLUGIN_IDS]);
|
|
243
240
|
const configuredChannels = cfg.channels;
|
|
244
241
|
if (configuredChannels && typeof configuredChannels === "object") {
|
|
245
242
|
for (const key of Object.keys(configuredChannels)) {
|
|
246
243
|
if (key === "defaults") {
|
|
247
244
|
continue;
|
|
248
245
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
channelIds.add(key);
|
|
252
|
-
}
|
|
246
|
+
const normalizedCore = normalizeChatChannelId(key);
|
|
247
|
+
channelIds.add(normalizedCore ?? key);
|
|
253
248
|
}
|
|
254
249
|
}
|
|
255
250
|
for (const channelId of channelIds) {
|
|
256
251
|
if (!channelId) {
|
|
257
252
|
continue;
|
|
258
253
|
}
|
|
259
|
-
// Skip core channels - they're built-in and don't need plugin entries
|
|
260
|
-
if (CORE_CHANNEL_IDS.has(channelId)) {
|
|
261
|
-
continue;
|
|
262
|
-
}
|
|
263
254
|
if (isChannelConfigured(cfg, channelId, env)) {
|
|
264
255
|
changes.push({
|
|
265
256
|
pluginId: channelId,
|
|
@@ -17,6 +17,16 @@ export type ConnectionToken = {
|
|
|
17
17
|
createdAt: Date;
|
|
18
18
|
lastConnectedAt: Date | null;
|
|
19
19
|
};
|
|
20
|
+
export type ComposioConnectedAccountRecord = {
|
|
21
|
+
userId: string;
|
|
22
|
+
toolkitSlug: string;
|
|
23
|
+
authConfigId: string;
|
|
24
|
+
connectedAccountId: string;
|
|
25
|
+
status: string | null;
|
|
26
|
+
statusReason: string | null;
|
|
27
|
+
createdAt: Date;
|
|
28
|
+
updatedAt: Date;
|
|
29
|
+
};
|
|
20
30
|
export type HostedDbClient = {
|
|
21
31
|
/** Look up a connection token and return the associated user */
|
|
22
32
|
lookupToken: (token: string) => Promise<{
|
|
@@ -31,6 +41,25 @@ export type HostedDbClient = {
|
|
|
31
41
|
setWhatsAppAccountId: (tokenId: string, accountId: string) => Promise<void>;
|
|
32
42
|
/** Set the Telegram owner id for a token */
|
|
33
43
|
setTelegramOwnerId: (tokenId: string, ownerId: string) => Promise<void>;
|
|
44
|
+
/** Upsert a Composio connected account record for a user/toolkit */
|
|
45
|
+
upsertComposioConnectedAccount: (params: {
|
|
46
|
+
userId: string;
|
|
47
|
+
toolkitSlug: string;
|
|
48
|
+
authConfigId: string;
|
|
49
|
+
connectedAccountId: string;
|
|
50
|
+
}) => Promise<void>;
|
|
51
|
+
/** Get a Composio connected account record for a user/toolkit */
|
|
52
|
+
getComposioConnectedAccount: (params: {
|
|
53
|
+
userId: string;
|
|
54
|
+
toolkitSlug: string;
|
|
55
|
+
}) => Promise<ComposioConnectedAccountRecord | null>;
|
|
56
|
+
/** Update status fields for a Composio connected account record */
|
|
57
|
+
updateComposioConnectedAccountStatus: (params: {
|
|
58
|
+
userId: string;
|
|
59
|
+
toolkitSlug: string;
|
|
60
|
+
status: string;
|
|
61
|
+
statusReason: string | null;
|
|
62
|
+
}) => Promise<void>;
|
|
34
63
|
/** Close the database connection */
|
|
35
64
|
close: () => Promise<void>;
|
|
36
65
|
};
|
|
@@ -36,6 +36,20 @@ export async function initHostedDb() {
|
|
|
36
36
|
// Test the connection
|
|
37
37
|
await sql `SELECT 1`;
|
|
38
38
|
log.info("Connected to hosted database");
|
|
39
|
+
// Ensure hosted-mode auxiliary tables exist (best-effort).
|
|
40
|
+
await sql `
|
|
41
|
+
CREATE TABLE IF NOT EXISTS composio_connected_accounts (
|
|
42
|
+
user_id UUID REFERENCES users(id),
|
|
43
|
+
toolkit_slug TEXT NOT NULL,
|
|
44
|
+
auth_config_id TEXT NOT NULL,
|
|
45
|
+
connected_account_id TEXT NOT NULL,
|
|
46
|
+
status TEXT,
|
|
47
|
+
status_reason TEXT,
|
|
48
|
+
created_at TIMESTAMPTZ DEFAULT now(),
|
|
49
|
+
updated_at TIMESTAMPTZ DEFAULT now(),
|
|
50
|
+
PRIMARY KEY (user_id, toolkit_slug)
|
|
51
|
+
)
|
|
52
|
+
`;
|
|
39
53
|
dbClient = {
|
|
40
54
|
lookupToken: async (token) => {
|
|
41
55
|
const rows = await sql `
|
|
@@ -127,6 +141,65 @@ export async function initHostedDb() {
|
|
|
127
141
|
UPDATE connection_tokens
|
|
128
142
|
SET telegram_owner_id = ${ownerId}
|
|
129
143
|
WHERE id = ${tokenId}
|
|
144
|
+
`;
|
|
145
|
+
},
|
|
146
|
+
upsertComposioConnectedAccount: async (params) => {
|
|
147
|
+
await sql `
|
|
148
|
+
INSERT INTO composio_connected_accounts (
|
|
149
|
+
user_id,
|
|
150
|
+
toolkit_slug,
|
|
151
|
+
auth_config_id,
|
|
152
|
+
connected_account_id,
|
|
153
|
+
updated_at
|
|
154
|
+
)
|
|
155
|
+
VALUES (
|
|
156
|
+
${params.userId},
|
|
157
|
+
${params.toolkitSlug},
|
|
158
|
+
${params.authConfigId},
|
|
159
|
+
${params.connectedAccountId},
|
|
160
|
+
now()
|
|
161
|
+
)
|
|
162
|
+
ON CONFLICT (user_id, toolkit_slug) DO UPDATE SET
|
|
163
|
+
auth_config_id = EXCLUDED.auth_config_id,
|
|
164
|
+
connected_account_id = EXCLUDED.connected_account_id,
|
|
165
|
+
updated_at = now()
|
|
166
|
+
`;
|
|
167
|
+
},
|
|
168
|
+
getComposioConnectedAccount: async (params) => {
|
|
169
|
+
const rows = await sql `
|
|
170
|
+
SELECT
|
|
171
|
+
user_id,
|
|
172
|
+
toolkit_slug,
|
|
173
|
+
auth_config_id,
|
|
174
|
+
connected_account_id,
|
|
175
|
+
status,
|
|
176
|
+
status_reason,
|
|
177
|
+
created_at,
|
|
178
|
+
updated_at
|
|
179
|
+
FROM composio_connected_accounts
|
|
180
|
+
WHERE user_id = ${params.userId} AND toolkit_slug = ${params.toolkitSlug}
|
|
181
|
+
LIMIT 1
|
|
182
|
+
`;
|
|
183
|
+
if (rows.length === 0) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const row = rows[0];
|
|
187
|
+
return {
|
|
188
|
+
userId: row.user_id,
|
|
189
|
+
toolkitSlug: row.toolkit_slug,
|
|
190
|
+
authConfigId: row.auth_config_id,
|
|
191
|
+
connectedAccountId: row.connected_account_id,
|
|
192
|
+
status: row.status,
|
|
193
|
+
statusReason: row.status_reason,
|
|
194
|
+
createdAt: row.created_at,
|
|
195
|
+
updatedAt: row.updated_at,
|
|
196
|
+
};
|
|
197
|
+
},
|
|
198
|
+
updateComposioConnectedAccountStatus: async (params) => {
|
|
199
|
+
await sql `
|
|
200
|
+
UPDATE composio_connected_accounts
|
|
201
|
+
SET status = ${params.status}, status_reason = ${params.statusReason}, updated_at = now()
|
|
202
|
+
WHERE user_id = ${params.userId} AND toolkit_slug = ${params.toolkitSlug}
|
|
130
203
|
`;
|
|
131
204
|
},
|
|
132
205
|
close: async () => {
|