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,108 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { isDeadSessionError, detectRateLimit } from "../rateLimit.js";
|
|
3
|
+
function makeResult(overrides = {}) {
|
|
4
|
+
return {
|
|
5
|
+
sessionId: "test-session",
|
|
6
|
+
result: "",
|
|
7
|
+
...overrides,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
describe("isDeadSessionError", () => {
|
|
11
|
+
it("returns true for error with zero cost and no rate limit", () => {
|
|
12
|
+
const result = makeResult({
|
|
13
|
+
error: "Claude exited with code 1 (no stderr output)",
|
|
14
|
+
cost: 0,
|
|
15
|
+
numTurns: 0,
|
|
16
|
+
});
|
|
17
|
+
expect(isDeadSessionError(result)).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it("returns true for error with undefined cost/turns (no work done)", () => {
|
|
20
|
+
const result = makeResult({
|
|
21
|
+
error: "Claude exited with code 1",
|
|
22
|
+
});
|
|
23
|
+
expect(isDeadSessionError(result)).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
it("returns false when rate limit status is present", () => {
|
|
26
|
+
const result = makeResult({
|
|
27
|
+
error: "Claude usage limit reached",
|
|
28
|
+
cost: 0,
|
|
29
|
+
rateLimit: { status: "rejected" },
|
|
30
|
+
});
|
|
31
|
+
expect(isDeadSessionError(result)).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
it("returns false when cost > 0 (work was done)", () => {
|
|
34
|
+
const result = makeResult({
|
|
35
|
+
error: "Some error after work",
|
|
36
|
+
cost: 0.05,
|
|
37
|
+
numTurns: 3,
|
|
38
|
+
});
|
|
39
|
+
expect(isDeadSessionError(result)).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
it("returns false when numTurns > 0 (work was done)", () => {
|
|
42
|
+
const result = makeResult({
|
|
43
|
+
error: "Some error after work",
|
|
44
|
+
cost: 0,
|
|
45
|
+
numTurns: 1,
|
|
46
|
+
});
|
|
47
|
+
expect(isDeadSessionError(result)).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
it("returns false when there is no error", () => {
|
|
50
|
+
const result = makeResult({ result: "success" });
|
|
51
|
+
expect(isDeadSessionError(result)).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
// Secondary pattern matching — requires zero cost as conjunction
|
|
54
|
+
it("returns true for 'error_during_execution' with zero cost", () => {
|
|
55
|
+
const result = makeResult({
|
|
56
|
+
error: "error_during_execution",
|
|
57
|
+
cost: 0,
|
|
58
|
+
numTurns: 0,
|
|
59
|
+
});
|
|
60
|
+
expect(isDeadSessionError(result)).toBe(true);
|
|
61
|
+
});
|
|
62
|
+
it("returns false for 'error_during_execution' when cost > 0 (real work done)", () => {
|
|
63
|
+
const result = makeResult({
|
|
64
|
+
error: "error_during_execution",
|
|
65
|
+
cost: 0.05,
|
|
66
|
+
numTurns: 1,
|
|
67
|
+
});
|
|
68
|
+
expect(isDeadSessionError(result)).toBe(false);
|
|
69
|
+
});
|
|
70
|
+
it("returns true for 'session not found' in error text", () => {
|
|
71
|
+
const result = makeResult({
|
|
72
|
+
error: "Session not found or expired",
|
|
73
|
+
cost: 0,
|
|
74
|
+
});
|
|
75
|
+
expect(isDeadSessionError(result)).toBe(true);
|
|
76
|
+
});
|
|
77
|
+
it("returns true for 'invalid session' in error text", () => {
|
|
78
|
+
const result = makeResult({
|
|
79
|
+
error: "Invalid session ID provided",
|
|
80
|
+
cost: 0,
|
|
81
|
+
});
|
|
82
|
+
expect(isDeadSessionError(result)).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
it("returns true for 'session expired' in error text", () => {
|
|
85
|
+
const result = makeResult({
|
|
86
|
+
error: "The session has expired",
|
|
87
|
+
cost: 0,
|
|
88
|
+
});
|
|
89
|
+
expect(isDeadSessionError(result)).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
it("does not false-positive on rate limit errors with no cost", () => {
|
|
92
|
+
const result = makeResult({
|
|
93
|
+
error: "rate limit exceeded",
|
|
94
|
+
cost: 0,
|
|
95
|
+
rateLimit: { status: "rejected", resetsAt: 1234567890 },
|
|
96
|
+
});
|
|
97
|
+
expect(isDeadSessionError(result)).toBe(false);
|
|
98
|
+
});
|
|
99
|
+
it("does not interfere with detectRateLimit", () => {
|
|
100
|
+
const rateLimited = makeResult({
|
|
101
|
+
error: "Claude usage limit reached",
|
|
102
|
+
rateLimit: { status: "rejected", resetsAt: 9999999999 },
|
|
103
|
+
});
|
|
104
|
+
expect(detectRateLimit(rateLimited).limited).toBe(true);
|
|
105
|
+
expect(isDeadSessionError(rateLimited)).toBe(false);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=rateLimit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimit.test.js","sourceRoot":"","sources":["../../../../src/shared/__tests__/rateLimit.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEtE,SAAS,UAAU,CAAC,YAAmC,EAAE;IACvD,OAAO;QACL,SAAS,EAAE,cAAc;QACzB,MAAM,EAAE,EAAE;QACV,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,8CAA8C;YACrD,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,2BAA2B;SACnC,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,4BAA4B;YACnC,IAAI,EAAE,CAAC;YACP,SAAS,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,uBAAuB;YAC9B,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,uBAAuB;YAC9B,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,wBAAwB;YAC/B,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,wBAAwB;YAC/B,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,8BAA8B;YACrC,IAAI,EAAE,CAAC;SACR,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,6BAA6B;YACpC,IAAI,EAAE,CAAC;SACR,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,yBAAyB;YAChC,IAAI,EAAE,CAAC;SACR,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,qBAAqB;YAC5B,IAAI,EAAE,CAAC;YACP,SAAS,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;SACxD,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,WAAW,GAAG,UAAU,CAAC;YAC7B,KAAK,EAAE,4BAA4B;YACnC,SAAS,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;SACxD,CAAC,CAAC;QACH,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usageAwareness.test.d.ts","sourceRoot":"","sources":["../../../../src/shared/__tests__/usageAwareness.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
// vi.mock factory is hoisted — cannot reference local variables.
|
|
5
|
+
// Use a fixed path that the mock can resolve at hoist time.
|
|
6
|
+
vi.mock("../paths.js", () => ({
|
|
7
|
+
JINN_HOME: path.join(import.meta.dirname || __dirname, ".tmp-usage-test"),
|
|
8
|
+
}));
|
|
9
|
+
import { isLikelyNearClaudeUsageLimit, recordClaudeRateLimit, } from "../usageAwareness.js";
|
|
10
|
+
const TEMP_DIR = path.join(import.meta.dirname || __dirname, ".tmp-usage-test");
|
|
11
|
+
const STATE_PATH = path.join(TEMP_DIR, "tmp", "claude-usage.json");
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
fs.mkdirSync(path.join(TEMP_DIR, "tmp"), { recursive: true });
|
|
14
|
+
});
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
fs.rmSync(TEMP_DIR, { recursive: true, force: true });
|
|
17
|
+
});
|
|
18
|
+
describe("isLikelyNearClaudeUsageLimit", () => {
|
|
19
|
+
it("returns false when no state file exists", () => {
|
|
20
|
+
expect(isLikelyNearClaudeUsageLimit()).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
it("returns true when rate limit was hit recently (within 6h)", () => {
|
|
23
|
+
const recentHit = new Date(Date.now() - 30 * 60_000).toISOString(); // 30 min ago
|
|
24
|
+
fs.writeFileSync(STATE_PATH, JSON.stringify({ lastRateLimitAt: recentHit }));
|
|
25
|
+
expect(isLikelyNearClaudeUsageLimit()).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
it("returns false when rate limit was hit more than 6h ago", () => {
|
|
28
|
+
const oldHit = new Date(Date.now() - 7 * 60 * 60_000).toISOString(); // 7h ago
|
|
29
|
+
fs.writeFileSync(STATE_PATH, JSON.stringify({ lastRateLimitAt: oldHit }));
|
|
30
|
+
expect(isLikelyNearClaudeUsageLimit()).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
it("returns false when lastResetsAt has passed, even if lastRateLimitAt is recent", () => {
|
|
33
|
+
const recentHit = new Date(Date.now() - 30 * 60_000).toISOString(); // 30 min ago
|
|
34
|
+
const pastReset = new Date(Date.now() - 10 * 60_000).toISOString(); // 10 min ago
|
|
35
|
+
fs.writeFileSync(STATE_PATH, JSON.stringify({ lastRateLimitAt: recentHit, lastResetsAt: pastReset }));
|
|
36
|
+
expect(isLikelyNearClaudeUsageLimit()).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
it("returns true when lastResetsAt is in the future", () => {
|
|
39
|
+
const recentHit = new Date(Date.now() - 30 * 60_000).toISOString(); // 30 min ago
|
|
40
|
+
const futureReset = new Date(Date.now() + 60 * 60_000).toISOString(); // 1h from now
|
|
41
|
+
fs.writeFileSync(STATE_PATH, JSON.stringify({ lastRateLimitAt: recentHit, lastResetsAt: futureReset }));
|
|
42
|
+
expect(isLikelyNearClaudeUsageLimit()).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
it("ignores invalid lastResetsAt and falls back to 6h heuristic", () => {
|
|
45
|
+
const recentHit = new Date(Date.now() - 30 * 60_000).toISOString();
|
|
46
|
+
fs.writeFileSync(STATE_PATH, JSON.stringify({ lastRateLimitAt: recentHit, lastResetsAt: "not-a-date" }));
|
|
47
|
+
expect(isLikelyNearClaudeUsageLimit()).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
it("works end-to-end with recordClaudeRateLimit", () => {
|
|
50
|
+
const futureResetSeconds = (Date.now() + 2 * 60 * 60_000) / 1000; // 2h from now
|
|
51
|
+
recordClaudeRateLimit(futureResetSeconds);
|
|
52
|
+
expect(isLikelyNearClaudeUsageLimit()).toBe(true);
|
|
53
|
+
// Simulate time passing beyond the reset
|
|
54
|
+
const pastResetTime = new Date(futureResetSeconds * 1000 + 1000);
|
|
55
|
+
expect(isLikelyNearClaudeUsageLimit(pastResetTime)).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=usageAwareness.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usageAwareness.test.js","sourceRoot":"","sources":["../../../../src/shared/__tests__/usageAwareness.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/shared/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,UAAU,IAAI,UAAU,CAQvC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import yaml from "js-yaml";
|
|
3
|
+
import { CONFIG_PATH } from "./paths.js";
|
|
4
|
+
export function loadConfig() {
|
|
5
|
+
if (!fs.existsSync(CONFIG_PATH)) {
|
|
6
|
+
throw new Error(`Jinn config not found at ${CONFIG_PATH}. Run "jinn setup" first.`);
|
|
7
|
+
}
|
|
8
|
+
const raw = fs.readFileSync(CONFIG_PATH, "utf-8");
|
|
9
|
+
return yaml.load(raw);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/shared/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,4BAA4B,WAAW,2BAA2B,CACnE,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAe,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Employee, Session } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Resolve the effort level for a session.
|
|
4
|
+
*
|
|
5
|
+
* For child sessions (has parentSessionId), resolution chain:
|
|
6
|
+
* 1. config.engines.<engine>.childEffortOverride — global cost-control knob
|
|
7
|
+
* 2. session.effortLevel — COO's per-task judgment (from API body)
|
|
8
|
+
* 3. employee.effortLevel — employee YAML default
|
|
9
|
+
* 4. config.engines.<engine>.effortLevel — engine fallback
|
|
10
|
+
*
|
|
11
|
+
* For non-child sessions (COO's own), use engine effortLevel directly.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveEffort(engineConfig: {
|
|
14
|
+
effortLevel?: string;
|
|
15
|
+
childEffortOverride?: string;
|
|
16
|
+
}, session: Pick<Session, "parentSessionId" | "effortLevel">, employee?: Pick<Employee, "effortLevel"> | null): string;
|
|
17
|
+
//# sourceMappingURL=effort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effort.d.ts","sourceRoot":"","sources":["../../../src/shared/effort.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAIpD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,EACpE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG,aAAa,CAAC,EACzD,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,GAAG,IAAI,GAC9C,MAAM,CA4BR"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { logger } from "./logger.js";
|
|
2
|
+
const VALID_EFFORTS = new Set(["low", "medium", "high"]);
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the effort level for a session.
|
|
5
|
+
*
|
|
6
|
+
* For child sessions (has parentSessionId), resolution chain:
|
|
7
|
+
* 1. config.engines.<engine>.childEffortOverride — global cost-control knob
|
|
8
|
+
* 2. session.effortLevel — COO's per-task judgment (from API body)
|
|
9
|
+
* 3. employee.effortLevel — employee YAML default
|
|
10
|
+
* 4. config.engines.<engine>.effortLevel — engine fallback
|
|
11
|
+
*
|
|
12
|
+
* For non-child sessions (COO's own), use engine effortLevel directly.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveEffort(engineConfig, session, employee) {
|
|
15
|
+
if (session.parentSessionId) {
|
|
16
|
+
const override = engineConfig.childEffortOverride;
|
|
17
|
+
if (override) {
|
|
18
|
+
if (VALID_EFFORTS.has(override))
|
|
19
|
+
return override;
|
|
20
|
+
logger.warn(`Invalid childEffortOverride "${override}" in engine config, skipping`);
|
|
21
|
+
}
|
|
22
|
+
const requested = session.effortLevel;
|
|
23
|
+
if (requested) {
|
|
24
|
+
if (VALID_EFFORTS.has(requested))
|
|
25
|
+
return requested;
|
|
26
|
+
logger.warn(`Invalid effortLevel "${requested}" on session, skipping`);
|
|
27
|
+
}
|
|
28
|
+
const empDefault = employee?.effortLevel;
|
|
29
|
+
if (empDefault) {
|
|
30
|
+
if (VALID_EFFORTS.has(empDefault))
|
|
31
|
+
return empDefault;
|
|
32
|
+
logger.warn(`Invalid effortLevel "${empDefault}" on employee, skipping`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Non-child sessions (COO) or fallback
|
|
36
|
+
const engineDefault = engineConfig.effortLevel;
|
|
37
|
+
if (engineDefault && VALID_EFFORTS.has(engineDefault))
|
|
38
|
+
return engineDefault;
|
|
39
|
+
if (engineDefault) {
|
|
40
|
+
logger.warn(`Invalid effortLevel "${engineDefault}" in engine config, defaulting to "medium"`);
|
|
41
|
+
}
|
|
42
|
+
return "medium";
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=effort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effort.js","sourceRoot":"","sources":["../../../src/shared/effort.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAC3B,YAAoE,EACpE,OAAyD,EACzD,QAA+C;IAE/C,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,YAAY,CAAC,mBAAmB,CAAC;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,gCAAgC,QAAQ,8BAA8B,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;QACtC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,wBAAwB,SAAS,wBAAwB,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,EAAE,WAAW,CAAC;QACzC,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,OAAO,UAAU,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,wBAAwB,UAAU,yBAAyB,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC;IAC/C,IAAI,aAAa,IAAI,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,OAAO,aAAa,CAAC;IAC5E,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,wBAAwB,aAAa,4CAA4C,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function configureLogger(opts: {
|
|
2
|
+
level?: string;
|
|
3
|
+
stdout?: boolean;
|
|
4
|
+
file?: boolean;
|
|
5
|
+
}): void;
|
|
6
|
+
export declare const logger: {
|
|
7
|
+
debug: (msg: string) => void;
|
|
8
|
+
info: (msg: string) => void;
|
|
9
|
+
warn: (msg: string) => void;
|
|
10
|
+
error: (msg: string) => void;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/shared/logger.ts"],"names":[],"mappings":"AAWA,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,QASA;AASD,eAAO,MAAM,MAAM;iBACJ,MAAM;gBACP,MAAM;gBACN,MAAM;iBACL,MAAM;CACpB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { LOGS_DIR } from "./paths.js";
|
|
4
|
+
const LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };
|
|
5
|
+
let minLevel = "info";
|
|
6
|
+
let writeToStdout = true;
|
|
7
|
+
let logStream = null;
|
|
8
|
+
export function configureLogger(opts) {
|
|
9
|
+
if (opts.level && opts.level in LEVELS)
|
|
10
|
+
minLevel = opts.level;
|
|
11
|
+
if (opts.stdout !== undefined)
|
|
12
|
+
writeToStdout = opts.stdout;
|
|
13
|
+
if (opts.file !== false) {
|
|
14
|
+
fs.mkdirSync(LOGS_DIR, { recursive: true });
|
|
15
|
+
logStream = fs.createWriteStream(path.join(LOGS_DIR, "gateway.log"), {
|
|
16
|
+
flags: "a",
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function log(level, message) {
|
|
21
|
+
if (LEVELS[level] < LEVELS[minLevel])
|
|
22
|
+
return;
|
|
23
|
+
const line = `${new Date().toISOString()} [${level.toUpperCase()}] ${message}`;
|
|
24
|
+
if (writeToStdout)
|
|
25
|
+
console.log(line);
|
|
26
|
+
if (logStream)
|
|
27
|
+
logStream.write(line + "\n");
|
|
28
|
+
}
|
|
29
|
+
export const logger = {
|
|
30
|
+
debug: (msg) => log("debug", msg),
|
|
31
|
+
info: (msg) => log("info", msg),
|
|
32
|
+
warn: (msg) => log("warn", msg),
|
|
33
|
+
error: (msg) => log("error", msg),
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/shared/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAW,CAAC;AAGjE,IAAI,QAAQ,GAAa,MAAM,CAAC;AAChC,IAAI,aAAa,GAAG,IAAI,CAAC;AACzB,IAAI,SAAS,GAA0B,IAAI,CAAC;AAE5C,MAAM,UAAU,eAAe,CAAC,IAI/B;IACC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM;QAAE,QAAQ,GAAG,IAAI,CAAC,KAAiB,CAAC;IAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3D,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,SAAS,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE;YACnE,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,KAAe,EAAE,OAAe;IAC3C,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO;IAC7C,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;IAC/E,IAAI,aAAa;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,SAAS;QAAE,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;IACzC,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IACvC,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IACvC,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;CAC1C,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JINN_HOME is kept as the exported constant name for backwards compatibility
|
|
3
|
+
* with all internal callers. The actual value resolves to ~/.ryoko/ on new
|
|
4
|
+
* installs and after the one-time migration above.
|
|
5
|
+
*/
|
|
6
|
+
export declare const JINN_HOME: string;
|
|
7
|
+
export declare const CONFIG_PATH: string;
|
|
8
|
+
export declare const SESSIONS_DB: string;
|
|
9
|
+
export declare const CRON_JOBS: string;
|
|
10
|
+
export declare const CRON_RUNS: string;
|
|
11
|
+
export declare const ORG_DIR: string;
|
|
12
|
+
export declare const SKILLS_DIR: string;
|
|
13
|
+
export declare const DOCS_DIR: string;
|
|
14
|
+
export declare const LOGS_DIR: string;
|
|
15
|
+
export declare const TMP_DIR: string;
|
|
16
|
+
export declare const MODELS_DIR: string;
|
|
17
|
+
export declare const STT_MODELS_DIR: string;
|
|
18
|
+
export declare const PID_FILE: string;
|
|
19
|
+
export declare const CLAUDE_SKILLS_DIR: string;
|
|
20
|
+
export declare const AGENTS_SKILLS_DIR: string;
|
|
21
|
+
export declare const TEMPLATE_DIR: string;
|
|
22
|
+
export declare const FILES_DIR: string;
|
|
23
|
+
export declare const MIGRATIONS_DIR: string;
|
|
24
|
+
export declare const TEMPLATE_MIGRATIONS_DIR: string;
|
|
25
|
+
/**
|
|
26
|
+
* Global instances registry — always at ~/.ryoko/instances.json regardless
|
|
27
|
+
* of which instance is running, so every instance can discover the others.
|
|
28
|
+
* Falls back to ~/.jinn/ when only the legacy home exists.
|
|
29
|
+
*/
|
|
30
|
+
export declare const INSTANCES_REGISTRY: string;
|
|
31
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/shared/paths.ts"],"names":[],"mappings":"AAgDA;;;;GAIG;AACH,eAAO,MAAM,SAAS,QAAgB,CAAC;AACvC,eAAO,MAAM,WAAW,QAAsC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAAkD,CAAC;AAC3E,eAAO,MAAM,SAAS,QAA4C,CAAC;AACnE,eAAO,MAAM,SAAS,QAAuC,CAAC;AAC9D,eAAO,MAAM,OAAO,QAA8B,CAAC;AACnD,eAAO,MAAM,UAAU,QAAiC,CAAC;AACzD,eAAO,MAAM,QAAQ,QAA+B,CAAC;AACrD,eAAO,MAAM,QAAQ,QAA+B,CAAC;AACrD,eAAO,MAAM,OAAO,QAA8B,CAAC;AACnD,eAAO,MAAM,UAAU,QAAiC,CAAC;AACzD,eAAO,MAAM,cAAc,QAA4C,CAAC;AACxE,eAAO,MAAM,QAAQ,QAAsC,CAAC;AAC5D,eAAO,MAAM,iBAAiB,QAA4C,CAAC;AAC3E,eAAO,MAAM,iBAAiB,QAA4C,CAAC;AAC3E,eAAO,MAAM,YAAY,QAAqD,CAAC;AAC/E,eAAO,MAAM,SAAS,QAAgC,CAAC;AACvD,eAAO,MAAM,cAAc,QAAqC,CAAC;AACjE,eAAO,MAAM,uBAAuB,QAAwC,CAAC;AAE7E;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,QAM3B,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
/**
|
|
8
|
+
* One-time migration: if the user has a legacy ~/.jinn/ but no ~/.ryoko/,
|
|
9
|
+
* rename the entire directory in place. Runs at module load so every path
|
|
10
|
+
* constant below already points at the migrated location. Any failure is
|
|
11
|
+
* silent — resolveHome() still has a legacy fallback.
|
|
12
|
+
*/
|
|
13
|
+
function migrateLegacyHome() {
|
|
14
|
+
if (process.env.RYOKO_HOME || process.env.JINN_HOME)
|
|
15
|
+
return;
|
|
16
|
+
if (process.env.RYOKO_INSTANCE || process.env.JINN_INSTANCE)
|
|
17
|
+
return;
|
|
18
|
+
const legacy = path.join(os.homedir(), ".jinn");
|
|
19
|
+
const target = path.join(os.homedir(), ".ryoko");
|
|
20
|
+
if (!fs.existsSync(legacy))
|
|
21
|
+
return;
|
|
22
|
+
if (fs.existsSync(target))
|
|
23
|
+
return;
|
|
24
|
+
try {
|
|
25
|
+
fs.renameSync(legacy, target);
|
|
26
|
+
console.log(`[openryoko] migrated ~/.jinn → ~/.ryoko`);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
/* leave legacy in place; resolveHome will still find it via fallback */
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
migrateLegacyHome();
|
|
33
|
+
/**
|
|
34
|
+
* Resolve the home directory for the current instance.
|
|
35
|
+
* Precedence: RYOKO_HOME > JINN_HOME (legacy) > RYOKO_INSTANCE > JINN_INSTANCE >
|
|
36
|
+
* ~/.ryoko (falls back to ~/.jinn if ~/.ryoko doesn't exist yet).
|
|
37
|
+
*/
|
|
38
|
+
function resolveHome() {
|
|
39
|
+
if (process.env.RYOKO_HOME)
|
|
40
|
+
return process.env.RYOKO_HOME;
|
|
41
|
+
if (process.env.JINN_HOME)
|
|
42
|
+
return process.env.JINN_HOME;
|
|
43
|
+
const instance = process.env.RYOKO_INSTANCE || process.env.JINN_INSTANCE;
|
|
44
|
+
if (instance)
|
|
45
|
+
return path.join(os.homedir(), `.${instance}`);
|
|
46
|
+
const ryokoHome = path.join(os.homedir(), ".ryoko");
|
|
47
|
+
const jinnHome = path.join(os.homedir(), ".jinn");
|
|
48
|
+
if (fs.existsSync(ryokoHome))
|
|
49
|
+
return ryokoHome;
|
|
50
|
+
if (fs.existsSync(jinnHome))
|
|
51
|
+
return jinnHome;
|
|
52
|
+
return ryokoHome;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* JINN_HOME is kept as the exported constant name for backwards compatibility
|
|
56
|
+
* with all internal callers. The actual value resolves to ~/.ryoko/ on new
|
|
57
|
+
* installs and after the one-time migration above.
|
|
58
|
+
*/
|
|
59
|
+
export const JINN_HOME = resolveHome();
|
|
60
|
+
export const CONFIG_PATH = path.join(JINN_HOME, "config.yaml");
|
|
61
|
+
export const SESSIONS_DB = path.join(JINN_HOME, "sessions", "registry.db");
|
|
62
|
+
export const CRON_JOBS = path.join(JINN_HOME, "cron", "jobs.json");
|
|
63
|
+
export const CRON_RUNS = path.join(JINN_HOME, "cron", "runs");
|
|
64
|
+
export const ORG_DIR = path.join(JINN_HOME, "org");
|
|
65
|
+
export const SKILLS_DIR = path.join(JINN_HOME, "skills");
|
|
66
|
+
export const DOCS_DIR = path.join(JINN_HOME, "docs");
|
|
67
|
+
export const LOGS_DIR = path.join(JINN_HOME, "logs");
|
|
68
|
+
export const TMP_DIR = path.join(JINN_HOME, "tmp");
|
|
69
|
+
export const MODELS_DIR = path.join(JINN_HOME, "models");
|
|
70
|
+
export const STT_MODELS_DIR = path.join(JINN_HOME, "models", "whisper");
|
|
71
|
+
export const PID_FILE = path.join(JINN_HOME, "gateway.pid");
|
|
72
|
+
export const CLAUDE_SKILLS_DIR = path.join(JINN_HOME, ".claude", "skills");
|
|
73
|
+
export const AGENTS_SKILLS_DIR = path.join(JINN_HOME, ".agents", "skills");
|
|
74
|
+
export const TEMPLATE_DIR = path.join(__dirname, "..", "..", "..", "template");
|
|
75
|
+
export const FILES_DIR = path.join(JINN_HOME, "files");
|
|
76
|
+
export const MIGRATIONS_DIR = path.join(JINN_HOME, "migrations");
|
|
77
|
+
export const TEMPLATE_MIGRATIONS_DIR = path.join(TEMPLATE_DIR, "migrations");
|
|
78
|
+
/**
|
|
79
|
+
* Global instances registry — always at ~/.ryoko/instances.json regardless
|
|
80
|
+
* of which instance is running, so every instance can discover the others.
|
|
81
|
+
* Falls back to ~/.jinn/ when only the legacy home exists.
|
|
82
|
+
*/
|
|
83
|
+
export const INSTANCES_REGISTRY = (() => {
|
|
84
|
+
const ryoko = path.join(os.homedir(), ".ryoko", "instances.json");
|
|
85
|
+
const jinn = path.join(os.homedir(), ".jinn", "instances.json");
|
|
86
|
+
if (fs.existsSync(path.dirname(ryoko)))
|
|
87
|
+
return ryoko;
|
|
88
|
+
if (fs.existsSync(path.dirname(jinn)))
|
|
89
|
+
return jinn;
|
|
90
|
+
return ryoko;
|
|
91
|
+
})();
|
|
92
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/shared/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EngineResult } from "./types.js";
|
|
2
|
+
export interface RateLimitDetection {
|
|
3
|
+
limited: boolean;
|
|
4
|
+
/** Unix timestamp in seconds */
|
|
5
|
+
resetsAt?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Detect whether an engine result indicates a dead/expired session rather than
|
|
9
|
+
* a transient or rate-limit error. A dead session is one where the engine exited
|
|
10
|
+
* with an error but did zero work (no cost, no turns) and there is no rate-limit
|
|
11
|
+
* signal — meaning the --resume ID is stale and should not be retried.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isDeadSessionError(result: EngineResult): boolean;
|
|
14
|
+
export declare function detectRateLimit(result: EngineResult): RateLimitDetection;
|
|
15
|
+
export declare function computeRateLimitDeadlineMs(resetsAtSeconds?: number, extraMs?: number): number;
|
|
16
|
+
export declare function computeNextRetryDelayMs(resetsAtSeconds?: number): {
|
|
17
|
+
delayMs: number;
|
|
18
|
+
resumeAt?: Date;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=rateLimit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../../src/shared/rateLimit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAUD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAkBhE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,kBAAkB,CAcxE;AAED,wBAAgB,0BAA0B,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,SAAc,GAAG,MAAM,CAKlG;AAED,wBAAgB,uBAAuB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,IAAI,CAAA;CAAE,CAStG"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const RATE_LIMIT_ERROR_RE = /rate.?limit|too many requests|429|overloaded|usage.*limit|exceeded.*limit|out of extra usage/i;
|
|
2
|
+
/** Patterns that indicate the engine session is dead (expired, not found, etc.) */
|
|
3
|
+
const DEAD_SESSION_PATTERNS = [
|
|
4
|
+
/error.during.execution/i,
|
|
5
|
+
/session.not.found/i,
|
|
6
|
+
/invalid.session/i,
|
|
7
|
+
/session.*expired/i,
|
|
8
|
+
];
|
|
9
|
+
/**
|
|
10
|
+
* Detect whether an engine result indicates a dead/expired session rather than
|
|
11
|
+
* a transient or rate-limit error. A dead session is one where the engine exited
|
|
12
|
+
* with an error but did zero work (no cost, no turns) and there is no rate-limit
|
|
13
|
+
* signal — meaning the --resume ID is stale and should not be retried.
|
|
14
|
+
*/
|
|
15
|
+
export function isDeadSessionError(result) {
|
|
16
|
+
if (!result.error)
|
|
17
|
+
return false;
|
|
18
|
+
// If rate limit info is present, this is a rate limit, not a dead session
|
|
19
|
+
if (result.rateLimit?.status)
|
|
20
|
+
return false;
|
|
21
|
+
const zeroCost = result.cost === undefined || result.cost === 0;
|
|
22
|
+
const zeroTurns = result.numTurns === undefined || result.numTurns === 0;
|
|
23
|
+
// Primary: error with zero work done and no rate limit
|
|
24
|
+
if (zeroCost && zeroTurns)
|
|
25
|
+
return true;
|
|
26
|
+
// Secondary: known dead-session patterns in error text, but only when no real
|
|
27
|
+
// work was done (zeroCost) — avoids wiping IDs after a real session that
|
|
28
|
+
// happened to include a matching substring in its error message.
|
|
29
|
+
if (zeroCost && DEAD_SESSION_PATTERNS.some((p) => p.test(result.error)))
|
|
30
|
+
return true;
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
export function detectRateLimit(result) {
|
|
34
|
+
const resetsAt = typeof result.rateLimit?.resetsAt === "number"
|
|
35
|
+
? result.rateLimit.resetsAt
|
|
36
|
+
: undefined;
|
|
37
|
+
if (result.rateLimit?.status === "rejected") {
|
|
38
|
+
return { limited: true, resetsAt };
|
|
39
|
+
}
|
|
40
|
+
if (result.error && RATE_LIMIT_ERROR_RE.test(result.error)) {
|
|
41
|
+
return { limited: true, resetsAt };
|
|
42
|
+
}
|
|
43
|
+
return { limited: false };
|
|
44
|
+
}
|
|
45
|
+
export function computeRateLimitDeadlineMs(resetsAtSeconds, extraMs = 30 * 60_000) {
|
|
46
|
+
if (typeof resetsAtSeconds === "number" && Number.isFinite(resetsAtSeconds)) {
|
|
47
|
+
return resetsAtSeconds * 1000 + extraMs;
|
|
48
|
+
}
|
|
49
|
+
return Date.now() + extraMs;
|
|
50
|
+
}
|
|
51
|
+
export function computeNextRetryDelayMs(resetsAtSeconds) {
|
|
52
|
+
if (typeof resetsAtSeconds === "number" && Number.isFinite(resetsAtSeconds)) {
|
|
53
|
+
const resumeAt = new Date(resetsAtSeconds * 1000);
|
|
54
|
+
// Add a small buffer to avoid retrying a few ms before the reset boundary.
|
|
55
|
+
const bufferMs = 10_000;
|
|
56
|
+
const delayMs = Math.max(10_000, resumeAt.getTime() - Date.now() + bufferMs);
|
|
57
|
+
return { delayMs, resumeAt };
|
|
58
|
+
}
|
|
59
|
+
return { delayMs: 60_000 };
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=rateLimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../../src/shared/rateLimit.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GACvB,+FAA+F,CAAC;AAQlG,mFAAmF;AACnF,MAAM,qBAAqB,GAAG;IAC5B,yBAAyB;IACzB,oBAAoB;IACpB,kBAAkB;IAClB,mBAAmB;CACpB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEhC,0EAA0E;IAC1E,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM;QAAE,OAAO,KAAK,CAAC;IAE3C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;IAEzE,uDAAuD;IACvD,IAAI,QAAQ,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAEvC,8EAA8E;IAC9E,yEAAyE;IACzE,iEAAiE;IACjE,IAAI,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,SAAS,EAAE,QAAQ,KAAK,QAAQ;QAC7D,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ;QAC3B,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,KAAK,UAAU,EAAE,CAAC;QAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACrC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,eAAwB,EAAE,OAAO,GAAG,EAAE,GAAG,MAAM;IACxF,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5E,OAAO,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,eAAwB;IAC9D,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5E,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;QAClD,2EAA2E;QAC3E,MAAM,QAAQ,GAAG,MAAM,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC;QAC7E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC"}
|