@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
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join, posix } from 'node:path';
|
|
3
|
+
import { kbFileExtension } from '../../shared/kb-file-types.js';
|
|
4
|
+
// Error carrying an HTTP status; the API layer translates `statusCode` to the
|
|
5
|
+
// response code.
|
|
6
|
+
export class KbError extends Error {
|
|
7
|
+
statusCode;
|
|
8
|
+
constructor(statusCode, message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.statusCode = statusCode;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
// Text content larger than this is not inlined in the file API; the client
|
|
14
|
+
// falls back to the raw route. Keeps a giant tracked file from bloating a JSON
|
|
15
|
+
// response.
|
|
16
|
+
export const INLINE_TEXT_CAP = 2 * 1024 * 1024;
|
|
17
|
+
// Short cache so an HTML report pulling many relative assets doesn't rescan the
|
|
18
|
+
// KB per asset. Visibility rarely changes within a page load; staleness
|
|
19
|
+
// self-heals on the next tick.
|
|
20
|
+
export const CACHE_TTL_MS = 5_000;
|
|
21
|
+
export const KB_ID = /^[A-Za-z0-9._-]+$/;
|
|
22
|
+
export function normalizeRelPath(raw) {
|
|
23
|
+
if (!raw || raw.includes('\0') || raw.includes('\\') || raw.startsWith('/')) {
|
|
24
|
+
throw new KbError(400, 'bad_path');
|
|
25
|
+
}
|
|
26
|
+
const normalized = posix.normalize(raw).replace(/^\/+/, '');
|
|
27
|
+
if (!normalized || normalized === '.' || normalized === '..') {
|
|
28
|
+
throw new KbError(400, 'bad_path');
|
|
29
|
+
}
|
|
30
|
+
if (normalized.startsWith('../') || normalized.includes('/../')) {
|
|
31
|
+
throw new KbError(400, 'bad_path');
|
|
32
|
+
}
|
|
33
|
+
return normalized;
|
|
34
|
+
}
|
|
35
|
+
export function kbView(kb) {
|
|
36
|
+
return { id: kb.id, label: kb.label };
|
|
37
|
+
}
|
|
38
|
+
export function requiredString(value, field) {
|
|
39
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
40
|
+
throw new KbError(400, `${field} is required`);
|
|
41
|
+
}
|
|
42
|
+
return value.trim();
|
|
43
|
+
}
|
|
44
|
+
export function expandHome(path) {
|
|
45
|
+
if (path === '~')
|
|
46
|
+
return homedir();
|
|
47
|
+
return path.startsWith('~/') ? join(homedir(), path.slice(2)) : path;
|
|
48
|
+
}
|
|
49
|
+
// Build a nested dir/file tree from a flat list of repo-relative POSIX paths.
|
|
50
|
+
export function buildTree(paths) {
|
|
51
|
+
const rootNodes = [];
|
|
52
|
+
const dirIndex = new Map();
|
|
53
|
+
dirIndex.set('', rootNodes);
|
|
54
|
+
for (const filePath of paths.sort()) {
|
|
55
|
+
const segments = filePath.split('/');
|
|
56
|
+
let prefix = '';
|
|
57
|
+
for (let i = 0; i < segments.length; i += 1) {
|
|
58
|
+
const segment = segments[i];
|
|
59
|
+
const isLeaf = i === segments.length - 1;
|
|
60
|
+
const currentPath = prefix ? `${prefix}/${segment}` : segment;
|
|
61
|
+
const siblings = dirIndex.get(prefix) ?? rootNodes;
|
|
62
|
+
let node = siblings.find((n) => n.name === segment && n.type === (isLeaf ? 'file' : 'dir'));
|
|
63
|
+
if (!node) {
|
|
64
|
+
node = { name: segment, path: currentPath, type: isLeaf ? 'file' : 'dir' };
|
|
65
|
+
if (!isLeaf)
|
|
66
|
+
node.children = [];
|
|
67
|
+
siblings.push(node);
|
|
68
|
+
if (!isLeaf)
|
|
69
|
+
dirIndex.set(currentPath, node.children);
|
|
70
|
+
}
|
|
71
|
+
prefix = currentPath;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
sortTree(rootNodes);
|
|
75
|
+
return rootNodes;
|
|
76
|
+
}
|
|
77
|
+
export function contentTypeFor(relPath) {
|
|
78
|
+
return RAW_CONTENT_TYPES[kbFileExtension(relPath)] ?? 'application/octet-stream';
|
|
79
|
+
}
|
|
80
|
+
// Dirs before files, each group alphabetical (case-insensitive).
|
|
81
|
+
function sortTree(nodes) {
|
|
82
|
+
nodes.sort((a, b) => {
|
|
83
|
+
if (a.type !== b.type)
|
|
84
|
+
return a.type === 'dir' ? -1 : 1;
|
|
85
|
+
return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
|
|
86
|
+
});
|
|
87
|
+
for (const node of nodes) {
|
|
88
|
+
if (node.children)
|
|
89
|
+
sortTree(node.children);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const RAW_CONTENT_TYPES = {
|
|
93
|
+
html: 'text/html; charset=utf-8',
|
|
94
|
+
htm: 'text/html; charset=utf-8',
|
|
95
|
+
css: 'text/css; charset=utf-8',
|
|
96
|
+
js: 'application/javascript; charset=utf-8',
|
|
97
|
+
mjs: 'application/javascript; charset=utf-8',
|
|
98
|
+
json: 'application/json; charset=utf-8',
|
|
99
|
+
svg: 'image/svg+xml',
|
|
100
|
+
png: 'image/png',
|
|
101
|
+
jpg: 'image/jpeg',
|
|
102
|
+
jpeg: 'image/jpeg',
|
|
103
|
+
gif: 'image/gif',
|
|
104
|
+
webp: 'image/webp',
|
|
105
|
+
ico: 'image/x-icon',
|
|
106
|
+
bmp: 'image/bmp',
|
|
107
|
+
avif: 'image/avif',
|
|
108
|
+
woff2: 'font/woff2',
|
|
109
|
+
woff: 'font/woff',
|
|
110
|
+
md: 'text/markdown; charset=utf-8',
|
|
111
|
+
txt: 'text/plain; charset=utf-8',
|
|
112
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { KbCreateRequest, KbFile, KbRenameRequest, KbTree, KbView } from '../../shared/kb.js';
|
|
2
|
+
import { KbRegistryStore, KbStore } from '../storage/schema/kb.store.js';
|
|
3
|
+
import { type KbDirectoryBrowse } from './kb.helper.js';
|
|
4
|
+
export declare class KbRegistryService {
|
|
5
|
+
private readonly registry;
|
|
6
|
+
private kbsCache;
|
|
7
|
+
private readonly services;
|
|
8
|
+
constructor(registry?: KbRegistryStore);
|
|
9
|
+
clearCaches(): void;
|
|
10
|
+
listKbs(): Promise<KbView[]>;
|
|
11
|
+
browseKbDirectories(rawPath: string | undefined): Promise<KbDirectoryBrowse>;
|
|
12
|
+
addKb(input: KbCreateRequest): Promise<KbView[]>;
|
|
13
|
+
ensureDefaultTeamKbForAgentHome(homePath: string): Promise<void>;
|
|
14
|
+
serviceFor(id: string): KbService;
|
|
15
|
+
private resolvedKbs;
|
|
16
|
+
}
|
|
17
|
+
export declare class KbService {
|
|
18
|
+
private readonly id;
|
|
19
|
+
private readonly store;
|
|
20
|
+
private readonly onMutation;
|
|
21
|
+
private visibleFilesCache;
|
|
22
|
+
constructor(id: string, store?: KbStore, onMutation?: () => void);
|
|
23
|
+
clearCaches(): void;
|
|
24
|
+
getKb(): Promise<KbView>;
|
|
25
|
+
rename(input: KbRenameRequest): Promise<KbView>;
|
|
26
|
+
remove(): Promise<void>;
|
|
27
|
+
buildTree(): Promise<KbTree>;
|
|
28
|
+
readFile(rawPath: string): Promise<KbFile>;
|
|
29
|
+
resolveRawFile(rawPath: string): Promise<{
|
|
30
|
+
absPath: string;
|
|
31
|
+
contentType: string;
|
|
32
|
+
}>;
|
|
33
|
+
private resolvedKb;
|
|
34
|
+
private resolveTrackedPath;
|
|
35
|
+
private resolveVisibleKbPath;
|
|
36
|
+
private visibleKbFiles;
|
|
37
|
+
private rootGitignoreFilter;
|
|
38
|
+
private collectVisibleFiles;
|
|
39
|
+
}
|
|
40
|
+
export declare const defaultKbRegistryService: KbRegistryService;
|
|
41
|
+
//# sourceMappingURL=kb.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb.service.d.ts","sourceRoot":"","sources":["../../../server/kb/kb.service.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAUL,KAAK,iBAAiB,EAEvB,MAAM,gBAAgB,CAAC;AAExB,qBAAa,iBAAiB;IAIhB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,OAAO,CAAC,QAAQ,CAA0D;IAC1E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;gBAE5B,QAAQ,GAAE,eAAuC;IAI9E,WAAW,IAAI,IAAI;IAKb,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK5B,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAoB5E,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBhD,+BAA+B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAetE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS;YAQnB,WAAW;CAsB1B;AAOD,qBAAa,SAAS;IAIlB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,iBAAiB,CAAuD;gBAG7D,EAAE,EAAE,MAAM,EACV,KAAK,GAAE,OAAyB,EAChC,UAAU,GAAE,MAAM,IAAe;IAGpD,WAAW,IAAI,IAAI;IAIb,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAKxB,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAO/C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAMvB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAM5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB1C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;YAK1E,UAAU;YAaV,kBAAkB;YAOlB,oBAAoB;YAoCpB,cAAc;YAYd,mBAAmB;YAQnB,mBAAmB;CAqBlC;AAED,eAAO,MAAM,wBAAwB,mBAA0B,CAAC"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { lstat, readFile, readdir, realpath, stat } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { isAbsolute, join, posix, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import ignore from 'ignore';
|
|
5
|
+
import { DEFAULT_TEAM_KB_ROOT } from '../../shared/agent-home.js';
|
|
6
|
+
import { kbCodeLanguage, kbFileKind } from '../../shared/kb-file-types.js';
|
|
7
|
+
import { KbRegistryStore, KbStore } from '../storage/schema/kb.store.js';
|
|
8
|
+
import { buildTree, CACHE_TTL_MS, contentTypeFor, expandHome, INLINE_TEXT_CAP, KB_ID, KbError, kbView, normalizeRelPath, } from './kb.helper.js';
|
|
9
|
+
export class KbRegistryService {
|
|
10
|
+
registry;
|
|
11
|
+
kbsCache;
|
|
12
|
+
services = new Map();
|
|
13
|
+
constructor(registry = new KbRegistryStore()) {
|
|
14
|
+
this.registry = registry;
|
|
15
|
+
}
|
|
16
|
+
// Test hook: the root/visibility caches have a TTL, so a test switching
|
|
17
|
+
// ANIMA_HOME within the TTL window would otherwise see stale roots.
|
|
18
|
+
clearCaches() {
|
|
19
|
+
this.kbsCache = undefined;
|
|
20
|
+
this.services.forEach((service) => service.clearCaches());
|
|
21
|
+
}
|
|
22
|
+
async listKbs() {
|
|
23
|
+
const kbs = await this.resolvedKbs();
|
|
24
|
+
return kbs.map((kb) => kbView(kb));
|
|
25
|
+
}
|
|
26
|
+
async browseKbDirectories(rawPath) {
|
|
27
|
+
const home = await realpath(homedir());
|
|
28
|
+
const requested = rawPath?.trim() ? expandHome(rawPath.trim()) : home;
|
|
29
|
+
const requestedRealpath = await realpath(resolve(requested)).catch(() => undefined);
|
|
30
|
+
if (!requestedRealpath)
|
|
31
|
+
throw new KbError(404, 'path_not_found');
|
|
32
|
+
if (requestedRealpath !== home && !requestedRealpath.startsWith(home + sep)) {
|
|
33
|
+
throw new KbError(400, 'path outside browse root');
|
|
34
|
+
}
|
|
35
|
+
const currentStat = await stat(requestedRealpath).catch(() => undefined);
|
|
36
|
+
if (!currentStat?.isDirectory())
|
|
37
|
+
throw new KbError(400, 'path must be an existing directory');
|
|
38
|
+
const entries = await readdir(requestedRealpath, { withFileTypes: true });
|
|
39
|
+
return {
|
|
40
|
+
path: requestedRealpath,
|
|
41
|
+
entries: entries
|
|
42
|
+
.filter((entry) => entry.isDirectory() && !entry.name.startsWith('.'))
|
|
43
|
+
.map((entry) => ({ name: entry.name, path: join(requestedRealpath, entry.name) }))
|
|
44
|
+
.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async addKb(input) {
|
|
48
|
+
const id = input.id;
|
|
49
|
+
const label = input.label;
|
|
50
|
+
const rootPath = expandHome(input.path);
|
|
51
|
+
if (!KB_ID.test(id))
|
|
52
|
+
throw new KbError(400, 'id must be a URL-safe slug');
|
|
53
|
+
const absolutePath = resolve(rootPath);
|
|
54
|
+
const rootStat = await stat(absolutePath).catch(() => undefined);
|
|
55
|
+
if (!rootStat?.isDirectory())
|
|
56
|
+
throw new KbError(400, 'path must be an existing directory');
|
|
57
|
+
const store = new KbStore(id);
|
|
58
|
+
if (store.exists()) {
|
|
59
|
+
throw new KbError(409, `kb already exists: ${id}`);
|
|
60
|
+
}
|
|
61
|
+
await store.write({ id, label, path: absolutePath });
|
|
62
|
+
this.clearCaches();
|
|
63
|
+
return this.listKbs();
|
|
64
|
+
}
|
|
65
|
+
async ensureDefaultTeamKbForAgentHome(homePath) {
|
|
66
|
+
const teamRoot = resolve(expandHome(DEFAULT_TEAM_KB_ROOT));
|
|
67
|
+
const resolvedHome = resolve(expandHome(homePath));
|
|
68
|
+
if (!isPathInside(resolvedHome, teamRoot))
|
|
69
|
+
return;
|
|
70
|
+
const configured = await this.registry.list();
|
|
71
|
+
if (configured.some((kb) => resolve(expandHome(kb.path)) === teamRoot))
|
|
72
|
+
return;
|
|
73
|
+
await this.addKb({
|
|
74
|
+
id: nextKbId(configured.map((kb) => kb.id), 'team'),
|
|
75
|
+
label: 'Team',
|
|
76
|
+
path: teamRoot,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
serviceFor(id) {
|
|
80
|
+
if (!KB_ID.test(id))
|
|
81
|
+
throw new KbError(400, 'bad kb id');
|
|
82
|
+
if (!this.services.has(id)) {
|
|
83
|
+
this.services.set(id, new KbService(id, new KbStore(id), () => this.clearCaches()));
|
|
84
|
+
}
|
|
85
|
+
return this.services.get(id);
|
|
86
|
+
}
|
|
87
|
+
async resolvedKbs() {
|
|
88
|
+
const now = Date.now();
|
|
89
|
+
if (this.kbsCache && now - this.kbsCache.loadedAt < CACHE_TTL_MS) {
|
|
90
|
+
return this.kbsCache.kbs;
|
|
91
|
+
}
|
|
92
|
+
// Let config-validation errors propagate. Swallowing them here would turn
|
|
93
|
+
// malformed KB config into a silent empty surface, hiding the exact config
|
|
94
|
+
// boundary we want explicit.
|
|
95
|
+
const configured = await this.registry.list();
|
|
96
|
+
const kbs = [];
|
|
97
|
+
for (const entry of configured) {
|
|
98
|
+
const path = resolve(entry.path);
|
|
99
|
+
const kbStat = await stat(path).catch(() => undefined);
|
|
100
|
+
if (kbStat?.isDirectory()) {
|
|
101
|
+
kbs.push({ id: entry.id, label: entry.label, path });
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
console.error(`kb "${entry.id}" path is not an existing directory, skipping: ${path}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
this.kbsCache = { kbs, loadedAt: now };
|
|
108
|
+
return kbs;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Read-only web view over one Knowledge Base directory. If the KB root has
|
|
112
|
+
// a root `.gitignore`, those patterns are the exposure filter; otherwise every
|
|
113
|
+
// file under the root is visible. `.git/` is VCS metadata, not content, and is
|
|
114
|
+
// always skipped. Every request resolves to a root-relative POSIX path that must
|
|
115
|
+
// be an exact member of the visible file set before any byte is read.
|
|
116
|
+
export class KbService {
|
|
117
|
+
id;
|
|
118
|
+
store;
|
|
119
|
+
onMutation;
|
|
120
|
+
visibleFilesCache;
|
|
121
|
+
constructor(id, store = new KbStore(id), onMutation = () => { }) {
|
|
122
|
+
this.id = id;
|
|
123
|
+
this.store = store;
|
|
124
|
+
this.onMutation = onMutation;
|
|
125
|
+
}
|
|
126
|
+
clearCaches() {
|
|
127
|
+
this.visibleFilesCache = undefined;
|
|
128
|
+
}
|
|
129
|
+
async getKb() {
|
|
130
|
+
const kb = await this.resolvedKb();
|
|
131
|
+
return kbView(kb);
|
|
132
|
+
}
|
|
133
|
+
async rename(input) {
|
|
134
|
+
if (!this.store.exists())
|
|
135
|
+
throw new KbError(404, `kb not found: ${this.id}`);
|
|
136
|
+
await this.store.update((kb) => ({ ...kb, label: input.label }));
|
|
137
|
+
this.onMutation();
|
|
138
|
+
return this.getKb();
|
|
139
|
+
}
|
|
140
|
+
async remove() {
|
|
141
|
+
if (!this.store.exists())
|
|
142
|
+
throw new KbError(404, `kb not found: ${this.id}`);
|
|
143
|
+
await this.store.remove();
|
|
144
|
+
this.onMutation();
|
|
145
|
+
}
|
|
146
|
+
async buildTree() {
|
|
147
|
+
const kb = await this.resolvedKb();
|
|
148
|
+
const files = await this.visibleKbFiles(kb);
|
|
149
|
+
return { kb: kbView(kb), nodes: buildTree([...files]) };
|
|
150
|
+
}
|
|
151
|
+
async readFile(rawPath) {
|
|
152
|
+
const { kb, relPath, absPath } = await this.resolveTrackedPath(rawPath);
|
|
153
|
+
const name = posix.basename(relPath);
|
|
154
|
+
const kind = kbFileKind(relPath);
|
|
155
|
+
const fileStat = await lstat(absPath);
|
|
156
|
+
const meta = { kbId: kb.id, path: relPath, name, kind, size: fileStat.size };
|
|
157
|
+
if (kind === 'code') {
|
|
158
|
+
const language = kbCodeLanguage(relPath);
|
|
159
|
+
if (language)
|
|
160
|
+
meta.language = language;
|
|
161
|
+
}
|
|
162
|
+
// Image / HTML / binary render via the raw route (img src / iframe src), so
|
|
163
|
+
// we don't inline their bytes here. Text-ish kinds carry their content for
|
|
164
|
+
// the client renderer, capped.
|
|
165
|
+
if (kind === 'markdown' || kind === 'json' || kind === 'code' || kind === 'text') {
|
|
166
|
+
if (fileStat.size > INLINE_TEXT_CAP) {
|
|
167
|
+
meta.truncated = true;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
meta.content = await readFile(absPath, 'utf8');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return meta;
|
|
174
|
+
}
|
|
175
|
+
async resolveRawFile(rawPath) {
|
|
176
|
+
const { relPath, absPath } = await this.resolveTrackedPath(rawPath);
|
|
177
|
+
return { absPath, contentType: contentTypeFor(relPath) };
|
|
178
|
+
}
|
|
179
|
+
async resolvedKb() {
|
|
180
|
+
if (!KB_ID.test(this.id))
|
|
181
|
+
throw new KbError(400, 'bad kb id');
|
|
182
|
+
if (!this.store.exists())
|
|
183
|
+
throw new KbError(404, 'kb_not_found');
|
|
184
|
+
const entry = await this.store.read();
|
|
185
|
+
const path = resolve(entry.path);
|
|
186
|
+
const kbStat = await stat(path).catch(() => undefined);
|
|
187
|
+
if (!kbStat?.isDirectory()) {
|
|
188
|
+
console.error(`kb "${entry.id}" path is not an existing directory, skipping: ${path}`);
|
|
189
|
+
throw new KbError(404, 'kb_not_found');
|
|
190
|
+
}
|
|
191
|
+
return { id: entry.id, label: entry.label, path };
|
|
192
|
+
}
|
|
193
|
+
async resolveTrackedPath(rawPath) {
|
|
194
|
+
const kb = await this.resolvedKb();
|
|
195
|
+
const relPath = normalizeRelPath(rawPath);
|
|
196
|
+
const files = await this.visibleKbFiles(kb);
|
|
197
|
+
return this.resolveVisibleKbPath(kb, relPath, files);
|
|
198
|
+
}
|
|
199
|
+
async resolveVisibleKbPath(kb, relPath, files) {
|
|
200
|
+
if (!files.has(relPath)) {
|
|
201
|
+
throw new KbError(404, 'not_found');
|
|
202
|
+
}
|
|
203
|
+
let absPath = join(kb.path, relPath);
|
|
204
|
+
// Defensive lexical containment assert (normalizeRelPath already strips `..`).
|
|
205
|
+
const kbResolved = resolve(kb.path);
|
|
206
|
+
const absResolved = resolve(absPath);
|
|
207
|
+
if (absResolved !== kbResolved && !absResolved.startsWith(kbResolved + sep)) {
|
|
208
|
+
throw new KbError(404, 'not_found');
|
|
209
|
+
}
|
|
210
|
+
let fileStat = await lstat(absPath);
|
|
211
|
+
if (fileStat.isSymbolicLink()) {
|
|
212
|
+
const resolvedTarget = await realpath(absPath).catch(() => undefined);
|
|
213
|
+
if (!resolvedTarget)
|
|
214
|
+
throw new KbError(404, 'not_found');
|
|
215
|
+
const kbRealpath = await realpath(kb.path);
|
|
216
|
+
if (resolvedTarget !== kbRealpath && !resolvedTarget.startsWith(kbRealpath + sep)) {
|
|
217
|
+
throw new KbError(404, 'not_found');
|
|
218
|
+
}
|
|
219
|
+
const targetRelPath = relative(kbRealpath, resolvedTarget).split(sep).join(posix.sep);
|
|
220
|
+
if (!files.has(targetRelPath)) {
|
|
221
|
+
throw new KbError(404, 'not_found');
|
|
222
|
+
}
|
|
223
|
+
absPath = resolvedTarget;
|
|
224
|
+
fileStat = await lstat(absPath);
|
|
225
|
+
}
|
|
226
|
+
if (!fileStat.isFile()) {
|
|
227
|
+
throw new KbError(404, 'not_found');
|
|
228
|
+
}
|
|
229
|
+
return { kb, relPath, absPath };
|
|
230
|
+
}
|
|
231
|
+
async visibleKbFiles(kb) {
|
|
232
|
+
const now = Date.now();
|
|
233
|
+
if (this.visibleFilesCache && now - this.visibleFilesCache.loadedAt < CACHE_TTL_MS) {
|
|
234
|
+
return this.visibleFilesCache.files;
|
|
235
|
+
}
|
|
236
|
+
const files = new Set();
|
|
237
|
+
const filter = await this.rootGitignoreFilter(kb.path);
|
|
238
|
+
await this.collectVisibleFiles(kb.path, '', filter, files);
|
|
239
|
+
this.visibleFilesCache = { files, loadedAt: now };
|
|
240
|
+
return files;
|
|
241
|
+
}
|
|
242
|
+
async rootGitignoreFilter(rootPath) {
|
|
243
|
+
// Product v1 uses the KB root `.gitignore` as the boundary. Nested
|
|
244
|
+
// `.gitignore` files are intentionally not loaded yet; add them here if a
|
|
245
|
+
// KB starts relying on subdir-specific ignore rules.
|
|
246
|
+
const content = await readFile(join(rootPath, '.gitignore'), 'utf8').catch(() => undefined);
|
|
247
|
+
return content === undefined ? undefined : ignore().add(content);
|
|
248
|
+
}
|
|
249
|
+
async collectVisibleFiles(rootPath, dirRelPath, filter, files) {
|
|
250
|
+
const dirPath = dirRelPath ? join(rootPath, dirRelPath) : rootPath;
|
|
251
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
252
|
+
for (const entry of entries) {
|
|
253
|
+
const relPath = dirRelPath ? `${dirRelPath}/${entry.name}` : entry.name;
|
|
254
|
+
if (relPath === '.git' || relPath.startsWith('.git/'))
|
|
255
|
+
continue;
|
|
256
|
+
if (entry.isDirectory()) {
|
|
257
|
+
if (filter?.ignores(`${relPath}/`))
|
|
258
|
+
continue;
|
|
259
|
+
await this.collectVisibleFiles(rootPath, relPath, filter, files);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if ((entry.isFile() || entry.isSymbolicLink()) && !filter?.ignores(relPath)) {
|
|
263
|
+
files.add(relPath);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
export const defaultKbRegistryService = new KbRegistryService();
|
|
269
|
+
function nextKbId(existingIds, preferred) {
|
|
270
|
+
const existing = new Set(existingIds);
|
|
271
|
+
if (!existing.has(preferred))
|
|
272
|
+
return preferred;
|
|
273
|
+
for (let index = 2;; index += 1) {
|
|
274
|
+
const candidate = `${preferred}-${index}`;
|
|
275
|
+
if (!existing.has(candidate))
|
|
276
|
+
return candidate;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
function isPathInside(path, parent) {
|
|
280
|
+
const relPath = relative(parent, path);
|
|
281
|
+
return relPath === '' || Boolean(relPath && !relPath.startsWith('..') && !isAbsolute(relPath));
|
|
282
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Activity } from '../../shared/activity.js';
|
|
2
|
+
import type { AgentMessageRecord } from '../../shared/messages.js';
|
|
3
|
+
import type { InboxItem } from '../../shared/inbox.js';
|
|
4
|
+
export declare function messageFromInboxItem(item: InboxItem): AgentMessageRecord | undefined;
|
|
5
|
+
export declare function messageFromActivity(activity: Activity): AgentMessageRecord | undefined;
|
|
6
|
+
export declare function messageIdForInboxItem(item: InboxItem): string;
|
|
7
|
+
export declare function messageIdForActivity(activity: Activity): string;
|
|
8
|
+
//# sourceMappingURL=message.projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.projection.d.ts","sourceRoot":"","sources":["../../../server/messages/message.projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAEV,SAAS,EAGV,MAAM,uBAAuB,CAAC;AAE/B,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,kBAAkB,GAAG,SAAS,CAiBpF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,kBAAkB,GAAG,SAAS,CAiDtF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE7D;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE/D"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
export function messageFromInboxItem(item) {
|
|
2
|
+
if (item.kind === 'slack')
|
|
3
|
+
return slackInboxMessage(item);
|
|
4
|
+
if (item.kind === 'reminder') {
|
|
5
|
+
return {
|
|
6
|
+
actor: 'Reminder',
|
|
7
|
+
direction: 'in',
|
|
8
|
+
kind: 'reminder',
|
|
9
|
+
messageId: messageIdForInboxItem(item),
|
|
10
|
+
reminderId: item.reminderId,
|
|
11
|
+
source: { id: item.id, kind: 'inbox' },
|
|
12
|
+
text: `Reminder fired: ${item.reminderId}`,
|
|
13
|
+
timestamp: item.receivedAt,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (item.kind === 'onboarding')
|
|
17
|
+
return onboardingMessage(item);
|
|
18
|
+
if (item.kind === 'choice_response')
|
|
19
|
+
return choiceResponseMessage(item);
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
export function messageFromActivity(activity) {
|
|
23
|
+
if (activity.type !== 'external.effect.completed' && activity.type !== 'tool.call.completed')
|
|
24
|
+
return undefined;
|
|
25
|
+
const payload = activity.payload ?? {};
|
|
26
|
+
const tool = stringField(payload, 'tool');
|
|
27
|
+
const effect = stringField(payload, 'effect');
|
|
28
|
+
if (tool === 'anima.message.send' ||
|
|
29
|
+
tool === 'anima.message.update' ||
|
|
30
|
+
effect === 'slack.message.send' ||
|
|
31
|
+
effect === 'slack.message.update') {
|
|
32
|
+
return baseOutboxMessage(activity, payload, {
|
|
33
|
+
isEdit: tool === 'anima.message.update' || effect === 'slack.message.update',
|
|
34
|
+
kind: 'message',
|
|
35
|
+
messageTs: stringField(payload, 'ts') ?? stringField(payload, 'targetTs'),
|
|
36
|
+
text: stringField(payload, 'text') ?? '',
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (tool === 'anima.file.send' || effect === 'slack.file.send') {
|
|
40
|
+
const files = uploadFiles(payload['uploads']);
|
|
41
|
+
const caption = stringField(payload, 'caption') ?? '';
|
|
42
|
+
const text = [caption, files.length ? `Files: ${files.map((file) => file.filename).join(', ')}` : 'Files uploaded']
|
|
43
|
+
.filter(Boolean)
|
|
44
|
+
.join('\n');
|
|
45
|
+
return baseOutboxMessage(activity, payload, {
|
|
46
|
+
files,
|
|
47
|
+
kind: 'file',
|
|
48
|
+
text,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (tool === 'anima.message.react' || effect === 'slack.reaction') {
|
|
52
|
+
const action = stringField(payload, 'action') === 'removed' ? 'removed' : 'added';
|
|
53
|
+
const name = stringField(payload, 'name') ?? '';
|
|
54
|
+
return baseOutboxMessage(activity, payload, {
|
|
55
|
+
kind: 'reaction',
|
|
56
|
+
messageTs: stringField(payload, 'targetTs') ?? stringField(payload, 'ts'),
|
|
57
|
+
reaction: {
|
|
58
|
+
action,
|
|
59
|
+
name,
|
|
60
|
+
...(payload['noop'] === true ? { noop: true } : {}),
|
|
61
|
+
},
|
|
62
|
+
text: `Reaction ${action}: :${name || 'unknown'}:`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
export function messageIdForInboxItem(item) {
|
|
68
|
+
return `msg_inbox:${item.id}`;
|
|
69
|
+
}
|
|
70
|
+
export function messageIdForActivity(activity) {
|
|
71
|
+
return `msg_activity:${activity.activityId}`;
|
|
72
|
+
}
|
|
73
|
+
function slackInboxMessage(item) {
|
|
74
|
+
return {
|
|
75
|
+
actor: slackActorLabel(item),
|
|
76
|
+
actorDisplayName: item.actor?.displayName,
|
|
77
|
+
actorHandle: item.actor?.handle,
|
|
78
|
+
actorUserId: item.actor?.userId,
|
|
79
|
+
channelId: item.channelId,
|
|
80
|
+
...(item.channelName ? { channelName: item.channelName } : {}),
|
|
81
|
+
direction: 'in',
|
|
82
|
+
...(item.files?.length ? { files: item.files.map((file) => ({
|
|
83
|
+
filename: file.name,
|
|
84
|
+
fileId: file.id,
|
|
85
|
+
mimetype: file.mimetype,
|
|
86
|
+
sizeBytes: file.sizeBytes,
|
|
87
|
+
})) } : {}),
|
|
88
|
+
kind: 'message',
|
|
89
|
+
messageId: messageIdForInboxItem(item),
|
|
90
|
+
messageTs: item.messageTs,
|
|
91
|
+
...(item.permalink ? { permalink: item.permalink } : {}),
|
|
92
|
+
source: { id: item.id, kind: 'inbox' },
|
|
93
|
+
text: item.text,
|
|
94
|
+
...(item.threadTs ? { threadTs: item.threadTs } : {}),
|
|
95
|
+
timestamp: item.receivedAt,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function onboardingMessage(item) {
|
|
99
|
+
return {
|
|
100
|
+
actor: onboardingActorLabel(item),
|
|
101
|
+
actorDisplayName: item.operator.displayName,
|
|
102
|
+
actorHandle: item.operator.handle,
|
|
103
|
+
actorUserId: item.operator.slackUserId,
|
|
104
|
+
channelId: item.channelId,
|
|
105
|
+
direction: 'in',
|
|
106
|
+
kind: 'onboarding',
|
|
107
|
+
messageId: messageIdForInboxItem(item),
|
|
108
|
+
source: { id: item.id, kind: 'inbox' },
|
|
109
|
+
text: item.text,
|
|
110
|
+
timestamp: item.receivedAt,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function choiceResponseMessage(item) {
|
|
114
|
+
return {
|
|
115
|
+
actor: choiceActorLabel(item),
|
|
116
|
+
actorDisplayName: item.answeredBy.displayName,
|
|
117
|
+
actorHandle: item.answeredBy.handle,
|
|
118
|
+
actorUserId: item.answeredBy.slackUserId,
|
|
119
|
+
channelId: item.channelId,
|
|
120
|
+
...(item.channelName ? { channelName: item.channelName } : {}),
|
|
121
|
+
direction: 'in',
|
|
122
|
+
kind: 'choice_response',
|
|
123
|
+
messageId: messageIdForInboxItem(item),
|
|
124
|
+
messageTs: item.messageTs,
|
|
125
|
+
optionLabel: item.optionLabel,
|
|
126
|
+
question: item.question,
|
|
127
|
+
source: { id: item.id, kind: 'inbox' },
|
|
128
|
+
text: `Selected: ${item.optionLabel}\nQuestion: ${item.question}`,
|
|
129
|
+
threadTs: item.threadTs,
|
|
130
|
+
timestamp: item.receivedAt,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function baseOutboxMessage(activity, payload, entry) {
|
|
134
|
+
return {
|
|
135
|
+
channelId: stringField(payload, 'channel'),
|
|
136
|
+
channelDisplayName: stringField(payload, 'channelDisplayName'),
|
|
137
|
+
channelKind: stringField(payload, 'channelKind'),
|
|
138
|
+
channelName: stringField(payload, 'channelName'),
|
|
139
|
+
direction: 'out',
|
|
140
|
+
dmHandle: stringField(payload, 'dmHandle'),
|
|
141
|
+
dmUserId: stringField(payload, 'dmUserId'),
|
|
142
|
+
messageId: messageIdForActivity(activity),
|
|
143
|
+
messageTs: entry.messageTs,
|
|
144
|
+
permalink: stringField(payload, 'permalink'),
|
|
145
|
+
source: { id: activity.activityId, kind: 'activity' },
|
|
146
|
+
threadTs: stringField(payload, 'threadTs'),
|
|
147
|
+
timestamp: activity.createdAt,
|
|
148
|
+
...entry,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function slackActorLabel(item) {
|
|
152
|
+
const actor = item.actor;
|
|
153
|
+
const handle = actor?.handle?.replace(/^@/, '');
|
|
154
|
+
if (handle) {
|
|
155
|
+
const name = actor?.displayName ?? actor?.realName;
|
|
156
|
+
return name && name !== handle ? `${name} (@${handle})` : `@${handle}`;
|
|
157
|
+
}
|
|
158
|
+
return actor?.displayName ?? actor?.realName ?? actor?.userId ?? 'Unknown user';
|
|
159
|
+
}
|
|
160
|
+
function onboardingActorLabel(item) {
|
|
161
|
+
const handle = item.operator.handle?.replace(/^@/, '');
|
|
162
|
+
if (handle)
|
|
163
|
+
return `${item.operator.displayName} (@${handle})`;
|
|
164
|
+
return item.operator.displayName || item.operator.slackUserId;
|
|
165
|
+
}
|
|
166
|
+
function choiceActorLabel(item) {
|
|
167
|
+
const handle = item.answeredBy.handle?.replace(/^@/, '');
|
|
168
|
+
if (handle) {
|
|
169
|
+
const name = item.answeredBy.displayName;
|
|
170
|
+
return name && name !== handle ? `${name} (@${handle})` : `@${handle}`;
|
|
171
|
+
}
|
|
172
|
+
return item.answeredBy.displayName ?? item.answeredBy.slackUserId;
|
|
173
|
+
}
|
|
174
|
+
function uploadFiles(raw) {
|
|
175
|
+
if (!Array.isArray(raw))
|
|
176
|
+
return [];
|
|
177
|
+
return raw.flatMap((entry) => {
|
|
178
|
+
if (!entry || typeof entry !== 'object')
|
|
179
|
+
return [];
|
|
180
|
+
const record = entry;
|
|
181
|
+
const filename = stringField(record, 'filename');
|
|
182
|
+
if (!filename)
|
|
183
|
+
return [];
|
|
184
|
+
return [{
|
|
185
|
+
filename,
|
|
186
|
+
...(stringField(record, 'fileId') ? { fileId: stringField(record, 'fileId') } : {}),
|
|
187
|
+
...(stringField(record, 'mimetype') ? { mimetype: stringField(record, 'mimetype') } : {}),
|
|
188
|
+
...(stringField(record, 'permalink') ? { permalink: stringField(record, 'permalink') } : {}),
|
|
189
|
+
...(typeof record['sizeBytes'] === 'number' ? { sizeBytes: record['sizeBytes'] } : {}),
|
|
190
|
+
...(stringField(record, 'thumb360') ? { thumb360: stringField(record, 'thumb360') } : {}),
|
|
191
|
+
...(stringField(record, 'thumb720') ? { thumb720: stringField(record, 'thumb720') } : {}),
|
|
192
|
+
}];
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
function stringField(payload, key) {
|
|
196
|
+
const value = payload[key];
|
|
197
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
198
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Activity } from '../../shared/activity.js';
|
|
2
|
+
import type { AgentMessageDirection, AgentMessageHistoryPage, AgentMessageRecord } from '../../shared/messages.js';
|
|
3
|
+
import type { InboxItem } from '../../shared/inbox.js';
|
|
4
|
+
import { ActivityStore } from '../storage/schema/activity.store.js';
|
|
5
|
+
import { WakeQueueStore } from '../storage/schema/wake-queue.store.js';
|
|
6
|
+
import { MessageStore } from '../storage/schema/message.store.js';
|
|
7
|
+
export interface MessageListInput {
|
|
8
|
+
before?: string;
|
|
9
|
+
direction?: AgentMessageDirection;
|
|
10
|
+
limit?: number;
|
|
11
|
+
since?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class MessageService {
|
|
14
|
+
private readonly store;
|
|
15
|
+
private readonly wakeQueueStore;
|
|
16
|
+
private readonly activityStore;
|
|
17
|
+
constructor(agentId: string, store?: MessageStore, wakeQueueStore?: WakeQueueStore, activityStore?: ActivityStore);
|
|
18
|
+
recordInboxItem(item: InboxItem): Promise<AgentMessageRecord | undefined>;
|
|
19
|
+
recordOutboxActivity(activity: Activity): Promise<AgentMessageRecord | undefined>;
|
|
20
|
+
list(input?: MessageListInput): Promise<AgentMessageHistoryPage>;
|
|
21
|
+
legacyBackfilled(): Promise<boolean>;
|
|
22
|
+
private backfillLegacyMessages;
|
|
23
|
+
}
|
|
24
|
+
export declare function messageServiceForAgent(agentId: string): MessageService;
|
|
25
|
+
//# sourceMappingURL=message.service.d.ts.map
|