openryoko 0.9.4-ryoko.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/jimmy.d.ts +3 -0
- package/dist/bin/jimmy.d.ts.map +1 -0
- package/dist/bin/jimmy.js +149 -0
- package/dist/bin/jimmy.js.map +1 -0
- package/dist/package.json +54 -0
- package/dist/src/cli/__tests__/migrate.test.d.ts +2 -0
- package/dist/src/cli/__tests__/migrate.test.d.ts.map +1 -0
- package/dist/src/cli/__tests__/migrate.test.js +79 -0
- package/dist/src/cli/__tests__/migrate.test.js.map +1 -0
- package/dist/src/cli/chrome-allow.d.ts +5 -0
- package/dist/src/cli/chrome-allow.d.ts.map +1 -0
- package/dist/src/cli/chrome-allow.js +250 -0
- package/dist/src/cli/chrome-allow.js.map +1 -0
- package/dist/src/cli/create.d.ts +2 -0
- package/dist/src/cli/create.d.ts.map +1 -0
- package/dist/src/cli/create.js +72 -0
- package/dist/src/cli/create.js.map +1 -0
- package/dist/src/cli/instances.d.ts +14 -0
- package/dist/src/cli/instances.d.ts.map +1 -0
- package/dist/src/cli/instances.js +43 -0
- package/dist/src/cli/instances.js.map +1 -0
- package/dist/src/cli/list.d.ts +2 -0
- package/dist/src/cli/list.d.ts.map +1 -0
- package/dist/src/cli/list.js +38 -0
- package/dist/src/cli/list.js.map +1 -0
- package/dist/src/cli/migrate.d.ts +5 -0
- package/dist/src/cli/migrate.d.ts.map +1 -0
- package/dist/src/cli/migrate.js +222 -0
- package/dist/src/cli/migrate.js.map +1 -0
- package/dist/src/cli/nuke.d.ts +2 -0
- package/dist/src/cli/nuke.d.ts.map +1 -0
- package/dist/src/cli/nuke.js +91 -0
- package/dist/src/cli/nuke.js.map +1 -0
- package/dist/src/cli/remove.d.ts +4 -0
- package/dist/src/cli/remove.d.ts.map +1 -0
- package/dist/src/cli/remove.js +47 -0
- package/dist/src/cli/remove.js.map +1 -0
- package/dist/src/cli/setup.d.ts +4 -0
- package/dist/src/cli/setup.d.ts.map +1 -0
- package/dist/src/cli/setup.js +491 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/skills.d.ts +28 -0
- package/dist/src/cli/skills.d.ts.map +1 -0
- package/dist/src/cli/skills.js +284 -0
- package/dist/src/cli/skills.js.map +1 -0
- package/dist/src/cli/start.d.ts +5 -0
- package/dist/src/cli/start.d.ts.map +1 -0
- package/dist/src/cli/start.js +34 -0
- package/dist/src/cli/start.js.map +1 -0
- package/dist/src/cli/status.d.ts +2 -0
- package/dist/src/cli/status.d.ts.map +1 -0
- package/dist/src/cli/status.js +69 -0
- package/dist/src/cli/status.js.map +1 -0
- package/dist/src/cli/stop.d.ts +2 -0
- package/dist/src/cli/stop.d.ts.map +1 -0
- package/dist/src/cli/stop.js +11 -0
- package/dist/src/cli/stop.js.map +1 -0
- package/dist/src/connectors/cron/index.d.ts +21 -0
- package/dist/src/connectors/cron/index.d.ts.map +1 -0
- package/dist/src/connectors/cron/index.js +75 -0
- package/dist/src/connectors/cron/index.js.map +1 -0
- package/dist/src/connectors/discord/format.d.ts +3 -0
- package/dist/src/connectors/discord/format.d.ts.map +1 -0
- package/dist/src/connectors/discord/format.js +33 -0
- package/dist/src/connectors/discord/format.js.map +1 -0
- package/dist/src/connectors/discord/index.d.ts +47 -0
- package/dist/src/connectors/discord/index.d.ts.map +1 -0
- package/dist/src/connectors/discord/index.js +308 -0
- package/dist/src/connectors/discord/index.js.map +1 -0
- package/dist/src/connectors/discord/remote.d.ts +33 -0
- package/dist/src/connectors/discord/remote.d.ts.map +1 -0
- package/dist/src/connectors/discord/remote.js +89 -0
- package/dist/src/connectors/discord/remote.js.map +1 -0
- package/dist/src/connectors/discord/threads.d.ts +5 -0
- package/dist/src/connectors/discord/threads.d.ts.map +1 -0
- package/dist/src/connectors/discord/threads.js +22 -0
- package/dist/src/connectors/discord/threads.js.map +1 -0
- package/dist/src/connectors/slack/__tests__/active-threads.test.d.ts +2 -0
- package/dist/src/connectors/slack/__tests__/active-threads.test.d.ts.map +1 -0
- package/dist/src/connectors/slack/__tests__/active-threads.test.js +57 -0
- package/dist/src/connectors/slack/__tests__/active-threads.test.js.map +1 -0
- package/dist/src/connectors/slack/__tests__/format.test.d.ts +2 -0
- package/dist/src/connectors/slack/__tests__/format.test.d.ts.map +1 -0
- package/dist/src/connectors/slack/__tests__/format.test.js +115 -0
- package/dist/src/connectors/slack/__tests__/format.test.js.map +1 -0
- package/dist/src/connectors/slack/__tests__/speaker.test.d.ts +2 -0
- package/dist/src/connectors/slack/__tests__/speaker.test.d.ts.map +1 -0
- package/dist/src/connectors/slack/__tests__/speaker.test.js +59 -0
- package/dist/src/connectors/slack/__tests__/speaker.test.js.map +1 -0
- package/dist/src/connectors/slack/__tests__/triage-prompt.test.d.ts +2 -0
- package/dist/src/connectors/slack/__tests__/triage-prompt.test.d.ts.map +1 -0
- package/dist/src/connectors/slack/__tests__/triage-prompt.test.js +102 -0
- package/dist/src/connectors/slack/__tests__/triage-prompt.test.js.map +1 -0
- package/dist/src/connectors/slack/__tests__/triage.test.d.ts +2 -0
- package/dist/src/connectors/slack/__tests__/triage.test.d.ts.map +1 -0
- package/dist/src/connectors/slack/__tests__/triage.test.js +88 -0
- package/dist/src/connectors/slack/__tests__/triage.test.js.map +1 -0
- package/dist/src/connectors/slack/active-threads.d.ts +39 -0
- package/dist/src/connectors/slack/active-threads.d.ts.map +1 -0
- package/dist/src/connectors/slack/active-threads.js +71 -0
- package/dist/src/connectors/slack/active-threads.js.map +1 -0
- package/dist/src/connectors/slack/format.d.ts +17 -0
- package/dist/src/connectors/slack/format.d.ts.map +1 -0
- package/dist/src/connectors/slack/format.js +85 -0
- package/dist/src/connectors/slack/format.js.map +1 -0
- package/dist/src/connectors/slack/index.d.ts +51 -0
- package/dist/src/connectors/slack/index.d.ts.map +1 -0
- package/dist/src/connectors/slack/index.js +562 -0
- package/dist/src/connectors/slack/index.js.map +1 -0
- package/dist/src/connectors/slack/speaker.d.ts +39 -0
- package/dist/src/connectors/slack/speaker.d.ts.map +1 -0
- package/dist/src/connectors/slack/speaker.js +30 -0
- package/dist/src/connectors/slack/speaker.js.map +1 -0
- package/dist/src/connectors/slack/threads.d.ts +12 -0
- package/dist/src/connectors/slack/threads.d.ts.map +1 -0
- package/dist/src/connectors/slack/threads.js +41 -0
- package/dist/src/connectors/slack/threads.js.map +1 -0
- package/dist/src/connectors/slack/threads.test.d.ts +2 -0
- package/dist/src/connectors/slack/threads.test.d.ts.map +1 -0
- package/dist/src/connectors/slack/threads.test.js +79 -0
- package/dist/src/connectors/slack/threads.test.js.map +1 -0
- package/dist/src/connectors/slack/triage-prompt.d.ts +50 -0
- package/dist/src/connectors/slack/triage-prompt.d.ts.map +1 -0
- package/dist/src/connectors/slack/triage-prompt.js +127 -0
- package/dist/src/connectors/slack/triage-prompt.js.map +1 -0
- package/dist/src/connectors/slack/triage.d.ts +41 -0
- package/dist/src/connectors/slack/triage.d.ts.map +1 -0
- package/dist/src/connectors/slack/triage.js +120 -0
- package/dist/src/connectors/slack/triage.js.map +1 -0
- package/dist/src/connectors/telegram/__tests__/connector.test.d.ts +2 -0
- package/dist/src/connectors/telegram/__tests__/connector.test.d.ts.map +1 -0
- package/dist/src/connectors/telegram/__tests__/connector.test.js +257 -0
- package/dist/src/connectors/telegram/__tests__/connector.test.js.map +1 -0
- package/dist/src/connectors/telegram/__tests__/format.test.d.ts +2 -0
- package/dist/src/connectors/telegram/__tests__/format.test.d.ts.map +1 -0
- package/dist/src/connectors/telegram/__tests__/format.test.js +79 -0
- package/dist/src/connectors/telegram/__tests__/format.test.js.map +1 -0
- package/dist/src/connectors/telegram/__tests__/threads.test.d.ts +2 -0
- package/dist/src/connectors/telegram/__tests__/threads.test.d.ts.map +1 -0
- package/dist/src/connectors/telegram/__tests__/threads.test.js +51 -0
- package/dist/src/connectors/telegram/__tests__/threads.test.js.map +1 -0
- package/dist/src/connectors/telegram/format.d.ts +12 -0
- package/dist/src/connectors/telegram/format.d.ts.map +1 -0
- package/dist/src/connectors/telegram/format.js +61 -0
- package/dist/src/connectors/telegram/format.js.map +1 -0
- package/dist/src/connectors/telegram/index.d.ts +28 -0
- package/dist/src/connectors/telegram/index.d.ts.map +1 -0
- package/dist/src/connectors/telegram/index.js +213 -0
- package/dist/src/connectors/telegram/index.js.map +1 -0
- package/dist/src/connectors/telegram/threads.d.ts +29 -0
- package/dist/src/connectors/telegram/threads.d.ts.map +1 -0
- package/dist/src/connectors/telegram/threads.js +26 -0
- package/dist/src/connectors/telegram/threads.js.map +1 -0
- package/dist/src/connectors/whatsapp/__tests__/format.test.d.ts +2 -0
- package/dist/src/connectors/whatsapp/__tests__/format.test.d.ts.map +1 -0
- package/dist/src/connectors/whatsapp/__tests__/format.test.js +70 -0
- package/dist/src/connectors/whatsapp/__tests__/format.test.js.map +1 -0
- package/dist/src/connectors/whatsapp/format.d.ts +12 -0
- package/dist/src/connectors/whatsapp/format.d.ts.map +1 -0
- package/dist/src/connectors/whatsapp/format.js +53 -0
- package/dist/src/connectors/whatsapp/format.js.map +1 -0
- package/dist/src/connectors/whatsapp/index.d.ts +42 -0
- package/dist/src/connectors/whatsapp/index.d.ts.map +1 -0
- package/dist/src/connectors/whatsapp/index.js +279 -0
- package/dist/src/connectors/whatsapp/index.js.map +1 -0
- package/dist/src/cron/jobs.d.ts +5 -0
- package/dist/src/cron/jobs.d.ts.map +1 -0
- package/dist/src/cron/jobs.js +23 -0
- package/dist/src/cron/jobs.js.map +1 -0
- package/dist/src/cron/runner.d.ts +4 -0
- package/dist/src/cron/runner.d.ts.map +1 -0
- package/dist/src/cron/runner.js +88 -0
- package/dist/src/cron/runner.js.map +1 -0
- package/dist/src/cron/scheduler.d.ts +8 -0
- package/dist/src/cron/scheduler.d.ts.map +1 -0
- package/dist/src/cron/scheduler.js +64 -0
- package/dist/src/cron/scheduler.js.map +1 -0
- package/dist/src/engines/__tests__/gemini.test.d.ts +2 -0
- package/dist/src/engines/__tests__/gemini.test.d.ts.map +1 -0
- package/dist/src/engines/__tests__/gemini.test.js +404 -0
- package/dist/src/engines/__tests__/gemini.test.js.map +1 -0
- package/dist/src/engines/claude.d.ts +20 -0
- package/dist/src/engines/claude.d.ts.map +1 -0
- package/dist/src/engines/claude.js +520 -0
- package/dist/src/engines/claude.js.map +1 -0
- package/dist/src/engines/codex.d.ts +15 -0
- package/dist/src/engines/codex.d.ts.map +1 -0
- package/dist/src/engines/codex.js +351 -0
- package/dist/src/engines/codex.js.map +1 -0
- package/dist/src/engines/gemini.d.ts +32 -0
- package/dist/src/engines/gemini.d.ts.map +1 -0
- package/dist/src/engines/gemini.js +328 -0
- package/dist/src/engines/gemini.js.map +1 -0
- package/dist/src/engines/mock.d.ts +16 -0
- package/dist/src/engines/mock.d.ts.map +1 -0
- package/dist/src/engines/mock.js +47 -0
- package/dist/src/engines/mock.js.map +1 -0
- package/dist/src/gateway/__tests__/api-last-n.test.d.ts +2 -0
- package/dist/src/gateway/__tests__/api-last-n.test.d.ts.map +1 -0
- package/dist/src/gateway/__tests__/api-last-n.test.js +32 -0
- package/dist/src/gateway/__tests__/api-last-n.test.js.map +1 -0
- package/dist/src/gateway/__tests__/costs.test.d.ts +2 -0
- package/dist/src/gateway/__tests__/costs.test.d.ts.map +1 -0
- package/dist/src/gateway/__tests__/costs.test.js +32 -0
- package/dist/src/gateway/__tests__/costs.test.js.map +1 -0
- package/dist/src/gateway/__tests__/org-hierarchy.test.d.ts +2 -0
- package/dist/src/gateway/__tests__/org-hierarchy.test.d.ts.map +1 -0
- package/dist/src/gateway/__tests__/org-hierarchy.test.js +161 -0
- package/dist/src/gateway/__tests__/org-hierarchy.test.js.map +1 -0
- package/dist/src/gateway/__tests__/org-update.test.d.ts +2 -0
- package/dist/src/gateway/__tests__/org-update.test.d.ts.map +1 -0
- package/dist/src/gateway/__tests__/org-update.test.js +99 -0
- package/dist/src/gateway/__tests__/org-update.test.js.map +1 -0
- package/dist/src/gateway/__tests__/org.test.d.ts +2 -0
- package/dist/src/gateway/__tests__/org.test.d.ts.map +1 -0
- package/dist/src/gateway/__tests__/org.test.js +77 -0
- package/dist/src/gateway/__tests__/org.test.js.map +1 -0
- package/dist/src/gateway/__tests__/services.test.d.ts +2 -0
- package/dist/src/gateway/__tests__/services.test.d.ts.map +1 -0
- package/dist/src/gateway/__tests__/services.test.js +153 -0
- package/dist/src/gateway/__tests__/services.test.js.map +1 -0
- package/dist/src/gateway/api.d.ts +19 -0
- package/dist/src/gateway/api.d.ts.map +1 -0
- package/dist/src/gateway/api.js +2261 -0
- package/dist/src/gateway/api.js.map +1 -0
- package/dist/src/gateway/budgets.d.ts +16 -0
- package/dist/src/gateway/budgets.d.ts.map +1 -0
- package/dist/src/gateway/budgets.js +39 -0
- package/dist/src/gateway/budgets.js.map +1 -0
- package/dist/src/gateway/costs.d.ts +19 -0
- package/dist/src/gateway/costs.d.ts.map +1 -0
- package/dist/src/gateway/costs.js +39 -0
- package/dist/src/gateway/costs.js.map +1 -0
- package/dist/src/gateway/daemon-entry.d.ts +2 -0
- package/dist/src/gateway/daemon-entry.d.ts.map +1 -0
- package/dist/src/gateway/daemon-entry.js +12 -0
- package/dist/src/gateway/daemon-entry.js.map +1 -0
- package/dist/src/gateway/files.d.ts +6 -0
- package/dist/src/gateway/files.d.ts.map +1 -0
- package/dist/src/gateway/files.js +442 -0
- package/dist/src/gateway/files.js.map +1 -0
- package/dist/src/gateway/goals.d.ts +11 -0
- package/dist/src/gateway/goals.d.ts.map +1 -0
- package/dist/src/gateway/goals.js +72 -0
- package/dist/src/gateway/goals.js.map +1 -0
- package/dist/src/gateway/lifecycle.d.ts +10 -0
- package/dist/src/gateway/lifecycle.d.ts.map +1 -0
- package/dist/src/gateway/lifecycle.js +152 -0
- package/dist/src/gateway/lifecycle.js.map +1 -0
- package/dist/src/gateway/org-hierarchy.d.ts +5 -0
- package/dist/src/gateway/org-hierarchy.d.ts.map +1 -0
- package/dist/src/gateway/org-hierarchy.js +174 -0
- package/dist/src/gateway/org-hierarchy.js.map +1 -0
- package/dist/src/gateway/org.d.ts +17 -0
- package/dist/src/gateway/org.d.ts.map +1 -0
- package/dist/src/gateway/org.js +136 -0
- package/dist/src/gateway/org.js.map +1 -0
- package/dist/src/gateway/server.d.ts +4 -0
- package/dist/src/gateway/server.d.ts.map +1 -0
- package/dist/src/gateway/server.js +764 -0
- package/dist/src/gateway/server.js.map +1 -0
- package/dist/src/gateway/services.d.ts +28 -0
- package/dist/src/gateway/services.d.ts.map +1 -0
- package/dist/src/gateway/services.js +112 -0
- package/dist/src/gateway/services.js.map +1 -0
- package/dist/src/gateway/watcher.d.ts +14 -0
- package/dist/src/gateway/watcher.d.ts.map +1 -0
- package/dist/src/gateway/watcher.js +111 -0
- package/dist/src/gateway/watcher.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/gateway-server.d.ts +13 -0
- package/dist/src/mcp/gateway-server.d.ts.map +1 -0
- package/dist/src/mcp/gateway-server.js +376 -0
- package/dist/src/mcp/gateway-server.js.map +1 -0
- package/dist/src/mcp/resolver.d.ts +19 -0
- package/dist/src/mcp/resolver.d.ts.map +1 -0
- package/dist/src/mcp/resolver.js +159 -0
- package/dist/src/mcp/resolver.js.map +1 -0
- package/dist/src/sessions/__tests__/callbacks.test.d.ts +2 -0
- package/dist/src/sessions/__tests__/callbacks.test.d.ts.map +1 -0
- package/dist/src/sessions/__tests__/callbacks.test.js +154 -0
- package/dist/src/sessions/__tests__/callbacks.test.js.map +1 -0
- package/dist/src/sessions/callbacks.d.ts +31 -0
- package/dist/src/sessions/callbacks.d.ts.map +1 -0
- package/dist/src/sessions/callbacks.js +112 -0
- package/dist/src/sessions/callbacks.js.map +1 -0
- package/dist/src/sessions/context.d.ts +36 -0
- package/dist/src/sessions/context.d.ts.map +1 -0
- package/dist/src/sessions/context.js +741 -0
- package/dist/src/sessions/context.js.map +1 -0
- package/dist/src/sessions/fork.d.ts +30 -0
- package/dist/src/sessions/fork.d.ts.map +1 -0
- package/dist/src/sessions/fork.js +178 -0
- package/dist/src/sessions/fork.js.map +1 -0
- package/dist/src/sessions/manager.d.ts +27 -0
- package/dist/src/sessions/manager.d.ts.map +1 -0
- package/dist/src/sessions/manager.js +751 -0
- package/dist/src/sessions/manager.js.map +1 -0
- package/dist/src/sessions/queue.d.ts +36 -0
- package/dist/src/sessions/queue.d.ts.map +1 -0
- package/dist/src/sessions/queue.js +101 -0
- package/dist/src/sessions/queue.js.map +1 -0
- package/dist/src/sessions/queue.test.d.ts +2 -0
- package/dist/src/sessions/queue.test.d.ts.map +1 -0
- package/dist/src/sessions/queue.test.js +28 -0
- package/dist/src/sessions/queue.test.js.map +1 -0
- package/dist/src/sessions/registry.d.ts +116 -0
- package/dist/src/sessions/registry.d.ts.map +1 -0
- package/dist/src/sessions/registry.js +480 -0
- package/dist/src/sessions/registry.js.map +1 -0
- package/dist/src/sessions/registry.test.d.ts +2 -0
- package/dist/src/sessions/registry.test.d.ts.map +1 -0
- package/dist/src/sessions/registry.test.js +41 -0
- package/dist/src/sessions/registry.test.js.map +1 -0
- package/dist/src/shared/__tests__/rateLimit.test.d.ts +2 -0
- package/dist/src/shared/__tests__/rateLimit.test.d.ts.map +1 -0
- package/dist/src/shared/__tests__/rateLimit.test.js +108 -0
- package/dist/src/shared/__tests__/rateLimit.test.js.map +1 -0
- package/dist/src/shared/__tests__/usageAwareness.test.d.ts +2 -0
- package/dist/src/shared/__tests__/usageAwareness.test.d.ts.map +1 -0
- package/dist/src/shared/__tests__/usageAwareness.test.js +58 -0
- package/dist/src/shared/__tests__/usageAwareness.test.js.map +1 -0
- package/dist/src/shared/config.d.ts +3 -0
- package/dist/src/shared/config.d.ts.map +1 -0
- package/dist/src/shared/config.js +11 -0
- package/dist/src/shared/config.js.map +1 -0
- package/dist/src/shared/effort.d.ts +17 -0
- package/dist/src/shared/effort.d.ts.map +1 -0
- package/dist/src/shared/effort.js +44 -0
- package/dist/src/shared/effort.js.map +1 -0
- package/dist/src/shared/logger.d.ts +12 -0
- package/dist/src/shared/logger.d.ts.map +1 -0
- package/dist/src/shared/logger.js +35 -0
- package/dist/src/shared/logger.js.map +1 -0
- package/dist/src/shared/paths.d.ts +31 -0
- package/dist/src/shared/paths.d.ts.map +1 -0
- package/dist/src/shared/paths.js +92 -0
- package/dist/src/shared/paths.js.map +1 -0
- package/dist/src/shared/rateLimit.d.ts +20 -0
- package/dist/src/shared/rateLimit.d.ts.map +1 -0
- package/dist/src/shared/rateLimit.js +61 -0
- package/dist/src/shared/rateLimit.js.map +1 -0
- package/dist/src/shared/types.d.ts +448 -0
- package/dist/src/shared/types.d.ts.map +1 -0
- package/dist/src/shared/types.js +4 -0
- package/dist/src/shared/types.js.map +1 -0
- package/dist/src/shared/usageAwareness.d.ts +10 -0
- package/dist/src/shared/usageAwareness.d.ts.map +1 -0
- package/dist/src/shared/usageAwareness.js +69 -0
- package/dist/src/shared/usageAwareness.js.map +1 -0
- package/dist/src/shared/version.d.ts +15 -0
- package/dist/src/shared/version.d.ts.map +1 -0
- package/dist/src/shared/version.js +56 -0
- package/dist/src/shared/version.js.map +1 -0
- package/dist/src/stt/stt.d.ts +24 -0
- package/dist/src/stt/stt.d.ts.map +1 -0
- package/dist/src/stt/stt.js +203 -0
- package/dist/src/stt/stt.js.map +1 -0
- package/dist/web/404.html +1 -0
- package/dist/web/__next.__PAGE__.txt +9 -0
- package/dist/web/__next._full.txt +19 -0
- package/dist/web/__next._head.txt +6 -0
- package/dist/web/__next._index.txt +6 -0
- package/dist/web/__next._tree.txt +2 -0
- package/dist/web/_next/static/chunks/00yn.jp4tr9l6.js +62 -0
- package/dist/web/_next/static/chunks/0398g9fy2i2l..js +5 -0
- package/dist/web/_next/static/chunks/03~yq9q893hmn.js +1 -0
- package/dist/web/_next/static/chunks/07t-qdutaizlf.js +5 -0
- package/dist/web/_next/static/chunks/0_pxvi.u4tzw1.js +5 -0
- package/dist/web/_next/static/chunks/0dtbl8648b3u9.js +7 -0
- package/dist/web/_next/static/chunks/0e3pdjkorr5zl.js +2 -0
- package/dist/web/_next/static/chunks/0ewpxy-mzj3j3.js +1 -0
- package/dist/web/_next/static/chunks/0ihbb7~gq42g~.js +5 -0
- package/dist/web/_next/static/chunks/0j4uz-g9x1_~s.js +1 -0
- package/dist/web/_next/static/chunks/0mlo32yrc7ziu.css +1 -0
- package/dist/web/_next/static/chunks/0ru56x83x4rkk.js +1 -0
- package/dist/web/_next/static/chunks/0svvev77pb2gu.js +1 -0
- package/dist/web/_next/static/chunks/0tf9kpygstdls.js +1 -0
- package/dist/web/_next/static/chunks/0wzpea61sn2-k.js +5 -0
- package/dist/web/_next/static/chunks/0y3dnnq~kxyz_.js +1 -0
- package/dist/web/_next/static/chunks/0y~qqhmf2o7pt.js +1 -0
- package/dist/web/_next/static/chunks/0~6m1p5hnsx2f.js +1 -0
- package/dist/web/_next/static/chunks/10-liamt-ipcu.js +1 -0
- package/dist/web/_next/static/chunks/10l08hq.acixl.js +5 -0
- package/dist/web/_next/static/chunks/11rbefjn.e-3-.js +1 -0
- package/dist/web/_next/static/chunks/11rodb4s1x4of.js +1 -0
- package/dist/web/_next/static/chunks/12_uxtnrqhoo1.js +1 -0
- package/dist/web/_next/static/chunks/12h4dws.tz7yb.js +5 -0
- package/dist/web/_next/static/chunks/13juizw904g.e.js +1 -0
- package/dist/web/_next/static/chunks/14ge_q22f0n.f.js +1 -0
- package/dist/web/_next/static/chunks/16b0jvgccyt2i.js +5 -0
- package/dist/web/_next/static/chunks/17-u9c_weg12-.js +31 -0
- package/dist/web/_next/static/chunks/turbopack-0dt987bw_1nyf.js +1 -0
- package/dist/web/_next/static/media/apple-icon.0.wpl4.d-5bkf.jpg +0 -0
- package/dist/web/_next/static/media/icon.0.wpl4.d-5bkf.jpg +0 -0
- package/dist/web/_next/static/uwjABwQIFELOHhVlstvOe/_buildManifest.js +11 -0
- package/dist/web/_next/static/uwjABwQIFELOHhVlstvOe/_clientMiddlewareManifest.js +1 -0
- package/dist/web/_next/static/uwjABwQIFELOHhVlstvOe/_ssgManifest.js +1 -0
- package/dist/web/_not-found/__next._full.txt +17 -0
- package/dist/web/_not-found/__next._head.txt +6 -0
- package/dist/web/_not-found/__next._index.txt +6 -0
- package/dist/web/_not-found/__next._not-found.__PAGE__.txt +5 -0
- package/dist/web/_not-found/__next._not-found.txt +5 -0
- package/dist/web/_not-found/__next._tree.txt +2 -0
- package/dist/web/_not-found.html +1 -0
- package/dist/web/_not-found.txt +17 -0
- package/dist/web/apple-icon.jpg +0 -0
- package/dist/web/chat/__next._full.txt +21 -0
- package/dist/web/chat/__next._head.txt +6 -0
- package/dist/web/chat/__next._index.txt +6 -0
- package/dist/web/chat/__next._tree.txt +2 -0
- package/dist/web/chat/__next.chat.__PAGE__.txt +9 -0
- package/dist/web/chat/__next.chat.txt +5 -0
- package/dist/web/chat.html +1 -0
- package/dist/web/chat.txt +21 -0
- package/dist/web/cron/__next._full.txt +21 -0
- package/dist/web/cron/__next._head.txt +6 -0
- package/dist/web/cron/__next._index.txt +6 -0
- package/dist/web/cron/__next._tree.txt +2 -0
- package/dist/web/cron/__next.cron.__PAGE__.txt +9 -0
- package/dist/web/cron/__next.cron.txt +5 -0
- package/dist/web/cron.html +1 -0
- package/dist/web/cron.txt +21 -0
- package/dist/web/icon.jpg +0 -0
- package/dist/web/index.html +1 -0
- package/dist/web/index.txt +19 -0
- package/dist/web/kanban/__next._full.txt +21 -0
- package/dist/web/kanban/__next._head.txt +6 -0
- package/dist/web/kanban/__next._index.txt +6 -0
- package/dist/web/kanban/__next._tree.txt +2 -0
- package/dist/web/kanban/__next.kanban.__PAGE__.txt +9 -0
- package/dist/web/kanban/__next.kanban.txt +5 -0
- package/dist/web/kanban.html +1 -0
- package/dist/web/kanban.txt +21 -0
- package/dist/web/logs/__next._full.txt +21 -0
- package/dist/web/logs/__next._head.txt +6 -0
- package/dist/web/logs/__next._index.txt +6 -0
- package/dist/web/logs/__next._tree.txt +2 -0
- package/dist/web/logs/__next.logs.__PAGE__.txt +9 -0
- package/dist/web/logs/__next.logs.txt +5 -0
- package/dist/web/logs.html +7 -0
- package/dist/web/logs.txt +21 -0
- package/dist/web/org/__next._full.txt +21 -0
- package/dist/web/org/__next._head.txt +6 -0
- package/dist/web/org/__next._index.txt +6 -0
- package/dist/web/org/__next._tree.txt +2 -0
- package/dist/web/org/__next.org.__PAGE__.txt +9 -0
- package/dist/web/org/__next.org.txt +5 -0
- package/dist/web/org.html +1 -0
- package/dist/web/org.txt +21 -0
- package/dist/web/sessions/__next._full.txt +18 -0
- package/dist/web/sessions/__next._head.txt +6 -0
- package/dist/web/sessions/__next._index.txt +6 -0
- package/dist/web/sessions/__next._tree.txt +2 -0
- package/dist/web/sessions/__next.sessions.__PAGE__.txt +6 -0
- package/dist/web/sessions/__next.sessions.txt +5 -0
- package/dist/web/sessions.html +1 -0
- package/dist/web/sessions.txt +18 -0
- package/dist/web/settings/__next._full.txt +21 -0
- package/dist/web/settings/__next._head.txt +6 -0
- package/dist/web/settings/__next._index.txt +6 -0
- package/dist/web/settings/__next._tree.txt +2 -0
- package/dist/web/settings/__next.settings.__PAGE__.txt +9 -0
- package/dist/web/settings/__next.settings.txt +5 -0
- package/dist/web/settings.html +1 -0
- package/dist/web/settings.txt +21 -0
- package/dist/web/skills/__next._full.txt +21 -0
- package/dist/web/skills/__next._head.txt +6 -0
- package/dist/web/skills/__next._index.txt +6 -0
- package/dist/web/skills/__next._tree.txt +2 -0
- package/dist/web/skills/__next.skills.__PAGE__.txt +9 -0
- package/dist/web/skills/__next.skills.txt +5 -0
- package/dist/web/skills.html +1 -0
- package/dist/web/skills.txt +21 -0
- package/package.json +54 -0
- package/template/AGENTS.md +285 -0
- package/template/CLAUDE.md +285 -0
- package/template/config.default.yaml +71 -0
- package/template/docs/architecture.md +74 -0
- package/template/docs/connectors.md +72 -0
- package/template/docs/cron.md +137 -0
- package/template/docs/mcp.md +108 -0
- package/template/docs/org.md +105 -0
- package/template/docs/overview.md +39 -0
- package/template/docs/self-modification.md +65 -0
- package/template/docs/skills.md +58 -0
- package/template/knowledge/.gitkeep +0 -0
- package/template/migrations/.gitkeep +0 -0
- package/template/migrations/0.1.0/MIGRATION.md +25 -0
- package/template/migrations/0.2.0/MIGRATION.md +41 -0
- package/template/migrations/0.2.0/files/config.default.yaml +30 -0
- package/template/migrations/0.3.0/MIGRATION.md +57 -0
- package/template/migrations/0.3.0/files/config.default.yaml +62 -0
- package/template/migrations/0.3.0/files/docs/mcp.md +108 -0
- package/template/migrations/0.7.3/MIGRATION.md +63 -0
- package/template/migrations/0.7.3/files/AGENTS.md +188 -0
- package/template/migrations/0.7.3/files/CLAUDE.md +127 -0
- package/template/migrations/0.7.5/MIGRATION.md +78 -0
- package/template/migrations/0.8.0/MIGRATION.md +73 -0
- package/template/migrations/0.9.0/MIGRATION.md +82 -0
- package/template/skills/cron-manager/SKILL.md +127 -0
- package/template/skills/find-and-install/SKILL.md +92 -0
- package/template/skills/management/SKILL.md +226 -0
- package/template/skills/migrate/SKILL.md +154 -0
- package/template/skills/new/SKILL.md +19 -0
- package/template/skills/onboarding/SKILL.md +106 -0
- package/template/skills/self-heal/SKILL.md +114 -0
- package/template/skills/skill-creator/SKILL.md +112 -0
- package/template/skills/status/SKILL.md +19 -0
- package/template/skills/sync/SKILL.md +67 -0
- package/template/skills.json +3 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speaker.js","sourceRoot":"","sources":["../../../../src/connectors/slack/speaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAUoB,EACpB,UAAkB;IAElB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACxF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;IAEtC,OAAO;QACL,IAAI,EAAE,WAAW,IAAI,QAAQ,IAAI,MAAM,IAAI,IAAI,CAAC,EAAE,IAAI,UAAU;QAChE,QAAQ;QACR,WAAW;QACX,MAAM;QACN,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;QAC/B,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,SAAS;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReplyContext } from "../../shared/types.js";
|
|
2
|
+
export interface SlackMessageEventLike {
|
|
3
|
+
channel: string;
|
|
4
|
+
user?: string;
|
|
5
|
+
ts?: string;
|
|
6
|
+
thread_ts?: string;
|
|
7
|
+
channel_type?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function deriveSessionKey(event: SlackMessageEventLike): string;
|
|
10
|
+
export declare function buildReplyContext(event: SlackMessageEventLike): ReplyContext;
|
|
11
|
+
export declare function isOldSlackMessage(ts: string | undefined, bootTimeMs: number): boolean;
|
|
12
|
+
//# sourceMappingURL=threads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/threads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAYrE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,CAsB5E;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAKrF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function deriveSessionKey(event) {
|
|
2
|
+
if (event.channel_type === "im") {
|
|
3
|
+
return `slack:dm:${event.user || "unknown"}`;
|
|
4
|
+
}
|
|
5
|
+
// Thread reply — use thread_ts (which is the root message's ts)
|
|
6
|
+
if (event.thread_ts && event.thread_ts !== event.ts) {
|
|
7
|
+
return `slack:${event.channel}:${event.thread_ts}`;
|
|
8
|
+
}
|
|
9
|
+
// Root channel message — use ts so thread replies will match
|
|
10
|
+
return `slack:${event.channel}:${event.ts}`;
|
|
11
|
+
}
|
|
12
|
+
export function buildReplyContext(event) {
|
|
13
|
+
// For DMs, don't set thread (DMs don't support threading the same way)
|
|
14
|
+
if (event.channel_type === "im") {
|
|
15
|
+
return {
|
|
16
|
+
channel: event.channel,
|
|
17
|
+
thread: null,
|
|
18
|
+
messageTs: event.ts ?? null,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
// For channel messages, always set thread so bot replies in a thread
|
|
22
|
+
// For root messages: thread = ts (starts a thread under the root)
|
|
23
|
+
// For thread replies: thread = thread_ts (continues existing thread)
|
|
24
|
+
const thread = event.thread_ts && event.thread_ts !== event.ts
|
|
25
|
+
? event.thread_ts
|
|
26
|
+
: event.ts ?? null;
|
|
27
|
+
return {
|
|
28
|
+
channel: event.channel,
|
|
29
|
+
thread,
|
|
30
|
+
messageTs: event.ts ?? null,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function isOldSlackMessage(ts, bootTimeMs) {
|
|
34
|
+
if (!ts)
|
|
35
|
+
return false;
|
|
36
|
+
const secs = Number(ts.split(".")[0]);
|
|
37
|
+
if (!Number.isFinite(secs))
|
|
38
|
+
return false;
|
|
39
|
+
return secs * 1000 < bootTimeMs;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=threads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../../src/connectors/slack/threads.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,YAAY,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;IAC/C,CAAC;IAED,gEAAgE;IAChE,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;QACpD,OAAO,SAAS,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;IACrD,CAAC;IAED,6DAA6D;IAC7D,OAAO,SAAS,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAA4B;IAC5D,uEAAuE;IACvE,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI;SAC5B,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,kEAAkE;IAClE,qEAAqE;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE;QAC5D,CAAC,CAAC,KAAK,CAAC,SAAS;QACjB,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC;IAErB,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM;QACN,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAsB,EAAE,UAAkB;IAC1E,IAAI,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IACtB,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,IAAI,GAAG,IAAI,GAAG,UAAU,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.test.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/threads.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { buildReplyContext, deriveSessionKey, isOldSlackMessage } from "./threads.js";
|
|
4
|
+
test("deriveSessionKey keeps DM sessions per user", () => {
|
|
5
|
+
const key = deriveSessionKey({
|
|
6
|
+
channel: "D123",
|
|
7
|
+
user: "U123",
|
|
8
|
+
channel_type: "im",
|
|
9
|
+
ts: "1700000000.000100",
|
|
10
|
+
});
|
|
11
|
+
assert.equal(key, "slack:dm:U123");
|
|
12
|
+
});
|
|
13
|
+
test("deriveSessionKey uses ts for channel root messages", () => {
|
|
14
|
+
const key = deriveSessionKey({
|
|
15
|
+
channel: "C123",
|
|
16
|
+
user: "U123",
|
|
17
|
+
ts: "1700000000.000100",
|
|
18
|
+
});
|
|
19
|
+
assert.equal(key, "slack:C123:1700000000.000100");
|
|
20
|
+
});
|
|
21
|
+
test("deriveSessionKey uses thread_ts for thread replies (matches root)", () => {
|
|
22
|
+
const key = deriveSessionKey({
|
|
23
|
+
channel: "C123",
|
|
24
|
+
user: "U123",
|
|
25
|
+
ts: "1700000100.000200",
|
|
26
|
+
thread_ts: "1700000000.000100",
|
|
27
|
+
});
|
|
28
|
+
assert.equal(key, "slack:C123:1700000000.000100");
|
|
29
|
+
});
|
|
30
|
+
test("deriveSessionKey treats same-ts thread_ts as root message", () => {
|
|
31
|
+
const key = deriveSessionKey({
|
|
32
|
+
channel: "C123",
|
|
33
|
+
user: "U123",
|
|
34
|
+
ts: "1700000000.000100",
|
|
35
|
+
thread_ts: "1700000000.000100",
|
|
36
|
+
});
|
|
37
|
+
assert.equal(key, "slack:C123:1700000000.000100");
|
|
38
|
+
});
|
|
39
|
+
test("buildReplyContext sets thread for channel root messages", () => {
|
|
40
|
+
const context = buildReplyContext({
|
|
41
|
+
channel: "C123",
|
|
42
|
+
ts: "1700000000.000100",
|
|
43
|
+
channel_type: "channel",
|
|
44
|
+
});
|
|
45
|
+
assert.deepEqual(context, {
|
|
46
|
+
channel: "C123",
|
|
47
|
+
thread: "1700000000.000100",
|
|
48
|
+
messageTs: "1700000000.000100",
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
test("buildReplyContext sets thread_ts for thread replies", () => {
|
|
52
|
+
const context = buildReplyContext({
|
|
53
|
+
channel: "C123",
|
|
54
|
+
ts: "1700000100.000200",
|
|
55
|
+
thread_ts: "1700000000.000100",
|
|
56
|
+
});
|
|
57
|
+
assert.deepEqual(context, {
|
|
58
|
+
channel: "C123",
|
|
59
|
+
thread: "1700000000.000100",
|
|
60
|
+
messageTs: "1700000100.000200",
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
test("buildReplyContext does NOT set thread for DMs", () => {
|
|
64
|
+
const context = buildReplyContext({
|
|
65
|
+
channel: "D123",
|
|
66
|
+
ts: "1700000000.000100",
|
|
67
|
+
channel_type: "im",
|
|
68
|
+
});
|
|
69
|
+
assert.deepEqual(context, {
|
|
70
|
+
channel: "D123",
|
|
71
|
+
thread: null,
|
|
72
|
+
messageTs: "1700000000.000100",
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
test("isOldSlackMessage compares against boot time", () => {
|
|
76
|
+
assert.equal(isOldSlackMessage("1700000000.000100", 1700000001000), true);
|
|
77
|
+
assert.equal(isOldSlackMessage("1700000002.000100", 1700000001000), false);
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=threads.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.test.js","sourceRoot":"","sources":["../../../../src/connectors/slack/threads.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure prompt builder for Slack air-reading triage.
|
|
3
|
+
*
|
|
4
|
+
* The triage LLM is given the incoming message plus light context and
|
|
5
|
+
* must respond with a single JSON decision: silent / react / reply.
|
|
6
|
+
*
|
|
7
|
+
* Kept pure (no I/O) so it can be snapshot-tested without spawning
|
|
8
|
+
* a subprocess.
|
|
9
|
+
*/
|
|
10
|
+
export interface TriagePromptInput {
|
|
11
|
+
/** Display name of the bot itself (e.g. "Ryoko", "Jinn") */
|
|
12
|
+
botName: string;
|
|
13
|
+
/** Short persona description — what this bot is good at */
|
|
14
|
+
persona?: string;
|
|
15
|
+
/** Name of the operator who owns this Jinn instance */
|
|
16
|
+
operatorName?: string;
|
|
17
|
+
/** Channel type: "im" (DM), "channel", "group", "mpim" etc. */
|
|
18
|
+
channelType: string;
|
|
19
|
+
/** Human-readable channel identifier (e.g. "#general" or "DM") */
|
|
20
|
+
channelDescription: string;
|
|
21
|
+
/** Display name of the speaker */
|
|
22
|
+
speakerName: string;
|
|
23
|
+
/** Whether the speaker is the operator of this Jinn */
|
|
24
|
+
speakerIsOperator: boolean;
|
|
25
|
+
/** Whether the bot was explicitly @-mentioned in the message */
|
|
26
|
+
wasMentioned: boolean;
|
|
27
|
+
/** Recent messages in the thread for context — oldest first */
|
|
28
|
+
recentThread: Array<{
|
|
29
|
+
speaker: string;
|
|
30
|
+
text: string;
|
|
31
|
+
}>;
|
|
32
|
+
/** The message being triaged */
|
|
33
|
+
messageText: string;
|
|
34
|
+
}
|
|
35
|
+
export interface TriageDecision {
|
|
36
|
+
action: "silent" | "react" | "reply";
|
|
37
|
+
emoji?: string;
|
|
38
|
+
reason?: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function buildTriagePrompt(input: TriagePromptInput): string;
|
|
41
|
+
/**
|
|
42
|
+
* Parse the triage LLM output into a TriageDecision.
|
|
43
|
+
* Tolerates:
|
|
44
|
+
* - whitespace / leading/trailing prose
|
|
45
|
+
* - markdown code fences (```json ... ```)
|
|
46
|
+
* - emoji written with surrounding colons (":eyes:" → "eyes")
|
|
47
|
+
* Returns null if no valid decision can be extracted.
|
|
48
|
+
*/
|
|
49
|
+
export declare function parseTriageDecision(raw: string): TriageDecision | null;
|
|
50
|
+
//# sourceMappingURL=triage-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage-prompt.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/triage-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,YAAY,EAAE,OAAO,CAAC;IACtB,+DAA+D;IAC/D,YAAY,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA0FlE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAkCtE"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure prompt builder for Slack air-reading triage.
|
|
3
|
+
*
|
|
4
|
+
* The triage LLM is given the incoming message plus light context and
|
|
5
|
+
* must respond with a single JSON decision: silent / react / reply.
|
|
6
|
+
*
|
|
7
|
+
* Kept pure (no I/O) so it can be snapshot-tested without spawning
|
|
8
|
+
* a subprocess.
|
|
9
|
+
*/
|
|
10
|
+
const MAX_MESSAGE_CHARS = 2000;
|
|
11
|
+
const MAX_THREAD_ITEM_CHARS = 300;
|
|
12
|
+
const MAX_THREAD_ITEMS = 10;
|
|
13
|
+
export function buildTriagePrompt(input) {
|
|
14
|
+
const { botName, persona, operatorName, channelType, channelDescription, speakerName, speakerIsOperator, wasMentioned, recentThread, messageText, } = input;
|
|
15
|
+
const personaBlock = persona?.trim()
|
|
16
|
+
? persona.trim()
|
|
17
|
+
: `${botName} is a helpful AI assistant embedded in Slack.`;
|
|
18
|
+
const operatorBlock = operatorName?.trim()
|
|
19
|
+
? `The operator (who runs this Jinn instance) is **${operatorName.trim()}**.`
|
|
20
|
+
: `No operator has been configured.`;
|
|
21
|
+
const speakerRole = speakerIsOperator
|
|
22
|
+
? "the operator of this Jinn instance"
|
|
23
|
+
: "NOT the operator — a different person";
|
|
24
|
+
const threadItems = recentThread
|
|
25
|
+
.slice(-MAX_THREAD_ITEMS)
|
|
26
|
+
.map((m) => {
|
|
27
|
+
const text = (m.text ?? "").trim().slice(0, MAX_THREAD_ITEM_CHARS);
|
|
28
|
+
return `- [${m.speaker}] ${text}`;
|
|
29
|
+
})
|
|
30
|
+
.join("\n");
|
|
31
|
+
const threadBlock = threadItems.length > 0 ? threadItems : "(no prior messages in this thread)";
|
|
32
|
+
const truncatedMessage = messageText.length > MAX_MESSAGE_CHARS
|
|
33
|
+
? messageText.slice(0, MAX_MESSAGE_CHARS) + "\n…(truncated)"
|
|
34
|
+
: messageText;
|
|
35
|
+
return `You are a TRIAGE classifier for ${botName}, an AI assistant on Slack.
|
|
36
|
+
You decide whether ${botName} should respond to a specific incoming message.
|
|
37
|
+
|
|
38
|
+
# Output format (STRICT)
|
|
39
|
+
Output EXACTLY ONE JSON object, nothing else. No markdown, no prose, no code fences.
|
|
40
|
+
Schema:
|
|
41
|
+
{"action": "silent" | "react" | "reply", "emoji": "<slack-emoji-name>", "reason": "<=30 chars"}
|
|
42
|
+
|
|
43
|
+
- "silent" — do absolutely nothing. No reply, no reaction. The bot stays invisible.
|
|
44
|
+
- "react" — add ONE emoji reaction and nothing else (no text reply). Choose a Slack emoji name without colons (e.g. "eyes", "thumbsup", "pray", "ok_hand", "dog", "white_check_mark").
|
|
45
|
+
- "reply" — ${botName} should write a real text response.
|
|
46
|
+
|
|
47
|
+
"emoji" is required only when action = "react". Omit or leave empty otherwise.
|
|
48
|
+
|
|
49
|
+
# About ${botName}
|
|
50
|
+
${personaBlock}
|
|
51
|
+
|
|
52
|
+
# Operator
|
|
53
|
+
${operatorBlock}
|
|
54
|
+
|
|
55
|
+
# Current context
|
|
56
|
+
- Channel: ${channelDescription} (type: ${channelType})
|
|
57
|
+
- Speaker: ${speakerName} — ${speakerRole}
|
|
58
|
+
- Was ${botName} explicitly @-mentioned in this message? ${wasMentioned ? "YES" : "no"}
|
|
59
|
+
|
|
60
|
+
# Recent thread (for context only — not the message to triage)
|
|
61
|
+
${threadBlock}
|
|
62
|
+
|
|
63
|
+
# The message to triage
|
|
64
|
+
"""
|
|
65
|
+
${truncatedMessage}
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
# Decision rules (apply in order, stop at first match)
|
|
69
|
+
1. If the message is a short acknowledgment, thanks, or affirmation directed at ${botName}'s prior reply
|
|
70
|
+
(e.g. "ありがとう", "thanks", "了解", "OK", "なるほど", "👍") → "react" with a fitting emoji.
|
|
71
|
+
2. If the message is clearly addressed to ${botName} (called by name, imperative aimed at the bot,
|
|
72
|
+
continuation of a 1:1 exchange) → "reply".
|
|
73
|
+
3. If the topic clearly matches ${botName}'s expertise AND ${botName} can contribute concrete,
|
|
74
|
+
wanted value (not just chitchat) → "reply".
|
|
75
|
+
4. Otherwise → "silent".
|
|
76
|
+
|
|
77
|
+
# Principles (these override the rules when in tension)
|
|
78
|
+
- Err on the side of SILENCE. Annoying intrusion is far worse than missing a chance to reply.
|
|
79
|
+
- Never butt into casual chat between other people. If the conversation is not for you, stay silent.
|
|
80
|
+
- Do not reply just to be polite or to say "I see" / "interesting" — add value or stay out.
|
|
81
|
+
- If your confidence that ${botName} should speak is below ~60%, choose "silent".
|
|
82
|
+
- Prefer "react" over "reply" for pure acknowledgments. A single emoji is often enough.
|
|
83
|
+
|
|
84
|
+
# Output
|
|
85
|
+
Produce the JSON object now. Do not explain. Do not wrap in a code block. JSON only.`;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Parse the triage LLM output into a TriageDecision.
|
|
89
|
+
* Tolerates:
|
|
90
|
+
* - whitespace / leading/trailing prose
|
|
91
|
+
* - markdown code fences (```json ... ```)
|
|
92
|
+
* - emoji written with surrounding colons (":eyes:" → "eyes")
|
|
93
|
+
* Returns null if no valid decision can be extracted.
|
|
94
|
+
*/
|
|
95
|
+
export function parseTriageDecision(raw) {
|
|
96
|
+
if (!raw)
|
|
97
|
+
return null;
|
|
98
|
+
// Strip markdown code fences if present
|
|
99
|
+
const fenced = raw.match(/```(?:json)?\s*([\s\S]*?)```/i);
|
|
100
|
+
const candidate = fenced ? fenced[1] : raw;
|
|
101
|
+
// Find the first {...} block
|
|
102
|
+
const jsonMatch = candidate.match(/\{[\s\S]*\}/);
|
|
103
|
+
if (!jsonMatch)
|
|
104
|
+
return null;
|
|
105
|
+
let parsed;
|
|
106
|
+
try {
|
|
107
|
+
parsed = JSON.parse(jsonMatch[0]);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
if (!parsed || typeof parsed !== "object")
|
|
113
|
+
return null;
|
|
114
|
+
const obj = parsed;
|
|
115
|
+
const action = obj.action;
|
|
116
|
+
if (action !== "silent" && action !== "react" && action !== "reply")
|
|
117
|
+
return null;
|
|
118
|
+
const rawEmoji = typeof obj.emoji === "string" ? obj.emoji.trim() : "";
|
|
119
|
+
const emoji = rawEmoji.replace(/^:+|:+$/g, "") || undefined;
|
|
120
|
+
const reason = typeof obj.reason === "string" ? obj.reason.trim().slice(0, 120) : undefined;
|
|
121
|
+
// Action "react" requires an emoji; default to eyes if missing
|
|
122
|
+
if (action === "react" && !emoji) {
|
|
123
|
+
return { action, emoji: "eyes", reason };
|
|
124
|
+
}
|
|
125
|
+
return { action, emoji, reason };
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=triage-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage-prompt.js","sourceRoot":"","sources":["../../../../src/connectors/slack/triage-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA+BH,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,MAAM,UAAU,iBAAiB,CAAC,KAAwB;IACxD,MAAM,EACJ,OAAO,EACP,OAAO,EACP,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,GAAG,KAAK,CAAC;IAEV,MAAM,YAAY,GAAG,OAAO,EAAE,IAAI,EAAE;QAClC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE;QAChB,CAAC,CAAC,GAAG,OAAO,+CAA+C,CAAC;IAE9D,MAAM,aAAa,GAAG,YAAY,EAAE,IAAI,EAAE;QACxC,CAAC,CAAC,mDAAmD,YAAY,CAAC,IAAI,EAAE,KAAK;QAC7E,CAAC,CAAC,kCAAkC,CAAC;IAEvC,MAAM,WAAW,GAAG,iBAAiB;QACnC,CAAC,CAAC,oCAAoC;QACtC,CAAC,CAAC,uCAAuC,CAAC;IAE5C,MAAM,WAAW,GAAG,YAAY;SAC7B,KAAK,CAAC,CAAC,gBAAgB,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;IACpC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,oCAAoC,CAAC;IAEhG,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,GAAG,iBAAiB;QAC7D,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,GAAG,gBAAgB;QAC5D,CAAC,CAAC,WAAW,CAAC;IAEhB,OAAO,mCAAmC,OAAO;qBAC9B,OAAO;;;;;;;;;eASb,OAAO;;;;UAIZ,OAAO;EACf,YAAY;;;EAGZ,aAAa;;;aAGF,kBAAkB,WAAW,WAAW;aACxC,WAAW,MAAM,WAAW;QACjC,OAAO,4CAA4C,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;;;EAGpF,WAAW;;;;EAIX,gBAAgB;;;;kFAIgE,OAAO;;4CAE7C,OAAO;;kCAEjB,OAAO,oBAAoB,OAAO;;;;;;;;4BAQxC,OAAO;;;;qFAIkD,CAAC;AACtF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,wCAAwC;IACxC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAE3C,6BAA6B;IAC7B,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACjD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,GAAG,GAAG,MAAiC,CAAC;IAE9C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1B,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAEjF,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;IAC5D,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5F,+DAA+D;IAC/D,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACjC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Air-reading triage runner for Slack.
|
|
3
|
+
*
|
|
4
|
+
* Invokes a cheap LLM (Haiku, via Claude Code CLI by default) to decide
|
|
5
|
+
* whether an incoming Slack message should be ignored, acknowledged
|
|
6
|
+
* with an emoji, or replied to with a full engine session.
|
|
7
|
+
*
|
|
8
|
+
* This sits BEFORE the main session manager and prevents the expensive
|
|
9
|
+
* engine from running on messages that don't actually want a reply.
|
|
10
|
+
*/
|
|
11
|
+
import { spawn } from "node:child_process";
|
|
12
|
+
import { type TriageDecision, type TriagePromptInput } from "./triage-prompt.js";
|
|
13
|
+
export interface TriageRunnerOptions {
|
|
14
|
+
/** Binary to invoke — defaults to "claude" */
|
|
15
|
+
bin?: string;
|
|
16
|
+
/** Model to use for the triage call (e.g. "claude-haiku-4-5") */
|
|
17
|
+
model?: string;
|
|
18
|
+
/** Soft timeout before we fall back to the fail-open action */
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
/** Override the spawner (for tests) */
|
|
21
|
+
spawnImpl?: typeof spawn;
|
|
22
|
+
/**
|
|
23
|
+
* Action to fall back to when triage itself fails (timeout / spawn error /
|
|
24
|
+
* unparseable output). Defaults to "reply" because in the most dangerous
|
|
25
|
+
* scenario — our bot_user_id didn't load and so @-mentions silently slip
|
|
26
|
+
* through to triage — missing a real question is worse than a stray reply.
|
|
27
|
+
*
|
|
28
|
+
* Callers that *know* the message is ambient (not a DM, not an @-mention,
|
|
29
|
+
* not addressed to us) should pass "silent" instead: in that path a
|
|
30
|
+
* fail-open reply is guaranteed to barge into someone else's conversation.
|
|
31
|
+
*/
|
|
32
|
+
failOpenAction?: "reply" | "silent";
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Run a triage decision. Never throws — on error returns a fail-open fallback
|
|
36
|
+
* decision ("reply") so a failing triage cannot silently drop a real message.
|
|
37
|
+
* Missing a reply is far worse than an unwanted reply; if triage can't decide,
|
|
38
|
+
* let the full engine through.
|
|
39
|
+
*/
|
|
40
|
+
export declare function runTriage(input: TriagePromptInput, options?: TriageRunnerOptions): Promise<TriageDecision>;
|
|
41
|
+
//# sourceMappingURL=triage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/triage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;;;;;;;OASG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CACrC;AAMD;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,cAAc,CAAC,CAyBzB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Air-reading triage runner for Slack.
|
|
3
|
+
*
|
|
4
|
+
* Invokes a cheap LLM (Haiku, via Claude Code CLI by default) to decide
|
|
5
|
+
* whether an incoming Slack message should be ignored, acknowledged
|
|
6
|
+
* with an emoji, or replied to with a full engine session.
|
|
7
|
+
*
|
|
8
|
+
* This sits BEFORE the main session manager and prevents the expensive
|
|
9
|
+
* engine from running on messages that don't actually want a reply.
|
|
10
|
+
*/
|
|
11
|
+
import { spawn } from "node:child_process";
|
|
12
|
+
import { logger } from "../../shared/logger.js";
|
|
13
|
+
import { buildTriagePrompt, parseTriageDecision, } from "./triage-prompt.js";
|
|
14
|
+
const DEFAULT_TIMEOUT_MS = 8000;
|
|
15
|
+
const DEFAULT_MODEL = "claude-haiku-4-5";
|
|
16
|
+
const DEFAULT_BIN = "claude";
|
|
17
|
+
/**
|
|
18
|
+
* Run a triage decision. Never throws — on error returns a fail-open fallback
|
|
19
|
+
* decision ("reply") so a failing triage cannot silently drop a real message.
|
|
20
|
+
* Missing a reply is far worse than an unwanted reply; if triage can't decide,
|
|
21
|
+
* let the full engine through.
|
|
22
|
+
*/
|
|
23
|
+
export async function runTriage(input, options = {}) {
|
|
24
|
+
const prompt = buildTriagePrompt(input);
|
|
25
|
+
const bin = options.bin || DEFAULT_BIN;
|
|
26
|
+
const model = options.model || DEFAULT_MODEL;
|
|
27
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
28
|
+
const spawnFn = options.spawnImpl || spawn;
|
|
29
|
+
const failOpenAction = options.failOpenAction ?? "reply";
|
|
30
|
+
try {
|
|
31
|
+
const output = await invokeClaudeOneShot(prompt, {
|
|
32
|
+
bin,
|
|
33
|
+
model,
|
|
34
|
+
timeoutMs,
|
|
35
|
+
spawnFn,
|
|
36
|
+
});
|
|
37
|
+
const decision = parseTriageDecision(output);
|
|
38
|
+
if (!decision) {
|
|
39
|
+
logger.warn(`[triage] unparseable output, defaulting to ${failOpenAction.toUpperCase()} (fail-open): ${output.slice(0, 200)}`);
|
|
40
|
+
return { action: failOpenAction, reason: "parse_failed" };
|
|
41
|
+
}
|
|
42
|
+
return decision;
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
logger.warn(`[triage] execution failed, defaulting to ${failOpenAction.toUpperCase()} (fail-open): ${err}`);
|
|
46
|
+
return { action: failOpenAction, reason: "triage_error" };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function invokeClaudeOneShot(prompt, opts) {
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
const args = [
|
|
52
|
+
"-p",
|
|
53
|
+
"--output-format",
|
|
54
|
+
"json",
|
|
55
|
+
"--model",
|
|
56
|
+
opts.model,
|
|
57
|
+
"--dangerously-skip-permissions",
|
|
58
|
+
prompt,
|
|
59
|
+
];
|
|
60
|
+
const proc = opts.spawnFn(opts.bin, args, {
|
|
61
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
62
|
+
});
|
|
63
|
+
let stdout = "";
|
|
64
|
+
let stderr = "";
|
|
65
|
+
let settled = false;
|
|
66
|
+
const timer = setTimeout(() => {
|
|
67
|
+
if (settled)
|
|
68
|
+
return;
|
|
69
|
+
settled = true;
|
|
70
|
+
try {
|
|
71
|
+
proc.kill("SIGTERM");
|
|
72
|
+
}
|
|
73
|
+
catch { /* ignore */ }
|
|
74
|
+
reject(new Error(`triage timed out after ${opts.timeoutMs}ms`));
|
|
75
|
+
}, opts.timeoutMs);
|
|
76
|
+
proc.stdout?.on("data", (chunk) => {
|
|
77
|
+
stdout += chunk.toString("utf8");
|
|
78
|
+
});
|
|
79
|
+
proc.stderr?.on("data", (chunk) => {
|
|
80
|
+
stderr += chunk.toString("utf8");
|
|
81
|
+
});
|
|
82
|
+
proc.on("error", (err) => {
|
|
83
|
+
if (settled)
|
|
84
|
+
return;
|
|
85
|
+
settled = true;
|
|
86
|
+
clearTimeout(timer);
|
|
87
|
+
reject(err);
|
|
88
|
+
});
|
|
89
|
+
proc.on("close", (code) => {
|
|
90
|
+
if (settled)
|
|
91
|
+
return;
|
|
92
|
+
settled = true;
|
|
93
|
+
clearTimeout(timer);
|
|
94
|
+
if (code !== 0) {
|
|
95
|
+
reject(new Error(`claude exited ${code}: ${stderr.slice(0, 500)}`));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
resolve(extractClaudeResult(stdout));
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Claude Code's `--output-format json` wraps the model's response in an
|
|
104
|
+
* envelope like `{ "type": "result", "result": "...", ... }`. Strip that
|
|
105
|
+
* if present; otherwise return the raw stdout unchanged.
|
|
106
|
+
*/
|
|
107
|
+
function extractClaudeResult(stdout) {
|
|
108
|
+
const trimmed = stdout.trim();
|
|
109
|
+
if (!trimmed)
|
|
110
|
+
return "";
|
|
111
|
+
try {
|
|
112
|
+
const parsed = JSON.parse(trimmed);
|
|
113
|
+
if (parsed && typeof parsed === "object" && typeof parsed.result === "string") {
|
|
114
|
+
return parsed.result;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch { /* fall through */ }
|
|
118
|
+
return trimmed;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=triage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../../../src/connectors/slack/triage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector.test.d.ts","sourceRoot":"","sources":["../../../../../src/connectors/telegram/__tests__/connector.test.ts"],"names":[],"mappings":""}
|