saeeol 1.2.5 → 1.2.8
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/package.json +17 -12
- package/src/ltm/config.ts +15 -15
- package/src/ltm/events.ts +1 -1
- package/src/ltm/index.ts +1 -1
- package/src/ltm/pipeline.ts +22 -22
- package/src/ltm/scheduler.ts +20 -20
- package/src/ltm/store.ts +9 -7
- package/src/ltm/types.ts +16 -16
- package/src/provider/local/embedder.ts +21 -21
- package/src/provider/models-snapshot.d.ts +2 -0
- package/src/provider/models-snapshot.js +3 -0
- package/src/session/core/session.ts +1 -39
- package/src/session/message/message-errors.ts +1 -1
- package/src/session/message/message-parts.ts +1 -1
- package/src/session/message/message-transform.ts +1 -1
- package/src/session/message/message-types.ts +1 -1
- package/src/tool/core/tool.ts +1 -1
- package/AGENTS.md +0 -72
- package/BUN_SHELL_MIGRATION_PLAN.md +0 -136
- package/Dockerfile +0 -18
- package/assets/saeeol.ico +0 -0
- package/bunfig.toml +0 -7
- package/database.db +0 -0
- package/drizzle.config.ts +0 -10
- package/git +0 -0
- package/migration/20260127222353_familiar_lady_ursula/migration.sql +0 -90
- package/migration/20260127222353_familiar_lady_ursula/snapshot.json +0 -796
- package/migration/20260211171708_add_project_commands/migration.sql +0 -1
- package/migration/20260211171708_add_project_commands/snapshot.json +0 -806
- package/migration/20260213144116_wakeful_the_professor/migration.sql +0 -11
- package/migration/20260213144116_wakeful_the_professor/snapshot.json +0 -897
- package/migration/20260225215848_workspace/migration.sql +0 -7
- package/migration/20260225215848_workspace/snapshot.json +0 -959
- package/migration/20260227213759_add_session_workspace_id/migration.sql +0 -2
- package/migration/20260227213759_add_session_workspace_id/snapshot.json +0 -983
- package/migration/20260228203230_blue_harpoon/migration.sql +0 -17
- package/migration/20260228203230_blue_harpoon/snapshot.json +0 -1102
- package/migration/20260303231226_add_workspace_fields/migration.sql +0 -5
- package/migration/20260303231226_add_workspace_fields/snapshot.json +0 -1013
- package/migration/20260309230000_move_org_to_state/migration.sql +0 -3
- package/migration/20260309230000_move_org_to_state/snapshot.json +0 -1156
- package/migration/20260312043431_session_message_cursor/migration.sql +0 -4
- package/migration/20260312043431_session_message_cursor/snapshot.json +0 -1168
- package/migration/20260323234822_events/migration.sql +0 -13
- package/migration/20260323234822_events/snapshot.json +0 -1271
- package/migration/20260410174513_workspace-name/migration.sql +0 -16
- package/migration/20260410174513_workspace-name/snapshot.json +0 -1271
- package/migration/20260413175956_chief_energizer/migration.sql +0 -13
- package/migration/20260413175956_chief_energizer/snapshot.json +0 -1399
- package/migration/20260423070820_add_icon_url_override/migration.sql +0 -2
- package/migration/20260423070820_add_icon_url_override/snapshot.json +0 -1409
- package/migration/20260428004200_add_session_path/migration.sql +0 -1
- package/migration/20260428004200_add_session_path/snapshot.json +0 -1419
- package/npm/bin/saeeol +0 -42
- package/npm/package.json +0 -39
- package/npm/postinstall.js +0 -162
- package/parsers-config.ts +0 -289
- package/script/build.ts +0 -393
- package/script/check-migrations.ts +0 -16
- package/script/fix-node-pty.ts +0 -34
- package/script/generate.ts +0 -23
- package/script/postinstall.mjs +0 -189
- package/script/publish.ts +0 -200
- package/script/run-workspace-server +0 -106
- package/script/schema.ts +0 -63
- package/script/test-runner.ts +0 -420
- package/script/time.ts +0 -6
- package/script/trace-imports.ts +0 -153
- package/script/upgrade-opentui.ts +0 -64
- package/scripts/diff-sdk-types.sh +0 -52
- package/specs/effect/facades.md +0 -221
- package/specs/effect/http-api.md +0 -401
- package/specs/effect/instance-context.md +0 -309
- package/specs/effect/loose-ends.md +0 -34
- package/specs/effect/migration.md +0 -299
- package/specs/effect/routes.md +0 -64
- package/specs/effect/schema.md +0 -399
- package/specs/effect/server-package.md +0 -668
- package/specs/effect/tools.md +0 -90
- package/specs/tui-plugins.md +0 -433
- package/specs/v2/api.ts +0 -67
- package/specs/v2/keymappings.md +0 -10
- package/specs/v2/message-shape.md +0 -136
- package/src/tool/apply_patch.txt +0 -33
- package/src/tool/bash.txt +0 -119
- package/src/tool/edit.txt +0 -10
- package/src/tool/glob.txt +0 -6
- package/src/tool/grep.txt +0 -8
- package/src/tool/lsp.txt +0 -24
- package/src/tool/plan-enter.txt +0 -14
- package/src/tool/plan-exit.txt +0 -13
- package/src/tool/question.txt +0 -11
- package/src/tool/read.txt +0 -14
- package/src/tool/recall.txt +0 -12
- package/src/tool/skill.txt +0 -5
- package/src/tool/task.txt +0 -57
- package/src/tool/todowrite.txt +0 -167
- package/src/tool/warpgrep.txt +0 -10
- package/src/tool/webfetch.txt +0 -13
- package/src/tool/websearch.txt +0 -14
- package/src/tool/write.txt +0 -8
- package/sst-env.d.ts +0 -10
- package/test/AGENTS.md +0 -133
- package/test/account/repo.test.ts +0 -352
- package/test/account/service.test.ts +0 -456
- package/test/acp/agent-interface.test.ts +0 -51
- package/test/acp/event-subscription.test.ts +0 -725
- package/test/agent/agent.test.ts +0 -890
- package/test/auth/auth.test.ts +0 -86
- package/test/bun/registry.test.ts +0 -75
- package/test/bus/bus-effect.test.ts +0 -161
- package/test/bus/bus-integration.test.ts +0 -87
- package/test/bus/bus.test.ts +0 -219
- package/test/cli/account.test.ts +0 -26
- package/test/cli/auto-mode.test.ts +0 -75
- package/test/cli/bin-saeeol.test.ts +0 -8
- package/test/cli/cmd/tui/prompt-part.test.ts +0 -47
- package/test/cli/cmd/tui/prompt-traits.test.ts +0 -38
- package/test/cli/cmd/tui/sync.test.tsx +0 -159
- package/test/cli/error.test.ts +0 -18
- package/test/cli/github-action.test.ts +0 -198
- package/test/cli/github-remote.test.ts +0 -85
- package/test/cli/import.test.ts +0 -97
- package/test/cli/install-artifact.test.ts +0 -72
- package/test/cli/plugin-auth-picker.test.ts +0 -120
- package/test/cli/pr.test.ts +0 -59
- package/test/cli/tui/editor-context-zed.test.ts +0 -356
- package/test/cli/tui/editor-context.test.tsx +0 -228
- package/test/cli/tui/keybind-plugin.test.ts +0 -90
- package/test/cli/tui/markdown.test.ts +0 -161
- package/test/cli/tui/plugin-add.test.ts +0 -111
- package/test/cli/tui/plugin-install.test.ts +0 -87
- package/test/cli/tui/plugin-lifecycle.test.ts +0 -224
- package/test/cli/tui/plugin-loader-entrypoint.test.ts +0 -484
- package/test/cli/tui/plugin-loader-pure.test.ts +0 -71
- package/test/cli/tui/plugin-loader.test.ts +0 -816
- package/test/cli/tui/plugin-toggle.test.ts +0 -157
- package/test/cli/tui/revert-diff.test.ts +0 -35
- package/test/cli/tui/slot-replace.test.tsx +0 -47
- package/test/cli/tui/theme-store.test.ts +0 -54
- package/test/cli/tui/thread.test.ts +0 -28
- package/test/cli/tui/transcript.test.ts +0 -426
- package/test/cli/tui/usage.test.ts +0 -60
- package/test/cli/tui/use-event.test.tsx +0 -175
- package/test/config/agent-color.test.ts +0 -67
- package/test/config/config.test.ts +0 -2544
- package/test/config/fixtures/empty-frontmatter.md +0 -4
- package/test/config/fixtures/frontmatter.md +0 -28
- package/test/config/fixtures/markdown-header.md +0 -11
- package/test/config/fixtures/no-frontmatter.md +0 -1
- package/test/config/fixtures/weird-model-id.md +0 -13
- package/test/config/lsp.test.ts +0 -87
- package/test/config/markdown.test.ts +0 -228
- package/test/config/plugin.test.ts +0 -0
- package/test/config/tui.test.ts +0 -624
- package/test/control-plane/adapters.test.ts +0 -71
- package/test/control-plane/workspace.test.ts +0 -1526
- package/test/effect/app-runtime-logger.test.ts +0 -98
- package/test/effect/config-service.test.ts +0 -65
- package/test/effect/instance-state.test.ts +0 -394
- package/test/effect/run-service.test.ts +0 -89
- package/test/effect/runner.test.ts +0 -523
- package/test/fake/provider.ts +0 -82
- package/test/file/fsmonitor.test.ts +0 -68
- package/test/file/ignore.test.ts +0 -10
- package/test/file/index.test.ts +0 -954
- package/test/file/path-traversal.test.ts +0 -205
- package/test/file/ripgrep.test.ts +0 -226
- package/test/file/watcher.test.ts +0 -249
- package/test/filesystem/filesystem.test.ts +0 -319
- package/test/fixture/db.ts +0 -11
- package/test/fixture/fixture.test.ts +0 -26
- package/test/fixture/fixture.ts +0 -175
- package/test/fixture/flock-worker.ts +0 -72
- package/test/fixture/log-init-worker.ts +0 -62
- package/test/fixture/lsp/fake-lsp-server.js +0 -249
- package/test/fixture/plug-worker.ts +0 -93
- package/test/fixture/plugin-meta-worker.ts +0 -19
- package/test/fixture/skills/agents-sdk/SKILL.md +0 -152
- package/test/fixture/skills/cloudflare/SKILL.md +0 -211
- package/test/fixture/skills/index.json +0 -6
- package/test/fixture/tui-plugin.ts +0 -323
- package/test/fixture/tui-runtime.ts +0 -31
- package/test/format/format.test.ts +0 -272
- package/test/git/git.test.ts +0 -128
- package/test/ide/ide.test.ts +0 -82
- package/test/installation/installation.test.ts +0 -168
- package/test/keybind.test.ts +0 -421
- package/test/lib/effect.ts +0 -53
- package/test/lib/filesystem.ts +0 -10
- package/test/lib/llm-server.ts +0 -778
- package/test/lib/websocket.ts +0 -46
- package/test/lsp/client.test.ts +0 -482
- package/test/lsp/index.test.ts +0 -160
- package/test/lsp/launch.test.ts +0 -22
- package/test/lsp/lifecycle.test.ts +0 -184
- package/test/ltm/ltm.test.ts +0 -230
- package/test/mcp/headers.test.ts +0 -178
- package/test/mcp/lifecycle.test.ts +0 -787
- package/test/mcp/oauth-auto-connect.test.ts +0 -311
- package/test/mcp/oauth-browser.test.ts +0 -276
- package/test/mcp/oauth-callback.test.ts +0 -34
- package/test/memory/abort-leak-webfetch.ts +0 -49
- package/test/memory/abort-leak.test.ts +0 -128
- package/test/patch/patch.test.ts +0 -348
- package/test/permission/arity.test.ts +0 -33
- package/test/permission/next.test.ts +0 -1227
- package/test/permission/next.toConfig.test.ts +0 -110
- package/test/permission-task.test.ts +0 -326
- package/test/plugin/auth-override.test.ts +0 -79
- package/test/plugin/cloudflare.test.ts +0 -68
- package/test/plugin/codex.test.ts +0 -123
- package/test/plugin/github-copilot-models.test.ts +0 -261
- package/test/plugin/install-concurrency.test.ts +0 -140
- package/test/plugin/install.test.ts +0 -570
- package/test/plugin/loader-shared.test.ts +0 -1169
- package/test/plugin/meta.test.ts +0 -137
- package/test/plugin/shared.test.ts +0 -88
- package/test/plugin/trigger.test.ts +0 -102
- package/test/plugin/workspace-adapter.test.ts +0 -109
- package/test/preload.ts +0 -77
- package/test/project/instance.test.ts +0 -276
- package/test/project/migrate-global.test.ts +0 -152
- package/test/project/project.test.ts +0 -600
- package/test/project/vcs.test.ts +0 -286
- package/test/project/worktree-remove.test.ts +0 -126
- package/test/project/worktree.test.ts +0 -223
- package/test/provider/amazon-bedrock.test.ts +0 -462
- package/test/provider/copilot/convert-to-copilot-messages.test.ts +0 -523
- package/test/provider/copilot/copilot-chat-model.test.ts +0 -592
- package/test/provider/gitlab-duo.test.ts +0 -413
- package/test/provider/local.test.ts +0 -208
- package/test/provider/models.test.ts +0 -261
- package/test/provider/provider-category.test.ts +0 -190
- package/test/provider/provider.test.ts +0 -2758
- package/test/provider/transform.test.ts +0 -3681
- package/test/pty/pty-output-isolation.test.ts +0 -147
- package/test/pty/pty-session.test.ts +0 -102
- package/test/pty/pty-shell.test.ts +0 -104
- package/test/question/question.test.ts +0 -490
- package/test/saeeol/agent-global-config-dirs.test.ts +0 -24
- package/test/saeeol/agent-manager-tool.test.ts +0 -71
- package/test/saeeol/agent-permission-overrides.test.ts +0 -75
- package/test/saeeol/agent-skill-permissions.test.ts +0 -37
- package/test/saeeol/ask-agent-permissions.test.ts +0 -303
- package/test/saeeol/bash-hierarchy.test.ts +0 -64
- package/test/saeeol/bash-permission-metadata.test.ts +0 -66
- package/test/saeeol/bash-security-extended.test.ts +0 -243
- package/test/saeeol/bedrock-claude-empty-content.test.ts +0 -138
- package/test/saeeol/boxes-integration.test.ts +0 -415
- package/test/saeeol/builtin-skills.test.ts +0 -75
- package/test/saeeol/cleanup.ts +0 -28
- package/test/saeeol/cli/dev-setup.test.ts +0 -74
- package/test/saeeol/cli/roll-call.test.ts +0 -161
- package/test/saeeol/cli-run-auto-helper.test.ts +0 -58
- package/test/saeeol/codex-auth-refresh.test.ts +0 -124
- package/test/saeeol/commit-message/generate.test.ts +0 -188
- package/test/saeeol/commit-message/git-context.test.ts +0 -303
- package/test/saeeol/commit-message-windows.test.ts +0 -38
- package/test/saeeol/compaction-payload-recovery.test.ts +0 -406
- package/test/saeeol/compaction-preservation-audit.test.ts +0 -122
- package/test/saeeol/compaction-skip-guard.test.ts +0 -224
- package/test/saeeol/compaction-smart-select.test.ts +0 -100
- package/test/saeeol/config/config.test.ts +0 -166
- package/test/saeeol/config/indexing-default-plugin.test.ts +0 -82
- package/test/saeeol/config/opentelemetry-default.test.ts +0 -29
- package/test/saeeol/config-gitignore.test.ts +0 -70
- package/test/saeeol/config-injector.test.ts +0 -305
- package/test/saeeol/config-resilience.test.ts +0 -234
- package/test/saeeol/config-validation.test.ts +0 -183
- package/test/saeeol/cost-propagation.test.ts +0 -94
- package/test/saeeol/cost-tracker-extended.test.ts +0 -141
- package/test/saeeol/cost-tracker.test.ts +0 -64
- package/test/saeeol/custom-provider-delete.test.ts +0 -149
- package/test/saeeol/diff-full.test.ts +0 -226
- package/test/saeeol/edit-permission-filediff.test.ts +0 -223
- package/test/saeeol/encoding.test.ts +0 -364
- package/test/saeeol/enhance-prompt.test.ts +0 -61
- package/test/saeeol/ensure-plan-dir.test.ts +0 -32
- package/test/saeeol/errors.test.ts +0 -144
- package/test/saeeol/external-directory-boundary.test.ts +0 -96
- package/test/saeeol/gateway-headers.test.ts +0 -88
- package/test/saeeol/help.test.ts +0 -191
- package/test/saeeol/ignore-migrator.test.ts +0 -308
- package/test/saeeol/indexing-auth.test.ts +0 -45
- package/test/saeeol/indexing-feature.test.ts +0 -44
- package/test/saeeol/indexing-label.test.ts +0 -70
- package/test/saeeol/indexing-startup.test.ts +0 -381
- package/test/saeeol/indexing-worktree.test.ts +0 -73
- package/test/saeeol/instruction.test.ts +0 -136
- package/test/saeeol/lancedb-runtime.test.ts +0 -116
- package/test/saeeol/loader-auth.test.ts +0 -168
- package/test/saeeol/local-model.test.ts +0 -621
- package/test/saeeol/logo.test.ts +0 -31
- package/test/saeeol/lsp-typescript-lightweight.test.ts +0 -89
- package/test/saeeol/mcp-branding.test.ts +0 -33
- package/test/saeeol/mcp-docker-rm.test.ts +0 -32
- package/test/saeeol/mcp-migrator.test.ts +0 -736
- package/test/saeeol/mcp-oauth-callback.test.ts +0 -33
- package/test/saeeol/memory-io.test.ts +0 -198
- package/test/saeeol/memory-paths.test.ts +0 -87
- package/test/saeeol/memory-security.test.ts +0 -166
- package/test/saeeol/model-cache-org.test.ts +0 -164
- package/test/saeeol/model-info-panel-utils.test.ts +0 -52
- package/test/saeeol/model-info-panel.types.test.ts +0 -7
- package/test/saeeol/models-401-fallback.test.ts +0 -52
- package/test/saeeol/modes-migrator.test.ts +0 -320
- package/test/saeeol/nvidia-headers.test.ts +0 -74
- package/test/saeeol/patch-jsonc.test.ts +0 -73
- package/test/saeeol/patch.test.ts +0 -172
- package/test/saeeol/paths.test.ts +0 -265
- package/test/saeeol/permission/config-paths.test.ts +0 -174
- package/test/saeeol/permission/env-read.test.ts +0 -149
- package/test/saeeol/permission/external-directory-allow.test.ts +0 -327
- package/test/saeeol/permission/next.always-rules.test.ts +0 -882
- package/test/saeeol/permission/next.reply-http.test.ts +0 -205
- package/test/saeeol/permission/next.reply-routing.test.ts +0 -184
- package/test/saeeol/plan-exit-detection.test.ts +0 -494
- package/test/saeeol/plan-followup.test.ts +0 -1376
- package/test/saeeol/project-config-update.test.ts +0 -120
- package/test/saeeol/project-id.test.ts +0 -455
- package/test/saeeol/provider-cost.test.ts +0 -171
- package/test/saeeol/provider-list-failed-state.test.ts +0 -100
- package/test/saeeol/question-dismiss-all.test.ts +0 -174
- package/test/saeeol/read-directory.test.ts +0 -116
- package/test/saeeol/rules-migrator.test.ts +0 -257
- package/test/saeeol/run-auto.test.ts +0 -176
- package/test/saeeol/run-network.test.ts +0 -224
- package/test/saeeol/semantic-search.test.ts +0 -186
- package/test/saeeol/server/permission-allow-everything.test.ts +0 -125
- package/test/saeeol/session/instruction-substitution.test.ts +0 -72
- package/test/saeeol/session/platform-attribution.test.ts +0 -118
- package/test/saeeol/session/session.test.ts +0 -105
- package/test/saeeol/session-compaction-cap.test.ts +0 -399
- package/test/saeeol/session-compaction-chunks.test.ts +0 -501
- package/test/saeeol/session-compaction-safety.test.ts +0 -481
- package/test/saeeol/session-fork-remap.test.ts +0 -251
- package/test/saeeol/session-import-service.test.ts +0 -114
- package/test/saeeol/session-list.test.ts +0 -47
- package/test/saeeol/session-message-metadata.test.ts +0 -128
- package/test/saeeol/session-overflow.test.ts +0 -78
- package/test/saeeol/session-processor-empty-tool-calls.test.ts +0 -571
- package/test/saeeol/session-processor-network-offline.test.ts +0 -204
- package/test/saeeol/session-processor-retry-limit.test.ts +0 -238
- package/test/saeeol/session-processor-review-telemetry.test.ts +0 -82
- package/test/saeeol/session-prompt-compaction-safety.test.ts +0 -517
- package/test/saeeol/session-prompt-queue.test.ts +0 -815
- package/test/saeeol/sessions/inflight-cache.test.ts +0 -157
- package/test/saeeol/sessions/ingest-queue.test.ts +0 -402
- package/test/saeeol/sessions/remote-protocol.test.ts +0 -258
- package/test/saeeol/sessions/remote-sender.test.ts +0 -1036
- package/test/saeeol/sessions/remote-ws.test.ts +0 -367
- package/test/saeeol/sessions/sessions-enable-remote.test.disable +0 -181
- package/test/saeeol/slot-prop-reactivity.test.ts +0 -142
- package/test/saeeol/snapshot-cache.test.ts +0 -84
- package/test/saeeol/snapshot-freeze-repro.test.ts +0 -100
- package/test/saeeol/snapshot-track-timeout.test.ts +0 -519
- package/test/saeeol/stats-subagent-cost.test.ts +0 -123
- package/test/saeeol/suggestion/auto-dismiss.test.ts +0 -65
- package/test/saeeol/suggestion/suggestion.test.ts +0 -145
- package/test/saeeol/suggestion/tool.test.ts +0 -298
- package/test/saeeol/summary-file-diff.test.ts +0 -28
- package/test/saeeol/system-prompt.test.ts +0 -142
- package/test/saeeol/task-nesting.test.ts +0 -193
- package/test/saeeol/telemetry/feedback.test.ts +0 -8
- package/test/saeeol/todo-view.test.ts +0 -57
- package/test/saeeol/tool-encoding.test.ts +0 -455
- package/test/saeeol/tool-registry-indexing-import-failure.test.ts +0 -49
- package/test/saeeol/tool-registry-indexing.test.ts +0 -236
- package/test/saeeol/tool-registry-semantic-import-failure.test.ts +0 -55
- package/test/saeeol/tool-task-model.test.ts +0 -352
- package/test/saeeol/transform-opus-4.7.test.ts +0 -89
- package/test/saeeol/tui-diff.test.ts +0 -91
- package/test/saeeol/tui-sync.test.ts +0 -80
- package/test/saeeol/util/url.test.ts +0 -141
- package/test/saeeol/workflows-migrator.test.ts +0 -261
- package/test/saeeol/worktree-diff-summary.test.ts +0 -64
- package/test/saeeol/worktree-diff.test.ts +0 -223
- package/test/saeeol/worktree-remove-lock.test.ts +0 -82
- package/test/server/AGENTS.md +0 -15
- package/test/server/contract.test.ts +0 -231
- package/test/server/experimental-session-list.test.ts +0 -157
- package/test/server/global-session-list.test.ts +0 -155
- package/test/server/httpapi-authorization.test.ts +0 -103
- package/test/server/httpapi-bridge.test.ts +0 -440
- package/test/server/httpapi-config.test.ts +0 -67
- package/test/server/httpapi-cors.test.ts +0 -89
- package/test/server/httpapi-event.test.ts +0 -57
- package/test/server/httpapi-experimental.test.ts +0 -219
- package/test/server/httpapi-file.test.ts +0 -79
- package/test/server/httpapi-instance-context.test.ts +0 -237
- package/test/server/httpapi-instance.legacy.test.ts +0 -140
- package/test/server/httpapi-instance.test.ts +0 -83
- package/test/server/httpapi-json-parity.test.ts +0 -263
- package/test/server/httpapi-mcp-oauth.test.ts +0 -76
- package/test/server/httpapi-mcp.test.ts +0 -189
- package/test/server/httpapi-provider.test.ts +0 -153
- package/test/server/httpapi-pty-websocket.test.ts +0 -16
- package/test/server/httpapi-pty.test.ts +0 -175
- package/test/server/httpapi-raw-route-auth.test.ts +0 -89
- package/test/server/httpapi-sdk.test.ts +0 -679
- package/test/server/httpapi-session.test.ts +0 -464
- package/test/server/httpapi-sync.test.ts +0 -130
- package/test/server/httpapi-tui.test.ts +0 -121
- package/test/server/httpapi-workspace-routing.test.ts +0 -471
- package/test/server/httpapi-workspace.test.ts +0 -427
- package/test/server/project-init-git.test.ts +0 -113
- package/test/server/proxy-util.test.ts +0 -113
- package/test/server/session-actions.test.ts +0 -49
- package/test/server/session-list.test.ts +0 -238
- package/test/server/session-messages.test.ts +0 -167
- package/test/server/session-select.test.ts +0 -100
- package/test/server/trace-attributes.test.ts +0 -76
- package/test/server/workspace-proxy.test.ts +0 -165
- package/test/server/workspace-routing.test.ts +0 -85
- package/test/session/compaction.test.ts +0 -2420
- package/test/session/instruction.test.ts +0 -247
- package/test/session/llm.test.ts +0 -1273
- package/test/session/message-v2.test.ts +0 -1291
- package/test/session/messages-pagination.test.ts +0 -1173
- package/test/session/network.test.ts +0 -249
- package/test/session/processor-effect.test.ts +0 -847
- package/test/session/prompt.test.ts +0 -2131
- package/test/session/retry.test.ts +0 -340
- package/test/session/revert-compact.test.ts +0 -639
- package/test/session/schema-decoding.test.ts +0 -311
- package/test/session/session-entry-stepper.test.ts +0 -917
- package/test/session/session-schema.test.ts +0 -76
- package/test/session/snapshot-tool-race.test.ts +0 -257
- package/test/session/structured-output-integration.test.ts +0 -265
- package/test/session/structured-output.test.ts +0 -381
- package/test/session/system.test.ts +0 -73
- package/test/share/share-next.test.ts +0 -333
- package/test/shell/shell.test.ts +0 -99
- package/test/skill/discovery.test.ts +0 -116
- package/test/skill/skill.test.ts +0 -393
- package/test/snapshot/snapshot.test.ts +0 -1531
- package/test/storage/db.test.ts +0 -23
- package/test/storage/json-migration.test.ts +0 -832
- package/test/storage/storage.test.ts +0 -293
- package/test/suggestion/suggestion.test.ts +0 -1
- package/test/sync/index.test.ts +0 -256
- package/test/tool/__snapshots__/parameters.test.ts.snap +0 -500
- package/test/tool/__snapshots__/tool.test.ts.snap +0 -9
- package/test/tool/apply_patch.test.ts +0 -614
- package/test/tool/bash.test.ts +0 -1225
- package/test/tool/diagnostics-filter.test.ts +0 -55
- package/test/tool/edit.test.ts +0 -754
- package/test/tool/external-directory.test.ts +0 -169
- package/test/tool/fixtures/large-image.png +0 -0
- package/test/tool/fixtures/models-api.json +0 -65179
- package/test/tool/glob.test.ts +0 -107
- package/test/tool/grep.test.ts +0 -114
- package/test/tool/lsp.test.ts +0 -187
- package/test/tool/parameters.test.ts +0 -243
- package/test/tool/question.test.ts +0 -129
- package/test/tool/read.test.ts +0 -500
- package/test/tool/recall.test.ts +0 -151
- package/test/tool/registry.test.ts +0 -203
- package/test/tool/skill.test.ts +0 -135
- package/test/tool/suggest.test.ts +0 -1
- package/test/tool/task.test.ts +0 -612
- package/test/tool/tool-define.test.ts +0 -99
- package/test/tool/truncation.test.ts +0 -260
- package/test/tool/webfetch.test.ts +0 -103
- package/test/tool/write.test.ts +0 -291
- package/test/util/data-url.test.ts +0 -14
- package/test/util/effect-zod.test.ts +0 -754
- package/test/util/error.test.ts +0 -38
- package/test/util/filesystem.test.ts +0 -656
- package/test/util/format.test.ts +0 -59
- package/test/util/glob.test.ts +0 -164
- package/test/util/iife.test.ts +0 -36
- package/test/util/lazy.test.ts +0 -50
- package/test/util/lock.test.ts +0 -72
- package/test/util/log.test.ts +0 -86
- package/test/util/module.test.ts +0 -59
- package/test/util/process.test.ts +0 -128
- package/test/util/timeout.test.ts +0 -21
- package/test/util/which.test.ts +0 -100
- package/test/util/wildcard.test.ts +0 -90
- package/test/workspace/workspace-restore.test.ts +0 -296
package/src/tool/warpgrep.txt
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
- Searches the codebase using a natural language search string
|
|
2
|
-
- Takes a natural language search string as input: a question about something you want to understand, or a description of what you're looking for
|
|
3
|
-
- This is not pattern matching or semantic search — it is an AI-powered search agent that performs intelligent multi-step searches across the repository, returning only the most relevant spans
|
|
4
|
-
- Use this when you're looking for a feature or implementation, or trying to understand how something works in a large codebase but are unclear about the exact patterns to search for
|
|
5
|
-
|
|
6
|
-
Usage notes:
|
|
7
|
-
- This does NOT accept regex or keyword dumps — use natural language
|
|
8
|
-
- Best practice is using this at the start of long codebase explorations when you haven't yet mapped out the relevant areas
|
|
9
|
-
- Firing two or three concurrent codebase_search calls at different angles helps go through a large codebase faster
|
|
10
|
-
- This tool is read-only and does not modify any files
|
package/src/tool/webfetch.txt
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
- Fetches content from a specified URL
|
|
2
|
-
- Takes a URL and optional format as input
|
|
3
|
-
- Fetches the URL content, converts to requested format (markdown by default)
|
|
4
|
-
- Returns the content in the specified format
|
|
5
|
-
- Use this tool when you need to retrieve and analyze web content
|
|
6
|
-
|
|
7
|
-
Usage notes:
|
|
8
|
-
- IMPORTANT: if another tool is present that offers better web fetching capabilities, is more targeted to the task, or has fewer restrictions, prefer using that tool instead of this one.
|
|
9
|
-
- The URL must be a fully-formed valid URL
|
|
10
|
-
- HTTP URLs will be automatically upgraded to HTTPS
|
|
11
|
-
- Format options: "markdown" (default), "text", or "html"
|
|
12
|
-
- This tool is read-only and does not modify any files
|
|
13
|
-
- Results may be summarized if the content is very large
|
package/src/tool/websearch.txt
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
- Search the web using Exa AI - performs real-time web searches and can scrape content from specific URLs
|
|
2
|
-
- Provides up-to-date information for current events and recent data
|
|
3
|
-
- Supports configurable result counts and returns the content from the most relevant websites
|
|
4
|
-
- Use this tool for accessing information beyond knowledge cutoff
|
|
5
|
-
- Searches are performed automatically within a single API call
|
|
6
|
-
|
|
7
|
-
Usage notes:
|
|
8
|
-
- Supports live crawling modes: 'fallback' (backup if cached unavailable) or 'preferred' (prioritize live crawling)
|
|
9
|
-
- Search types: 'auto' (balanced), 'fast' (quick results), 'deep' (comprehensive search)
|
|
10
|
-
- Configurable context length for optimal LLM integration
|
|
11
|
-
- Domain filtering and advanced search options available
|
|
12
|
-
|
|
13
|
-
The current year is {{year}}. You MUST use this year when searching for recent information or current events
|
|
14
|
-
- Example: If the current year is 2026 and the user asks for "latest AI news", search for "AI news 2026", NOT "AI news 2025"
|
package/src/tool/write.txt
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
Writes a file to the local filesystem.
|
|
2
|
-
|
|
3
|
-
Usage:
|
|
4
|
-
- This tool will overwrite the existing file if there is one at the provided path.
|
|
5
|
-
- If this is an existing file, you MUST use the Read tool first to read the file's contents. This tool will fail if you did not read the file first.
|
|
6
|
-
- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.
|
|
7
|
-
- NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.
|
|
8
|
-
- Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.
|
package/sst-env.d.ts
DELETED
package/test/AGENTS.md
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
# Test Fixtures Guide
|
|
2
|
-
|
|
3
|
-
## Temporary Directory Fixture
|
|
4
|
-
|
|
5
|
-
The `tmpdir` function in `fixture/fixture.ts` creates temporary directories for tests with automatic cleanup.
|
|
6
|
-
|
|
7
|
-
### Basic Usage
|
|
8
|
-
|
|
9
|
-
```typescript
|
|
10
|
-
import { tmpdir } from "./fixture/fixture"
|
|
11
|
-
|
|
12
|
-
test("example", async () => {
|
|
13
|
-
await using tmp = await tmpdir()
|
|
14
|
-
// tmp.path is the temp directory path
|
|
15
|
-
// automatically cleaned up when test ends
|
|
16
|
-
})
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
### Options
|
|
20
|
-
|
|
21
|
-
- `git?: boolean` - Initialize a git repo with a root commit
|
|
22
|
-
- `config?: Partial<Config.Info>` - Write an `saeeol.json` config file
|
|
23
|
-
- `init?: (dir: string) => Promise<T>` - Custom setup function, returns value accessible as `tmp.extra`
|
|
24
|
-
- `dispose?: (dir: string) => Promise<T>` - Custom cleanup function
|
|
25
|
-
|
|
26
|
-
### Examples
|
|
27
|
-
|
|
28
|
-
**Git repository:**
|
|
29
|
-
|
|
30
|
-
```typescript
|
|
31
|
-
await using tmp = await tmpdir({ git: true })
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
**With config file:**
|
|
35
|
-
|
|
36
|
-
```typescript
|
|
37
|
-
await using tmp = await tmpdir({
|
|
38
|
-
config: { model: "test/model", username: "testuser" },
|
|
39
|
-
})
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
**Custom initialization (returns extra data):**
|
|
43
|
-
|
|
44
|
-
```typescript
|
|
45
|
-
await using tmp = await tmpdir<string>({
|
|
46
|
-
init: async (dir) => {
|
|
47
|
-
await Bun.write(path.join(dir, "file.txt"), "content")
|
|
48
|
-
return "extra data"
|
|
49
|
-
},
|
|
50
|
-
})
|
|
51
|
-
// Access extra data via tmp.extra
|
|
52
|
-
console.log(tmp.extra) // "extra data"
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
**With cleanup:**
|
|
56
|
-
|
|
57
|
-
```typescript
|
|
58
|
-
await using tmp = await tmpdir({
|
|
59
|
-
init: async (dir) => {
|
|
60
|
-
const specialDir = path.join(dir, "special")
|
|
61
|
-
await fs.mkdir(specialDir)
|
|
62
|
-
return specialDir
|
|
63
|
-
},
|
|
64
|
-
dispose: async (dir) => {
|
|
65
|
-
// Custom cleanup logic
|
|
66
|
-
await fs.rm(path.join(dir, "special"), { recursive: true })
|
|
67
|
-
},
|
|
68
|
-
})
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Returned Object
|
|
72
|
-
|
|
73
|
-
- `path: string` - Absolute path to the temp directory (realpath resolved)
|
|
74
|
-
- `extra: T` - Value returned by the `init` function
|
|
75
|
-
- `[Symbol.asyncDispose]` - Enables automatic cleanup via `await using`
|
|
76
|
-
|
|
77
|
-
### Notes
|
|
78
|
-
|
|
79
|
-
- Directories are created in the system temp folder with prefix `saeeol-test-`
|
|
80
|
-
- Use `await using` for automatic cleanup when the variable goes out of scope
|
|
81
|
-
- Paths are sanitized to strip null bytes (defensive fix for CI environments)
|
|
82
|
-
|
|
83
|
-
## Testing With Effects
|
|
84
|
-
|
|
85
|
-
Use `testEffect(...)` from `test/lib/effect.ts` for tests that exercise Effect services or Effect-based workflows.
|
|
86
|
-
|
|
87
|
-
### Core Pattern
|
|
88
|
-
|
|
89
|
-
```typescript
|
|
90
|
-
import { describe, expect } from "bun:test"
|
|
91
|
-
import { Effect, Layer } from "effect"
|
|
92
|
-
import { provideTmpdirInstance } from "../fixture/fixture"
|
|
93
|
-
import { testEffect } from "../lib/effect"
|
|
94
|
-
|
|
95
|
-
const it = testEffect(Layer.mergeAll(MyService.defaultLayer))
|
|
96
|
-
|
|
97
|
-
describe("my service", () => {
|
|
98
|
-
it.live("does the thing", () =>
|
|
99
|
-
provideTmpdirInstance(() =>
|
|
100
|
-
Effect.gen(function* () {
|
|
101
|
-
const svc = yield* MyService.Service
|
|
102
|
-
const out = yield* svc.run()
|
|
103
|
-
expect(out).toEqual("ok")
|
|
104
|
-
}),
|
|
105
|
-
),
|
|
106
|
-
)
|
|
107
|
-
})
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### `it.effect` vs `it.live`
|
|
111
|
-
|
|
112
|
-
- Use `it.effect(...)` when the test should run with `TestClock` and `TestConsole`.
|
|
113
|
-
- Use `it.live(...)` when the test depends on real time, filesystem mtimes, child processes, git, locks, or other live OS behavior.
|
|
114
|
-
- Most integration-style tests in this package use `it.live(...)`.
|
|
115
|
-
|
|
116
|
-
### Effect Fixtures
|
|
117
|
-
|
|
118
|
-
Prefer the Effect-aware helpers from `fixture/fixture.ts` instead of building a manual runtime in each test.
|
|
119
|
-
|
|
120
|
-
- `tmpdirScoped(options?)` creates a scoped temp directory and cleans it up when the Effect scope closes.
|
|
121
|
-
- `provideInstance(dir)(effect)` is the low-level helper. It does not create a directory; it just runs an Effect with `Instance.current` bound to `dir`.
|
|
122
|
-
- `provideTmpdirInstance((dir) => effect, options?)` is the convenience helper. It creates a temp directory, binds it as the active instance, and disposes the instance on cleanup.
|
|
123
|
-
- `provideTmpdirServer((input) => effect, options?)` does the same, but also provides the test LLM server.
|
|
124
|
-
|
|
125
|
-
Use `provideTmpdirInstance(...)` by default when a test only needs one temp instance. Use `tmpdirScoped()` plus `provideInstance(...)` when a test needs multiple directories, custom setup before binding, or needs to switch instance context within one test.
|
|
126
|
-
|
|
127
|
-
### Style
|
|
128
|
-
|
|
129
|
-
- Define `const it = testEffect(...)` near the top of the file.
|
|
130
|
-
- Keep the test body inside `Effect.gen(function* () { ... })`.
|
|
131
|
-
- Yield services directly with `yield* MyService.Service` or `yield* MyTool`.
|
|
132
|
-
- Avoid custom `ManagedRuntime`, `attach(...)`, or ad hoc `run(...)` wrappers when `testEffect(...)` already provides the runtime.
|
|
133
|
-
- When a test needs instance-local state, prefer `provideTmpdirInstance(...)` or `provideInstance(...)` over manual `Instance.provide(...)` inside Promise-style tests.
|
|
@@ -1,352 +0,0 @@
|
|
|
1
|
-
import { expect } from "bun:test"
|
|
2
|
-
import { Effect, Layer, Option } from "effect"
|
|
3
|
-
|
|
4
|
-
import { AccountRepo } from "../../src/account/repo"
|
|
5
|
-
import { AccessToken, AccountID, OrgID, RefreshToken } from "../../src/account/schema"
|
|
6
|
-
import { Database } from "@/storage/db"
|
|
7
|
-
import { testEffect } from "../lib/effect"
|
|
8
|
-
|
|
9
|
-
const truncate = Layer.effectDiscard(
|
|
10
|
-
Effect.sync(() => {
|
|
11
|
-
const db = Database.Client()
|
|
12
|
-
db.run(/*sql*/ `DELETE FROM account_state`)
|
|
13
|
-
db.run(/*sql*/ `DELETE FROM account`)
|
|
14
|
-
}),
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
const it = testEffect(Layer.merge(AccountRepo.layer, truncate))
|
|
18
|
-
|
|
19
|
-
it.live("list returns empty when no accounts exist", () =>
|
|
20
|
-
Effect.gen(function* () {
|
|
21
|
-
const accounts = yield* AccountRepo.Service.use((r) => r.list())
|
|
22
|
-
expect(accounts).toEqual([])
|
|
23
|
-
}),
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
it.live("active returns none when no accounts exist", () =>
|
|
27
|
-
Effect.gen(function* () {
|
|
28
|
-
const active = yield* AccountRepo.Service.use((r) => r.active())
|
|
29
|
-
expect(Option.isNone(active)).toBe(true)
|
|
30
|
-
}),
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
it.live("persistAccount inserts and getRow retrieves", () =>
|
|
34
|
-
Effect.gen(function* () {
|
|
35
|
-
const id = AccountID.make("user-1")
|
|
36
|
-
yield* AccountRepo.Service.use((r) =>
|
|
37
|
-
r.persistAccount({
|
|
38
|
-
id,
|
|
39
|
-
email: "test@example.com",
|
|
40
|
-
url: "https://control.example.com",
|
|
41
|
-
accessToken: AccessToken.make("at_123"),
|
|
42
|
-
refreshToken: RefreshToken.make("rt_456"),
|
|
43
|
-
expiry: Date.now() + 3600_000,
|
|
44
|
-
orgID: Option.some(OrgID.make("org-1")),
|
|
45
|
-
}),
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
const row = yield* AccountRepo.Service.use((r) => r.getRow(id))
|
|
49
|
-
expect(Option.isSome(row)).toBe(true)
|
|
50
|
-
const value = Option.getOrThrow(row)
|
|
51
|
-
expect(value.id).toBe(AccountID.make("user-1"))
|
|
52
|
-
expect(value.email).toBe("test@example.com")
|
|
53
|
-
|
|
54
|
-
const active = yield* AccountRepo.Service.use((r) => r.active())
|
|
55
|
-
expect(Option.getOrThrow(active).active_org_id).toBe(OrgID.make("org-1"))
|
|
56
|
-
}),
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
it.live("persistAccount normalizes trailing slashes in stored server URLs", () =>
|
|
60
|
-
Effect.gen(function* () {
|
|
61
|
-
const id = AccountID.make("user-1")
|
|
62
|
-
|
|
63
|
-
yield* AccountRepo.Service.use((r) =>
|
|
64
|
-
r.persistAccount({
|
|
65
|
-
id,
|
|
66
|
-
email: "test@example.com",
|
|
67
|
-
url: "https://control.example.com/",
|
|
68
|
-
accessToken: AccessToken.make("at_123"),
|
|
69
|
-
refreshToken: RefreshToken.make("rt_456"),
|
|
70
|
-
expiry: Date.now() + 3600_000,
|
|
71
|
-
orgID: Option.none(),
|
|
72
|
-
}),
|
|
73
|
-
)
|
|
74
|
-
|
|
75
|
-
const row = yield* AccountRepo.Service.use((r) => r.getRow(id))
|
|
76
|
-
const active = yield* AccountRepo.Service.use((r) => r.active())
|
|
77
|
-
const list = yield* AccountRepo.Service.use((r) => r.list())
|
|
78
|
-
|
|
79
|
-
expect(Option.getOrThrow(row).url).toBe("https://control.example.com")
|
|
80
|
-
expect(Option.getOrThrow(active).url).toBe("https://control.example.com")
|
|
81
|
-
expect(list[0]?.url).toBe("https://control.example.com")
|
|
82
|
-
}),
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
it.live("persistAccount sets the active account and org", () =>
|
|
86
|
-
Effect.gen(function* () {
|
|
87
|
-
const id1 = AccountID.make("user-1")
|
|
88
|
-
const id2 = AccountID.make("user-2")
|
|
89
|
-
|
|
90
|
-
yield* AccountRepo.Service.use((r) =>
|
|
91
|
-
r.persistAccount({
|
|
92
|
-
id: id1,
|
|
93
|
-
email: "first@example.com",
|
|
94
|
-
url: "https://control.example.com",
|
|
95
|
-
accessToken: AccessToken.make("at_1"),
|
|
96
|
-
refreshToken: RefreshToken.make("rt_1"),
|
|
97
|
-
expiry: Date.now() + 3600_000,
|
|
98
|
-
orgID: Option.some(OrgID.make("org-1")),
|
|
99
|
-
}),
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
yield* AccountRepo.Service.use((r) =>
|
|
103
|
-
r.persistAccount({
|
|
104
|
-
id: id2,
|
|
105
|
-
email: "second@example.com",
|
|
106
|
-
url: "https://control.example.com",
|
|
107
|
-
accessToken: AccessToken.make("at_2"),
|
|
108
|
-
refreshToken: RefreshToken.make("rt_2"),
|
|
109
|
-
expiry: Date.now() + 3600_000,
|
|
110
|
-
orgID: Option.some(OrgID.make("org-2")),
|
|
111
|
-
}),
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
// Last persisted account is active with its org
|
|
115
|
-
const active = yield* AccountRepo.Service.use((r) => r.active())
|
|
116
|
-
expect(Option.isSome(active)).toBe(true)
|
|
117
|
-
expect(Option.getOrThrow(active).id).toBe(AccountID.make("user-2"))
|
|
118
|
-
expect(Option.getOrThrow(active).active_org_id).toBe(OrgID.make("org-2"))
|
|
119
|
-
}),
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
it.live("list returns all accounts", () =>
|
|
123
|
-
Effect.gen(function* () {
|
|
124
|
-
const id1 = AccountID.make("user-1")
|
|
125
|
-
const id2 = AccountID.make("user-2")
|
|
126
|
-
|
|
127
|
-
yield* AccountRepo.Service.use((r) =>
|
|
128
|
-
r.persistAccount({
|
|
129
|
-
id: id1,
|
|
130
|
-
email: "a@example.com",
|
|
131
|
-
url: "https://control.example.com",
|
|
132
|
-
accessToken: AccessToken.make("at_1"),
|
|
133
|
-
refreshToken: RefreshToken.make("rt_1"),
|
|
134
|
-
expiry: Date.now() + 3600_000,
|
|
135
|
-
orgID: Option.none(),
|
|
136
|
-
}),
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
yield* AccountRepo.Service.use((r) =>
|
|
140
|
-
r.persistAccount({
|
|
141
|
-
id: id2,
|
|
142
|
-
email: "b@example.com",
|
|
143
|
-
url: "https://control.example.com",
|
|
144
|
-
accessToken: AccessToken.make("at_2"),
|
|
145
|
-
refreshToken: RefreshToken.make("rt_2"),
|
|
146
|
-
expiry: Date.now() + 3600_000,
|
|
147
|
-
orgID: Option.some(OrgID.make("org-1")),
|
|
148
|
-
}),
|
|
149
|
-
)
|
|
150
|
-
|
|
151
|
-
const accounts = yield* AccountRepo.Service.use((r) => r.list())
|
|
152
|
-
expect(accounts.length).toBe(2)
|
|
153
|
-
expect(accounts.map((a) => a.email).sort()).toEqual(["a@example.com", "b@example.com"])
|
|
154
|
-
}),
|
|
155
|
-
)
|
|
156
|
-
|
|
157
|
-
it.live("remove deletes an account", () =>
|
|
158
|
-
Effect.gen(function* () {
|
|
159
|
-
const id = AccountID.make("user-1")
|
|
160
|
-
|
|
161
|
-
yield* AccountRepo.Service.use((r) =>
|
|
162
|
-
r.persistAccount({
|
|
163
|
-
id,
|
|
164
|
-
email: "test@example.com",
|
|
165
|
-
url: "https://control.example.com",
|
|
166
|
-
accessToken: AccessToken.make("at_1"),
|
|
167
|
-
refreshToken: RefreshToken.make("rt_1"),
|
|
168
|
-
expiry: Date.now() + 3600_000,
|
|
169
|
-
orgID: Option.none(),
|
|
170
|
-
}),
|
|
171
|
-
)
|
|
172
|
-
|
|
173
|
-
yield* AccountRepo.Service.use((r) => r.remove(id))
|
|
174
|
-
|
|
175
|
-
const row = yield* AccountRepo.Service.use((r) => r.getRow(id))
|
|
176
|
-
expect(Option.isNone(row)).toBe(true)
|
|
177
|
-
}),
|
|
178
|
-
)
|
|
179
|
-
|
|
180
|
-
it.live("use stores the selected org and marks the account active", () =>
|
|
181
|
-
Effect.gen(function* () {
|
|
182
|
-
const id1 = AccountID.make("user-1")
|
|
183
|
-
const id2 = AccountID.make("user-2")
|
|
184
|
-
|
|
185
|
-
yield* AccountRepo.Service.use((r) =>
|
|
186
|
-
r.persistAccount({
|
|
187
|
-
id: id1,
|
|
188
|
-
email: "first@example.com",
|
|
189
|
-
url: "https://control.example.com",
|
|
190
|
-
accessToken: AccessToken.make("at_1"),
|
|
191
|
-
refreshToken: RefreshToken.make("rt_1"),
|
|
192
|
-
expiry: Date.now() + 3600_000,
|
|
193
|
-
orgID: Option.none(),
|
|
194
|
-
}),
|
|
195
|
-
)
|
|
196
|
-
|
|
197
|
-
yield* AccountRepo.Service.use((r) =>
|
|
198
|
-
r.persistAccount({
|
|
199
|
-
id: id2,
|
|
200
|
-
email: "second@example.com",
|
|
201
|
-
url: "https://control.example.com",
|
|
202
|
-
accessToken: AccessToken.make("at_2"),
|
|
203
|
-
refreshToken: RefreshToken.make("rt_2"),
|
|
204
|
-
expiry: Date.now() + 3600_000,
|
|
205
|
-
orgID: Option.none(),
|
|
206
|
-
}),
|
|
207
|
-
)
|
|
208
|
-
|
|
209
|
-
yield* AccountRepo.Service.use((r) => r.use(id1, Option.some(OrgID.make("org-99"))))
|
|
210
|
-
const active1 = yield* AccountRepo.Service.use((r) => r.active())
|
|
211
|
-
expect(Option.getOrThrow(active1).id).toBe(id1)
|
|
212
|
-
expect(Option.getOrThrow(active1).active_org_id).toBe(OrgID.make("org-99"))
|
|
213
|
-
|
|
214
|
-
yield* AccountRepo.Service.use((r) => r.use(id1, Option.none()))
|
|
215
|
-
const active2 = yield* AccountRepo.Service.use((r) => r.active())
|
|
216
|
-
expect(Option.getOrThrow(active2).active_org_id).toBeNull()
|
|
217
|
-
}),
|
|
218
|
-
)
|
|
219
|
-
|
|
220
|
-
it.live("persistToken updates token fields", () =>
|
|
221
|
-
Effect.gen(function* () {
|
|
222
|
-
const id = AccountID.make("user-1")
|
|
223
|
-
|
|
224
|
-
yield* AccountRepo.Service.use((r) =>
|
|
225
|
-
r.persistAccount({
|
|
226
|
-
id,
|
|
227
|
-
email: "test@example.com",
|
|
228
|
-
url: "https://control.example.com",
|
|
229
|
-
accessToken: AccessToken.make("old_token"),
|
|
230
|
-
refreshToken: RefreshToken.make("old_refresh"),
|
|
231
|
-
expiry: 1000,
|
|
232
|
-
orgID: Option.none(),
|
|
233
|
-
}),
|
|
234
|
-
)
|
|
235
|
-
|
|
236
|
-
const expiry = Date.now() + 7200_000
|
|
237
|
-
yield* AccountRepo.Service.use((r) =>
|
|
238
|
-
r.persistToken({
|
|
239
|
-
accountID: id,
|
|
240
|
-
accessToken: AccessToken.make("new_token"),
|
|
241
|
-
refreshToken: RefreshToken.make("new_refresh"),
|
|
242
|
-
expiry: Option.some(expiry),
|
|
243
|
-
}),
|
|
244
|
-
)
|
|
245
|
-
|
|
246
|
-
const row = yield* AccountRepo.Service.use((r) => r.getRow(id))
|
|
247
|
-
const value = Option.getOrThrow(row)
|
|
248
|
-
expect(value.access_token).toBe(AccessToken.make("new_token"))
|
|
249
|
-
expect(value.refresh_token).toBe(RefreshToken.make("new_refresh"))
|
|
250
|
-
expect(value.token_expiry).toBe(expiry)
|
|
251
|
-
}),
|
|
252
|
-
)
|
|
253
|
-
|
|
254
|
-
it.live("persistToken with no expiry sets token_expiry to null", () =>
|
|
255
|
-
Effect.gen(function* () {
|
|
256
|
-
const id = AccountID.make("user-1")
|
|
257
|
-
|
|
258
|
-
yield* AccountRepo.Service.use((r) =>
|
|
259
|
-
r.persistAccount({
|
|
260
|
-
id,
|
|
261
|
-
email: "test@example.com",
|
|
262
|
-
url: "https://control.example.com",
|
|
263
|
-
accessToken: AccessToken.make("old_token"),
|
|
264
|
-
refreshToken: RefreshToken.make("old_refresh"),
|
|
265
|
-
expiry: 1000,
|
|
266
|
-
orgID: Option.none(),
|
|
267
|
-
}),
|
|
268
|
-
)
|
|
269
|
-
|
|
270
|
-
yield* AccountRepo.Service.use((r) =>
|
|
271
|
-
r.persistToken({
|
|
272
|
-
accountID: id,
|
|
273
|
-
accessToken: AccessToken.make("new_token"),
|
|
274
|
-
refreshToken: RefreshToken.make("new_refresh"),
|
|
275
|
-
expiry: Option.none(),
|
|
276
|
-
}),
|
|
277
|
-
)
|
|
278
|
-
|
|
279
|
-
const row = yield* AccountRepo.Service.use((r) => r.getRow(id))
|
|
280
|
-
expect(Option.getOrThrow(row).token_expiry).toBeNull()
|
|
281
|
-
}),
|
|
282
|
-
)
|
|
283
|
-
|
|
284
|
-
it.live("persistAccount upserts on conflict", () =>
|
|
285
|
-
Effect.gen(function* () {
|
|
286
|
-
const id = AccountID.make("user-1")
|
|
287
|
-
|
|
288
|
-
yield* AccountRepo.Service.use((r) =>
|
|
289
|
-
r.persistAccount({
|
|
290
|
-
id,
|
|
291
|
-
email: "test@example.com",
|
|
292
|
-
url: "https://control.example.com",
|
|
293
|
-
accessToken: AccessToken.make("at_v1"),
|
|
294
|
-
refreshToken: RefreshToken.make("rt_v1"),
|
|
295
|
-
expiry: 1000,
|
|
296
|
-
orgID: Option.some(OrgID.make("org-1")),
|
|
297
|
-
}),
|
|
298
|
-
)
|
|
299
|
-
|
|
300
|
-
yield* AccountRepo.Service.use((r) =>
|
|
301
|
-
r.persistAccount({
|
|
302
|
-
id,
|
|
303
|
-
email: "test@example.com",
|
|
304
|
-
url: "https://control.example.com",
|
|
305
|
-
accessToken: AccessToken.make("at_v2"),
|
|
306
|
-
refreshToken: RefreshToken.make("rt_v2"),
|
|
307
|
-
expiry: 2000,
|
|
308
|
-
orgID: Option.some(OrgID.make("org-2")),
|
|
309
|
-
}),
|
|
310
|
-
)
|
|
311
|
-
|
|
312
|
-
const accounts = yield* AccountRepo.Service.use((r) => r.list())
|
|
313
|
-
expect(accounts.length).toBe(1)
|
|
314
|
-
|
|
315
|
-
const row = yield* AccountRepo.Service.use((r) => r.getRow(id))
|
|
316
|
-
const value = Option.getOrThrow(row)
|
|
317
|
-
expect(value.access_token).toBe(AccessToken.make("at_v2"))
|
|
318
|
-
|
|
319
|
-
const active = yield* AccountRepo.Service.use((r) => r.active())
|
|
320
|
-
expect(Option.getOrThrow(active).active_org_id).toBe(OrgID.make("org-2"))
|
|
321
|
-
}),
|
|
322
|
-
)
|
|
323
|
-
|
|
324
|
-
it.live("remove clears active state when deleting the active account", () =>
|
|
325
|
-
Effect.gen(function* () {
|
|
326
|
-
const id = AccountID.make("user-1")
|
|
327
|
-
|
|
328
|
-
yield* AccountRepo.Service.use((r) =>
|
|
329
|
-
r.persistAccount({
|
|
330
|
-
id,
|
|
331
|
-
email: "test@example.com",
|
|
332
|
-
url: "https://control.example.com",
|
|
333
|
-
accessToken: AccessToken.make("at_1"),
|
|
334
|
-
refreshToken: RefreshToken.make("rt_1"),
|
|
335
|
-
expiry: Date.now() + 3600_000,
|
|
336
|
-
orgID: Option.some(OrgID.make("org-1")),
|
|
337
|
-
}),
|
|
338
|
-
)
|
|
339
|
-
|
|
340
|
-
yield* AccountRepo.Service.use((r) => r.remove(id))
|
|
341
|
-
|
|
342
|
-
const active = yield* AccountRepo.Service.use((r) => r.active())
|
|
343
|
-
expect(Option.isNone(active)).toBe(true)
|
|
344
|
-
}),
|
|
345
|
-
)
|
|
346
|
-
|
|
347
|
-
it.live("getRow returns none for nonexistent account", () =>
|
|
348
|
-
Effect.gen(function* () {
|
|
349
|
-
const row = yield* AccountRepo.Service.use((r) => r.getRow(AccountID.make("nope")))
|
|
350
|
-
expect(Option.isNone(row)).toBe(true)
|
|
351
|
-
}),
|
|
352
|
-
)
|