saeeol 1.2.5 → 1.2.7
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 +15 -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/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/bin/saeeol +0 -187
- 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/tsconfig.json +0 -19
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.7",
|
|
4
4
|
"name": "saeeol",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
"@babel/core": "7.28.4",
|
|
51
51
|
"@effect/language-service": "0.84.2",
|
|
52
52
|
"@octokit/webhooks-types": "7.6.1",
|
|
53
|
-
"@saeeol/script": "7.3.
|
|
54
|
-
"@saeeol/core": "7.3.
|
|
53
|
+
"@saeeol/script": "7.3.4",
|
|
54
|
+
"@saeeol/core": "7.3.4",
|
|
55
55
|
"@parcel/watcher-darwin-arm64": "2.5.1",
|
|
56
56
|
"@parcel/watcher-darwin-x64": "2.5.1",
|
|
57
57
|
"@parcel/watcher-linux-arm64-glibc": "2.5.1",
|
|
@@ -133,14 +133,14 @@
|
|
|
133
133
|
"@parcel/watcher": "2.5.1",
|
|
134
134
|
"@pierre/diffs": "1.1.0-beta.18",
|
|
135
135
|
"@saeeol/boxes": "0.2.0",
|
|
136
|
-
"@saeeol/core": "7.3.
|
|
137
|
-
"@saeeol/gateway": "7.3.
|
|
138
|
-
"@saeeol/i18n": "7.3.
|
|
139
|
-
"@saeeol/indexing": "7.3.
|
|
140
|
-
"@saeeol/plugin": "7.3.
|
|
141
|
-
"@saeeol/script": "7.3.
|
|
142
|
-
"@saeeol/sdk": "7.3.
|
|
143
|
-
"@saeeol/telemetry": "7.3.
|
|
136
|
+
"@saeeol/core": "7.3.4",
|
|
137
|
+
"@saeeol/gateway": "7.3.3",
|
|
138
|
+
"@saeeol/i18n": "7.3.4",
|
|
139
|
+
"@saeeol/indexing": "7.3.3",
|
|
140
|
+
"@saeeol/plugin": "7.3.4",
|
|
141
|
+
"@saeeol/script": "7.3.4",
|
|
142
|
+
"@saeeol/sdk": "7.3.4",
|
|
143
|
+
"@saeeol/telemetry": "7.3.3",
|
|
144
144
|
"@solid-primitives/event-bus": "1.1.2",
|
|
145
145
|
"@solid-primitives/scheduled": "1.5.2",
|
|
146
146
|
"@standard-schema/spec": "1.0.0",
|
|
@@ -202,5 +202,8 @@
|
|
|
202
202
|
"overrides": {
|
|
203
203
|
"drizzle-orm": "1.0.0-beta.19-d95b7a4"
|
|
204
204
|
},
|
|
205
|
-
"peerDependencies": {}
|
|
205
|
+
"peerDependencies": {},
|
|
206
|
+
"files": [
|
|
207
|
+
"src"
|
|
208
|
+
]
|
|
206
209
|
}
|
package/src/ltm/config.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** LTM —
|
|
1
|
+
/** LTM — hardware auto-detection + deterministic LLM parameter calculation */
|
|
2
2
|
|
|
3
3
|
import os from "os"
|
|
4
4
|
import { Effect } from "effect"
|
|
@@ -10,7 +10,7 @@ import type { HardwareProfile, LLMBakeParams, LTMConfig } from "./types"
|
|
|
10
10
|
|
|
11
11
|
const log = Log.create({ service: "ltm/config" })
|
|
12
12
|
|
|
13
|
-
// ──
|
|
13
|
+
// ── Default LTM config ──
|
|
14
14
|
|
|
15
15
|
export const DEFAULT_LTM_CONFIG: LTMConfig = {
|
|
16
16
|
enabled: false,
|
|
@@ -23,9 +23,9 @@ export const DEFAULT_LTM_CONFIG: LTMConfig = {
|
|
|
23
23
|
retrieval: { topK: 5, minScore: 0.7, maxTokens: 2000 },
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
// ──
|
|
26
|
+
// ── Hardware profiling ──
|
|
27
27
|
|
|
28
|
-
/**
|
|
28
|
+
/** Collect system hardware information */
|
|
29
29
|
export async function profileHardware(): Promise<HardwareProfile> {
|
|
30
30
|
const gpu = await Effect.runPromise(GPU.profile)
|
|
31
31
|
const totalRAMMB = Math.round(os.totalmem() / (1024 * 1024))
|
|
@@ -41,7 +41,7 @@ export async function profileHardware(): Promise<HardwareProfile> {
|
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
/**
|
|
44
|
+
/** Hardware hash for change detection */
|
|
45
45
|
export function hardwareHash(hw: HardwareProfile): string {
|
|
46
46
|
const raw = `${hw.gpuCount}|${hw.totalVRAMMB}|${hw.totalRAMMB}|${hw.cpuCores}|${hw.cudaAvailable}`
|
|
47
47
|
let h = 0
|
|
@@ -51,29 +51,29 @@ export function hardwareHash(hw: HardwareProfile): string {
|
|
|
51
51
|
return h.toString(36)
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
// ──
|
|
54
|
+
// ── Embedding model selection ──
|
|
55
55
|
|
|
56
|
-
/**
|
|
56
|
+
/** Auto-select embedding model based on available VRAM */
|
|
57
57
|
export function selectEmbeddingModel(hw: HardwareProfile) {
|
|
58
58
|
const vram = hw.availableVRAMMB
|
|
59
|
-
//
|
|
59
|
+
// Prefer multilingual (Korean-capable) models
|
|
60
60
|
if (vram >= 3000 || hw.totalRAMMB >= 16000) return RAG.EMBEDDING_MODELS[3] // bge-m3, 1024d, 2.2GB
|
|
61
61
|
if (vram >= 1500 || hw.totalRAMMB >= 8000) return RAG.EMBEDDING_MODELS[4] // nomic-embed, 768d, 550MB
|
|
62
62
|
if (vram >= 500) return RAG.EMBEDDING_MODELS[0] // bge-small-en, 384d, 130MB
|
|
63
63
|
return RAG.EMBEDDING_MODELS[5] // all-minilm-l6, 384d, 80MB
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
// ── Bake (
|
|
66
|
+
// ── Bake (deterministic parameter calculation) ──
|
|
67
67
|
|
|
68
|
-
/**
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Compute hardware-based LLM parameters and persist to disk.
|
|
70
|
+
* Once computed, the same values are reused as long as hardware doesn't change.
|
|
71
|
+
*/
|
|
72
72
|
export async function bake(hw: HardwareProfile): Promise<LLMBakeParams> {
|
|
73
73
|
const existing = await readBake()
|
|
74
74
|
const hash = hardwareHash(hw)
|
|
75
75
|
|
|
76
|
-
//
|
|
76
|
+
// If hash matches, reuse existing params (deterministic)
|
|
77
77
|
if (existing && existing.hardwareHash === hash) {
|
|
78
78
|
log.info("bake: hardware unchanged, reusing existing params", { hash })
|
|
79
79
|
return existing
|
|
@@ -96,7 +96,7 @@ export async function bake(hw: HardwareProfile): Promise<LLMBakeParams> {
|
|
|
96
96
|
return params
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
// ──
|
|
99
|
+
// ── Persistence ──
|
|
100
100
|
|
|
101
101
|
import path from "path"
|
|
102
102
|
import { mkdir, readFile, writeFile } from "fs/promises"
|
package/src/ltm/events.ts
CHANGED
package/src/ltm/index.ts
CHANGED
package/src/ltm/pipeline.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** LTM —
|
|
1
|
+
/** LTM — background collection pipeline */
|
|
2
2
|
|
|
3
3
|
import { Effect } from "effect"
|
|
4
4
|
import * as Log from "@saeeol/core/util/log"
|
|
@@ -19,9 +19,9 @@ let running = false
|
|
|
19
19
|
let config: LTMConfig | undefined
|
|
20
20
|
let unsubscribers: Array<() => void> = []
|
|
21
21
|
|
|
22
|
-
// ──
|
|
22
|
+
// ── Pipeline lifecycle ──
|
|
23
23
|
|
|
24
|
-
/**
|
|
24
|
+
/** Start the pipeline */
|
|
25
25
|
export async function start(cfg: LTMConfig, bake: LLMBakeParams): Promise<void> {
|
|
26
26
|
if (running) return
|
|
27
27
|
if (!cfg.enabled) return
|
|
@@ -31,7 +31,7 @@ export async function start(cfg: LTMConfig, bake: LLMBakeParams): Promise<void>
|
|
|
31
31
|
|
|
32
32
|
log.info("pipeline starting", { model: bake.embeddingModel })
|
|
33
33
|
|
|
34
|
-
//
|
|
34
|
+
// Start embedding server
|
|
35
35
|
const server = await Embedder.start(bake)
|
|
36
36
|
if (server.status !== "running") {
|
|
37
37
|
log.error("embedding server failed to start, pipeline disabled")
|
|
@@ -39,7 +39,7 @@ export async function start(cfg: LTMConfig, bake: LLMBakeParams): Promise<void>
|
|
|
39
39
|
return
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
//
|
|
42
|
+
// Prune old memories
|
|
43
43
|
if (cfg.episodic.enabled) {
|
|
44
44
|
const pruned = await Store.prune(cfg.episodic.retainDays * 24 * 60 * 60 * 1000)
|
|
45
45
|
if (pruned > 0) {
|
|
@@ -48,7 +48,7 @@ export async function start(cfg: LTMConfig, bake: LLMBakeParams): Promise<void>
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
//
|
|
51
|
+
// Enforce memory limit
|
|
52
52
|
const count = await Store.count()
|
|
53
53
|
if (count > cfg.maxMemories) {
|
|
54
54
|
const excess = count - cfg.maxMemories
|
|
@@ -59,18 +59,18 @@ export async function start(cfg: LTMConfig, bake: LLMBakeParams): Promise<void>
|
|
|
59
59
|
log.info("trimmed memories to max", { removed: toRemove.length })
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
// BusEvent
|
|
62
|
+
// Bind BusEvent subscriptions
|
|
63
63
|
bindSubscriptions()
|
|
64
64
|
|
|
65
65
|
log.info("pipeline started", { memoryCount: await Store.count() })
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
/**
|
|
68
|
+
/** Stop the pipeline */
|
|
69
69
|
export async function stop(): Promise<void> {
|
|
70
70
|
if (!running) return
|
|
71
71
|
running = false
|
|
72
72
|
|
|
73
|
-
//
|
|
73
|
+
// Unsubscribe
|
|
74
74
|
for (const unsub of unsubscribers) {
|
|
75
75
|
try { unsub() } catch { /* ignore */ }
|
|
76
76
|
}
|
|
@@ -81,27 +81,27 @@ export async function stop(): Promise<void> {
|
|
|
81
81
|
log.info("pipeline stopped")
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
/**
|
|
84
|
+
/** Current state */
|
|
85
85
|
export function isActive(): boolean {
|
|
86
86
|
return running
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
// ── BusEvent
|
|
89
|
+
// ── BusEvent subscription binding ──
|
|
90
90
|
|
|
91
91
|
function bindSubscriptions() {
|
|
92
92
|
if (!config) return
|
|
93
93
|
|
|
94
|
-
// 1.
|
|
94
|
+
// 1. Session diff → episodic memory (after code change + AI response)
|
|
95
95
|
const unsubDiff = Bus.subscribe(SessionEvent.Diff, async (event) => {
|
|
96
96
|
if (!running || !config?.episodic.enabled) return
|
|
97
97
|
|
|
98
98
|
const sessionID = event.properties.sessionID
|
|
99
|
-
// diff
|
|
100
|
-
//
|
|
99
|
+
// diff events fire when session state is updated after an assistant response
|
|
100
|
+
// Contains both user message and assistant response context
|
|
101
101
|
const diffs = event.properties.diff
|
|
102
102
|
if (!diffs || diffs.length === 0) return
|
|
103
103
|
|
|
104
|
-
const summary = `code changes: ${diffs.map((d) => `${d.
|
|
104
|
+
const summary = `code changes: ${diffs.map((d) => `${d.file} (${d.status})`).join(", ")}`
|
|
105
105
|
try {
|
|
106
106
|
const vector = await Embedder.embedOne(summary)
|
|
107
107
|
const memory = {
|
|
@@ -129,7 +129,7 @@ function bindSubscriptions() {
|
|
|
129
129
|
})
|
|
130
130
|
unsubscribers.push(unsubDiff)
|
|
131
131
|
|
|
132
|
-
// 2.
|
|
132
|
+
// 2. Session error → episodic memory (problem/resolution tracking)
|
|
133
133
|
const unsubError = Bus.subscribe(SessionEvent.Error, async (event) => {
|
|
134
134
|
if (!running || !config?.episodic.enabled) return
|
|
135
135
|
const sessionID = event.properties.sessionID
|
|
@@ -169,9 +169,9 @@ function bindSubscriptions() {
|
|
|
169
169
|
log.info("bus subscriptions bound", { count: unsubscribers.length })
|
|
170
170
|
}
|
|
171
171
|
|
|
172
|
-
// ──
|
|
172
|
+
// ── Direct-call handlers (called explicitly from external modules) ──
|
|
173
173
|
|
|
174
|
-
/**
|
|
174
|
+
/** Conversation message → episodic memory */
|
|
175
175
|
export async function onMessageCompleted(
|
|
176
176
|
sessionID: string,
|
|
177
177
|
projectID: string | undefined,
|
|
@@ -191,7 +191,7 @@ export async function onMessageCompleted(
|
|
|
191
191
|
})
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
-
/**
|
|
194
|
+
/** File change → semantic memory */
|
|
195
195
|
export async function onFileChanged(
|
|
196
196
|
projectID: string,
|
|
197
197
|
filePath: string,
|
|
@@ -199,14 +199,14 @@ export async function onFileChanged(
|
|
|
199
199
|
): Promise<void> {
|
|
200
200
|
if (!running || !config?.semantic.enabled || !config.semantic.indexOnFileChange) return
|
|
201
201
|
|
|
202
|
-
// VRAM
|
|
202
|
+
// Check VRAM scheduler — can we run embedding?
|
|
203
203
|
const canRun = await Scheduler.canRunEmbedding()
|
|
204
204
|
if (!canRun) {
|
|
205
205
|
log.info("skipping file indexing — VRAM budget exceeded", { filePath })
|
|
206
206
|
return
|
|
207
207
|
}
|
|
208
208
|
|
|
209
|
-
//
|
|
209
|
+
// Split file into chunks (simple line-based)
|
|
210
210
|
const lines = content.split("\n")
|
|
211
211
|
const chunkSize = 50
|
|
212
212
|
const chunks: Array<{ text: string; start: number; end: number }> = []
|
|
@@ -239,7 +239,7 @@ export async function onFileChanged(
|
|
|
239
239
|
log.info("indexed file", { filePath, chunks: chunks.length })
|
|
240
240
|
}
|
|
241
241
|
|
|
242
|
-
/**
|
|
242
|
+
/** Code edit → procedural memory */
|
|
243
243
|
export async function onCodeEdit(
|
|
244
244
|
projectID: string | undefined,
|
|
245
245
|
filePath: string,
|
package/src/ltm/scheduler.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** LTM — VRAM
|
|
1
|
+
/** LTM — VRAM/task scheduler */
|
|
2
2
|
|
|
3
3
|
import * as Log from "@saeeol/core/util/log"
|
|
4
4
|
import type { HardwareProfile } from "./types"
|
|
@@ -8,19 +8,19 @@ import { Effect } from "effect"
|
|
|
8
8
|
|
|
9
9
|
const log = Log.create({ service: "ltm/scheduler" })
|
|
10
10
|
|
|
11
|
-
/**
|
|
11
|
+
/** Current allocation state */
|
|
12
12
|
export interface Allocation {
|
|
13
13
|
llm: number
|
|
14
14
|
embedding: number
|
|
15
15
|
available: number
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
/**
|
|
18
|
+
/** Scheduling strategy */
|
|
19
19
|
export type Strategy = "concurrent" | "alternating" | "cpu-fallback" | "no-gpu"
|
|
20
20
|
|
|
21
|
-
// ── VRAM
|
|
21
|
+
// ── VRAM gauge ──
|
|
22
22
|
|
|
23
|
-
/**
|
|
23
|
+
/** Query current VRAM allocation state */
|
|
24
24
|
export async function allocation(): Promise<Allocation> {
|
|
25
25
|
const gpu = await Effect.runPromise(GPU.profile)
|
|
26
26
|
const embVRAM = Embedder.vramUsage()
|
|
@@ -31,7 +31,7 @@ export async function allocation(): Promise<Allocation> {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
/**
|
|
34
|
+
/** Return the scheduling strategy */
|
|
35
35
|
export async function strategy(): Promise<Strategy> {
|
|
36
36
|
const gpu = await Effect.runPromise(GPU.profile)
|
|
37
37
|
if (!gpu.cudaAvailable) return "no-gpu"
|
|
@@ -40,47 +40,47 @@ export async function strategy(): Promise<Strategy> {
|
|
|
40
40
|
return "cpu-fallback"
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
// ──
|
|
43
|
+
// ── Execution decisions ──
|
|
44
44
|
|
|
45
|
-
/**
|
|
45
|
+
/** Whether embedding background work can run */
|
|
46
46
|
export async function canRunEmbedding(): Promise<boolean> {
|
|
47
47
|
const strat = await strategy()
|
|
48
|
-
// no-gpu
|
|
48
|
+
// no-gpu or cpu-fallback: always allowed (CPU processing)
|
|
49
49
|
if (strat === "no-gpu" || strat === "cpu-fallback") return true
|
|
50
|
-
// concurrent
|
|
50
|
+
// concurrent: always allowed
|
|
51
51
|
if (strat === "concurrent") return true
|
|
52
|
-
// alternating:
|
|
52
|
+
// alternating: need at least 2GB VRAM
|
|
53
53
|
const alloc = await allocation()
|
|
54
54
|
return alloc.available >= 2048
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
/** LLM
|
|
57
|
+
/** Whether LLM and embedding can run concurrently */
|
|
58
58
|
export async function canRunConcurrent(hw: HardwareProfile): Promise<boolean> {
|
|
59
59
|
if (hw.totalVRAMMB >= 16384) return true
|
|
60
60
|
if (hw.totalVRAMMB >= 8192 && Embedder.vramUsage() <= 1024) return true
|
|
61
61
|
return false
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
// ── LLM ↔
|
|
64
|
+
// ── LLM ↔ embedding time-sharing ──
|
|
65
65
|
|
|
66
|
-
/**
|
|
66
|
+
/** Called when LLM requests VRAM — pauses embedding if needed */
|
|
67
67
|
export async function requestLLM(vramNeededMB: number): Promise<boolean> {
|
|
68
68
|
const strat = await strategy()
|
|
69
69
|
|
|
70
|
-
// concurrent
|
|
70
|
+
// concurrent strategy: both can run
|
|
71
71
|
if (strat === "concurrent") return true
|
|
72
|
-
// no-gpu: GPU
|
|
72
|
+
// no-gpu: GPU not needed
|
|
73
73
|
if (strat === "no-gpu") return true
|
|
74
74
|
|
|
75
75
|
const alloc = await allocation()
|
|
76
76
|
|
|
77
|
-
//
|
|
77
|
+
// Sufficient VRAM — proceed as-is
|
|
78
78
|
if (alloc.available >= vramNeededMB) {
|
|
79
79
|
log.info("LLM request: enough VRAM", { available: alloc.available, needed: vramNeededMB })
|
|
80
80
|
return true
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
// alternating
|
|
83
|
+
// alternating strategy: pause embedding to free VRAM
|
|
84
84
|
if (strat === "alternating" && alloc.embedding > 0) {
|
|
85
85
|
log.info("LLM request: pausing embedding to free VRAM", {
|
|
86
86
|
embedding: alloc.embedding,
|
|
@@ -90,14 +90,14 @@ export async function requestLLM(vramNeededMB: number): Promise<boolean> {
|
|
|
90
90
|
return true
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
// cpu-fallback:
|
|
93
|
+
// cpu-fallback: embedding already runs on CPU, GPU is LLM-exclusive
|
|
94
94
|
if (strat === "cpu-fallback") return true
|
|
95
95
|
|
|
96
96
|
log.warn("LLM request: insufficient VRAM", { available: alloc.available, needed: vramNeededMB })
|
|
97
97
|
return false
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
/**
|
|
100
|
+
/** Resume embedding server — called when LLM goes idle */
|
|
101
101
|
export async function resumeEmbedding(bake: {
|
|
102
102
|
embeddingModel: string
|
|
103
103
|
embeddingDimensions: number
|
package/src/ltm/store.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** LTM —
|
|
1
|
+
/** LTM — filesystem-based vector store */
|
|
2
2
|
|
|
3
3
|
import path from "path"
|
|
4
4
|
import { mkdir, readFile, writeFile, readdir, rm, stat } from "fs/promises"
|
|
@@ -8,7 +8,7 @@ import type { Memory, MemoryType } from "./types"
|
|
|
8
8
|
|
|
9
9
|
const log = Log.create({ service: "ltm/store" })
|
|
10
10
|
|
|
11
|
-
// ──
|
|
11
|
+
// ── Cosine similarity ──
|
|
12
12
|
|
|
13
13
|
function cosine(a: number[], b: number[]): number {
|
|
14
14
|
let dot = 0
|
|
@@ -24,14 +24,16 @@ function cosine(a: number[], b: number[]): number {
|
|
|
24
24
|
return denom === 0 ? 0 : dot / denom
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
// ──
|
|
27
|
+
// ── File paths ──
|
|
28
28
|
|
|
29
29
|
function storeDir(): string {
|
|
30
30
|
return path.join(Global.Path.data, "ltm", "memories")
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
function memoryPath(id: string): string {
|
|
34
|
-
|
|
34
|
+
// Sanitize special characters for safe filenames
|
|
35
|
+
const safe = id.replace(/[:<>\"|?*]/g, "_")
|
|
36
|
+
return path.join(storeDir(), `${safe}.json`)
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
function indexPath(): string {
|
|
@@ -42,7 +44,7 @@ async function ensure(): Promise<void> {
|
|
|
42
44
|
await mkdir(storeDir(), { recursive: true })
|
|
43
45
|
}
|
|
44
46
|
|
|
45
|
-
// ──
|
|
47
|
+
// ── Index ──
|
|
46
48
|
|
|
47
49
|
interface Index {
|
|
48
50
|
memories: Array<{ id: string; type: MemoryType; timestamp: number; source: string }>
|
|
@@ -62,7 +64,7 @@ async function writeIndex(idx: Index): Promise<void> {
|
|
|
62
64
|
await writeFile(indexPath(), JSON.stringify(idx, null, 2))
|
|
63
65
|
}
|
|
64
66
|
|
|
65
|
-
// ──
|
|
67
|
+
// ── Public API ──
|
|
66
68
|
|
|
67
69
|
export async function upsert(memory: Memory): Promise<void> {
|
|
68
70
|
await ensure()
|
|
@@ -99,7 +101,7 @@ export async function search(
|
|
|
99
101
|
candidates.push({ ...mem, score })
|
|
100
102
|
}
|
|
101
103
|
} catch {
|
|
102
|
-
//
|
|
104
|
+
// File deleted — remove from index too
|
|
103
105
|
}
|
|
104
106
|
}
|
|
105
107
|
|
package/src/ltm/types.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
/** LTM —
|
|
1
|
+
/** LTM — long-term memory type definitions */
|
|
2
2
|
|
|
3
3
|
import { Schema } from "effect"
|
|
4
4
|
import { optionalOmitUndefined } from "@/util/schema"
|
|
5
5
|
|
|
6
|
-
// ──
|
|
6
|
+
// ── Memory types ──
|
|
7
7
|
|
|
8
8
|
export const MemoryType = Schema.Literals(["episodic", "semantic", "procedural"])
|
|
9
9
|
export type MemoryType = Schema.Schema.Type<typeof MemoryType>
|
|
10
10
|
|
|
11
|
-
// ──
|
|
11
|
+
// ── Memory entry ──
|
|
12
12
|
|
|
13
13
|
export const MemoryMetadata = Schema.Struct({
|
|
14
14
|
source: Schema.String,
|
|
@@ -30,7 +30,7 @@ export const Memory = Schema.Struct({
|
|
|
30
30
|
})
|
|
31
31
|
export type Memory = Schema.Schema.Type<typeof Memory>
|
|
32
32
|
|
|
33
|
-
// ──
|
|
33
|
+
// ── Embedding server ──
|
|
34
34
|
|
|
35
35
|
export const EmbedderStatus = Schema.Literals(["stopped", "starting", "running", "error"])
|
|
36
36
|
export type EmbedderStatus = Schema.Schema.Type<typeof EmbedderStatus>
|
|
@@ -38,14 +38,14 @@ export type EmbedderStatus = Schema.Schema.Type<typeof EmbedderStatus>
|
|
|
38
38
|
export const EmbeddingServer = Schema.Struct({
|
|
39
39
|
id: Schema.String,
|
|
40
40
|
model: Schema.String,
|
|
41
|
-
status:
|
|
41
|
+
status: EmbedderStatus,
|
|
42
42
|
endpoint: Schema.String,
|
|
43
43
|
dimensions: Schema.Number,
|
|
44
44
|
vramMB: Schema.Number,
|
|
45
45
|
})
|
|
46
46
|
export type EmbeddingServer = Schema.Schema.Type<typeof EmbeddingServer>
|
|
47
47
|
|
|
48
|
-
// ──
|
|
48
|
+
// ── Hardware profile ──
|
|
49
49
|
|
|
50
50
|
export const HardwareProfile = Schema.Struct({
|
|
51
51
|
gpuCount: Schema.Number,
|
|
@@ -57,29 +57,29 @@ export const HardwareProfile = Schema.Struct({
|
|
|
57
57
|
})
|
|
58
58
|
export type HardwareProfile = Schema.Schema.Type<typeof HardwareProfile>
|
|
59
59
|
|
|
60
|
-
// ── LLM
|
|
60
|
+
// ── LLM parameters (deterministic) ──
|
|
61
61
|
|
|
62
62
|
export const LLMBakeParams = Schema.Struct({
|
|
63
|
-
/**
|
|
63
|
+
/** Embedding model ID */
|
|
64
64
|
embeddingModel: Schema.String,
|
|
65
|
-
/**
|
|
65
|
+
/** Embedding dimensions */
|
|
66
66
|
embeddingDimensions: Schema.Number,
|
|
67
|
-
/**
|
|
67
|
+
/** Embedding model VRAM usage (MB) */
|
|
68
68
|
embeddingVRAMMB: Schema.Number,
|
|
69
|
-
/**
|
|
69
|
+
/** Context length */
|
|
70
70
|
contextLength: Schema.Number,
|
|
71
|
-
/**
|
|
71
|
+
/** Batch size */
|
|
72
72
|
batchSize: Schema.Number,
|
|
73
|
-
/** Ollama
|
|
73
|
+
/** Ollama thread count */
|
|
74
74
|
numThread: Schema.Number,
|
|
75
|
-
/** GPU
|
|
75
|
+
/** GPU layer count (-1=all) */
|
|
76
76
|
numGPU: Schema.Number,
|
|
77
|
-
/**
|
|
77
|
+
/** Profile detection hash at generation time (triggers recompute on change) */
|
|
78
78
|
hardwareHash: Schema.String,
|
|
79
79
|
})
|
|
80
80
|
export type LLMBakeParams = Schema.Schema.Type<typeof LLMBakeParams>
|
|
81
81
|
|
|
82
|
-
// ── LTM
|
|
82
|
+
// ── LTM configuration ──
|
|
83
83
|
|
|
84
84
|
export const LTMConfig = Schema.Struct({
|
|
85
85
|
enabled: Schema.Boolean,
|