@otto-assistant/otto 0.1.1 → 0.7.15
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/bin.js +2 -0
- package/dist/agent-model.e2e.test.js +755 -0
- package/dist/ai-tool-to-genai.js +233 -0
- package/dist/ai-tool-to-genai.test.js +267 -0
- package/dist/ai-tool.js +6 -0
- package/dist/anthropic-account-identity.js +62 -0
- package/dist/anthropic-account-identity.test.js +38 -0
- package/dist/anthropic-auth-plugin.js +917 -0
- package/dist/anthropic-auth-state.js +303 -0
- package/dist/anthropic-auth-state.test.js +150 -0
- package/dist/bin.js +152 -0
- package/dist/btw-prefix-detection.js +17 -0
- package/dist/btw-prefix-detection.test.js +63 -0
- package/dist/channel-management.js +259 -0
- package/dist/cli-parsing.test.js +142 -0
- package/dist/cli-send-thread.e2e.test.js +353 -0
- package/dist/cli-telegram-options.test.js +99 -0
- package/dist/cli.js +4210 -568
- package/dist/commands/abort.js +65 -0
- package/dist/commands/action-buttons.js +245 -0
- package/dist/commands/add-dir.js +124 -0
- package/dist/commands/add-dir.test.js +126 -0
- package/dist/commands/add-project.js +113 -0
- package/dist/commands/agent.js +355 -0
- package/dist/commands/ask-question.js +320 -0
- package/dist/commands/ask-question.test.js +92 -0
- package/dist/commands/btw.js +121 -0
- package/dist/commands/cli-commands-group-a.test.js +728 -0
- package/dist/commands/cli-commands-group-b.test.js +695 -0
- package/dist/commands/compact.js +120 -0
- package/dist/commands/context-usage.js +140 -0
- package/dist/commands/create-new-project.js +130 -0
- package/dist/commands/diff.js +63 -0
- package/dist/commands/discord-commands-group-a.test.js +621 -0
- package/dist/commands/discord-commands-group-b.test.js +595 -0
- package/dist/commands/discord-commands-group-c.test.js +739 -0
- package/dist/commands/file-upload.js +275 -0
- package/dist/commands/fork-subagent.js +177 -0
- package/dist/commands/fork.js +262 -0
- package/dist/commands/gemini-apikey.js +70 -0
- package/dist/commands/login.js +887 -0
- package/dist/commands/mcp.js +239 -0
- package/dist/commands/memory-snapshot.js +24 -0
- package/dist/commands/mention-mode.js +44 -0
- package/dist/commands/merge-worktree.js +162 -0
- package/dist/commands/model-variant.js +366 -0
- package/dist/commands/model.js +794 -0
- package/dist/commands/new-worktree.js +465 -0
- package/dist/commands/paginated-select.js +57 -0
- package/dist/commands/permissions.js +274 -0
- package/dist/commands/queue.js +223 -0
- package/dist/commands/remove-project.js +115 -0
- package/dist/commands/restart-opencode-server.js +127 -0
- package/dist/commands/resume.js +149 -0
- package/dist/commands/run-command.js +79 -0
- package/dist/commands/screenshare.js +303 -0
- package/dist/commands/screenshare.test.js +20 -0
- package/dist/commands/session-id.js +78 -0
- package/dist/commands/session.js +176 -0
- package/dist/commands/share.js +80 -0
- package/dist/commands/tasks.js +205 -0
- package/dist/commands/thread-deletion-sync.js +50 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/undo-redo.js +305 -0
- package/dist/commands/unset-model.js +139 -0
- package/dist/commands/upgrade.js +48 -0
- package/dist/commands/user-command.js +155 -0
- package/dist/commands/verbosity.js +125 -0
- package/dist/commands/vscode.js +269 -0
- package/dist/commands/worktree-settings.js +43 -0
- package/dist/commands/worktrees.js +468 -0
- package/dist/condense-memory.js +33 -0
- package/dist/config.js +100 -255
- package/dist/context-awareness-plugin.js +340 -0
- package/dist/context-awareness-plugin.test.js +126 -0
- package/dist/critique-utils.js +95 -0
- package/dist/database.js +1355 -0
- package/dist/db.js +260 -0
- package/dist/db.test.js +138 -0
- package/dist/debounce-timeout.js +28 -0
- package/dist/debounced-process-flush.js +77 -0
- package/dist/discord-bot.js +1124 -0
- package/dist/discord-command-registration.js +567 -0
- package/dist/discord-urls.js +82 -0
- package/dist/discord-utils.js +616 -0
- package/dist/discord-utils.test.js +134 -0
- package/dist/errors.js +157 -0
- package/dist/escape-backticks.test.js +429 -0
- package/dist/event-stream-real-capture.e2e.test.js +533 -0
- package/dist/eventsource-parser.test.js +327 -0
- package/dist/exec-async.js +26 -0
- package/dist/external-opencode-sync.js +480 -0
- package/dist/format-tables.js +491 -0
- package/dist/format-tables.test.js +478 -0
- package/dist/forum-sync/config.js +79 -0
- package/dist/forum-sync/discord-operations.js +154 -0
- package/dist/forum-sync/index.js +5 -0
- package/dist/forum-sync/markdown.js +113 -0
- package/dist/forum-sync/sync-to-discord.js +417 -0
- package/dist/forum-sync/sync-to-files.js +190 -0
- package/dist/forum-sync/types.js +53 -0
- package/dist/forum-sync/watchers.js +307 -0
- package/dist/gateway-proxy-reconnect.e2e.test.js +394 -0
- package/dist/gateway-proxy.e2e.test.js +485 -0
- package/dist/genai-worker-wrapper.js +111 -0
- package/dist/genai-worker.js +311 -0
- package/dist/genai.js +232 -0
- package/dist/generated/browser.js +17 -0
- package/dist/generated/client.js +37 -0
- package/dist/generated/commonInputTypes.js +10 -0
- package/dist/generated/enums.js +58 -0
- package/dist/generated/internal/class.js +49 -0
- package/dist/generated/internal/prismaNamespace.js +254 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js +224 -0
- package/dist/generated/models/bot_api_keys.js +1 -0
- package/dist/generated/models/bot_tokens.js +1 -0
- package/dist/generated/models/channel_agents.js +1 -0
- package/dist/generated/models/channel_directories.js +1 -0
- package/dist/generated/models/channel_mention_mode.js +1 -0
- package/dist/generated/models/channel_models.js +1 -0
- package/dist/generated/models/channel_verbosity.js +1 -0
- package/dist/generated/models/channel_worktrees.js +1 -0
- package/dist/generated/models/forum_sync_configs.js +1 -0
- package/dist/generated/models/global_models.js +1 -0
- package/dist/generated/models/ipc_requests.js +1 -0
- package/dist/generated/models/part_messages.js +1 -0
- package/dist/generated/models/scheduled_tasks.js +1 -0
- package/dist/generated/models/session_agents.js +1 -0
- package/dist/generated/models/session_events.js +1 -0
- package/dist/generated/models/session_models.js +1 -0
- package/dist/generated/models/session_start_sources.js +1 -0
- package/dist/generated/models/thread_sessions.js +1 -0
- package/dist/generated/models/thread_worktrees.js +1 -0
- package/dist/generated/models.js +1 -0
- package/dist/heap-monitor.js +122 -0
- package/dist/hrana-server.js +251 -0
- package/dist/hrana-server.test.js +370 -0
- package/dist/html-actions.js +123 -0
- package/dist/html-actions.test.js +70 -0
- package/dist/html-components.js +117 -0
- package/dist/html-components.test.js +34 -0
- package/dist/image-optimizer-plugin.js +153 -0
- package/dist/image-utils.js +112 -0
- package/dist/interaction-handler.js +420 -0
- package/dist/ipc-polling.js +327 -0
- package/dist/ipc-tools-plugin.js +193 -0
- package/dist/ipc-utils.js +18 -0
- package/dist/limit-heading-depth.js +25 -0
- package/dist/limit-heading-depth.test.js +105 -0
- package/dist/logger.js +171 -0
- package/dist/markdown.js +342 -0
- package/dist/markdown.test.js +264 -0
- package/dist/memory-overview-plugin.js +128 -0
- package/dist/message-finish-field.e2e.test.js +168 -0
- package/dist/message-formatting.js +415 -0
- package/dist/message-formatting.test.js +115 -0
- package/dist/message-preprocessing.js +359 -0
- package/dist/onboarding-tutorial.js +163 -0
- package/dist/onboarding-welcome.js +37 -0
- package/dist/openai-realtime.js +224 -0
- package/dist/opencode-command-detection.js +65 -0
- package/dist/opencode-command-detection.test.js +240 -0
- package/dist/opencode-command.js +131 -0
- package/dist/opencode-command.test.js +48 -0
- package/dist/opencode-interrupt-plugin.js +388 -0
- package/dist/opencode-interrupt-plugin.test.js +463 -0
- package/dist/opencode.js +1117 -0
- package/dist/otto/branding.js +22 -0
- package/dist/otto/index.js +21 -0
- package/dist/otto-digital-twin.e2e.test.js +161 -0
- package/dist/otto-opencode-plugin-loading.e2e.test.js +94 -0
- package/dist/otto-opencode-plugin.js +21 -0
- package/dist/otto-opencode-plugin.test.js +98 -0
- package/dist/parse-permission-rules.test.js +117 -0
- package/dist/patch-text-parser.js +97 -0
- package/dist/plugin-logger.js +68 -0
- package/dist/privacy-sanitizer.js +105 -0
- package/dist/queue-advanced-abort.e2e.test.js +293 -0
- package/dist/queue-advanced-action-buttons.e2e.test.js +206 -0
- package/dist/queue-advanced-e2e-setup.js +790 -0
- package/dist/queue-advanced-footer.e2e.test.js +481 -0
- package/dist/queue-advanced-model-switch.e2e.test.js +299 -0
- package/dist/queue-advanced-permissions-typing.e2e.test.js +179 -0
- package/dist/queue-advanced-question.e2e.test.js +261 -0
- package/dist/queue-advanced-typing-interrupt.e2e.test.js +114 -0
- package/dist/queue-advanced-typing.e2e.test.js +153 -0
- package/dist/queue-drain-after-interactive-ui.e2e.test.js +119 -0
- package/dist/queue-interrupt-drain.e2e.test.js +135 -0
- package/dist/queue-question-select-drain.e2e.test.js +256 -0
- package/dist/runtime-idle-sweeper.js +52 -0
- package/dist/runtime-lifecycle.e2e.test.js +514 -0
- package/dist/sentry.js +23 -0
- package/dist/session-handler/agent-utils.js +67 -0
- package/dist/session-handler/event-stream-state.js +475 -0
- package/dist/session-handler/event-stream-state.test.js +632 -0
- package/dist/session-handler/model-utils.js +147 -0
- package/dist/session-handler/opencode-session-event-log.js +94 -0
- package/dist/session-handler/thread-runtime-state.js +131 -0
- package/dist/session-handler/thread-session-runtime.js +3390 -0
- package/dist/session-handler.js +9 -0
- package/dist/session-search.js +100 -0
- package/dist/session-search.test.js +40 -0
- package/dist/session-title-rename.test.js +92 -0
- package/dist/skill-filter.js +31 -0
- package/dist/skill-filter.test.js +65 -0
- package/dist/startup-service.js +153 -0
- package/dist/startup-time.e2e.test.js +296 -0
- package/dist/store.js +19 -0
- package/dist/subagent-rate-limit-plugin.js +175 -0
- package/dist/system-message.js +702 -0
- package/dist/system-message.test.js +697 -0
- package/dist/task-runner.js +530 -0
- package/dist/task-schedule.js +213 -0
- package/dist/task-schedule.test.js +71 -0
- package/dist/test-utils.js +313 -0
- package/dist/thinking-utils.js +35 -0
- package/dist/thread-message-queue.e2e.test.js +1111 -0
- package/dist/tools.js +357 -0
- package/dist/undo-redo.e2e.test.js +161 -0
- package/dist/unnest-code-blocks.js +146 -0
- package/dist/unnest-code-blocks.test.js +673 -0
- package/dist/upgrade.js +156 -0
- package/dist/utils.js +172 -0
- package/dist/utils.test.js +130 -0
- package/dist/voice-attachment.js +34 -0
- package/dist/voice-handler.js +646 -0
- package/dist/voice-message.e2e.test.js +1021 -0
- package/dist/voice.js +456 -0
- package/dist/voice.test.js +235 -0
- package/dist/wait-session.js +171 -0
- package/dist/websockify.js +69 -0
- package/dist/worker-types.js +4 -0
- package/dist/worktree-lifecycle.e2e.test.js +311 -0
- package/dist/worktree-utils.js +3 -0
- package/dist/worktrees.js +991 -0
- package/dist/worktrees.test.js +415 -0
- package/dist/xml.js +92 -0
- package/dist/xml.test.js +32 -0
- package/package.json +90 -38
- package/schema.prisma +303 -0
- package/skills/batch/SKILL.md +87 -0
- package/skills/critique/SKILL.md +112 -0
- package/skills/egaki/SKILL.md +100 -0
- package/skills/errore/SKILL.md +647 -0
- package/skills/event-sourcing-state/SKILL.md +252 -0
- package/skills/goke/SKILL.md +38 -0
- package/skills/jitter/EDITOR.md +219 -0
- package/skills/jitter/EXPORT-INTERNALS.md +309 -0
- package/skills/jitter/SKILL.md +158 -0
- package/skills/jitter/jitter-clipboard.json +1042 -0
- package/skills/jitter/package.json +14 -0
- package/skills/jitter/tsconfig.json +15 -0
- package/skills/jitter/utils/actions.ts +212 -0
- package/skills/jitter/utils/export.ts +114 -0
- package/skills/jitter/utils/index.ts +141 -0
- package/skills/jitter/utils/snapshot.ts +154 -0
- package/skills/jitter/utils/traverse.ts +246 -0
- package/skills/jitter/utils/types.ts +279 -0
- package/skills/jitter/utils/wait.ts +133 -0
- package/skills/lintcn/SKILL.md +873 -0
- package/skills/manual-kimaki-upstream-adapt/SKILL.md +114 -0
- package/skills/new-skill/SKILL.md +237 -0
- package/skills/npm-package/SKILL.md +617 -0
- package/skills/opensrc/SKILL.md +78 -0
- package/skills/otto-publish/SKILL.md +61 -0
- package/skills/playwriter/SKILL.md +35 -0
- package/skills/profano/SKILL.md +16 -0
- package/skills/proxyman/SKILL.md +215 -0
- package/skills/security-review/SKILL.md +208 -0
- package/skills/sigillo/SKILL.md +101 -0
- package/skills/simplify/SKILL.md +58 -0
- package/skills/spiceflow/SKILL.md +28 -0
- package/skills/termcast/SKILL.md +945 -0
- package/skills/tuistory/SKILL.md +98 -0
- package/skills/usecomputer/SKILL.md +264 -0
- package/skills/x-articles/SKILL.md +554 -0
- package/skills/zele/SKILL.md +49 -0
- package/skills/zustand-centralized-state/SKILL.md +1004 -0
- package/src/agent-model.e2e.test.ts +979 -0
- package/src/ai-tool-to-genai.test.ts +296 -0
- package/src/ai-tool-to-genai.ts +283 -0
- package/src/ai-tool.ts +39 -0
- package/src/anthropic-account-identity.test.ts +52 -0
- package/src/anthropic-account-identity.ts +77 -0
- package/src/anthropic-auth-plugin.ts +1139 -0
- package/src/anthropic-auth-state.test.ts +187 -0
- package/src/anthropic-auth-state.ts +386 -0
- package/src/bin.ts +182 -0
- package/src/btw-prefix-detection.test.ts +73 -0
- package/src/btw-prefix-detection.ts +23 -0
- package/src/channel-management.ts +376 -0
- package/src/cli-parsing.test.ts +197 -0
- package/src/cli-send-thread.e2e.test.ts +463 -0
- package/src/cli-telegram-options.test.ts +114 -0
- package/src/cli.ts +5718 -580
- package/src/commands/abort.ts +89 -0
- package/src/commands/action-buttons.ts +364 -0
- package/src/commands/add-dir.test.ts +154 -0
- package/src/commands/add-dir.ts +175 -0
- package/src/commands/add-project.ts +149 -0
- package/src/commands/agent.ts +496 -0
- package/src/commands/ask-question.test.ts +111 -0
- package/src/commands/ask-question.ts +455 -0
- package/src/commands/btw.ts +184 -0
- package/src/commands/cli-commands-group-a.test.ts +837 -0
- package/src/commands/cli-commands-group-b.test.ts +800 -0
- package/src/commands/compact.ts +157 -0
- package/src/commands/context-usage.ts +199 -0
- package/src/commands/create-new-project.ts +190 -0
- package/src/commands/diff.ts +91 -0
- package/src/commands/discord-commands-group-a.test.ts +751 -0
- package/src/commands/discord-commands-group-b.test.ts +648 -0
- package/src/commands/discord-commands-group-c.test.ts +882 -0
- package/src/commands/file-upload.ts +389 -0
- package/src/commands/fork-subagent.ts +263 -0
- package/src/commands/fork.ts +386 -0
- package/src/commands/gemini-apikey.ts +104 -0
- package/src/commands/login.ts +1175 -0
- package/src/commands/mcp.ts +307 -0
- package/src/commands/memory-snapshot.ts +30 -0
- package/src/commands/mention-mode.ts +68 -0
- package/src/commands/merge-worktree.ts +226 -0
- package/src/commands/model-variant.ts +485 -0
- package/src/commands/model.ts +1078 -0
- package/src/commands/new-worktree.ts +645 -0
- package/src/commands/paginated-select.ts +81 -0
- package/src/commands/permissions.ts +397 -0
- package/src/commands/queue.ts +293 -0
- package/src/commands/remove-project.ts +155 -0
- package/src/commands/restart-opencode-server.ts +162 -0
- package/src/commands/resume.ts +230 -0
- package/src/commands/run-command.ts +123 -0
- package/src/commands/screenshare.test.ts +30 -0
- package/src/commands/screenshare.ts +366 -0
- package/src/commands/session-id.ts +109 -0
- package/src/commands/session.ts +227 -0
- package/src/commands/share.ts +106 -0
- package/src/commands/tasks.ts +293 -0
- package/src/commands/thread-deletion-sync.ts +80 -0
- package/src/commands/types.ts +25 -0
- package/src/commands/undo-redo.ts +386 -0
- package/src/commands/unset-model.ts +174 -0
- package/src/commands/upgrade.ts +59 -0
- package/src/commands/user-command.ts +198 -0
- package/src/commands/verbosity.ts +173 -0
- package/src/commands/vscode.ts +342 -0
- package/src/commands/worktree-settings.ts +70 -0
- package/src/commands/worktrees.ts +645 -0
- package/src/condense-memory.ts +36 -0
- package/src/config.ts +103 -339
- package/src/context-awareness-plugin.test.ts +144 -0
- package/src/context-awareness-plugin.ts +469 -0
- package/src/critique-utils.ts +139 -0
- package/src/database.ts +1949 -0
- package/src/db.test.ts +162 -0
- package/src/db.ts +295 -0
- package/src/debounce-timeout.ts +43 -0
- package/src/debounced-process-flush.ts +104 -0
- package/src/discord-bot.ts +1505 -0
- package/src/discord-command-registration.ts +752 -0
- package/src/discord-urls.ts +89 -0
- package/src/discord-utils.test.ts +153 -0
- package/src/discord-utils.ts +846 -0
- package/src/errors.ts +201 -0
- package/src/escape-backticks.test.ts +469 -0
- package/src/event-stream-real-capture.e2e.test.ts +692 -0
- package/src/eventsource-parser.test.ts +351 -0
- package/src/exec-async.ts +35 -0
- package/src/external-opencode-sync.ts +685 -0
- package/src/format-tables.test.ts +515 -0
- package/src/format-tables.ts +718 -0
- package/src/forum-sync/config.ts +92 -0
- package/src/forum-sync/discord-operations.ts +241 -0
- package/src/forum-sync/index.ts +9 -0
- package/src/forum-sync/markdown.ts +172 -0
- package/src/forum-sync/sync-to-discord.ts +595 -0
- package/src/forum-sync/sync-to-files.ts +294 -0
- package/src/forum-sync/types.ts +175 -0
- package/src/forum-sync/watchers.ts +454 -0
- package/src/gateway-proxy-reconnect.e2e.test.ts +523 -0
- package/src/gateway-proxy.e2e.test.ts +644 -0
- package/src/genai-worker-wrapper.ts +164 -0
- package/src/genai-worker.ts +386 -0
- package/src/genai.ts +321 -0
- package/src/generated/browser.ts +114 -0
- package/src/generated/client.ts +138 -0
- package/src/generated/commonInputTypes.ts +770 -0
- package/src/generated/enums.ts +98 -0
- package/src/generated/internal/class.ts +384 -0
- package/src/generated/internal/prismaNamespace.ts +2394 -0
- package/src/generated/internal/prismaNamespaceBrowser.ts +327 -0
- package/src/generated/models/bot_api_keys.ts +1288 -0
- package/src/generated/models/bot_tokens.ts +1700 -0
- package/src/generated/models/channel_agents.ts +1256 -0
- package/src/generated/models/channel_directories.ts +1859 -0
- package/src/generated/models/channel_mention_mode.ts +1300 -0
- package/src/generated/models/channel_models.ts +1288 -0
- package/src/generated/models/channel_verbosity.ts +1228 -0
- package/src/generated/models/channel_worktrees.ts +1300 -0
- package/src/generated/models/forum_sync_configs.ts +1452 -0
- package/src/generated/models/global_models.ts +1288 -0
- package/src/generated/models/ipc_requests.ts +1485 -0
- package/src/generated/models/part_messages.ts +1302 -0
- package/src/generated/models/scheduled_tasks.ts +2320 -0
- package/src/generated/models/session_agents.ts +1086 -0
- package/src/generated/models/session_events.ts +1439 -0
- package/src/generated/models/session_models.ts +1114 -0
- package/src/generated/models/session_start_sources.ts +1408 -0
- package/src/generated/models/thread_sessions.ts +1781 -0
- package/src/generated/models/thread_worktrees.ts +1356 -0
- package/src/generated/models.ts +30 -0
- package/src/heap-monitor.ts +152 -0
- package/src/hrana-server.test.ts +434 -0
- package/src/hrana-server.ts +299 -0
- package/src/html-actions.test.ts +87 -0
- package/src/html-actions.ts +174 -0
- package/src/html-components.test.ts +38 -0
- package/src/html-components.ts +181 -0
- package/src/image-optimizer-plugin.ts +194 -0
- package/src/image-utils.ts +149 -0
- package/src/interaction-handler.ts +610 -0
- package/src/ipc-polling.ts +427 -0
- package/src/ipc-tools-plugin.ts +236 -0
- package/src/ipc-utils.ts +29 -0
- package/src/limit-heading-depth.test.ts +116 -0
- package/src/limit-heading-depth.ts +26 -0
- package/src/logger.ts +215 -0
- package/src/markdown.test.ts +315 -0
- package/src/markdown.ts +410 -0
- package/src/memory-overview-plugin.ts +163 -0
- package/src/message-finish-field.e2e.test.ts +195 -0
- package/src/message-formatting.test.ts +126 -0
- package/src/message-formatting.ts +535 -0
- package/src/message-preprocessing.ts +488 -0
- package/src/onboarding-tutorial.ts +167 -0
- package/src/onboarding-welcome.ts +49 -0
- package/src/openai-realtime.ts +358 -0
- package/src/opencode-command-detection.test.ts +307 -0
- package/src/opencode-command-detection.ts +76 -0
- package/src/opencode-command.test.ts +70 -0
- package/src/opencode-command.ts +191 -0
- package/src/opencode-interrupt-plugin.test.ts +682 -0
- package/src/opencode-interrupt-plugin.ts +507 -0
- package/src/opencode.ts +1453 -0
- package/src/otto/branding.ts +23 -0
- package/src/otto/index.ts +22 -0
- package/src/otto-digital-twin.e2e.test.ts +199 -0
- package/src/otto-opencode-plugin-loading.e2e.test.ts +117 -0
- package/src/otto-opencode-plugin.test.ts +108 -0
- package/src/otto-opencode-plugin.ts +22 -0
- package/src/parse-permission-rules.test.ts +127 -0
- package/src/patch-text-parser.ts +107 -0
- package/src/plugin-logger.ts +84 -0
- package/src/privacy-sanitizer.ts +142 -0
- package/src/queue-advanced-abort.e2e.test.ts +382 -0
- package/src/queue-advanced-action-buttons.e2e.test.ts +268 -0
- package/src/queue-advanced-e2e-setup.ts +877 -0
- package/src/queue-advanced-footer.e2e.test.ts +591 -0
- package/src/queue-advanced-model-switch.e2e.test.ts +383 -0
- package/src/queue-advanced-permissions-typing.e2e.test.ts +246 -0
- package/src/queue-advanced-question.e2e.test.ts +316 -0
- package/src/queue-advanced-typing-interrupt.e2e.test.ts +146 -0
- package/src/queue-advanced-typing.e2e.test.ts +199 -0
- package/src/queue-drain-after-interactive-ui.e2e.test.ts +151 -0
- package/src/queue-interrupt-drain.e2e.test.ts +166 -0
- package/src/queue-question-select-drain.e2e.test.ts +327 -0
- package/src/runtime-idle-sweeper.ts +76 -0
- package/src/runtime-lifecycle.e2e.test.ts +651 -0
- package/src/schema.sql +174 -0
- package/src/sentry.ts +26 -0
- package/src/session-handler/agent-utils.ts +99 -0
- package/src/session-handler/event-stream-fixtures/real-session-action-buttons.jsonl +45 -0
- package/src/session-handler/event-stream-fixtures/real-session-footer-suppressed-on-pre-idle-interrupt.jsonl +40 -0
- package/src/session-handler/event-stream-fixtures/real-session-permission-external-file.jsonl +23 -0
- package/src/session-handler/event-stream-fixtures/real-session-task-normal.jsonl +22 -0
- package/src/session-handler/event-stream-fixtures/real-session-task-three-parallel-sleeps.jsonl +277 -0
- package/src/session-handler/event-stream-fixtures/real-session-task-user-interruption.jsonl +46 -0
- package/src/session-handler/event-stream-fixtures/session-abort-after-idle-race.jsonl +21 -0
- package/src/session-handler/event-stream-fixtures/session-concurrent-messages-serialized.jsonl +56 -0
- package/src/session-handler/event-stream-fixtures/session-explicit-abort.jsonl +44 -0
- package/src/session-handler/event-stream-fixtures/session-normal-completion.jsonl +29 -0
- package/src/session-handler/event-stream-fixtures/session-tool-call-noisy-stream.jsonl +29 -0
- package/src/session-handler/event-stream-fixtures/session-two-completions-same-session.jsonl +50 -0
- package/src/session-handler/event-stream-fixtures/session-user-interruption.jsonl +59 -0
- package/src/session-handler/event-stream-fixtures/session-voice-queued-followup.jsonl +52 -0
- package/src/session-handler/event-stream-state.test.ts +717 -0
- package/src/session-handler/event-stream-state.ts +706 -0
- package/src/session-handler/model-utils.ts +217 -0
- package/src/session-handler/opencode-session-event-log.ts +130 -0
- package/src/session-handler/thread-runtime-state.ts +247 -0
- package/src/session-handler/thread-session-runtime.ts +4440 -0
- package/src/session-handler.ts +15 -0
- package/src/session-search.test.ts +50 -0
- package/src/session-search.ts +148 -0
- package/src/session-title-rename.test.ts +130 -0
- package/src/skill-filter.test.ts +83 -0
- package/src/skill-filter.ts +42 -0
- package/src/startup-service.ts +200 -0
- package/src/startup-time.e2e.test.ts +373 -0
- package/src/store.ts +139 -0
- package/src/subagent-rate-limit-plugin.ts +218 -0
- package/src/system-message.test.ts +710 -0
- package/src/system-message.ts +814 -0
- package/src/task-runner.ts +725 -0
- package/src/task-schedule.test.ts +84 -0
- package/src/task-schedule.ts +317 -0
- package/src/test-utils.ts +451 -0
- package/src/thinking-utils.ts +61 -0
- package/src/thread-message-queue.e2e.test.ts +1350 -0
- package/src/tools.ts +430 -0
- package/src/undici.d.ts +12 -0
- package/src/undo-redo.e2e.test.ts +209 -0
- package/src/unnest-code-blocks.test.ts +713 -0
- package/src/unnest-code-blocks.ts +185 -0
- package/src/upgrade.ts +185 -0
- package/src/utils.test.ts +155 -0
- package/src/utils.ts +265 -0
- package/src/voice-attachment.ts +51 -0
- package/src/voice-handler.ts +908 -0
- package/src/voice-message.e2e.test.ts +1255 -0
- package/src/voice.test.ts +281 -0
- package/src/voice.ts +638 -0
- package/src/wait-session.ts +273 -0
- package/src/websockify.ts +101 -0
- package/src/worker-types.ts +64 -0
- package/src/worktree-lifecycle.e2e.test.ts +396 -0
- package/src/worktree-utils.ts +4 -0
- package/src/worktrees.test.ts +489 -0
- package/src/worktrees.ts +1370 -0
- package/src/xml.test.ts +38 -0
- package/src/xml.ts +121 -0
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config.d.ts +0 -39
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/config.test.d.ts +0 -2
- package/dist/config.test.d.ts.map +0 -1
- package/dist/config.test.js +0 -202
- package/dist/config.test.js.map +0 -1
- package/dist/detect.d.ts +0 -9
- package/dist/detect.d.ts.map +0 -1
- package/dist/detect.js +0 -40
- package/dist/detect.js.map +0 -1
- package/dist/detect.test.d.ts +0 -2
- package/dist/detect.test.d.ts.map +0 -1
- package/dist/detect.test.js +0 -26
- package/dist/detect.test.js.map +0 -1
- package/dist/docker.d.ts +0 -7
- package/dist/docker.d.ts.map +0 -1
- package/dist/docker.js +0 -17
- package/dist/docker.js.map +0 -1
- package/dist/docker.test.d.ts +0 -2
- package/dist/docker.test.d.ts.map +0 -1
- package/dist/docker.test.js +0 -12
- package/dist/docker.test.js.map +0 -1
- package/dist/health.d.ts +0 -31
- package/dist/health.d.ts.map +0 -1
- package/dist/health.js +0 -117
- package/dist/health.js.map +0 -1
- package/dist/health.test.d.ts +0 -2
- package/dist/health.test.d.ts.map +0 -1
- package/dist/health.test.js +0 -52
- package/dist/health.test.js.map +0 -1
- package/dist/index.d.ts +0 -20
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -15
- package/dist/index.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -8
- package/dist/index.test.js.map +0 -1
- package/dist/installer.d.ts +0 -10
- package/dist/installer.d.ts.map +0 -1
- package/dist/installer.js +0 -50
- package/dist/installer.js.map +0 -1
- package/dist/installer.test.d.ts +0 -2
- package/dist/installer.test.d.ts.map +0 -1
- package/dist/installer.test.js +0 -43
- package/dist/installer.test.js.map +0 -1
- package/dist/lifecycle.d.ts +0 -10
- package/dist/lifecycle.d.ts.map +0 -1
- package/dist/lifecycle.js +0 -45
- package/dist/lifecycle.js.map +0 -1
- package/dist/lifecycle.test.d.ts +0 -2
- package/dist/lifecycle.test.d.ts.map +0 -1
- package/dist/lifecycle.test.js +0 -20
- package/dist/lifecycle.test.js.map +0 -1
- package/dist/manifest.d.ts +0 -18
- package/dist/manifest.d.ts.map +0 -1
- package/dist/manifest.js +0 -30
- package/dist/manifest.js.map +0 -1
- package/dist/skills-baseline.d.ts +0 -7
- package/dist/skills-baseline.d.ts.map +0 -1
- package/dist/skills-baseline.js +0 -9
- package/dist/skills-baseline.js.map +0 -1
- package/dist/skills.d.ts +0 -110
- package/dist/skills.d.ts.map +0 -1
- package/dist/skills.js +0 -429
- package/dist/skills.js.map +0 -1
- package/dist/skills.test.d.ts +0 -2
- package/dist/skills.test.d.ts.map +0 -1
- package/dist/skills.test.js +0 -416
- package/dist/skills.test.js.map +0 -1
- package/dist/sync.d.ts +0 -10
- package/dist/sync.d.ts.map +0 -1
- package/dist/sync.js +0 -39
- package/dist/sync.js.map +0 -1
- package/dist/tenant.d.ts +0 -13
- package/dist/tenant.d.ts.map +0 -1
- package/dist/tenant.js +0 -105
- package/dist/tenant.js.map +0 -1
- package/dist/tenant.test.d.ts +0 -2
- package/dist/tenant.test.d.ts.map +0 -1
- package/dist/tenant.test.js +0 -37
- package/dist/tenant.test.js.map +0 -1
- package/src/config.test.ts +0 -237
- package/src/detect.test.ts +0 -29
- package/src/detect.ts +0 -52
- package/src/docker.test.ts +0 -12
- package/src/docker.ts +0 -23
- package/src/health.test.ts +0 -61
- package/src/health.ts +0 -158
- package/src/index.test.ts +0 -8
- package/src/index.ts +0 -62
- package/src/installer.test.ts +0 -52
- package/src/installer.ts +0 -62
- package/src/lifecycle.test.ts +0 -23
- package/src/lifecycle.ts +0 -49
- package/src/manifest.ts +0 -42
- package/src/skills-baseline.ts +0 -14
- package/src/skills.test.ts +0 -503
- package/src/skills.ts +0 -512
- package/src/sync.ts +0 -53
- package/src/tenant.test.ts +0 -49
- package/src/tenant.ts +0 -120
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: event-sourcing-state
|
|
3
|
+
description: >
|
|
4
|
+
Event-sourced application state pattern for TypeScript apps. Prefer bounded
|
|
5
|
+
event logs plus pure derivation functions over mirrored mutable lifecycle
|
|
6
|
+
flags. Use when state transitions are driven by events and bugs can be
|
|
7
|
+
reproduced from a saved event stream.
|
|
8
|
+
version: 0.2.0
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<!-- Skill for event-sourced state and fixture-driven debugging. -->
|
|
12
|
+
|
|
13
|
+
# Event-Sourcing State
|
|
14
|
+
|
|
15
|
+
Use this skill when an app keeps adding mutable fields to track lifecycle,
|
|
16
|
+
phase, status, or UI state that could instead be derived from an event log.
|
|
17
|
+
|
|
18
|
+
## Core idea
|
|
19
|
+
|
|
20
|
+
Do not store the answer when you can store the evidence.
|
|
21
|
+
|
|
22
|
+
Coding agents overproduce state. Every bug looks like it wants one more flag,
|
|
23
|
+
one more cached answer, one more special case. Every field feels locally
|
|
24
|
+
justified. Globally you are building a machine nobody can hold in their head.
|
|
25
|
+
|
|
26
|
+
Every boolean you add:
|
|
27
|
+
|
|
28
|
+
1. doubles your app's possible states
|
|
29
|
+
2. doubles your bugs
|
|
30
|
+
3. doubles the coverage you need in the worst case
|
|
31
|
+
|
|
32
|
+
The fix is not a better set of flags. The fix is deleting the flags.
|
|
33
|
+
|
|
34
|
+
Stop storing conclusions and store evidence instead. If a decision depends on
|
|
35
|
+
what actually happened, keep the events and derive the answer from them.
|
|
36
|
+
|
|
37
|
+
## Anti-pattern: mirrored flags
|
|
38
|
+
|
|
39
|
+
To answer one yes/no UI question ("should the footer show?"), an agent will
|
|
40
|
+
mirror facts into state:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
type ThreadState = {
|
|
44
|
+
wasInterrupted: boolean
|
|
45
|
+
didAssistantFinish: boolean
|
|
46
|
+
didAssistantError: boolean
|
|
47
|
+
wasToolCallOnly: boolean
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function shouldShowFooter(state: ThreadState): boolean {
|
|
51
|
+
return state.didAssistantFinish
|
|
52
|
+
&& !state.wasInterrupted
|
|
53
|
+
&& !state.didAssistantError
|
|
54
|
+
&& !state.wasToolCallOnly
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Four flags to answer one question. Each flag caches a fact already present in
|
|
59
|
+
the event that produced it. Then a function recombines them back into one
|
|
60
|
+
boolean. None of these fields looks insane on its own — that is the trap.
|
|
61
|
+
|
|
62
|
+
## Pattern: derive from events
|
|
63
|
+
|
|
64
|
+
Keep the raw events and compute the answer when needed:
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
type SessionEvent =
|
|
68
|
+
| { type: 'session.status'; status: 'busy' | 'idle' }
|
|
69
|
+
| { type: 'session.aborted' }
|
|
70
|
+
| {
|
|
71
|
+
type: 'message.updated'
|
|
72
|
+
role: 'assistant'
|
|
73
|
+
completed: boolean
|
|
74
|
+
error: boolean
|
|
75
|
+
finish: 'stop' | 'tool-calls'
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function getLatestAssistantMessage(events: SessionEvent[]) {
|
|
79
|
+
for (let i = events.length - 1; i >= 0; i--) {
|
|
80
|
+
const event = events[i]
|
|
81
|
+
if (event?.type === 'message.updated' && event.role === 'assistant') {
|
|
82
|
+
return event
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return undefined
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function isNaturalCompletion(message: {
|
|
89
|
+
completed: boolean
|
|
90
|
+
error: boolean
|
|
91
|
+
finish: 'stop' | 'tool-calls'
|
|
92
|
+
}): boolean {
|
|
93
|
+
if (!message.completed) {
|
|
94
|
+
return false
|
|
95
|
+
}
|
|
96
|
+
if (message.error) {
|
|
97
|
+
return false
|
|
98
|
+
}
|
|
99
|
+
return message.finish !== 'tool-calls'
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function shouldShowFooter(events: SessionEvent[]): boolean {
|
|
103
|
+
const msg = getLatestAssistantMessage(events)
|
|
104
|
+
if (!msg) {
|
|
105
|
+
return false
|
|
106
|
+
}
|
|
107
|
+
return isNaturalCompletion(msg)
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Notice what disappeared:
|
|
112
|
+
|
|
113
|
+
1. no interruption flag
|
|
114
|
+
2. no finished flag
|
|
115
|
+
3. no special footer state
|
|
116
|
+
4. no extra state machine to explain another state machine
|
|
117
|
+
|
|
118
|
+
You keep the raw thing that happened, then compute the answer when needed.
|
|
119
|
+
|
|
120
|
+
## Rules
|
|
121
|
+
|
|
122
|
+
1. Keep events immutable and versioned.
|
|
123
|
+
2. Prefer one bounded event buffer over many mirrored flags.
|
|
124
|
+
3. Derive lifecycle state with pure functions.
|
|
125
|
+
4. Persist the event stream when it helps reproduce bugs.
|
|
126
|
+
5. Write tests against fixtures, not against live mutable runtime state.
|
|
127
|
+
|
|
128
|
+
## Good fit
|
|
129
|
+
|
|
130
|
+
- session lifecycle state
|
|
131
|
+
- workflow engines
|
|
132
|
+
- chat or agent runtimes
|
|
133
|
+
- typing/idle/footer decisions
|
|
134
|
+
- retry and interruption logic
|
|
135
|
+
|
|
136
|
+
## Bad fit
|
|
137
|
+
|
|
138
|
+
- raw high-volume telemetry that is never read back
|
|
139
|
+
- tiny local state better kept inside a closure
|
|
140
|
+
- data that is already a stable source of truth elsewhere
|
|
141
|
+
|
|
142
|
+
## Testing workflow
|
|
143
|
+
|
|
144
|
+
1. Export a failing event stream from production or local runtime.
|
|
145
|
+
2. Save it as a fixture (jsonl file).
|
|
146
|
+
3. Write a pure test around the derivation function.
|
|
147
|
+
4. Fix the derivation code.
|
|
148
|
+
5. Keep the fixture so the bug stays dead.
|
|
149
|
+
|
|
150
|
+
Any model can one-shot these problems because the feedback loop is obvious:
|
|
151
|
+
events in, answer out.
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
import fs from 'node:fs'
|
|
155
|
+
|
|
156
|
+
function loadEvents(file: string): SessionEvent[] {
|
|
157
|
+
return fs
|
|
158
|
+
.readFileSync(file, 'utf8')
|
|
159
|
+
.split('\n')
|
|
160
|
+
.filter(Boolean)
|
|
161
|
+
.map((line) => {
|
|
162
|
+
return JSON.parse(line) as SessionEvent
|
|
163
|
+
})
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
test('footer is hidden for aborted runs', () => {
|
|
167
|
+
const events = loadEvents('./fixtures/aborted-session.jsonl')
|
|
168
|
+
expect(shouldShowFooter(events)).toBe(false)
|
|
169
|
+
})
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
The reproduction artifact is just data:
|
|
173
|
+
|
|
174
|
+
1. no mocking the runtime
|
|
175
|
+
2. no mocking timers
|
|
176
|
+
3. no begging the runtime to reproduce the exact bad interleaving again
|
|
177
|
+
4. just events in, answer out
|
|
178
|
+
|
|
179
|
+
## Persistency
|
|
180
|
+
|
|
181
|
+
If you want persistence you just store the events. Events are easily versioned
|
|
182
|
+
and type-safe.
|
|
183
|
+
|
|
184
|
+
The trade is this:
|
|
185
|
+
|
|
186
|
+
- **Storing cached state**: if a user hits a broken state and you persist it,
|
|
187
|
+
the project is gone. Opening it crashes the app. To fix it you need migration
|
|
188
|
+
code that patches the corrupted state. Tedious and fragile.
|
|
189
|
+
- **Storing the event stream**: you fix the derivation functions, release a new
|
|
190
|
+
version, the user opens the project, and it works again. What matters is
|
|
191
|
+
keeping events immutable and versioned so derivation functions are guaranteed
|
|
192
|
+
to process events from older app versions and return valid state.
|
|
193
|
+
|
|
194
|
+
State is cached conclusions. Events are stored evidence. Evidence ages better.
|
|
195
|
+
|
|
196
|
+
If you can derive it, don't store it.
|
|
197
|
+
|
|
198
|
+
## State encapsulation
|
|
199
|
+
|
|
200
|
+
The next best thing after no state is state you don't care about because it is
|
|
201
|
+
encapsulated.
|
|
202
|
+
|
|
203
|
+
Not everything needs event sourcing. The second-best option is state you
|
|
204
|
+
successfully hide. A good example is React `useState`: state can only be
|
|
205
|
+
written in event handlers within the component subtree and can only be read in
|
|
206
|
+
the current component. It is local and easy to reason about.
|
|
207
|
+
|
|
208
|
+
The same applies to backend code. Instead of promoting a timer or counter into
|
|
209
|
+
a class field visible to all methods, encapsulate it in a closure:
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
// bad: timer is a class field, visible to all methods, agents will touch it
|
|
213
|
+
class MessageWriter {
|
|
214
|
+
private debounceTimeout: ReturnType<typeof setTimeout> | null = null
|
|
215
|
+
|
|
216
|
+
queueSend(text: string): void {
|
|
217
|
+
if (this.debounceTimeout) {
|
|
218
|
+
clearTimeout(this.debounceTimeout)
|
|
219
|
+
}
|
|
220
|
+
this.debounceTimeout = setTimeout(() => {
|
|
221
|
+
this.write(text)
|
|
222
|
+
}, 300)
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// good: timer is trapped in a tiny box, no other consumer can touch it
|
|
227
|
+
function createDebouncedAction(callback: () => void, delayMs = 300) {
|
|
228
|
+
let timeout: ReturnType<typeof setTimeout> | null = null
|
|
229
|
+
|
|
230
|
+
function clear(): void {
|
|
231
|
+
if (!timeout) {
|
|
232
|
+
return
|
|
233
|
+
}
|
|
234
|
+
clearTimeout(timeout)
|
|
235
|
+
timeout = null
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function trigger(): void {
|
|
239
|
+
clear()
|
|
240
|
+
timeout = setTimeout(() => {
|
|
241
|
+
timeout = null
|
|
242
|
+
callback()
|
|
243
|
+
}, delayMs)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return { trigger, clear }
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
A global variable has the potential of doubling your app state. An encapsulated
|
|
251
|
+
closure can only double the states of that tiny function. Given it is so small
|
|
252
|
+
you don't care — spotting a bug inside it is easy for you and agents.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: goke
|
|
3
|
+
description: >
|
|
4
|
+
goke is a zero-dependency, type-safe CLI framework for TypeScript. CAC replacement
|
|
5
|
+
with Standard Schema support (Zod, Valibot, ArkType). Use goke when building CLI
|
|
6
|
+
tools — it handles commands, subcommands, options, type coercion, help generation,
|
|
7
|
+
and more. Schema-based options give you automatic type inference, coercion from
|
|
8
|
+
strings, and help text generation. ALWAYS read this skill when a repo uses goke
|
|
9
|
+
for its CLI.
|
|
10
|
+
version: 0.0.1
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# goke
|
|
14
|
+
|
|
15
|
+
Fetch the full README from GitHub and read it before using goke:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
curl -L https://raw.githubusercontent.com/remorses/goke/main/README.md
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
> Read the README in full every time you use goke.
|
|
22
|
+
>
|
|
23
|
+
> Important: never use `head` or `tail` to truncate it. Read the full README instead.
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install goke # or bun, pnpm, etc
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Quick Notes
|
|
32
|
+
|
|
33
|
+
- Core APIs: `cli.option`, `cli.use`, `cli.version`, `cli.help`, `cli.parse`
|
|
34
|
+
- Prefer injected `{ fs, console, process }` over globals
|
|
35
|
+
- Use relative paths with injected `fs`; if a helper needs current-cwd semantics, pass injected `process.cwd` into that helper
|
|
36
|
+
- For JustBash compatibility tests, import the existing CLI from app code instead of defining a new CLI inside the test
|
|
37
|
+
|
|
38
|
+
The README is the source of truth for rules, examples, testing patterns, JustBash integration, and API details.
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# Jitter Editor API Reference
|
|
2
|
+
|
|
3
|
+
Reference for `window.app` methods and layer types. For utilities, see SKILL.md and use `jitterUtils.*`.
|
|
4
|
+
|
|
5
|
+
## App Instance Methods
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
// Playback
|
|
9
|
+
app.play()
|
|
10
|
+
app.stopPlayback()
|
|
11
|
+
app.moveCursor(timeInMs)
|
|
12
|
+
|
|
13
|
+
// Layer creation (opens picker or adds at cursor)
|
|
14
|
+
app.addArtboard()
|
|
15
|
+
app.addText('toolbar')
|
|
16
|
+
app.addRectShape('toolbar')
|
|
17
|
+
app.addEllipseShape('toolbar')
|
|
18
|
+
app.addMedia('toolbar')
|
|
19
|
+
|
|
20
|
+
// File operations
|
|
21
|
+
app.renameFile(newName)
|
|
22
|
+
app.deleteFile()
|
|
23
|
+
app.downloadProject()
|
|
24
|
+
app.scheduleSave()
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Dispatch Actions
|
|
28
|
+
|
|
29
|
+
Use `app.dispatchAction(action)` or `jitterUtils.*` helpers.
|
|
30
|
+
|
|
31
|
+
### Core Actions
|
|
32
|
+
|
|
33
|
+
| Action Type | Purpose |
|
|
34
|
+
| ------------------- | ---------------------- |
|
|
35
|
+
| `updateObjWithUndo` | Update node properties |
|
|
36
|
+
| `addObjWithUndo` | Add new node |
|
|
37
|
+
| `removeObjWithUndo` | Remove nodes |
|
|
38
|
+
| `setSelection` | Select nodes |
|
|
39
|
+
| `emptySelection` | Clear selection |
|
|
40
|
+
| `undo` / `redo` | Undo/redo |
|
|
41
|
+
| `setCurrentTime` | Set playhead time |
|
|
42
|
+
| `zoomToSelection` | Zoom to selected |
|
|
43
|
+
|
|
44
|
+
## Layer Types
|
|
45
|
+
|
|
46
|
+
### Artboard
|
|
47
|
+
|
|
48
|
+
```javascript
|
|
49
|
+
{
|
|
50
|
+
type: "artboard",
|
|
51
|
+
name: "16:9",
|
|
52
|
+
width: 1920,
|
|
53
|
+
height: 1080,
|
|
54
|
+
duration: 11000,
|
|
55
|
+
background: true,
|
|
56
|
+
fillColor: "#ffffff"
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Text
|
|
61
|
+
|
|
62
|
+
```javascript
|
|
63
|
+
{
|
|
64
|
+
type: "text",
|
|
65
|
+
text: "Hello World",
|
|
66
|
+
fontSize: 48,
|
|
67
|
+
font: { name: "Poppins", type: "googlefont", weight: 600 },
|
|
68
|
+
fillColor: "#000000",
|
|
69
|
+
textAlign: "center", // "left" | "center" | "right"
|
|
70
|
+
verticalAlign: "middle"
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Image / SVG / Video / GIF
|
|
75
|
+
|
|
76
|
+
```javascript
|
|
77
|
+
{
|
|
78
|
+
type: "image", // or "svg", "video", "gif"
|
|
79
|
+
url: "https://example.com/asset.jpg",
|
|
80
|
+
width: 400,
|
|
81
|
+
height: 300,
|
|
82
|
+
cornerRadius: 0
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Shapes
|
|
87
|
+
|
|
88
|
+
```javascript
|
|
89
|
+
// Rectangle
|
|
90
|
+
{ type: "rect", fillColor: "#3B82F6", cornerRadius: 8 }
|
|
91
|
+
|
|
92
|
+
// Ellipse
|
|
93
|
+
{ type: "ellipse", fillColor: "#EF4444" }
|
|
94
|
+
|
|
95
|
+
// Star
|
|
96
|
+
{ type: "star", fillColor: "#F59E0B", points: 5, innerRadius: 50 }
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Group
|
|
100
|
+
|
|
101
|
+
```javascript
|
|
102
|
+
{
|
|
103
|
+
type: "layerGrp",
|
|
104
|
+
name: "Group Name",
|
|
105
|
+
clipsContent: false,
|
|
106
|
+
cornerRadius: 0
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Common Properties
|
|
111
|
+
|
|
112
|
+
All layers support:
|
|
113
|
+
|
|
114
|
+
| Property | Type | Description |
|
|
115
|
+
| ----------------- | ------- | ------------------- |
|
|
116
|
+
| `x`, `y` | number | Position |
|
|
117
|
+
| `width`, `height` | number | Size |
|
|
118
|
+
| `angle` | number | Rotation in degrees |
|
|
119
|
+
| `scale` | number | Scale factor |
|
|
120
|
+
| `opacity` | number | 0-100 |
|
|
121
|
+
| `shadowEnabled` | boolean | Drop shadow |
|
|
122
|
+
| `strokeEnabled` | boolean | Stroke/border |
|
|
123
|
+
|
|
124
|
+
## Fill Colors
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
// Solid
|
|
128
|
+
fillColor: "#3B82F6"
|
|
129
|
+
|
|
130
|
+
// Linear gradient
|
|
131
|
+
fillColor: {
|
|
132
|
+
type: "GRADIENT_LINEAR",
|
|
133
|
+
stops: [
|
|
134
|
+
{ id: "s1", position: 0, color: "#FF0000" },
|
|
135
|
+
{ id: "s2", position: 1, color: "#0000FF" }
|
|
136
|
+
],
|
|
137
|
+
transform: { angle: 0, sx: 1, tx: 0.5, ty: 0.5 }
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Radial gradient
|
|
141
|
+
fillColor: {
|
|
142
|
+
type: "GRADIENT_RADIAL",
|
|
143
|
+
stops: [...],
|
|
144
|
+
transform: { sx: 1, tx: 0.5, ty: 0.5 }
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Easing Presets
|
|
149
|
+
|
|
150
|
+
```javascript
|
|
151
|
+
{ name: "smooth:standard:v1", schema: "v1", config: { intensity: 50 } }
|
|
152
|
+
{ name: "smooth:accelerate:v1", schema: "v1", config: { intensity: 50 } }
|
|
153
|
+
{ name: "smooth:decelerate:v1", schema: "v1", config: { intensity: 50 } }
|
|
154
|
+
{ name: "spring", schema: "v1", config: { stiffness: 100, damping: 10 } }
|
|
155
|
+
{ name: "bounce", schema: "v1", config: { bounces: 3 } }
|
|
156
|
+
{ name: "linear", schema: "v1", config: {} }
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Animation Types
|
|
160
|
+
|
|
161
|
+
### Transform
|
|
162
|
+
|
|
163
|
+
`scale`, `move`, `rotate`, `opacity`
|
|
164
|
+
|
|
165
|
+
### Enter/Exit
|
|
166
|
+
|
|
167
|
+
`fadeIn/Out`, `growIn/Out`, `shrinkIn/Out`, `slideIn/Out`, `spinIn/Out`, `blurIn/Out`, `textIn/Out`
|
|
168
|
+
|
|
169
|
+
### Mask
|
|
170
|
+
|
|
171
|
+
`maskRevealIn/Out`, `maskSlideIn/Out`, `maskCenterIn/Out`
|
|
172
|
+
|
|
173
|
+
### Media
|
|
174
|
+
|
|
175
|
+
`playVideo`, `playAudio`
|
|
176
|
+
|
|
177
|
+
## Node Tree Structure
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
Artboard (type: "artboard")
|
|
181
|
+
├── LayersTree (type: "layersTree")
|
|
182
|
+
│ ├── LayerGrp (type: "layerGrp")
|
|
183
|
+
│ │ ├── Text (type: "text")
|
|
184
|
+
│ │ └── Image (type: "image")
|
|
185
|
+
│ └── SVG (type: "svg")
|
|
186
|
+
└── OperationsTree (type: "operationsTree")
|
|
187
|
+
└── OpGrp (type: "opGrp")
|
|
188
|
+
├── Scale animation
|
|
189
|
+
└── FadeIn animation
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## State Access
|
|
193
|
+
|
|
194
|
+
```javascript
|
|
195
|
+
// Current selection
|
|
196
|
+
const state = app.props.observableEditorState.getSnapshot()
|
|
197
|
+
const selectedIds = state.selection.nodesIds
|
|
198
|
+
|
|
199
|
+
// Project config
|
|
200
|
+
const conf = app.props.observableImmutableConf.lastImmutableConf
|
|
201
|
+
|
|
202
|
+
// File metadata
|
|
203
|
+
const fileMeta = app.props.fileMeta
|
|
204
|
+
// { id, name, bucket, teamId }
|
|
205
|
+
|
|
206
|
+
// Subscribe to changes
|
|
207
|
+
const unsubscribe = app.props.observableImmutableConf.subscribe(() => {
|
|
208
|
+
// Config changed
|
|
209
|
+
})
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## File Actions
|
|
213
|
+
|
|
214
|
+
```javascript
|
|
215
|
+
await app.props.fileActions.duplicateFile(fileId) // Returns new ID
|
|
216
|
+
await app.props.fileActions.deleteFile(fileId)
|
|
217
|
+
await app.props.fileActions.renameFile(name)
|
|
218
|
+
await app.props.fileActions.saveFile()
|
|
219
|
+
```
|