@meetquinn/animactl 0.1.1-canary.21.1.cd63d38
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 +13 -0
- package/bin/anima +14 -0
- package/bin/animactl +14 -0
- package/dist/server/activities/activity.service.d.ts +22 -0
- package/dist/server/activities/activity.service.d.ts.map +1 -0
- package/dist/server/activities/activity.service.js +49 -0
- package/dist/server/agents/agent-config-ops.d.ts +17 -0
- package/dist/server/agents/agent-config-ops.d.ts.map +1 -0
- package/dist/server/agents/agent-config-ops.js +209 -0
- package/dist/server/agents/agent-skills.d.ts +4 -0
- package/dist/server/agents/agent-skills.d.ts.map +1 -0
- package/dist/server/agents/agent-skills.js +71 -0
- package/dist/server/agents/agent-slack-validation.d.ts +16 -0
- package/dist/server/agents/agent-slack-validation.d.ts.map +1 -0
- package/dist/server/agents/agent-slack-validation.js +155 -0
- package/dist/server/agents/agent-slack.service.d.ts +26 -0
- package/dist/server/agents/agent-slack.service.d.ts.map +1 -0
- package/dist/server/agents/agent-slack.service.js +198 -0
- package/dist/server/agents/agent.service.d.ts +41 -0
- package/dist/server/agents/agent.service.d.ts.map +1 -0
- package/dist/server/agents/agent.service.js +149 -0
- package/dist/server/agents/seed-memory.d.ts +4 -0
- package/dist/server/agents/seed-memory.d.ts.map +1 -0
- package/dist/server/agents/seed-memory.js +26 -0
- package/dist/server/anima-home.d.ts +3 -0
- package/dist/server/anima-home.d.ts.map +1 -0
- package/dist/server/anima-home.js +28 -0
- package/dist/server/asks/interactive-ask.service.d.ts +54 -0
- package/dist/server/asks/interactive-ask.service.d.ts.map +1 -0
- package/dist/server/asks/interactive-ask.service.js +181 -0
- package/dist/server/bundled-templates.d.ts +2 -0
- package/dist/server/bundled-templates.d.ts.map +1 -0
- package/dist/server/bundled-templates.js +24 -0
- package/dist/server/cli/anima.d.ts +4 -0
- package/dist/server/cli/anima.d.ts.map +1 -0
- package/dist/server/cli/anima.js +33 -0
- package/dist/server/cli/animactl-npm.d.ts +4 -0
- package/dist/server/cli/animactl-npm.d.ts.map +1 -0
- package/dist/server/cli/animactl-npm.js +17 -0
- package/dist/server/cli/animactl.d.ts +4 -0
- package/dist/server/cli/animactl.d.ts.map +1 -0
- package/dist/server/cli/animactl.js +26 -0
- package/dist/server/cli/runtime-cli.d.ts +33 -0
- package/dist/server/cli/runtime-cli.d.ts.map +1 -0
- package/dist/server/cli/runtime-cli.js +309 -0
- package/dist/server/cli/service.d.ts +3 -0
- package/dist/server/cli/service.d.ts.map +1 -0
- package/dist/server/cli/service.js +35 -0
- package/dist/server/cli/services-cli.d.ts +3 -0
- package/dist/server/cli/services-cli.d.ts.map +1 -0
- package/dist/server/cli/services-cli.js +191 -0
- package/dist/server/cli/shared.d.ts +6 -0
- package/dist/server/cli/shared.d.ts.map +1 -0
- package/dist/server/cli/shared.js +6 -0
- package/dist/server/ids.d.ts +10 -0
- package/dist/server/ids.d.ts.map +1 -0
- package/dist/server/ids.js +16 -0
- package/dist/server/inbox/reminder-subscriber.d.ts +15 -0
- package/dist/server/inbox/reminder-subscriber.d.ts.map +1 -0
- package/dist/server/inbox/reminder-subscriber.js +69 -0
- package/dist/server/inbox/slack-events.d.ts +62 -0
- package/dist/server/inbox/slack-events.d.ts.map +1 -0
- package/dist/server/inbox/slack-events.js +84 -0
- package/dist/server/inbox/slack-profiles.d.ts +41 -0
- package/dist/server/inbox/slack-profiles.d.ts.map +1 -0
- package/dist/server/inbox/slack-profiles.js +119 -0
- package/dist/server/inbox/slack-subscriber.d.ts +23 -0
- package/dist/server/inbox/slack-subscriber.d.ts.map +1 -0
- package/dist/server/inbox/slack-subscriber.js +301 -0
- package/dist/server/inbox/slack-subscription.service.d.ts +74 -0
- package/dist/server/inbox/slack-subscription.service.d.ts.map +1 -0
- package/dist/server/inbox/slack-subscription.service.js +346 -0
- package/dist/server/inbox/subscriber.d.ts +15 -0
- package/dist/server/inbox/subscriber.d.ts.map +1 -0
- package/dist/server/inbox/subscriber.js +26 -0
- package/dist/server/inbox/wake-queue.service.d.ts +58 -0
- package/dist/server/inbox/wake-queue.service.d.ts.map +1 -0
- package/dist/server/inbox/wake-queue.service.js +127 -0
- package/dist/server/json.d.ts +8 -0
- package/dist/server/json.d.ts.map +1 -0
- package/dist/server/json.js +23 -0
- package/dist/server/kb/kb.helper.d.ts +28 -0
- package/dist/server/kb/kb.helper.d.ts.map +1 -0
- package/dist/server/kb/kb.helper.js +112 -0
- package/dist/server/kb/kb.service.d.ts +41 -0
- package/dist/server/kb/kb.service.d.ts.map +1 -0
- package/dist/server/kb/kb.service.js +282 -0
- package/dist/server/messages/message.projection.d.ts +8 -0
- package/dist/server/messages/message.projection.d.ts.map +1 -0
- package/dist/server/messages/message.projection.js +198 -0
- package/dist/server/messages/message.service.d.ts +25 -0
- package/dist/server/messages/message.service.d.ts.map +1 -0
- package/dist/server/messages/message.service.js +69 -0
- package/dist/server/provider-usage/http.d.ts +16 -0
- package/dist/server/provider-usage/http.d.ts.map +1 -0
- package/dist/server/provider-usage/http.js +39 -0
- package/dist/server/provider-usage/provider-usage.service.d.ts +19 -0
- package/dist/server/provider-usage/provider-usage.service.d.ts.map +1 -0
- package/dist/server/provider-usage/provider-usage.service.js +78 -0
- package/dist/server/provider-usage/providers/claude.d.ts +15 -0
- package/dist/server/provider-usage/providers/claude.d.ts.map +1 -0
- package/dist/server/provider-usage/providers/claude.js +128 -0
- package/dist/server/provider-usage/providers/codex.d.ts +9 -0
- package/dist/server/provider-usage/providers/codex.d.ts.map +1 -0
- package/dist/server/provider-usage/providers/codex.js +64 -0
- package/dist/server/provider-usage/providers/common.d.ts +16 -0
- package/dist/server/provider-usage/providers/common.d.ts.map +1 -0
- package/dist/server/provider-usage/providers/common.js +72 -0
- package/dist/server/provider-usage/providers/kimi.d.ts +9 -0
- package/dist/server/provider-usage/providers/kimi.d.ts.map +1 -0
- package/dist/server/provider-usage/providers/kimi.js +113 -0
- package/dist/server/providers/active-runtime.d.ts +9 -0
- package/dist/server/providers/active-runtime.d.ts.map +1 -0
- package/dist/server/providers/active-runtime.js +24 -0
- package/dist/server/providers/child-process.d.ts +21 -0
- package/dist/server/providers/child-process.d.ts.map +1 -0
- package/dist/server/providers/child-process.js +93 -0
- package/dist/server/providers/claude-events.d.ts +11 -0
- package/dist/server/providers/claude-events.d.ts.map +1 -0
- package/dist/server/providers/claude-events.js +1007 -0
- package/dist/server/providers/claude.d.ts +19 -0
- package/dist/server/providers/claude.d.ts.map +1 -0
- package/dist/server/providers/claude.js +523 -0
- package/dist/server/providers/codex-app-server.d.ts +50 -0
- package/dist/server/providers/codex-app-server.d.ts.map +1 -0
- package/dist/server/providers/codex-app-server.js +357 -0
- package/dist/server/providers/codex-events.d.ts +18 -0
- package/dist/server/providers/codex-events.d.ts.map +1 -0
- package/dist/server/providers/codex-events.js +568 -0
- package/dist/server/providers/codex.d.ts +17 -0
- package/dist/server/providers/codex.d.ts.map +1 -0
- package/dist/server/providers/codex.js +127 -0
- package/dist/server/providers/factory.d.ts +3 -0
- package/dist/server/providers/factory.d.ts.map +1 -0
- package/dist/server/providers/factory.js +12 -0
- package/dist/server/providers/kimi-events.d.ts +4 -0
- package/dist/server/providers/kimi-events.d.ts.map +1 -0
- package/dist/server/providers/kimi-events.js +177 -0
- package/dist/server/providers/kimi.d.ts +17 -0
- package/dist/server/providers/kimi.d.ts.map +1 -0
- package/dist/server/providers/kimi.js +485 -0
- package/dist/server/providers/reasoning-events.d.ts +15 -0
- package/dist/server/providers/reasoning-events.d.ts.map +1 -0
- package/dist/server/providers/reasoning-events.js +25 -0
- package/dist/server/reminders/cli.d.ts +3 -0
- package/dist/server/reminders/cli.d.ts.map +1 -0
- package/dist/server/reminders/cli.js +216 -0
- package/dist/server/reminders/reminder.activity.d.ts +29 -0
- package/dist/server/reminders/reminder.activity.d.ts.map +1 -0
- package/dist/server/reminders/reminder.activity.js +86 -0
- package/dist/server/reminders/reminder.helper.d.ts +14 -0
- package/dist/server/reminders/reminder.helper.d.ts.map +1 -0
- package/dist/server/reminders/reminder.helper.js +160 -0
- package/dist/server/reminders/reminder.service.d.ts +48 -0
- package/dist/server/reminders/reminder.service.d.ts.map +1 -0
- package/dist/server/reminders/reminder.service.js +152 -0
- package/dist/server/runtime/active-item.d.ts +22 -0
- package/dist/server/runtime/active-item.d.ts.map +1 -0
- package/dist/server/runtime/active-item.js +49 -0
- package/dist/server/runtime/activity-payload.d.ts +5 -0
- package/dist/server/runtime/activity-payload.d.ts.map +1 -0
- package/dist/server/runtime/activity-payload.js +21 -0
- package/dist/server/runtime/activity-text.d.ts +4 -0
- package/dist/server/runtime/activity-text.d.ts.map +1 -0
- package/dist/server/runtime/activity-text.js +16 -0
- package/dist/server/runtime/activity.d.ts +15 -0
- package/dist/server/runtime/activity.d.ts.map +1 -0
- package/dist/server/runtime/activity.js +142 -0
- package/dist/server/runtime/agent-runner.d.ts +17 -0
- package/dist/server/runtime/agent-runner.d.ts.map +1 -0
- package/dist/server/runtime/agent-runner.js +51 -0
- package/dist/server/runtime/context.d.ts +3 -0
- package/dist/server/runtime/context.d.ts.map +1 -0
- package/dist/server/runtime/context.js +27 -0
- package/dist/server/runtime/delivery-prompt.d.ts +32 -0
- package/dist/server/runtime/delivery-prompt.d.ts.map +1 -0
- package/dist/server/runtime/delivery-prompt.js +189 -0
- package/dist/server/runtime/host.d.ts +44 -0
- package/dist/server/runtime/host.d.ts.map +1 -0
- package/dist/server/runtime/host.js +363 -0
- package/dist/server/runtime/item-activities.d.ts +3 -0
- package/dist/server/runtime/item-activities.d.ts.map +1 -0
- package/dist/server/runtime/item-activities.js +22 -0
- package/dist/server/runtime/managed-runtime.d.ts +73 -0
- package/dist/server/runtime/managed-runtime.d.ts.map +1 -0
- package/dist/server/runtime/managed-runtime.js +199 -0
- package/dist/server/runtime/processing-reactions.d.ts +28 -0
- package/dist/server/runtime/processing-reactions.d.ts.map +1 -0
- package/dist/server/runtime/processing-reactions.js +65 -0
- package/dist/server/runtime/provider-contract.d.ts +55 -0
- package/dist/server/runtime/provider-contract.d.ts.map +1 -0
- package/dist/server/runtime/provider-contract.js +4 -0
- package/dist/server/runtime/runtime-bridge.d.ts +26 -0
- package/dist/server/runtime/runtime-bridge.d.ts.map +1 -0
- package/dist/server/runtime/runtime-bridge.js +115 -0
- package/dist/server/runtime/runtime-release.d.ts +13 -0
- package/dist/server/runtime/runtime-release.d.ts.map +1 -0
- package/dist/server/runtime/runtime-release.js +97 -0
- package/dist/server/runtime/runtime-session.service.d.ts +22 -0
- package/dist/server/runtime/runtime-session.service.d.ts.map +1 -0
- package/dist/server/runtime/runtime-session.service.js +276 -0
- package/dist/server/runtime/runtime-upgrade.d.ts +79 -0
- package/dist/server/runtime/runtime-upgrade.d.ts.map +1 -0
- package/dist/server/runtime/runtime-upgrade.js +531 -0
- package/dist/server/runtime/runtime-worker.d.ts +56 -0
- package/dist/server/runtime/runtime-worker.d.ts.map +1 -0
- package/dist/server/runtime/runtime-worker.js +540 -0
- package/dist/server/runtime/runtime.service.d.ts +13 -0
- package/dist/server/runtime/runtime.service.d.ts.map +1 -0
- package/dist/server/runtime/runtime.service.js +50 -0
- package/dist/server/runtime/standing-prompt.d.ts +6 -0
- package/dist/server/runtime/standing-prompt.d.ts.map +1 -0
- package/dist/server/runtime/standing-prompt.js +41 -0
- package/dist/server/runtime/types.d.ts +16 -0
- package/dist/server/runtime/types.d.ts.map +1 -0
- package/dist/server/runtime/types.js +1 -0
- package/dist/server/runtime/usage.d.ts +5 -0
- package/dist/server/runtime/usage.d.ts.map +1 -0
- package/dist/server/runtime/usage.js +8 -0
- package/dist/server/services/env.d.ts +8 -0
- package/dist/server/services/env.d.ts.map +1 -0
- package/dist/server/services/env.js +31 -0
- package/dist/server/services/restart-drain.d.ts +4 -0
- package/dist/server/services/restart-drain.d.ts.map +1 -0
- package/dist/server/services/restart-drain.js +39 -0
- package/dist/server/services/restart-gate.d.ts +40 -0
- package/dist/server/services/restart-gate.d.ts.map +1 -0
- package/dist/server/services/restart-gate.js +151 -0
- package/dist/server/services/restart-result.d.ts +14 -0
- package/dist/server/services/restart-result.d.ts.map +1 -0
- package/dist/server/services/restart-result.js +79 -0
- package/dist/server/services/supervisor.d.ts +31 -0
- package/dist/server/services/supervisor.d.ts.map +1 -0
- package/dist/server/services/supervisor.js +201 -0
- package/dist/server/settings/settings.service.d.ts +21 -0
- package/dist/server/settings/settings.service.d.ts.map +1 -0
- package/dist/server/settings/settings.service.js +36 -0
- package/dist/server/slack/app-manifest.d.ts +5 -0
- package/dist/server/slack/app-manifest.d.ts.map +1 -0
- package/dist/server/slack/app-manifest.js +24 -0
- package/dist/server/slack/client.d.ts +3 -0
- package/dist/server/slack/client.d.ts.map +1 -0
- package/dist/server/slack/client.js +7 -0
- package/dist/server/slack/shortcut.service.d.ts +140 -0
- package/dist/server/slack/shortcut.service.d.ts.map +1 -0
- package/dist/server/slack/shortcut.service.js +493 -0
- package/dist/server/slack/shortcuts.d.ts +32 -0
- package/dist/server/slack/shortcuts.d.ts.map +1 -0
- package/dist/server/slack/shortcuts.js +163 -0
- package/dist/server/slack/slack-file.service.d.ts +46 -0
- package/dist/server/slack/slack-file.service.d.ts.map +1 -0
- package/dist/server/slack/slack-file.service.js +125 -0
- package/dist/server/slack/slack.helper.d.ts +50 -0
- package/dist/server/slack/slack.helper.d.ts.map +1 -0
- package/dist/server/slack/slack.helper.js +222 -0
- package/dist/server/slack/workspace-directory.service.d.ts +37 -0
- package/dist/server/slack/workspace-directory.service.d.ts.map +1 -0
- package/dist/server/slack/workspace-directory.service.js +239 -0
- package/dist/server/storage/json-file.d.ts +25 -0
- package/dist/server/storage/json-file.d.ts.map +1 -0
- package/dist/server/storage/json-file.js +97 -0
- package/dist/server/storage/json-store.d.ts +15 -0
- package/dist/server/storage/json-store.d.ts.map +1 -0
- package/dist/server/storage/json-store.js +34 -0
- package/dist/server/storage/jsonl-log.d.ts +41 -0
- package/dist/server/storage/jsonl-log.d.ts.map +1 -0
- package/dist/server/storage/jsonl-log.js +271 -0
- package/dist/server/storage/lock.d.ts +2 -0
- package/dist/server/storage/lock.d.ts.map +1 -0
- package/dist/server/storage/lock.js +90 -0
- package/dist/server/storage/safe-filename.d.ts +2 -0
- package/dist/server/storage/safe-filename.d.ts.map +1 -0
- package/dist/server/storage/safe-filename.js +4 -0
- package/dist/server/storage/schema/activity.store.d.ts +25 -0
- package/dist/server/storage/schema/activity.store.d.ts.map +1 -0
- package/dist/server/storage/schema/activity.store.js +49 -0
- package/dist/server/storage/schema/agent-usage.store.d.ts +13 -0
- package/dist/server/storage/schema/agent-usage.store.d.ts.map +1 -0
- package/dist/server/storage/schema/agent-usage.store.js +29 -0
- package/dist/server/storage/schema/agent.store.d.ts +17 -0
- package/dist/server/storage/schema/agent.store.d.ts.map +1 -0
- package/dist/server/storage/schema/agent.store.js +64 -0
- package/dist/server/storage/schema/cache.d.ts +41 -0
- package/dist/server/storage/schema/cache.d.ts.map +1 -0
- package/dist/server/storage/schema/cache.js +45 -0
- package/dist/server/storage/schema/interactive-ask.store.d.ts +77 -0
- package/dist/server/storage/schema/interactive-ask.store.d.ts.map +1 -0
- package/dist/server/storage/schema/interactive-ask.store.js +87 -0
- package/dist/server/storage/schema/kb.store.d.ts +23 -0
- package/dist/server/storage/schema/kb.store.d.ts.map +1 -0
- package/dist/server/storage/schema/kb.store.js +91 -0
- package/dist/server/storage/schema/message.store.d.ts +24 -0
- package/dist/server/storage/schema/message.store.d.ts.map +1 -0
- package/dist/server/storage/schema/message.store.js +52 -0
- package/dist/server/storage/schema/reminder.store.d.ts +53 -0
- package/dist/server/storage/schema/reminder.store.d.ts.map +1 -0
- package/dist/server/storage/schema/reminder.store.js +75 -0
- package/dist/server/storage/schema/server.store.d.ts +21 -0
- package/dist/server/storage/schema/server.store.d.ts.map +1 -0
- package/dist/server/storage/schema/server.store.js +27 -0
- package/dist/server/storage/schema/session.store.d.ts +64 -0
- package/dist/server/storage/schema/session.store.d.ts.map +1 -0
- package/dist/server/storage/schema/session.store.js +88 -0
- package/dist/server/storage/schema/subscription.store.d.ts +72 -0
- package/dist/server/storage/schema/subscription.store.d.ts.map +1 -0
- package/dist/server/storage/schema/subscription.store.js +93 -0
- package/dist/server/storage/schema/wake-queue.store.d.ts +191 -0
- package/dist/server/storage/schema/wake-queue.store.d.ts.map +1 -0
- package/dist/server/storage/schema/wake-queue.store.js +233 -0
- package/dist/server/tools/ask.d.ts +14 -0
- package/dist/server/tools/ask.d.ts.map +1 -0
- package/dist/server/tools/ask.js +309 -0
- package/dist/server/tools/file-send.d.ts +10 -0
- package/dist/server/tools/file-send.d.ts.map +1 -0
- package/dist/server/tools/file-send.js +128 -0
- package/dist/server/tools/files-cli.d.ts +3 -0
- package/dist/server/tools/files-cli.d.ts.map +1 -0
- package/dist/server/tools/files-cli.js +97 -0
- package/dist/server/tools/message-history-cli.d.ts +3 -0
- package/dist/server/tools/message-history-cli.d.ts.map +1 -0
- package/dist/server/tools/message-history-cli.js +111 -0
- package/dist/server/tools/message-read.d.ts +20 -0
- package/dist/server/tools/message-read.d.ts.map +1 -0
- package/dist/server/tools/message-read.js +138 -0
- package/dist/server/tools/messages-cli.d.ts +3 -0
- package/dist/server/tools/messages-cli.d.ts.map +1 -0
- package/dist/server/tools/messages-cli.js +104 -0
- package/dist/server/tools/messages.d.ts +18 -0
- package/dist/server/tools/messages.d.ts.map +1 -0
- package/dist/server/tools/messages.js +188 -0
- package/dist/server/tools/reactions-cli.d.ts +3 -0
- package/dist/server/tools/reactions-cli.d.ts.map +1 -0
- package/dist/server/tools/reactions-cli.js +87 -0
- package/dist/server/tools/reactions.d.ts +11 -0
- package/dist/server/tools/reactions.d.ts.map +1 -0
- package/dist/server/tools/reactions.js +77 -0
- package/dist/server/tools/slack-channel-resolver.d.ts +14 -0
- package/dist/server/tools/slack-channel-resolver.d.ts.map +1 -0
- package/dist/server/tools/slack-channel-resolver.js +47 -0
- package/dist/server/tools/slack-file-upload.d.ts +49 -0
- package/dist/server/tools/slack-file-upload.d.ts.map +1 -0
- package/dist/server/tools/slack-file-upload.js +93 -0
- package/dist/server/tools/slack-message-format.d.ts +13 -0
- package/dist/server/tools/slack-message-format.d.ts.map +1 -0
- package/dist/server/tools/slack-message-format.js +28 -0
- package/dist/server/tools/slack-message-mentions.d.ts +30 -0
- package/dist/server/tools/slack-message-mentions.d.ts.map +1 -0
- package/dist/server/tools/slack-message-mentions.js +88 -0
- package/dist/server/tools/slack-target.d.ts +22 -0
- package/dist/server/tools/slack-target.d.ts.map +1 -0
- package/dist/server/tools/slack-target.js +94 -0
- package/dist/server/tools/slack-transcript.d.ts +40 -0
- package/dist/server/tools/slack-transcript.d.ts.map +1 -0
- package/dist/server/tools/slack-transcript.js +166 -0
- package/dist/server/tools/subscriptions-cli.d.ts +3 -0
- package/dist/server/tools/subscriptions-cli.d.ts.map +1 -0
- package/dist/server/tools/subscriptions-cli.js +132 -0
- package/dist/server/tools/tool-context.d.ts +28 -0
- package/dist/server/tools/tool-context.d.ts.map +1 -0
- package/dist/server/tools/tool-context.js +79 -0
- package/dist/server/web/agent-file-routes.d.ts +3 -0
- package/dist/server/web/agent-file-routes.d.ts.map +1 -0
- package/dist/server/web/agent-file-routes.js +57 -0
- package/dist/server/web/agent-routes.d.ts +3 -0
- package/dist/server/web/agent-routes.d.ts.map +1 -0
- package/dist/server/web/agent-routes.js +96 -0
- package/dist/server/web/agent-slack-routes.d.ts +3 -0
- package/dist/server/web/agent-slack-routes.d.ts.map +1 -0
- package/dist/server/web/agent-slack-routes.js +17 -0
- package/dist/server/web/app.d.ts +3 -0
- package/dist/server/web/app.d.ts.map +1 -0
- package/dist/server/web/app.js +16 -0
- package/dist/server/web/host.d.ts +6 -0
- package/dist/server/web/host.d.ts.map +1 -0
- package/dist/server/web/host.js +40 -0
- package/dist/server/web/http.d.ts +15 -0
- package/dist/server/web/http.d.ts.map +1 -0
- package/dist/server/web/http.js +66 -0
- package/dist/server/web/kb-routes.d.ts +6 -0
- package/dist/server/web/kb-routes.d.ts.map +1 -0
- package/dist/server/web/kb-routes.js +94 -0
- package/dist/server/web/static.d.ts +3 -0
- package/dist/server/web/static.d.ts.map +1 -0
- package/dist/server/web/static.js +72 -0
- package/dist/server/web/system-routes.d.ts +3 -0
- package/dist/server/web/system-routes.d.ts.map +1 -0
- package/dist/server/web/system-routes.js +181 -0
- package/dist/shared/activity.d.ts +107 -0
- package/dist/shared/activity.d.ts.map +1 -0
- package/dist/shared/activity.js +2 -0
- package/dist/shared/agent-config.d.ts +368 -0
- package/dist/shared/agent-config.d.ts.map +1 -0
- package/dist/shared/agent-config.js +223 -0
- package/dist/shared/agent-home.d.ts +4 -0
- package/dist/shared/agent-home.d.ts.map +1 -0
- package/dist/shared/agent-home.js +5 -0
- package/dist/shared/inbox.d.ts +341 -0
- package/dist/shared/inbox.d.ts.map +1 -0
- package/dist/shared/inbox.js +91 -0
- package/dist/shared/kb-file-types.d.ts +5 -0
- package/dist/shared/kb-file-types.d.ts.map +1 -0
- package/dist/shared/kb-file-types.js +57 -0
- package/dist/shared/kb.d.ts +37 -0
- package/dist/shared/kb.d.ts.map +1 -0
- package/dist/shared/kb.js +9 -0
- package/dist/shared/messages.d.ts +52 -0
- package/dist/shared/messages.d.ts.map +1 -0
- package/dist/shared/messages.js +4 -0
- package/dist/shared/provider-catalog.d.ts +30 -0
- package/dist/shared/provider-catalog.d.ts.map +1 -0
- package/dist/shared/provider-catalog.js +59 -0
- package/dist/shared/provider-usage.d.ts +132 -0
- package/dist/shared/provider-usage.d.ts.map +1 -0
- package/dist/shared/provider-usage.js +41 -0
- package/dist/shared/reminder.d.ts +73 -0
- package/dist/shared/reminder.d.ts.map +1 -0
- package/dist/shared/reminder.js +44 -0
- package/dist/shared/runtime-upgrade.d.ts +161 -0
- package/dist/shared/runtime-upgrade.d.ts.map +1 -0
- package/dist/shared/runtime-upgrade.js +56 -0
- package/dist/shared/server-info.d.ts +180 -0
- package/dist/shared/server-info.d.ts.map +1 -0
- package/dist/shared/server-info.js +50 -0
- package/dist/shared/server-settings.d.ts +12 -0
- package/dist/shared/server-settings.d.ts.map +1 -0
- package/dist/shared/server-settings.js +6 -0
- package/dist/shared/skills.d.ts +19 -0
- package/dist/shared/skills.d.ts.map +1 -0
- package/dist/shared/skills.js +1 -0
- package/dist/shared/slack-manifest.d.ts +15 -0
- package/dist/shared/slack-manifest.d.ts.map +1 -0
- package/dist/shared/slack-manifest.js +8 -0
- package/dist/shared/snapshot.d.ts +47 -0
- package/dist/shared/snapshot.d.ts.map +1 -0
- package/dist/shared/snapshot.js +2 -0
- package/dist/shared/url-routes.d.ts +70 -0
- package/dist/shared/url-routes.d.ts.map +1 -0
- package/dist/shared/url-routes.js +144 -0
- package/dist/web/assets/activity-BP0C81IV.js +7 -0
- package/dist/web/assets/albert-sans-latin-ext-wght-normal-BAo4qCk1.woff2 +0 -0
- package/dist/web/assets/albert-sans-latin-wght-normal-BJ0ssN8N.woff2 +0 -0
- package/dist/web/assets/external-link-Dt0qTpmV.js +1 -0
- package/dist/web/assets/file-text-Dd9ys6py.js +1 -0
- package/dist/web/assets/fraunces-latin-ext-wght-italic-BfTTTDIL.woff2 +0 -0
- package/dist/web/assets/fraunces-latin-ext-wght-normal-Ca2vKHc0.woff2 +0 -0
- package/dist/web/assets/fraunces-latin-wght-italic-Py8at3oI.woff2 +0 -0
- package/dist/web/assets/fraunces-latin-wght-normal-ukD16Tqj.woff2 +0 -0
- package/dist/web/assets/fraunces-vietnamese-wght-italic-BicUS2cM.woff2 +0 -0
- package/dist/web/assets/fraunces-vietnamese-wght-normal-CnvboYUG.woff2 +0 -0
- package/dist/web/assets/globe-DmDZSgDP.js +1 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-600-normal-CTOM6hUh.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-600-normal-fLZuRloM.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-600-normal-9HEixskS.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-600-normal-V-xxqcpd.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-600-normal-D38SheWl.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-600-normal-DmB0ttJJ.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-600-normal-D2EvbN8M.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-600-normal-iLQfcSjf.woff +0 -0
- package/dist/web/assets/index-CzAQnbuO.js +80 -0
- package/dist/web/assets/index-DKecrvN0.css +2 -0
- package/dist/web/assets/kb-3wFeP2Jt.js +32 -0
- package/dist/web/assets/profile-D7wPZXW_.js +1 -0
- package/dist/web/assets/reminders-DOhroVwo.js +1 -0
- package/dist/web/favicon.svg +1 -0
- package/dist/web/icons.svg +24 -0
- package/dist/web/index.html +14 -0
- package/package.json +42 -0
- package/templates/agent-seed-memory.md +30 -0
- package/templates/runtime-standing-prompt.md +64 -0
- package/templates/slack-app-manifest.yaml +81 -0
package/README.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# @meetquinn/animactl
|
|
2
|
+
|
|
3
|
+
Operator CLI for installing and running Anima from npm.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx @meetquinn/animactl start
|
|
7
|
+
npx @meetquinn/animactl@canary restart
|
|
8
|
+
npx @meetquinn/animactl status
|
|
9
|
+
npx @meetquinn/animactl stop
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
This package installs the `@meetquinn/animactl` runtime into `~/.anima/runtime/current` and runs
|
|
13
|
+
services from that pinned runtime. Durable Anima data remains in `~/.anima`.
|
package/bin/anima
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, realpathSync } from 'node:fs';
|
|
3
|
+
import { dirname, resolve } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { spawnSync } from 'node:child_process';
|
|
6
|
+
|
|
7
|
+
const scriptPath = fileURLToPath(import.meta.url);
|
|
8
|
+
const sourcePath = existsSync(scriptPath) ? realpathSync(scriptPath) : scriptPath;
|
|
9
|
+
const packageRoot = resolve(dirname(sourcePath), '..');
|
|
10
|
+
const cliPath = resolve(packageRoot, 'dist/server/cli/anima.js');
|
|
11
|
+
const result = spawnSync(process.execPath, [cliPath, ...process.argv.slice(2)], { stdio: 'inherit' });
|
|
12
|
+
if (result.error) throw result.error;
|
|
13
|
+
if (result.signal) process.kill(process.pid, result.signal);
|
|
14
|
+
process.exit(result.status ?? 1);
|
package/bin/animactl
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, realpathSync } from 'node:fs';
|
|
3
|
+
import { dirname, resolve } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { spawnSync } from 'node:child_process';
|
|
6
|
+
|
|
7
|
+
const scriptPath = fileURLToPath(import.meta.url);
|
|
8
|
+
const sourcePath = existsSync(scriptPath) ? realpathSync(scriptPath) : scriptPath;
|
|
9
|
+
const packageRoot = resolve(dirname(sourcePath), '..');
|
|
10
|
+
const cliPath = resolve(packageRoot, 'dist/server/cli/animactl-npm.js');
|
|
11
|
+
const result = spawnSync(process.execPath, [cliPath, ...process.argv.slice(2)], { stdio: 'inherit' });
|
|
12
|
+
if (result.error) throw result.error;
|
|
13
|
+
if (result.signal) process.kill(process.pid, result.signal);
|
|
14
|
+
process.exit(result.status ?? 1);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Activity, AgentActivityFeedPage } from '../../shared/activity.js';
|
|
2
|
+
import { WakeQueueService } from '../inbox/wake-queue.service.js';
|
|
3
|
+
import { ActivityStore, type ActivityRecordInput } from '../storage/schema/activity.store.js';
|
|
4
|
+
export interface ActivityListInput {
|
|
5
|
+
before?: string;
|
|
6
|
+
limit?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ActivityRecorder {
|
|
9
|
+
record(agentId: string, input: ActivityRecordInput): Promise<Activity>;
|
|
10
|
+
}
|
|
11
|
+
export declare class ActivityService {
|
|
12
|
+
private readonly store;
|
|
13
|
+
private readonly wakeQueue;
|
|
14
|
+
constructor(agentId: string, store?: ActivityStore, wakeQueue?: WakeQueueService);
|
|
15
|
+
record(input: ActivityRecordInput): Promise<Activity>;
|
|
16
|
+
readAll(): Promise<Activity[]>;
|
|
17
|
+
readSince(createdAt: string): Promise<Activity[]>;
|
|
18
|
+
listActivityFeed(input?: ActivityListInput): Promise<AgentActivityFeedPage>;
|
|
19
|
+
}
|
|
20
|
+
export declare function activityServiceForAgent(agentId: string): ActivityService;
|
|
21
|
+
export declare const defaultActivityRecorder: ActivityRecorder;
|
|
22
|
+
//# sourceMappingURL=activity.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.service.d.ts","sourceRoot":"","sources":["../../../server/activities/activity.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA0B,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACxG,OAAO,EAAE,gBAAgB,EAAkB,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE9F,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACxE;AAED,qBAAa,eAAe;IAGxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAF1B,OAAO,EAAE,MAAM,EACE,KAAK,GAAE,aAA0C,EACjD,SAAS,GAAE,gBAAgD;IAG9E,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIrD,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAI9B,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAI3C,gBAAgB,CAAC,KAAK,GAAE,iBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CActF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAExE;AAED,eAAO,MAAM,uBAAuB,EAAE,gBAErC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { WakeQueueService } from '../inbox/wake-queue.service.js';
|
|
2
|
+
import { ActivityStore } from '../storage/schema/activity.store.js';
|
|
3
|
+
export class ActivityService {
|
|
4
|
+
store;
|
|
5
|
+
wakeQueue;
|
|
6
|
+
constructor(agentId, store = new ActivityStore(agentId), wakeQueue = new WakeQueueService(agentId)) {
|
|
7
|
+
this.store = store;
|
|
8
|
+
this.wakeQueue = wakeQueue;
|
|
9
|
+
}
|
|
10
|
+
record(input) {
|
|
11
|
+
return this.store.record(input);
|
|
12
|
+
}
|
|
13
|
+
readAll() {
|
|
14
|
+
return this.store.readAll();
|
|
15
|
+
}
|
|
16
|
+
readSince(createdAt) {
|
|
17
|
+
return this.store.readSince(createdAt);
|
|
18
|
+
}
|
|
19
|
+
async listActivityFeed(input = {}) {
|
|
20
|
+
const limit = normalizeActivityLimit(input.limit);
|
|
21
|
+
const [activities, items] = await Promise.all([
|
|
22
|
+
input.before ? this.store.readBefore(input.before, limit) : this.store.readLastN(limit),
|
|
23
|
+
this.wakeQueue.list(),
|
|
24
|
+
]);
|
|
25
|
+
const events = [...activities.map(activityFeedEvent), ...items.map(inboxFeedEvent)]
|
|
26
|
+
.filter((event) => !input.before || event.timestamp < input.before)
|
|
27
|
+
.sort((a, b) => a.timestamp.localeCompare(b.timestamp))
|
|
28
|
+
.slice(-limit);
|
|
29
|
+
const nextCursor = events.length >= limit ? (events[0]?.timestamp ?? null) : null;
|
|
30
|
+
return { events, nextCursor };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function activityServiceForAgent(agentId) {
|
|
34
|
+
return new ActivityService(agentId);
|
|
35
|
+
}
|
|
36
|
+
export const defaultActivityRecorder = {
|
|
37
|
+
record: (agentId, input) => activityServiceForAgent(agentId).record(input),
|
|
38
|
+
};
|
|
39
|
+
function normalizeActivityLimit(limit) {
|
|
40
|
+
if (!Number.isFinite(limit))
|
|
41
|
+
return 100;
|
|
42
|
+
return Math.min(Math.max(1, Math.trunc(limit)), 500);
|
|
43
|
+
}
|
|
44
|
+
function activityFeedEvent(activity) {
|
|
45
|
+
return { activity, kind: 'activity', timestamp: activity.createdAt };
|
|
46
|
+
}
|
|
47
|
+
function inboxFeedEvent(item) {
|
|
48
|
+
return { item, kind: 'inbox', timestamp: item.receivedAt };
|
|
49
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type AgentConfig, type AgentCreateRequest, type AgentUpdateProviderRequest } from '../../shared/agent-config.js';
|
|
2
|
+
export declare class AgentConfigError extends Error {
|
|
3
|
+
readonly statusCode: number;
|
|
4
|
+
constructor(statusCode: number, message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function isAgentRunnable(agent: AgentConfig): boolean;
|
|
7
|
+
export declare function agentConfigFromCreateInput(input: AgentCreateRequest): AgentConfig;
|
|
8
|
+
export declare function agentConfigWithProviderUpdate(current: AgentConfig, update: AgentUpdateProviderRequest): AgentConfig;
|
|
9
|
+
export declare function redactAgentConfig(agent: AgentConfig): AgentConfig;
|
|
10
|
+
export declare function normalizeAgentConfig(agentId: string, agent: AgentConfig): AgentConfig;
|
|
11
|
+
export declare function assertAgentConfigId(agentId: string, agent: AgentConfig, path: string): void;
|
|
12
|
+
export declare function validateAgentConfig(agent: AgentConfig): Promise<void>;
|
|
13
|
+
export declare function validateRunnableAgentConfig(agent: AgentConfig): Promise<void>;
|
|
14
|
+
export declare function ensureCreateAgentHome(homePath: string): Promise<void>;
|
|
15
|
+
export declare function ensureExistingAgentHome(homePath: string): Promise<void>;
|
|
16
|
+
export declare function resolveAgentHomePath(agent: AgentConfig): string;
|
|
17
|
+
//# sourceMappingURL=agent-config-ops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-config-ops.d.ts","sourceRoot":"","sources":["../../../server/agents/agent-config-ops.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAChC,MAAM,8BAA8B,CAAC;AAYtC,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIhD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE3D;AAMD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,kBAAkB,GAAG,WAAW,CAqBjF;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,0BAA0B,GACjC,WAAW,CAKb;AAiED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAMjE;AAaD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,CAMrF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI3F;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3E;AAED,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnF;AAoCD,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E;AAED,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAE/D"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { mkdir, stat } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
4
|
+
import { ANIMA_MANAGED_PROVIDER_ENV_KEYS, AgentProviderConfig, agentConfigSchema, agentIdFromName, } from '../../shared/agent-config.js';
|
|
5
|
+
import { DEFAULT_REASONING_EFFORT, isSupportedReasoningEffort, isSupportedProviderKind, isSupportedProviderModel, providerCatalogEntry, } from '../../shared/provider-catalog.js';
|
|
6
|
+
import { resolveAnimaHome } from '../anima-home.js';
|
|
7
|
+
import { AGENT_ID } from '../storage/schema/agent.store.js';
|
|
8
|
+
export class AgentConfigError extends Error {
|
|
9
|
+
statusCode;
|
|
10
|
+
constructor(statusCode, message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.statusCode = statusCode;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function isAgentRunnable(agent) {
|
|
16
|
+
return Boolean(agent.provider && agent.slack.appToken && agent.slack.botToken);
|
|
17
|
+
}
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Construction
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
export function agentConfigFromCreateInput(input) {
|
|
22
|
+
return {
|
|
23
|
+
createdAt: new Date().toISOString(),
|
|
24
|
+
enabled: true,
|
|
25
|
+
id: agentIdFromName(input.name),
|
|
26
|
+
profile: {
|
|
27
|
+
displayName: input.name,
|
|
28
|
+
role: input.role,
|
|
29
|
+
},
|
|
30
|
+
provider: AgentProviderConfig.parse(input.provider),
|
|
31
|
+
slack: {
|
|
32
|
+
appToken: '',
|
|
33
|
+
botToken: '',
|
|
34
|
+
connected: false,
|
|
35
|
+
manifestVersion: 0,
|
|
36
|
+
teamId: '',
|
|
37
|
+
workspaceIconUrl: '',
|
|
38
|
+
workspaceName: '',
|
|
39
|
+
},
|
|
40
|
+
homePath: resolveServerPath(input.homePath),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function agentConfigWithProviderUpdate(current, update) {
|
|
44
|
+
const selection = mergeProviderSelection(current.provider, update);
|
|
45
|
+
const env = mergeProviderEnv(current.provider.env, update.env);
|
|
46
|
+
if (env)
|
|
47
|
+
selection.env = env;
|
|
48
|
+
return { ...current, provider: AgentProviderConfig.parse(selection) };
|
|
49
|
+
}
|
|
50
|
+
// Returns the provider's kind/model/effort (and any kind-specific fields), env stripped.
|
|
51
|
+
// env is merged separately by mergeProviderEnv so the two concerns stay untangled.
|
|
52
|
+
function mergeProviderSelection(current, update) {
|
|
53
|
+
// Same kind: keep the current selection, overlay only the fields the update provides.
|
|
54
|
+
if (!update.kind || update.kind === current.kind) {
|
|
55
|
+
const currentEffort = 'reasoningEffort' in current ? current.reasoningEffort : undefined;
|
|
56
|
+
const model = update.model ?? current.model;
|
|
57
|
+
const reasoningEffort = update.reasoningEffort ?? currentEffort;
|
|
58
|
+
validateProviderShape(current.kind, model, reasoningEffort);
|
|
59
|
+
const { env: _env, ...rest } = current;
|
|
60
|
+
const next = { ...rest };
|
|
61
|
+
if (update.model !== undefined)
|
|
62
|
+
next.model = update.model;
|
|
63
|
+
if (update.reasoningEffort !== undefined)
|
|
64
|
+
next.reasoningEffort = update.reasoningEffort;
|
|
65
|
+
return next;
|
|
66
|
+
}
|
|
67
|
+
// Kind change: drop the old model/effort and adopt the new kind's catalog defaults.
|
|
68
|
+
const entry = providerCatalogEntry(update.kind);
|
|
69
|
+
if (!entry)
|
|
70
|
+
throw new AgentConfigError(400, `unsupported provider kind ${update.kind}`);
|
|
71
|
+
const model = update.model ?? entry.defaultModel;
|
|
72
|
+
const reasoningEffort = update.reasoningEffort ?? defaultReasoningEffort(entry);
|
|
73
|
+
validateProviderShape(entry.kind, model, reasoningEffort);
|
|
74
|
+
const next = { kind: entry.kind, model };
|
|
75
|
+
if (current.idleTimeoutMs !== undefined)
|
|
76
|
+
next.idleTimeoutMs = current.idleTimeoutMs;
|
|
77
|
+
if (reasoningEffort !== undefined)
|
|
78
|
+
next.reasoningEffort = reasoningEffort;
|
|
79
|
+
return next;
|
|
80
|
+
}
|
|
81
|
+
function mergeProviderEnv(current, update) {
|
|
82
|
+
const env = { ...current };
|
|
83
|
+
for (const [key, value] of Object.entries(update ?? {})) {
|
|
84
|
+
if (value !== null && isAnimaManagedProviderEnvKey(key)) {
|
|
85
|
+
throw new AgentConfigError(400, `${key} is managed by Anima and cannot be set in provider.env`);
|
|
86
|
+
}
|
|
87
|
+
if (value === null)
|
|
88
|
+
delete env[key];
|
|
89
|
+
else
|
|
90
|
+
env[key] = value;
|
|
91
|
+
}
|
|
92
|
+
return Object.keys(env).length > 0 ? env : undefined;
|
|
93
|
+
}
|
|
94
|
+
function defaultReasoningEffort(entry) {
|
|
95
|
+
if (entry.reasoningEfforts.length === 0)
|
|
96
|
+
return undefined;
|
|
97
|
+
return entry.reasoningEfforts.includes(DEFAULT_REASONING_EFFORT)
|
|
98
|
+
? DEFAULT_REASONING_EFFORT
|
|
99
|
+
: entry.reasoningEfforts[0];
|
|
100
|
+
}
|
|
101
|
+
function isAnimaManagedProviderEnvKey(key) {
|
|
102
|
+
return ANIMA_MANAGED_PROVIDER_ENV_KEYS.includes(key);
|
|
103
|
+
}
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
// Redaction (strip secrets before a config leaves the server)
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
export function redactAgentConfig(agent) {
|
|
108
|
+
return {
|
|
109
|
+
...agent,
|
|
110
|
+
provider: redactProviderEnv(agent.provider),
|
|
111
|
+
slack: { ...agent.slack, appToken: '', botToken: '' },
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// Keep the env keys visible so the UI can show what's set, but blank their values.
|
|
115
|
+
function redactProviderEnv(provider) {
|
|
116
|
+
if (!provider.env)
|
|
117
|
+
return provider;
|
|
118
|
+
const env = Object.fromEntries(Object.keys(provider.env).sort().map((key) => [key, '']));
|
|
119
|
+
return { ...provider, env };
|
|
120
|
+
}
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Validation (the write gate; the zod schema repairs configs on read)
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
export function normalizeAgentConfig(agentId, agent) {
|
|
125
|
+
if (!AGENT_ID.test(agentId))
|
|
126
|
+
throw new AgentConfigError(400, `agent id must match ${AGENT_ID}`);
|
|
127
|
+
const next = agentConfigSchema(agentId).parse(agent);
|
|
128
|
+
if (next.id !== agentId)
|
|
129
|
+
throw new AgentConfigError(400, 'agent id is immutable');
|
|
130
|
+
validateAgentConfigShape(next);
|
|
131
|
+
return next;
|
|
132
|
+
}
|
|
133
|
+
export function assertAgentConfigId(agentId, agent, path) {
|
|
134
|
+
if (agent.id !== agentId) {
|
|
135
|
+
throw new AgentConfigError(400, `${path}: agent id must match directory name ${agentId}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export async function validateAgentConfig(agent) {
|
|
139
|
+
validateAgentConfigShape(agent);
|
|
140
|
+
const homeStat = await stat(resolveAgentHomePath(agent)).catch(() => undefined);
|
|
141
|
+
if (!homeStat?.isDirectory()) {
|
|
142
|
+
throw new AgentConfigError(400, `Agent ${agent.id}: homePath must be an existing directory`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export async function validateRunnableAgentConfig(agent) {
|
|
146
|
+
await validateAgentConfig(agent);
|
|
147
|
+
if (!isAgentRunnable(agent)) {
|
|
148
|
+
throw new Error(`Agent ${agent.id}: provider and Slack tokens are required to run`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function validateAgentConfigShape(agent) {
|
|
152
|
+
if (!AGENT_ID.test(agent.id))
|
|
153
|
+
throw new AgentConfigError(400, `agent id must match ${AGENT_ID}`);
|
|
154
|
+
const provider = agent.provider;
|
|
155
|
+
const reasoningEffort = 'reasoningEffort' in provider ? provider.reasoningEffort : undefined;
|
|
156
|
+
validateProviderShape(provider.kind, provider.model, reasoningEffort, `Agent ${agent.id}: `);
|
|
157
|
+
if (agent.slack.appToken && !agent.slack.appToken.startsWith('xapp-')) {
|
|
158
|
+
throw new AgentConfigError(400, `Agent ${agent.id}: slack.appToken must start with xapp-`);
|
|
159
|
+
}
|
|
160
|
+
if (agent.slack.botToken && !agent.slack.botToken.startsWith('xoxb-')) {
|
|
161
|
+
throw new AgentConfigError(400, `Agent ${agent.id}: slack.botToken must start with xoxb-`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function validateProviderShape(kind, model, reasoningEffort, prefix = '') {
|
|
165
|
+
if (!isSupportedProviderKind(kind)) {
|
|
166
|
+
throw new AgentConfigError(400, `${prefix}unsupported provider kind ${kind}`);
|
|
167
|
+
}
|
|
168
|
+
if (model && !isSupportedProviderModel(kind, model)) {
|
|
169
|
+
throw new AgentConfigError(400, `${prefix}unsupported model for ${kind}: ${model}`);
|
|
170
|
+
}
|
|
171
|
+
if (reasoningEffort && !isSupportedReasoningEffort(kind, reasoningEffort)) {
|
|
172
|
+
throw new AgentConfigError(400, `${prefix}unsupported reasoningEffort ${reasoningEffort}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// ---------------------------------------------------------------------------
|
|
176
|
+
// Home paths
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
export async function ensureCreateAgentHome(homePath) {
|
|
179
|
+
const absolutePath = resolveServerPath(homePath);
|
|
180
|
+
const existing = await stat(absolutePath).catch(() => undefined);
|
|
181
|
+
if (existing) {
|
|
182
|
+
if (!existing.isDirectory())
|
|
183
|
+
throw new AgentConfigError(400, 'homePath must be a directory');
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
// Recursive so the full path (including the default agent home root) is created on first
|
|
187
|
+
// run when the parent directories don't exist yet.
|
|
188
|
+
await mkdir(absolutePath, { recursive: true });
|
|
189
|
+
}
|
|
190
|
+
export async function ensureExistingAgentHome(homePath) {
|
|
191
|
+
const existing = await stat(resolveServerPath(homePath)).catch(() => undefined);
|
|
192
|
+
if (!existing?.isDirectory()) {
|
|
193
|
+
throw new AgentConfigError(400, 'homePath must be an existing directory');
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
export function resolveAgentHomePath(agent) {
|
|
197
|
+
return resolveServerPath(agent.homePath);
|
|
198
|
+
}
|
|
199
|
+
function resolveServerPath(rawPath) {
|
|
200
|
+
const expanded = expandHome(rawPath);
|
|
201
|
+
return isAbsolute(expanded) ? resolve(expanded) : resolve(resolveAnimaHome(), expanded);
|
|
202
|
+
}
|
|
203
|
+
function expandHome(path) {
|
|
204
|
+
if (path === '~')
|
|
205
|
+
return homedir();
|
|
206
|
+
if (path.startsWith('~/'))
|
|
207
|
+
return resolve(homedir(), path.slice(2));
|
|
208
|
+
return path;
|
|
209
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-skills.d.ts","sourceRoot":"","sources":["../../../server/agents/agent-skills.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,wBAAwB,CAAC;AAMxE,wBAAsB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAS9E"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { resolveAgentHomePath } from './agent-config-ops.js';
|
|
5
|
+
const GLOBAL_AGENTS_SKILLS = join(homedir(), '.agents', 'skills');
|
|
6
|
+
const GLOBAL_CODEX_SKILLS = join(homedir(), '.codex', 'skills');
|
|
7
|
+
export async function scanAgentSkills(agent) {
|
|
8
|
+
const isCodex = agent.provider.kind === 'codex-cli';
|
|
9
|
+
const globalPath = isCodex ? GLOBAL_CODEX_SKILLS : GLOBAL_AGENTS_SKILLS;
|
|
10
|
+
const localPath = join(resolveAgentHomePath(agent), '.claude', 'skills');
|
|
11
|
+
const [global, local] = await Promise.all([
|
|
12
|
+
scanSkillDir(globalPath, isCodex),
|
|
13
|
+
scanSkillDir(localPath, false),
|
|
14
|
+
]);
|
|
15
|
+
return { global, globalPath, local, localPath };
|
|
16
|
+
}
|
|
17
|
+
async function scanSkillDir(dir, excludeSystem) {
|
|
18
|
+
let dirNames;
|
|
19
|
+
try {
|
|
20
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
21
|
+
dirNames = entries
|
|
22
|
+
.filter((entry) => {
|
|
23
|
+
if (!entry.isDirectory())
|
|
24
|
+
return false;
|
|
25
|
+
if (excludeSystem && entry.name === '.system')
|
|
26
|
+
return false;
|
|
27
|
+
if (entry.name.startsWith('.'))
|
|
28
|
+
return false;
|
|
29
|
+
return true;
|
|
30
|
+
})
|
|
31
|
+
.map((entry) => entry.name)
|
|
32
|
+
.sort();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const results = await Promise.all(dirNames.map((dirName) => readSkill(dir, dirName)));
|
|
38
|
+
return results.filter((skill) => skill !== null);
|
|
39
|
+
}
|
|
40
|
+
async function readSkill(base, dirName) {
|
|
41
|
+
try {
|
|
42
|
+
const content = await readFile(join(base, dirName, 'SKILL.md'), 'utf8');
|
|
43
|
+
const frontmatter = parseSkillFrontmatter(content);
|
|
44
|
+
return {
|
|
45
|
+
dirName,
|
|
46
|
+
name: frontmatter.name ?? dirName,
|
|
47
|
+
...(frontmatter.description ? { description: frontmatter.description } : {}),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function parseSkillFrontmatter(content) {
|
|
55
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
56
|
+
if (!match)
|
|
57
|
+
return {};
|
|
58
|
+
const result = {};
|
|
59
|
+
for (const line of match[1].split(/\r?\n/)) {
|
|
60
|
+
const keyValue = line.match(/^(\w+)\s*:\s*(.*)/);
|
|
61
|
+
if (!keyValue)
|
|
62
|
+
continue;
|
|
63
|
+
const key = keyValue[1];
|
|
64
|
+
const value = keyValue[2].trim();
|
|
65
|
+
if (key === 'description' && value)
|
|
66
|
+
result.description = value;
|
|
67
|
+
if (key === 'name' && value)
|
|
68
|
+
result.name = value;
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { WebClient } from '@slack/web-api';
|
|
2
|
+
import { type AgentSlackValidateRequest, type AgentSlackValidateResponse } from '../../shared/agent-config.js';
|
|
3
|
+
export interface SlackDisplayInfo {
|
|
4
|
+
appId?: string;
|
|
5
|
+
avatarUrl?: string;
|
|
6
|
+
botName?: string;
|
|
7
|
+
botUserId?: string;
|
|
8
|
+
teamId?: string;
|
|
9
|
+
workspaceIconUrl?: string;
|
|
10
|
+
workspaceName?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function validateSlackTokenPair(input: AgentSlackValidateRequest): Promise<AgentSlackValidateResponse>;
|
|
13
|
+
export declare function getSlackDisplayInfo(client: WebClient): Promise<SlackDisplayInfo>;
|
|
14
|
+
export declare function appIdFromAppToken(token: string | undefined): string | undefined;
|
|
15
|
+
export declare function getBotTokenScopes(token: string): Promise<string[]>;
|
|
16
|
+
//# sourceMappingURL=agent-slack-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-slack-validation.d.ts","sourceRoot":"","sources":["../../../server/agents/agent-slack-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAKhC,MAAM,8BAA8B,CAAC;AAMtC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,CAAC,CAYrC;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoBtF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAE/E;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWxE"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { isRecord } from '../json.js';
|
|
2
|
+
import { createSlackWebClient } from '../slack/client.js';
|
|
3
|
+
import { SlackWorkspaceDirectoryService } from '../slack/workspace-directory.service.js';
|
|
4
|
+
import { parseOauthScopesHeader } from '../slack/shortcuts.js';
|
|
5
|
+
const APP_TOKEN_APP_ID_PATTERN = /^xapp-\d+-(A[A-Z0-9]+)-/;
|
|
6
|
+
export async function validateSlackTokenPair(input) {
|
|
7
|
+
const app = input.appToken !== undefined
|
|
8
|
+
? await validateSlackToken('app', input.appToken)
|
|
9
|
+
: undefined;
|
|
10
|
+
const bot = input.botToken !== undefined
|
|
11
|
+
? await validateSlackToken('bot', input.botToken)
|
|
12
|
+
: undefined;
|
|
13
|
+
return {
|
|
14
|
+
...(app ? { app } : {}),
|
|
15
|
+
...(bot ? { bot } : {}),
|
|
16
|
+
connection: slackConnectionValidation(app, bot),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export async function getSlackDisplayInfo(client) {
|
|
20
|
+
const auth = await client.auth.test();
|
|
21
|
+
if (!auth.user_id)
|
|
22
|
+
throw new Error('Slack auth.test did not return a bot user id');
|
|
23
|
+
// Fetch the bot user profile directly (bypasses WorkspaceDirectoryService cache)
|
|
24
|
+
// so avatar changes take effect immediately on sync without requiring a full
|
|
25
|
+
// workspace directory refresh.
|
|
26
|
+
const userInfo = await client.users.info({ user: auth.user_id });
|
|
27
|
+
const user = userInfo.user;
|
|
28
|
+
const directory = new SlackWorkspaceDirectoryService({ client, teamId: auth.team_id });
|
|
29
|
+
const botName = directory.getUserDisplayName(user, (typeof auth.user === 'string' ? auth.user.trim() : '') || auth.user_id);
|
|
30
|
+
const workspaceIconUrl = await directory.getWorkspaceIconUrl().catch(() => '');
|
|
31
|
+
return {
|
|
32
|
+
appId: auth.app_id,
|
|
33
|
+
avatarUrl: user?.profile?.image_72 ?? '',
|
|
34
|
+
botName,
|
|
35
|
+
botUserId: auth.user_id,
|
|
36
|
+
teamId: auth.team_id ?? '',
|
|
37
|
+
workspaceIconUrl,
|
|
38
|
+
workspaceName: auth.team ?? '',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function appIdFromAppToken(token) {
|
|
42
|
+
return token?.match(APP_TOKEN_APP_ID_PATTERN)?.[1];
|
|
43
|
+
}
|
|
44
|
+
export async function getBotTokenScopes(token) {
|
|
45
|
+
const response = await fetch(slackApiMethodUrl('auth.test'), {
|
|
46
|
+
headers: {
|
|
47
|
+
authorization: `Bearer ${token}`,
|
|
48
|
+
'content-type': 'application/x-www-form-urlencoded',
|
|
49
|
+
},
|
|
50
|
+
method: 'POST',
|
|
51
|
+
});
|
|
52
|
+
const result = await response.json();
|
|
53
|
+
if (!result.ok)
|
|
54
|
+
throw new Error(`Slack auth.test failed: ${result.error ?? 'unknown_error'}`);
|
|
55
|
+
return parseOauthScopesHeader(response.headers.get('x-oauth-scopes'));
|
|
56
|
+
}
|
|
57
|
+
async function validateSlackToken(expected, rawToken) {
|
|
58
|
+
const token = rawToken.trim();
|
|
59
|
+
if (!token)
|
|
60
|
+
return invalidTokenValidation('unknown', expected, 'missing_token');
|
|
61
|
+
const detected = slackTokenKind(token);
|
|
62
|
+
if (detected === 'unknown')
|
|
63
|
+
return invalidTokenValidation(detected, expected, 'unknown_token_type');
|
|
64
|
+
if (detected !== expected)
|
|
65
|
+
return invalidTokenValidation(detected, expected, 'wrong_token_type');
|
|
66
|
+
return expected === 'app'
|
|
67
|
+
? validateAppToken(token)
|
|
68
|
+
: validateBotToken(token);
|
|
69
|
+
}
|
|
70
|
+
async function validateAppToken(token) {
|
|
71
|
+
const appId = appIdFromAppToken(token);
|
|
72
|
+
try {
|
|
73
|
+
await createSlackWebClient(token).apps.connections.open({});
|
|
74
|
+
return { ...(appId ? { appId } : {}), detected: 'app', expected: 'app', valid: true };
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
return {
|
|
78
|
+
...(appId ? { appId } : {}),
|
|
79
|
+
detected: 'app',
|
|
80
|
+
expected: 'app',
|
|
81
|
+
reason: tokenValidationReason(error, 'app'),
|
|
82
|
+
valid: false,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function validateBotToken(token) {
|
|
87
|
+
try {
|
|
88
|
+
const info = await getSlackDisplayInfo(createSlackWebClient(token));
|
|
89
|
+
return {
|
|
90
|
+
appId: info.appId,
|
|
91
|
+
botAvatarUrl: info.avatarUrl,
|
|
92
|
+
botName: info.botName,
|
|
93
|
+
botUserId: info.botUserId,
|
|
94
|
+
detected: 'bot',
|
|
95
|
+
expected: 'bot',
|
|
96
|
+
teamId: info.teamId,
|
|
97
|
+
valid: true,
|
|
98
|
+
workspaceIconUrl: info.workspaceIconUrl,
|
|
99
|
+
workspaceName: info.workspaceName,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
return { detected: 'bot', expected: 'bot', reason: tokenValidationReason(error, 'bot'), valid: false };
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function invalidTokenValidation(detected, expected, reason) {
|
|
107
|
+
return { detected, expected, reason, valid: false };
|
|
108
|
+
}
|
|
109
|
+
function slackTokenKind(token) {
|
|
110
|
+
if (token.startsWith('xapp-'))
|
|
111
|
+
return 'app';
|
|
112
|
+
if (token.startsWith('xoxb-'))
|
|
113
|
+
return 'bot';
|
|
114
|
+
return 'unknown';
|
|
115
|
+
}
|
|
116
|
+
function slackApiMethodUrl(method) {
|
|
117
|
+
const base = process.env.ANIMA_SLACK_API_URL ?? 'https://slack.com/api';
|
|
118
|
+
return `${base.replace(/\/$/, '')}/${method}`;
|
|
119
|
+
}
|
|
120
|
+
function slackConnectionValidation(app, bot) {
|
|
121
|
+
if (!app?.valid || !bot?.valid)
|
|
122
|
+
return { reason: 'incomplete', valid: false };
|
|
123
|
+
const base = {
|
|
124
|
+
appId: bot.appId ?? app.appId,
|
|
125
|
+
botAvatarUrl: bot.botAvatarUrl,
|
|
126
|
+
botName: bot.botName,
|
|
127
|
+
botUserId: bot.botUserId,
|
|
128
|
+
teamId: bot.teamId,
|
|
129
|
+
workspaceIconUrl: bot.workspaceIconUrl,
|
|
130
|
+
workspaceName: bot.workspaceName,
|
|
131
|
+
};
|
|
132
|
+
if (app.appId && bot.appId && app.appId !== bot.appId) {
|
|
133
|
+
return { ...base, reason: 'app_mismatch', valid: false };
|
|
134
|
+
}
|
|
135
|
+
return { ...base, valid: true };
|
|
136
|
+
}
|
|
137
|
+
function slackErrorCode(error) {
|
|
138
|
+
const data = isRecord(error) ? error['data'] : undefined;
|
|
139
|
+
if (isRecord(data) && typeof data['error'] === 'string')
|
|
140
|
+
return data['error'];
|
|
141
|
+
if (isRecord(error) && typeof error['code'] === 'string')
|
|
142
|
+
return error['code'];
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
function tokenValidationReason(error, kind) {
|
|
146
|
+
const code = slackErrorCode(error);
|
|
147
|
+
if (code === 'missing_scope' && kind === 'app')
|
|
148
|
+
return 'missing_connections_write';
|
|
149
|
+
if (code === 'invalid_auth' || code === 'not_authed' || code === 'token_revoked' || code === 'account_inactive') {
|
|
150
|
+
return 'invalid_token';
|
|
151
|
+
}
|
|
152
|
+
if (kind === 'bot' && error instanceof Error && /bot user id/i.test(error.message))
|
|
153
|
+
return 'not_bot_token';
|
|
154
|
+
return 'slack_api_error';
|
|
155
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { WebClient } from '@slack/web-api';
|
|
2
|
+
import { type AgentConnectSlackRequest, type AgentConfig, type AgentSetOwnerRequest, type AgentSlackValidateRequest, type AgentSlackValidateResponse, type SlackUserCandidate } from '../../shared/agent-config.js';
|
|
3
|
+
import { type AgentSlackManifestUpdateInfo, type AgentSlackManifestUpgradeRequest } from '../../shared/slack-manifest.js';
|
|
4
|
+
import { AgentService } from './agent.service.js';
|
|
5
|
+
export declare class AgentSlackService {
|
|
6
|
+
private readonly agentService;
|
|
7
|
+
constructor(agentService: AgentService);
|
|
8
|
+
validateTokens(input: AgentSlackValidateRequest): Promise<AgentSlackValidateResponse>;
|
|
9
|
+
connect(input: AgentConnectSlackRequest): Promise<AgentConfig>;
|
|
10
|
+
getManifestUpdateInfo(): Promise<AgentSlackManifestUpdateInfo>;
|
|
11
|
+
upgradeManifestVersion(input: AgentSlackManifestUpgradeRequest): Promise<AgentConfig>;
|
|
12
|
+
syncDisplayInfo(): Promise<AgentConfig>;
|
|
13
|
+
getWebClient(): Promise<WebClient>;
|
|
14
|
+
getAgentWebClient(): Promise<{
|
|
15
|
+
agent: AgentConfig;
|
|
16
|
+
client: WebClient;
|
|
17
|
+
}>;
|
|
18
|
+
private webClientForAgent;
|
|
19
|
+
fetchPrivateUrl(url: string): Promise<Response>;
|
|
20
|
+
listUsers(): Promise<SlackUserCandidate[]>;
|
|
21
|
+
setOwner(input: AgentSetOwnerRequest): Promise<AgentConfig>;
|
|
22
|
+
getInstallUrl(): Promise<string>;
|
|
23
|
+
private ensureOwnerOnboardingPrompt;
|
|
24
|
+
}
|
|
25
|
+
export declare function agentSlackServiceForAgent(agentId: string): AgentSlackService;
|
|
26
|
+
//# sourceMappingURL=agent-slack.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-slack.service.d.ts","sourceRoot":"","sources":["../../../server/agents/agent-slack.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,4BAA4B,EACjC,KAAK,gCAAgC,EACtC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAoBlD,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAGjD,cAAc,CAClB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,CAAC;IAIhC,OAAO,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC;IAwB9D,qBAAqB,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAgB9D,sBAAsB,CAC1B,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,WAAW,CAAC;IAoCjB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC;IAcvC,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAIlC,iBAAiB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE,CAAC;IAK7E,OAAO,CAAC,iBAAiB;IAInB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK/C,SAAS,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAK1C,QAAQ,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IAkB3D,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;YAMxB,2BAA2B;CAqD1C;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAE5E"}
|