siclaw 0.1.0
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/LICENSE +190 -0
- package/README.md +268 -0
- package/dist/agentbox/gateway-client.d.ts +41 -0
- package/dist/agentbox/gateway-client.js +108 -0
- package/dist/agentbox/gateway-client.js.map +1 -0
- package/dist/agentbox/http-server.d.ts +12 -0
- package/dist/agentbox/http-server.js +700 -0
- package/dist/agentbox/http-server.js.map +1 -0
- package/dist/agentbox/mcp-sync.d.ts +6 -0
- package/dist/agentbox/mcp-sync.js +26 -0
- package/dist/agentbox/mcp-sync.js.map +1 -0
- package/dist/agentbox/resource-handlers.d.ts +40 -0
- package/dist/agentbox/resource-handlers.js +116 -0
- package/dist/agentbox/resource-handlers.js.map +1 -0
- package/dist/agentbox/resource-sync.d.ts +28 -0
- package/dist/agentbox/resource-sync.js +74 -0
- package/dist/agentbox/resource-sync.js.map +1 -0
- package/dist/agentbox/session.d.ts +145 -0
- package/dist/agentbox/session.js +444 -0
- package/dist/agentbox/session.js.map +1 -0
- package/dist/agentbox-main.d.ts +7 -0
- package/dist/agentbox-main.js +90 -0
- package/dist/agentbox-main.js.map +1 -0
- package/dist/cli-main.d.ts +1 -0
- package/dist/cli-main.js +187 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/cli-setup.d.ts +17 -0
- package/dist/cli-setup.js +247 -0
- package/dist/cli-setup.js.map +1 -0
- package/dist/core/agent-factory.d.ts +52 -0
- package/dist/core/agent-factory.js +547 -0
- package/dist/core/agent-factory.js.map +1 -0
- package/dist/core/brain-session.d.ts +67 -0
- package/dist/core/brain-session.js +15 -0
- package/dist/core/brain-session.js.map +1 -0
- package/dist/core/brains/claude-sdk-brain.d.ts +76 -0
- package/dist/core/brains/claude-sdk-brain.js +403 -0
- package/dist/core/brains/claude-sdk-brain.js.map +1 -0
- package/dist/core/brains/pi-agent-brain.d.ts +28 -0
- package/dist/core/brains/pi-agent-brain.js +84 -0
- package/dist/core/brains/pi-agent-brain.js.map +1 -0
- package/dist/core/config.d.ts +109 -0
- package/dist/core/config.js +294 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/extensions/context-pruning.d.ts +38 -0
- package/dist/core/extensions/context-pruning.js +162 -0
- package/dist/core/extensions/context-pruning.js.map +1 -0
- package/dist/core/extensions/deep-investigation.d.ts +2 -0
- package/dist/core/extensions/deep-investigation.js +541 -0
- package/dist/core/extensions/deep-investigation.js.map +1 -0
- package/dist/core/extensions/memory-flush.d.ts +20 -0
- package/dist/core/extensions/memory-flush.js +120 -0
- package/dist/core/extensions/memory-flush.js.map +1 -0
- package/dist/core/llm-proxy.d.ts +37 -0
- package/dist/core/llm-proxy.js +578 -0
- package/dist/core/llm-proxy.js.map +1 -0
- package/dist/core/mcp-client.d.ts +80 -0
- package/dist/core/mcp-client.js +285 -0
- package/dist/core/mcp-client.js.map +1 -0
- package/dist/core/prompt.d.ts +1 -0
- package/dist/core/prompt.js +64 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/tool-adapter.d.ts +45 -0
- package/dist/core/tool-adapter.js +154 -0
- package/dist/core/tool-adapter.js.map +1 -0
- package/dist/cron/cron-api.d.ts +9 -0
- package/dist/cron/cron-api.js +94 -0
- package/dist/cron/cron-api.js.map +1 -0
- package/dist/cron/cron-coordinator.d.ts +29 -0
- package/dist/cron/cron-coordinator.js +150 -0
- package/dist/cron/cron-coordinator.js.map +1 -0
- package/dist/cron/cron-executor.d.ts +15 -0
- package/dist/cron/cron-executor.js +90 -0
- package/dist/cron/cron-executor.js.map +1 -0
- package/dist/cron/cron-matcher.d.ts +19 -0
- package/dist/cron/cron-matcher.js +114 -0
- package/dist/cron/cron-matcher.js.map +1 -0
- package/dist/cron/cron-scheduler.d.ts +42 -0
- package/dist/cron/cron-scheduler.js +91 -0
- package/dist/cron/cron-scheduler.js.map +1 -0
- package/dist/cron/gateway-client.d.ts +32 -0
- package/dist/cron/gateway-client.js +91 -0
- package/dist/cron/gateway-client.js.map +1 -0
- package/dist/cron-main.d.ts +10 -0
- package/dist/cron-main.js +75 -0
- package/dist/cron-main.js.map +1 -0
- package/dist/gateway/agentbox/client.d.ts +187 -0
- package/dist/gateway/agentbox/client.js +314 -0
- package/dist/gateway/agentbox/client.js.map +1 -0
- package/dist/gateway/agentbox/index.d.ts +10 -0
- package/dist/gateway/agentbox/index.js +11 -0
- package/dist/gateway/agentbox/index.js.map +1 -0
- package/dist/gateway/agentbox/k8s-spawner.d.ts +70 -0
- package/dist/gateway/agentbox/k8s-spawner.js +466 -0
- package/dist/gateway/agentbox/k8s-spawner.js.map +1 -0
- package/dist/gateway/agentbox/local-spawner.d.ts +63 -0
- package/dist/gateway/agentbox/local-spawner.js +234 -0
- package/dist/gateway/agentbox/local-spawner.js.map +1 -0
- package/dist/gateway/agentbox/manager.d.ts +121 -0
- package/dist/gateway/agentbox/manager.js +325 -0
- package/dist/gateway/agentbox/manager.js.map +1 -0
- package/dist/gateway/agentbox/process-spawner.d.ts +21 -0
- package/dist/gateway/agentbox/process-spawner.js +168 -0
- package/dist/gateway/agentbox/process-spawner.js.map +1 -0
- package/dist/gateway/agentbox/spawner.d.ts +33 -0
- package/dist/gateway/agentbox/spawner.js +10 -0
- package/dist/gateway/agentbox/spawner.js.map +1 -0
- package/dist/gateway/agentbox/types.d.ts +39 -0
- package/dist/gateway/agentbox/types.js +5 -0
- package/dist/gateway/agentbox/types.js.map +1 -0
- package/dist/gateway/auth/bind-code-store.d.ts +31 -0
- package/dist/gateway/auth/bind-code-store.js +73 -0
- package/dist/gateway/auth/bind-code-store.js.map +1 -0
- package/dist/gateway/auth/index.d.ts +9 -0
- package/dist/gateway/auth/index.js +10 -0
- package/dist/gateway/auth/index.js.map +1 -0
- package/dist/gateway/auth/jwt.d.ts +23 -0
- package/dist/gateway/auth/jwt.js +82 -0
- package/dist/gateway/auth/jwt.js.map +1 -0
- package/dist/gateway/auth/login.d.ts +26 -0
- package/dist/gateway/auth/login.js +74 -0
- package/dist/gateway/auth/login.js.map +1 -0
- package/dist/gateway/auth/middleware.d.ts +23 -0
- package/dist/gateway/auth/middleware.js +67 -0
- package/dist/gateway/auth/middleware.js.map +1 -0
- package/dist/gateway/auth/oauth2.d.ts +57 -0
- package/dist/gateway/auth/oauth2.js +113 -0
- package/dist/gateway/auth/oauth2.js.map +1 -0
- package/dist/gateway/auth/user-store.d.ts +95 -0
- package/dist/gateway/auth/user-store.js +291 -0
- package/dist/gateway/auth/user-store.js.map +1 -0
- package/dist/gateway/channels/channel-manager.d.ts +42 -0
- package/dist/gateway/channels/channel-manager.js +156 -0
- package/dist/gateway/channels/channel-manager.js.map +1 -0
- package/dist/gateway/channels/channel-rpc.d.ts +9 -0
- package/dist/gateway/channels/channel-rpc.js +104 -0
- package/dist/gateway/channels/channel-rpc.js.map +1 -0
- package/dist/gateway/channels/channel-store.d.ts +32 -0
- package/dist/gateway/channels/channel-store.js +114 -0
- package/dist/gateway/channels/channel-store.js.map +1 -0
- package/dist/gateway/channels/discord.d.ts +5 -0
- package/dist/gateway/channels/discord.js +177 -0
- package/dist/gateway/channels/discord.js.map +1 -0
- package/dist/gateway/channels/lark-format.d.ts +41 -0
- package/dist/gateway/channels/lark-format.js +620 -0
- package/dist/gateway/channels/lark-format.js.map +1 -0
- package/dist/gateway/channels/lark.d.ts +5 -0
- package/dist/gateway/channels/lark.js +1000 -0
- package/dist/gateway/channels/lark.js.map +1 -0
- package/dist/gateway/channels/slack.d.ts +5 -0
- package/dist/gateway/channels/slack.js +170 -0
- package/dist/gateway/channels/slack.js.map +1 -0
- package/dist/gateway/channels/telegram.d.ts +5 -0
- package/dist/gateway/channels/telegram.js +173 -0
- package/dist/gateway/channels/telegram.js.map +1 -0
- package/dist/gateway/channels/utils.d.ts +34 -0
- package/dist/gateway/channels/utils.js +115 -0
- package/dist/gateway/channels/utils.js.map +1 -0
- package/dist/gateway/config.d.ts +14 -0
- package/dist/gateway/config.js +12 -0
- package/dist/gateway/config.js.map +1 -0
- package/dist/gateway/cron/notify.d.ts +14 -0
- package/dist/gateway/cron/notify.js +40 -0
- package/dist/gateway/cron/notify.js.map +1 -0
- package/dist/gateway/db/dialect-helpers.d.ts +8 -0
- package/dist/gateway/db/dialect-helpers.js +26 -0
- package/dist/gateway/db/dialect-helpers.js.map +1 -0
- package/dist/gateway/db/index.d.ts +20 -0
- package/dist/gateway/db/index.js +140 -0
- package/dist/gateway/db/index.js.map +1 -0
- package/dist/gateway/db/init-schema.d.ts +8 -0
- package/dist/gateway/db/init-schema.js +385 -0
- package/dist/gateway/db/init-schema.js.map +1 -0
- package/dist/gateway/db/migrate-sqlite.d.ts +8 -0
- package/dist/gateway/db/migrate-sqlite.js +335 -0
- package/dist/gateway/db/migrate-sqlite.js.map +1 -0
- package/dist/gateway/db/repositories/chat-repo.d.ts +64 -0
- package/dist/gateway/db/repositories/chat-repo.js +115 -0
- package/dist/gateway/db/repositories/chat-repo.js.map +1 -0
- package/dist/gateway/db/repositories/config-repo.d.ts +164 -0
- package/dist/gateway/db/repositories/config-repo.js +267 -0
- package/dist/gateway/db/repositories/config-repo.js.map +1 -0
- package/dist/gateway/db/repositories/credential-repo.d.ts +51 -0
- package/dist/gateway/db/repositories/credential-repo.js +70 -0
- package/dist/gateway/db/repositories/credential-repo.js.map +1 -0
- package/dist/gateway/db/repositories/env-repo.d.ts +37 -0
- package/dist/gateway/db/repositories/env-repo.js +74 -0
- package/dist/gateway/db/repositories/env-repo.js.map +1 -0
- package/dist/gateway/db/repositories/mcp-server-repo.d.ts +97 -0
- package/dist/gateway/db/repositories/mcp-server-repo.js +83 -0
- package/dist/gateway/db/repositories/mcp-server-repo.js.map +1 -0
- package/dist/gateway/db/repositories/model-config-repo.d.ts +141 -0
- package/dist/gateway/db/repositories/model-config-repo.js +439 -0
- package/dist/gateway/db/repositories/model-config-repo.js.map +1 -0
- package/dist/gateway/db/repositories/notification-repo.d.ts +50 -0
- package/dist/gateway/db/repositories/notification-repo.js +105 -0
- package/dist/gateway/db/repositories/notification-repo.js.map +1 -0
- package/dist/gateway/db/repositories/permission-repo.d.ts +28 -0
- package/dist/gateway/db/repositories/permission-repo.js +74 -0
- package/dist/gateway/db/repositories/permission-repo.js.map +1 -0
- package/dist/gateway/db/repositories/skill-content-repo.d.ts +29 -0
- package/dist/gateway/db/repositories/skill-content-repo.js +90 -0
- package/dist/gateway/db/repositories/skill-content-repo.js.map +1 -0
- package/dist/gateway/db/repositories/skill-repo.d.ts +170 -0
- package/dist/gateway/db/repositories/skill-repo.js +185 -0
- package/dist/gateway/db/repositories/skill-repo.js.map +1 -0
- package/dist/gateway/db/repositories/skill-review-repo.d.ts +44 -0
- package/dist/gateway/db/repositories/skill-review-repo.js +44 -0
- package/dist/gateway/db/repositories/skill-review-repo.js.map +1 -0
- package/dist/gateway/db/repositories/skill-version-repo.d.ts +30 -0
- package/dist/gateway/db/repositories/skill-version-repo.js +56 -0
- package/dist/gateway/db/repositories/skill-version-repo.js.map +1 -0
- package/dist/gateway/db/repositories/system-config-repo.d.ts +21 -0
- package/dist/gateway/db/repositories/system-config-repo.js +86 -0
- package/dist/gateway/db/repositories/system-config-repo.js.map +1 -0
- package/dist/gateway/db/repositories/user-env-config-repo.d.ts +32 -0
- package/dist/gateway/db/repositories/user-env-config-repo.js +79 -0
- package/dist/gateway/db/repositories/user-env-config-repo.js.map +1 -0
- package/dist/gateway/db/repositories/user-repo.d.ts +59 -0
- package/dist/gateway/db/repositories/user-repo.js +83 -0
- package/dist/gateway/db/repositories/user-repo.js.map +1 -0
- package/dist/gateway/db/repositories/vote-repo.d.ts +26 -0
- package/dist/gateway/db/repositories/vote-repo.js +97 -0
- package/dist/gateway/db/repositories/vote-repo.js.map +1 -0
- package/dist/gateway/db/repositories/workspace-repo.d.ts +27 -0
- package/dist/gateway/db/repositories/workspace-repo.js +145 -0
- package/dist/gateway/db/repositories/workspace-repo.js.map +1 -0
- package/dist/gateway/db/schema-mysql.d.ts +3897 -0
- package/dist/gateway/db/schema-mysql.js +354 -0
- package/dist/gateway/db/schema-mysql.js.map +1 -0
- package/dist/gateway/db/schema-sqlite.d.ts +4147 -0
- package/dist/gateway/db/schema-sqlite.js +345 -0
- package/dist/gateway/db/schema-sqlite.js.map +1 -0
- package/dist/gateway/db/schema.d.ts +3869 -0
- package/dist/gateway/db/schema.js +16 -0
- package/dist/gateway/db/schema.js.map +1 -0
- package/dist/gateway/mcp-config-builder.d.ts +8 -0
- package/dist/gateway/mcp-config-builder.js +39 -0
- package/dist/gateway/mcp-config-builder.js.map +1 -0
- package/dist/gateway/output-redactor.d.ts +27 -0
- package/dist/gateway/output-redactor.js +101 -0
- package/dist/gateway/output-redactor.js.map +1 -0
- package/dist/gateway/plugins/api.d.ts +181 -0
- package/dist/gateway/plugins/api.js +28 -0
- package/dist/gateway/plugins/api.js.map +1 -0
- package/dist/gateway/plugins/channel-bridge.d.ts +72 -0
- package/dist/gateway/plugins/channel-bridge.js +586 -0
- package/dist/gateway/plugins/channel-bridge.js.map +1 -0
- package/dist/gateway/plugins/loader.d.ts +2 -0
- package/dist/gateway/plugins/loader.js +83 -0
- package/dist/gateway/plugins/loader.js.map +1 -0
- package/dist/gateway/plugins/runtime.d.ts +25 -0
- package/dist/gateway/plugins/runtime.js +64 -0
- package/dist/gateway/plugins/runtime.js.map +1 -0
- package/dist/gateway/resource-notifier.d.ts +36 -0
- package/dist/gateway/resource-notifier.js +123 -0
- package/dist/gateway/resource-notifier.js.map +1 -0
- package/dist/gateway/rpc-methods.d.ts +34 -0
- package/dist/gateway/rpc-methods.js +3198 -0
- package/dist/gateway/rpc-methods.js.map +1 -0
- package/dist/gateway/security/cert-manager.d.ts +77 -0
- package/dist/gateway/security/cert-manager.js +280 -0
- package/dist/gateway/security/cert-manager.js.map +1 -0
- package/dist/gateway/security/mtls-middleware.d.ts +33 -0
- package/dist/gateway/security/mtls-middleware.js +89 -0
- package/dist/gateway/security/mtls-middleware.js.map +1 -0
- package/dist/gateway/server.d.ts +54 -0
- package/dist/gateway/server.js +1146 -0
- package/dist/gateway/server.js.map +1 -0
- package/dist/gateway/skill-labels.d.ts +16 -0
- package/dist/gateway/skill-labels.js +79 -0
- package/dist/gateway/skill-labels.js.map +1 -0
- package/dist/gateway/skills/file-writer.d.ts +75 -0
- package/dist/gateway/skills/file-writer.js +320 -0
- package/dist/gateway/skills/file-writer.js.map +1 -0
- package/dist/gateway/skills/script-evaluator.d.ts +42 -0
- package/dist/gateway/skills/script-evaluator.js +204 -0
- package/dist/gateway/skills/script-evaluator.js.map +1 -0
- package/dist/gateway/skills/skill-bundle.d.ts +34 -0
- package/dist/gateway/skills/skill-bundle.js +83 -0
- package/dist/gateway/skills/skill-bundle.js.map +1 -0
- package/dist/gateway/web/dist/assets/index-BF6CtvnV.css +1 -0
- package/dist/gateway/web/dist/assets/index-Dumzqsr-.js +680 -0
- package/dist/gateway/web/dist/assets/index-n4IMHP1Q.js +675 -0
- package/dist/gateway/web/dist/index.html +14 -0
- package/dist/gateway/web/dist/noise.png +1 -0
- package/dist/gateway/web/dist/robots.txt +2 -0
- package/dist/gateway/web/dist/vite.svg +1 -0
- package/dist/gateway/ws-protocol.d.ts +68 -0
- package/dist/gateway/ws-protocol.js +106 -0
- package/dist/gateway/ws-protocol.js.map +1 -0
- package/dist/gateway-main.d.ts +1 -0
- package/dist/gateway-main.js +129 -0
- package/dist/gateway-main.js.map +1 -0
- package/dist/lib/s3-backup.d.ts +28 -0
- package/dist/lib/s3-backup.js +85 -0
- package/dist/lib/s3-backup.js.map +1 -0
- package/dist/lib/s3-storage.d.ts +45 -0
- package/dist/lib/s3-storage.js +210 -0
- package/dist/lib/s3-storage.js.map +1 -0
- package/dist/memory/chunker.d.ts +15 -0
- package/dist/memory/chunker.js +94 -0
- package/dist/memory/chunker.js.map +1 -0
- package/dist/memory/embeddings.d.ts +14 -0
- package/dist/memory/embeddings.js +143 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/index.d.ts +18 -0
- package/dist/memory/index.js +15 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/indexer.d.ts +70 -0
- package/dist/memory/indexer.js +567 -0
- package/dist/memory/indexer.js.map +1 -0
- package/dist/memory/mmr.d.ts +22 -0
- package/dist/memory/mmr.js +82 -0
- package/dist/memory/mmr.js.map +1 -0
- package/dist/memory/schema.d.ts +2 -0
- package/dist/memory/schema.js +85 -0
- package/dist/memory/schema.js.map +1 -0
- package/dist/memory/session-summarizer.d.ts +19 -0
- package/dist/memory/session-summarizer.js +139 -0
- package/dist/memory/session-summarizer.js.map +1 -0
- package/dist/memory/stop-words.d.ts +13 -0
- package/dist/memory/stop-words.js +132 -0
- package/dist/memory/stop-words.js.map +1 -0
- package/dist/memory/temporal-decay.d.ts +20 -0
- package/dist/memory/temporal-decay.js +63 -0
- package/dist/memory/temporal-decay.js.map +1 -0
- package/dist/memory/types.d.ts +40 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/shared/resource-sync.d.ts +80 -0
- package/dist/shared/resource-sync.js +24 -0
- package/dist/shared/resource-sync.js.map +1 -0
- package/dist/tools/command-sets.d.ts +61 -0
- package/dist/tools/command-sets.js +845 -0
- package/dist/tools/command-sets.js.map +1 -0
- package/dist/tools/create-skill.d.ts +2 -0
- package/dist/tools/create-skill.js +169 -0
- package/dist/tools/create-skill.js.map +1 -0
- package/dist/tools/credential-list.d.ts +8 -0
- package/dist/tools/credential-list.js +139 -0
- package/dist/tools/credential-list.js.map +1 -0
- package/dist/tools/deep-search/engine.d.ts +40 -0
- package/dist/tools/deep-search/engine.js +594 -0
- package/dist/tools/deep-search/engine.js.map +1 -0
- package/dist/tools/deep-search/events.d.ts +11 -0
- package/dist/tools/deep-search/events.js +10 -0
- package/dist/tools/deep-search/events.js.map +1 -0
- package/dist/tools/deep-search/format.d.ts +11 -0
- package/dist/tools/deep-search/format.js +143 -0
- package/dist/tools/deep-search/format.js.map +1 -0
- package/dist/tools/deep-search/prompts.d.ts +30 -0
- package/dist/tools/deep-search/prompts.js +237 -0
- package/dist/tools/deep-search/prompts.js.map +1 -0
- package/dist/tools/deep-search/sre-knowledge.d.ts +21 -0
- package/dist/tools/deep-search/sre-knowledge.js +112 -0
- package/dist/tools/deep-search/sre-knowledge.js.map +1 -0
- package/dist/tools/deep-search/sub-agent.d.ts +71 -0
- package/dist/tools/deep-search/sub-agent.js +401 -0
- package/dist/tools/deep-search/sub-agent.js.map +1 -0
- package/dist/tools/deep-search/tool.d.ts +9 -0
- package/dist/tools/deep-search/tool.js +201 -0
- package/dist/tools/deep-search/tool.js.map +1 -0
- package/dist/tools/deep-search/types.d.ts +67 -0
- package/dist/tools/deep-search/types.js +41 -0
- package/dist/tools/deep-search/types.js.map +1 -0
- package/dist/tools/dp-tools.d.ts +47 -0
- package/dist/tools/dp-tools.js +170 -0
- package/dist/tools/dp-tools.js.map +1 -0
- package/dist/tools/fork-skill.d.ts +2 -0
- package/dist/tools/fork-skill.js +93 -0
- package/dist/tools/fork-skill.js.map +1 -0
- package/dist/tools/k8s-checks.d.ts +18 -0
- package/dist/tools/k8s-checks.js +105 -0
- package/dist/tools/k8s-checks.js.map +1 -0
- package/dist/tools/kubeconfig-resolver.d.ts +11 -0
- package/dist/tools/kubeconfig-resolver.js +53 -0
- package/dist/tools/kubeconfig-resolver.js.map +1 -0
- package/dist/tools/kubectl.d.ts +12 -0
- package/dist/tools/kubectl.js +169 -0
- package/dist/tools/kubectl.js.map +1 -0
- package/dist/tools/manage-schedule.d.ts +3 -0
- package/dist/tools/manage-schedule.js +189 -0
- package/dist/tools/manage-schedule.js.map +1 -0
- package/dist/tools/memory-get.d.ts +2 -0
- package/dist/tools/memory-get.js +99 -0
- package/dist/tools/memory-get.js.map +1 -0
- package/dist/tools/memory-search.d.ts +3 -0
- package/dist/tools/memory-search.js +93 -0
- package/dist/tools/memory-search.js.map +1 -0
- package/dist/tools/netns-script.d.ts +3 -0
- package/dist/tools/netns-script.js +394 -0
- package/dist/tools/netns-script.js.map +1 -0
- package/dist/tools/node-exec.d.ts +18 -0
- package/dist/tools/node-exec.js +342 -0
- package/dist/tools/node-exec.js.map +1 -0
- package/dist/tools/node-script.d.ts +3 -0
- package/dist/tools/node-script.js +266 -0
- package/dist/tools/node-script.js.map +1 -0
- package/dist/tools/pod-exec.d.ts +4 -0
- package/dist/tools/pod-exec.js +146 -0
- package/dist/tools/pod-exec.js.map +1 -0
- package/dist/tools/pod-nsenter-exec.d.ts +3 -0
- package/dist/tools/pod-nsenter-exec.js +333 -0
- package/dist/tools/pod-nsenter-exec.js.map +1 -0
- package/dist/tools/pod-script.d.ts +3 -0
- package/dist/tools/pod-script.js +176 -0
- package/dist/tools/pod-script.js.map +1 -0
- package/dist/tools/restricted-bash.d.ts +41 -0
- package/dist/tools/restricted-bash.js +503 -0
- package/dist/tools/restricted-bash.js.map +1 -0
- package/dist/tools/run-skill.d.ts +3 -0
- package/dist/tools/run-skill.js +169 -0
- package/dist/tools/run-skill.js.map +1 -0
- package/dist/tools/sanitize-env.d.ts +14 -0
- package/dist/tools/sanitize-env.js +95 -0
- package/dist/tools/sanitize-env.js.map +1 -0
- package/dist/tools/script-resolver.d.ts +35 -0
- package/dist/tools/script-resolver.js +213 -0
- package/dist/tools/script-resolver.js.map +1 -0
- package/dist/tools/tool-render.d.ts +20 -0
- package/dist/tools/tool-render.js +77 -0
- package/dist/tools/tool-render.js.map +1 -0
- package/dist/tools/update-skill.d.ts +2 -0
- package/dist/tools/update-skill.js +169 -0
- package/dist/tools/update-skill.js.map +1 -0
- package/package.json +106 -0
- package/settings.example.json +74 -0
- package/siclaw.mjs +48 -0
- package/skills/core/cluster-events/SKILL.md +150 -0
- package/skills/core/deep-investigation/SKILL.md +87 -0
- package/skills/core/deep-investigation/default-memory.md +8 -0
- package/skills/core/deployment-rollout-debug/SKILL.md +144 -0
- package/skills/core/dns-debug/SKILL.md +144 -0
- package/skills/core/find-node/SKILL.md +23 -0
- package/skills/core/find-node/scripts/find-node.sh +9 -0
- package/skills/core/hpa-debug/SKILL.md +159 -0
- package/skills/core/image-pull-debug/SKILL.md +151 -0
- package/skills/core/ingress-debug/SKILL.md +189 -0
- package/skills/core/job-debug/SKILL.md +180 -0
- package/skills/core/meta.json +23 -0
- package/skills/core/node-health-check/SKILL.md +150 -0
- package/skills/core/node-logs/SKILL.md +68 -0
- package/skills/core/node-logs/scripts/get-node-logs.sh +78 -0
- package/skills/core/node-ping-gateway/SKILL.md +54 -0
- package/skills/core/node-ping-gateway/scripts/ping-node-gateway.sh +71 -0
- package/skills/core/node-show-gateway/SKILL.md +55 -0
- package/skills/core/node-show-gateway/scripts/show-node-gateway.sh +90 -0
- package/skills/core/pod-crash-debug/SKILL.md +135 -0
- package/skills/core/pod-pending-debug/SKILL.md +146 -0
- package/skills/core/pod-ping-gateway/SKILL.md +44 -0
- package/skills/core/pod-ping-gateway/scripts/ping-gateway.sh +76 -0
- package/skills/core/pod-show-gateway/SKILL.md +54 -0
- package/skills/core/pod-show-gateway/scripts/show-gateway.sh +115 -0
- package/skills/core/pvc-debug/SKILL.md +169 -0
- package/skills/core/service-debug/SKILL.md +164 -0
- package/skills/extension/.gitkeep +0 -0
- package/skills/platform/create-skill/SKILL.md +288 -0
- package/skills/platform/manage-skill/SKILL.md +23 -0
- package/skills/platform/update-skill/SKILL.md +52 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3/OSS Storage Utility
|
|
3
|
+
*
|
|
4
|
+
* Primary storage for skill versions — must be reliable with retries.
|
|
5
|
+
* Compatible with AWS S3, Aliyun OSS, MinIO, etc.
|
|
6
|
+
*/
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
export class S3Storage {
|
|
10
|
+
config;
|
|
11
|
+
client = null;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
}
|
|
15
|
+
/** Lazy-load S3 client (avoids import cost when not used) */
|
|
16
|
+
async getClient() {
|
|
17
|
+
if (this.client)
|
|
18
|
+
return this.client;
|
|
19
|
+
try {
|
|
20
|
+
const { S3Client } = await import("@aws-sdk/client-s3");
|
|
21
|
+
this.client = new S3Client({
|
|
22
|
+
endpoint: this.config.endpoint,
|
|
23
|
+
region: this.config.region || "us-east-1",
|
|
24
|
+
credentials: {
|
|
25
|
+
accessKeyId: this.config.accessKey,
|
|
26
|
+
secretAccessKey: this.config.secretKey,
|
|
27
|
+
},
|
|
28
|
+
forcePathStyle: true,
|
|
29
|
+
});
|
|
30
|
+
return this.client;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
console.warn("[s3-storage] @aws-sdk/client-s3 not installed, S3 storage disabled");
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Retry wrapper for reliability (S3 is primary storage) */
|
|
38
|
+
async withRetry(fn, maxRetries = 3) {
|
|
39
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
40
|
+
try {
|
|
41
|
+
return await fn();
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
if (attempt === maxRetries)
|
|
45
|
+
throw err;
|
|
46
|
+
await new Promise((r) => setTimeout(r, 1000 * attempt));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
throw new Error("unreachable");
|
|
50
|
+
}
|
|
51
|
+
/** Upload a single file */
|
|
52
|
+
async uploadFile(key, content) {
|
|
53
|
+
await this.withRetry(async () => {
|
|
54
|
+
const client = await this.getClient();
|
|
55
|
+
if (!client)
|
|
56
|
+
return;
|
|
57
|
+
const { PutObjectCommand } = await import("@aws-sdk/client-s3");
|
|
58
|
+
await client.send(new PutObjectCommand({
|
|
59
|
+
Bucket: this.config.bucket,
|
|
60
|
+
Key: key,
|
|
61
|
+
Body: typeof content === "string" ? Buffer.from(content) : content,
|
|
62
|
+
}));
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/** Upload all files in a directory recursively */
|
|
66
|
+
async uploadDir(prefix, localDir) {
|
|
67
|
+
await this.withRetry(async () => {
|
|
68
|
+
if (!fs.existsSync(localDir))
|
|
69
|
+
return;
|
|
70
|
+
await this._uploadDirInner(prefix, localDir);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
async _uploadDirInner(prefix, localDir) {
|
|
74
|
+
const entries = fs.readdirSync(localDir, { withFileTypes: true });
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
const localPath = path.join(localDir, entry.name);
|
|
77
|
+
const s3Key = `${prefix}/${entry.name}`;
|
|
78
|
+
if (entry.isDirectory()) {
|
|
79
|
+
if (entry.name === ".git")
|
|
80
|
+
continue;
|
|
81
|
+
await this._uploadDirInner(s3Key, localPath);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
const content = fs.readFileSync(localPath);
|
|
85
|
+
const client = await this.getClient();
|
|
86
|
+
if (!client)
|
|
87
|
+
return;
|
|
88
|
+
const { PutObjectCommand } = await import("@aws-sdk/client-s3");
|
|
89
|
+
await client.send(new PutObjectCommand({
|
|
90
|
+
Bucket: this.config.bucket,
|
|
91
|
+
Key: s3Key,
|
|
92
|
+
Body: content,
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Download a single file, returns null on NoSuchKey */
|
|
98
|
+
async downloadFile(key) {
|
|
99
|
+
return this.withRetry(async () => {
|
|
100
|
+
const client = await this.getClient();
|
|
101
|
+
if (!client)
|
|
102
|
+
return null;
|
|
103
|
+
const { GetObjectCommand } = await import("@aws-sdk/client-s3");
|
|
104
|
+
try {
|
|
105
|
+
const resp = await client.send(new GetObjectCommand({
|
|
106
|
+
Bucket: this.config.bucket,
|
|
107
|
+
Key: key,
|
|
108
|
+
}));
|
|
109
|
+
const chunks = [];
|
|
110
|
+
for await (const chunk of resp.Body) {
|
|
111
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
112
|
+
}
|
|
113
|
+
return Buffer.concat(chunks);
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
if (err.name === "NoSuchKey" || err.Code === "NoSuchKey")
|
|
117
|
+
return null;
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/** Download all files under a prefix to a local directory */
|
|
123
|
+
async downloadDir(prefix, localDir) {
|
|
124
|
+
await this.withRetry(async () => {
|
|
125
|
+
const keys = await this._listKeysInner(prefix);
|
|
126
|
+
for (const key of keys) {
|
|
127
|
+
const relativePath = key.slice(prefix.length).replace(/^\//, "");
|
|
128
|
+
if (!relativePath)
|
|
129
|
+
continue;
|
|
130
|
+
const localPath = path.join(localDir, relativePath);
|
|
131
|
+
const dir = path.dirname(localPath);
|
|
132
|
+
if (!fs.existsSync(dir))
|
|
133
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
134
|
+
const content = await this.downloadFile(key);
|
|
135
|
+
if (content)
|
|
136
|
+
fs.writeFileSync(localPath, content);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/** List all object keys under a prefix (with pagination) */
|
|
141
|
+
async listKeys(prefix) {
|
|
142
|
+
return this.withRetry(() => this._listKeysInner(prefix));
|
|
143
|
+
}
|
|
144
|
+
async _listKeysInner(prefix) {
|
|
145
|
+
const client = await this.getClient();
|
|
146
|
+
if (!client)
|
|
147
|
+
return [];
|
|
148
|
+
const { ListObjectsV2Command } = await import("@aws-sdk/client-s3");
|
|
149
|
+
const keys = [];
|
|
150
|
+
let continuationToken;
|
|
151
|
+
do {
|
|
152
|
+
const resp = await client.send(new ListObjectsV2Command({
|
|
153
|
+
Bucket: this.config.bucket,
|
|
154
|
+
Prefix: prefix,
|
|
155
|
+
ContinuationToken: continuationToken,
|
|
156
|
+
}));
|
|
157
|
+
if (resp.Contents) {
|
|
158
|
+
for (const obj of resp.Contents) {
|
|
159
|
+
if (obj.Key)
|
|
160
|
+
keys.push(obj.Key);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
continuationToken = resp.IsTruncated ? resp.NextContinuationToken : undefined;
|
|
164
|
+
} while (continuationToken);
|
|
165
|
+
return keys;
|
|
166
|
+
}
|
|
167
|
+
/** Delete all objects under a prefix */
|
|
168
|
+
async deleteDir(prefix) {
|
|
169
|
+
const client = await this.getClient();
|
|
170
|
+
if (!client)
|
|
171
|
+
return;
|
|
172
|
+
const keys = await this._listKeysInner(prefix);
|
|
173
|
+
if (keys.length === 0)
|
|
174
|
+
return;
|
|
175
|
+
const { DeleteObjectsCommand } = await import("@aws-sdk/client-s3");
|
|
176
|
+
// Delete in batches of 1000 (S3 limit)
|
|
177
|
+
for (let i = 0; i < keys.length; i += 1000) {
|
|
178
|
+
const batch = keys.slice(i, i + 1000);
|
|
179
|
+
await client.send(new DeleteObjectsCommand({
|
|
180
|
+
Bucket: this.config.bucket,
|
|
181
|
+
Delete: {
|
|
182
|
+
Objects: batch.map((Key) => ({ Key })),
|
|
183
|
+
},
|
|
184
|
+
}));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** Check if S3 is configured */
|
|
188
|
+
isEnabled() {
|
|
189
|
+
return !!(this.config.endpoint && this.config.bucket);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Create from DB config → environment variables.
|
|
193
|
+
* Priority: dbConfig > SICLAW_S3_* env vars > null
|
|
194
|
+
*/
|
|
195
|
+
static create(dbConfig) {
|
|
196
|
+
const endpoint = dbConfig?.["s3.endpoint"] ?? process.env.SICLAW_S3_ENDPOINT;
|
|
197
|
+
const bucket = dbConfig?.["s3.bucket"] ?? process.env.SICLAW_S3_BUCKET;
|
|
198
|
+
const accessKey = dbConfig?.["s3.accessKey"] ?? process.env.SICLAW_S3_ACCESS_KEY;
|
|
199
|
+
const secretKey = dbConfig?.["s3.secretKey"] ?? process.env.SICLAW_S3_SECRET_KEY;
|
|
200
|
+
if (!endpoint || !bucket || !accessKey || !secretKey) {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
return new S3Storage({ endpoint, bucket, accessKey, secretKey });
|
|
204
|
+
}
|
|
205
|
+
/** @deprecated Use create() instead */
|
|
206
|
+
static fromEnv() {
|
|
207
|
+
return S3Storage.create();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=s3-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-storage.js","sourceRoot":"","sources":["../../src/lib/s3-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ChunkResult {
|
|
2
|
+
heading: string;
|
|
3
|
+
content: string;
|
|
4
|
+
startLine: number;
|
|
5
|
+
endLine: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ChunkOptions {
|
|
8
|
+
maxTokens?: number;
|
|
9
|
+
overlapTokens?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Split markdown content into chunks with heading context and line numbers.
|
|
13
|
+
* Chunks are split by headings first, then by token budget with overlap.
|
|
14
|
+
*/
|
|
15
|
+
export declare function chunkMarkdown(text: string, opts?: ChunkOptions): ChunkResult[];
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const HEADING_RE = /^(#{1,6})\s+(.+)$/;
|
|
2
|
+
/** Rough token estimate: 1 token ≈ 4 bytes UTF-8 */
|
|
3
|
+
function estimateTokens(text) {
|
|
4
|
+
return Math.ceil(Buffer.byteLength(text, "utf-8") / 4);
|
|
5
|
+
}
|
|
6
|
+
const DEFAULT_MAX_TOKENS = 400;
|
|
7
|
+
const DEFAULT_OVERLAP_TOKENS = 80;
|
|
8
|
+
/**
|
|
9
|
+
* Split markdown content into chunks with heading context and line numbers.
|
|
10
|
+
* Chunks are split by headings first, then by token budget with overlap.
|
|
11
|
+
*/
|
|
12
|
+
export function chunkMarkdown(text, opts) {
|
|
13
|
+
const maxTokens = opts?.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
14
|
+
const overlapTokens = opts?.overlapTokens ?? DEFAULT_OVERLAP_TOKENS;
|
|
15
|
+
const lines = text.split("\n");
|
|
16
|
+
const chunks = [];
|
|
17
|
+
// Track heading hierarchy: headings[level-1] = text
|
|
18
|
+
const headings = [];
|
|
19
|
+
// Accumulate sections (heading boundary → heading boundary)
|
|
20
|
+
let sectionLines = [];
|
|
21
|
+
let sectionStart = 1; // 1-indexed
|
|
22
|
+
const flushSection = (endLineExclusive) => {
|
|
23
|
+
const content = sectionLines.join("\n").trim();
|
|
24
|
+
if (!content) {
|
|
25
|
+
sectionLines = [];
|
|
26
|
+
sectionStart = endLineExclusive;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const heading = headings.filter(Boolean).join(" > ");
|
|
30
|
+
const actualStart = sectionStart;
|
|
31
|
+
const actualEnd = endLineExclusive - 1; // inclusive
|
|
32
|
+
// Split section into token-bounded chunks with overlap
|
|
33
|
+
splitWithOverlap(sectionLines, actualStart, heading, maxTokens, overlapTokens, chunks);
|
|
34
|
+
sectionLines = [];
|
|
35
|
+
sectionStart = endLineExclusive;
|
|
36
|
+
};
|
|
37
|
+
for (let i = 0; i < lines.length; i++) {
|
|
38
|
+
const line = lines[i];
|
|
39
|
+
const match = line.match(HEADING_RE);
|
|
40
|
+
if (match) {
|
|
41
|
+
flushSection(i + 1); // flush previous section
|
|
42
|
+
const level = match[1].length;
|
|
43
|
+
const title = match[2].trim();
|
|
44
|
+
headings[level - 1] = title;
|
|
45
|
+
headings.length = level;
|
|
46
|
+
sectionLines.push(line);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
sectionLines.push(line);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
flushSection(lines.length + 1);
|
|
53
|
+
return chunks;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Split a section's lines into token-bounded chunks with overlap.
|
|
57
|
+
* Each chunk records its start/end line number (1-indexed).
|
|
58
|
+
*/
|
|
59
|
+
function splitWithOverlap(lines, startLineOffset, heading, maxTokens, overlapTokens, out) {
|
|
60
|
+
let i = 0;
|
|
61
|
+
while (i < lines.length) {
|
|
62
|
+
let tokens = 0;
|
|
63
|
+
let j = i;
|
|
64
|
+
// Accumulate lines until token budget reached
|
|
65
|
+
while (j < lines.length) {
|
|
66
|
+
const lineTokens = estimateTokens(lines[j]);
|
|
67
|
+
if (tokens + lineTokens > maxTokens && j > i)
|
|
68
|
+
break;
|
|
69
|
+
tokens += lineTokens;
|
|
70
|
+
j++;
|
|
71
|
+
}
|
|
72
|
+
const chunkLines = lines.slice(i, j);
|
|
73
|
+
const content = chunkLines.join("\n").trim();
|
|
74
|
+
if (content) {
|
|
75
|
+
out.push({
|
|
76
|
+
heading,
|
|
77
|
+
content,
|
|
78
|
+
startLine: startLineOffset + i,
|
|
79
|
+
endLine: startLineOffset + j - 1,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (j >= lines.length)
|
|
83
|
+
break;
|
|
84
|
+
// Step back by overlap amount
|
|
85
|
+
let overlapCount = 0;
|
|
86
|
+
let backtrack = j;
|
|
87
|
+
while (backtrack > i + 1 && overlapCount < overlapTokens) {
|
|
88
|
+
backtrack--;
|
|
89
|
+
overlapCount += estimateTokens(lines[backtrack]);
|
|
90
|
+
}
|
|
91
|
+
i = backtrack;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/memory/chunker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from "./types.js";
|
|
2
|
+
interface EmbeddingOpts {
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
dimensions?: number;
|
|
7
|
+
maxInputTokens?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function createEmbeddingProvider(opts?: EmbeddingOpts): EmbeddingProvider;
|
|
10
|
+
/** Convert number[] to Buffer for SQLite BLOB storage */
|
|
11
|
+
export declare function vectorToBlob(vec: number[]): Buffer;
|
|
12
|
+
/** Restore number[] from SQLite BLOB (returns Uint8Array, not Buffer) */
|
|
13
|
+
export declare function blobToVector(blob: Uint8Array): number[];
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
const DEFAULT_BASE_URL = "";
|
|
2
|
+
const DEFAULT_MODEL = "BAAI/bge-m3";
|
|
3
|
+
const DEFAULT_DIMENSIONS = 1024;
|
|
4
|
+
const DEFAULT_MAX_INPUT_TOKENS = 8192;
|
|
5
|
+
const MAX_RETRIES = 3;
|
|
6
|
+
const TIMEOUT_MS = 30_000;
|
|
7
|
+
const MAX_RETRY_DELAY_MS = 8000;
|
|
8
|
+
/** Max estimated tokens per embedding API batch */
|
|
9
|
+
const BATCH_MAX_TOKENS = 8000;
|
|
10
|
+
export function createEmbeddingProvider(opts) {
|
|
11
|
+
const baseUrl = (opts?.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
12
|
+
const apiKey = opts?.apiKey ?? "";
|
|
13
|
+
const model = opts?.model ?? DEFAULT_MODEL;
|
|
14
|
+
const dimensions = opts?.dimensions ?? DEFAULT_DIMENSIONS;
|
|
15
|
+
const maxInputTokens = opts?.maxInputTokens ?? DEFAULT_MAX_INPUT_TOKENS;
|
|
16
|
+
/** Estimate token count from text (rough: 1 token ≈ 4 bytes UTF-8) */
|
|
17
|
+
const estimateTokens = (text) => Math.ceil(Buffer.byteLength(text, "utf-8") / 4);
|
|
18
|
+
/** Truncate text to fit within maxInputTokens (byte-based, consistent with estimateTokens) */
|
|
19
|
+
const truncateToLimit = (text) => {
|
|
20
|
+
if (estimateTokens(text) <= maxInputTokens)
|
|
21
|
+
return text;
|
|
22
|
+
// Binary search for the right cutoff point
|
|
23
|
+
let lo = 0, hi = text.length;
|
|
24
|
+
while (lo < hi) {
|
|
25
|
+
const mid = (lo + hi + 1) >>> 1;
|
|
26
|
+
if (estimateTokens(text.slice(0, mid)) <= maxInputTokens)
|
|
27
|
+
lo = mid;
|
|
28
|
+
else
|
|
29
|
+
hi = mid - 1;
|
|
30
|
+
}
|
|
31
|
+
// Avoid splitting a UTF-16 surrogate pair
|
|
32
|
+
if (lo > 0 && lo < text.length) {
|
|
33
|
+
const code = text.charCodeAt(lo - 1);
|
|
34
|
+
if (code >= 0xd800 && code <= 0xdbff)
|
|
35
|
+
lo--;
|
|
36
|
+
}
|
|
37
|
+
return text.slice(0, lo);
|
|
38
|
+
};
|
|
39
|
+
/** Send a single batch to the embedding API with retries */
|
|
40
|
+
const embedBatch = async (texts) => {
|
|
41
|
+
if (texts.length === 0)
|
|
42
|
+
return [];
|
|
43
|
+
let lastError;
|
|
44
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
45
|
+
try {
|
|
46
|
+
const resp = await fetch(`${baseUrl}/embeddings`, {
|
|
47
|
+
method: "POST",
|
|
48
|
+
headers: {
|
|
49
|
+
"Content-Type": "application/json",
|
|
50
|
+
...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify({
|
|
53
|
+
model,
|
|
54
|
+
input: texts,
|
|
55
|
+
dimensions,
|
|
56
|
+
}),
|
|
57
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
58
|
+
});
|
|
59
|
+
if (!resp.ok) {
|
|
60
|
+
const body = await resp.text().catch(() => "");
|
|
61
|
+
const err = new Error(`Embedding API error ${resp.status}: ${body.slice(0, 200)}`);
|
|
62
|
+
// 4xx errors are not retryable, except 429 (rate limit)
|
|
63
|
+
if (resp.status >= 400 && resp.status < 500 && resp.status !== 429)
|
|
64
|
+
throw err;
|
|
65
|
+
lastError = err;
|
|
66
|
+
await sleep(retryDelay(attempt));
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const json = (await resp.json());
|
|
70
|
+
// Sort by index to preserve input order, sanitize non-finite values
|
|
71
|
+
const sorted = json.data.sort((a, b) => a.index - b.index);
|
|
72
|
+
return sorted.map((d) => d.embedding.map((v) => (Number.isFinite(v) ? v : 0)));
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
76
|
+
// Don't retry abort errors or non-retryable 4xx (but allow 429)
|
|
77
|
+
if (lastError.name === "AbortError")
|
|
78
|
+
throw lastError;
|
|
79
|
+
if (/API error 4\d\d/.test(lastError.message) && !lastError.message.includes("API error 429"))
|
|
80
|
+
throw lastError;
|
|
81
|
+
if (attempt < MAX_RETRIES - 1) {
|
|
82
|
+
await sleep(retryDelay(attempt));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
throw lastError ?? new Error("Embedding failed after retries");
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
dimensions,
|
|
90
|
+
model,
|
|
91
|
+
maxInputTokens,
|
|
92
|
+
async embed(texts) {
|
|
93
|
+
if (texts.length === 0)
|
|
94
|
+
return [];
|
|
95
|
+
// Truncate oversized texts
|
|
96
|
+
const truncated = texts.map(truncateToLimit);
|
|
97
|
+
// Split into token-bounded batches
|
|
98
|
+
const batches = [];
|
|
99
|
+
let currentBatch = [];
|
|
100
|
+
let currentTokens = 0;
|
|
101
|
+
for (const text of truncated) {
|
|
102
|
+
const tokens = estimateTokens(text);
|
|
103
|
+
// If adding this text would exceed budget and batch is non-empty, flush
|
|
104
|
+
if (currentBatch.length > 0 && currentTokens + tokens > BATCH_MAX_TOKENS) {
|
|
105
|
+
batches.push(currentBatch);
|
|
106
|
+
currentBatch = [];
|
|
107
|
+
currentTokens = 0;
|
|
108
|
+
}
|
|
109
|
+
currentBatch.push(text);
|
|
110
|
+
currentTokens += tokens;
|
|
111
|
+
}
|
|
112
|
+
if (currentBatch.length > 0) {
|
|
113
|
+
batches.push(currentBatch);
|
|
114
|
+
}
|
|
115
|
+
// Process batches sequentially
|
|
116
|
+
const allResults = [];
|
|
117
|
+
for (const batch of batches) {
|
|
118
|
+
const results = await embedBatch(batch);
|
|
119
|
+
allResults.push(...results);
|
|
120
|
+
}
|
|
121
|
+
return allResults;
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function sleep(ms) {
|
|
126
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
127
|
+
}
|
|
128
|
+
/** Exponential backoff with jitter and max cap */
|
|
129
|
+
function retryDelay(attempt) {
|
|
130
|
+
const base = 1000 * 2 ** attempt;
|
|
131
|
+
const jittered = Math.round(base * (1 + Math.random() * 0.2));
|
|
132
|
+
return Math.min(MAX_RETRY_DELAY_MS, jittered);
|
|
133
|
+
}
|
|
134
|
+
/** Convert number[] to Buffer for SQLite BLOB storage */
|
|
135
|
+
export function vectorToBlob(vec) {
|
|
136
|
+
return Buffer.from(new Float32Array(vec).buffer);
|
|
137
|
+
}
|
|
138
|
+
/** Restore number[] from SQLite BLOB (returns Uint8Array, not Buffer) */
|
|
139
|
+
export function blobToVector(blob) {
|
|
140
|
+
const f32 = new Float32Array(blob.buffer, blob.byteOffset, blob.byteLength / 4);
|
|
141
|
+
return Array.from(f32);
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/memory/embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { MemoryIndexer, type MemorySearchConfig } from "./indexer.js";
|
|
2
|
+
export { MemoryIndexer, type MemorySearchConfig } from "./indexer.js";
|
|
3
|
+
export { createEmbeddingProvider } from "./embeddings.js";
|
|
4
|
+
export type { MemoryChunk, MemorySearchResult, EmbeddingProvider, InvestigationRecord } from "./types.js";
|
|
5
|
+
export type { TemporalDecayConfig } from "./temporal-decay.js";
|
|
6
|
+
export type { MMRConfig } from "./mmr.js";
|
|
7
|
+
export interface MemoryIndexerOpts {
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
apiKey?: string;
|
|
10
|
+
model?: string;
|
|
11
|
+
dimensions?: number;
|
|
12
|
+
search?: MemorySearchConfig;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create a MemoryIndexer with default settings.
|
|
16
|
+
* DB stored at {memoryDir}/.memory.db
|
|
17
|
+
*/
|
|
18
|
+
export declare function createMemoryIndexer(memoryDir: string, opts?: MemoryIndexerOpts): Promise<MemoryIndexer>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { MemoryIndexer } from "./indexer.js";
|
|
3
|
+
import { createEmbeddingProvider } from "./embeddings.js";
|
|
4
|
+
export { MemoryIndexer } from "./indexer.js";
|
|
5
|
+
export { createEmbeddingProvider } from "./embeddings.js";
|
|
6
|
+
/**
|
|
7
|
+
* Create a MemoryIndexer with default settings.
|
|
8
|
+
* DB stored at {memoryDir}/.memory.db
|
|
9
|
+
*/
|
|
10
|
+
export async function createMemoryIndexer(memoryDir, opts) {
|
|
11
|
+
const dbPath = path.join(memoryDir, ".memory.db");
|
|
12
|
+
const embedding = createEmbeddingProvider(opts);
|
|
13
|
+
return new MemoryIndexer(dbPath, memoryDir, embedding, opts?.search);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAA2B,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAA2B,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAa1D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAiB,EAAE,IAAwB;IACnF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { EmbeddingProvider, InvestigationRecord, MemorySearchResult } from "./types.js";
|
|
2
|
+
import { type TemporalDecayConfig } from "./temporal-decay.js";
|
|
3
|
+
import { type MMRConfig } from "./mmr.js";
|
|
4
|
+
export interface MemorySearchConfig {
|
|
5
|
+
vectorWeight?: number;
|
|
6
|
+
ftsWeight?: number;
|
|
7
|
+
temporalDecay?: Partial<TemporalDecayConfig>;
|
|
8
|
+
mmr?: Partial<MMRConfig>;
|
|
9
|
+
}
|
|
10
|
+
export declare class MemoryIndexer {
|
|
11
|
+
private db;
|
|
12
|
+
private memoryDir;
|
|
13
|
+
private embedding;
|
|
14
|
+
private searchConfig;
|
|
15
|
+
private _syncing;
|
|
16
|
+
private _closed;
|
|
17
|
+
/** sqlite-vec extension loaded and vec table dimensions (0 = not available) */
|
|
18
|
+
private _vecDims;
|
|
19
|
+
private _watcher;
|
|
20
|
+
private _watchDebounce;
|
|
21
|
+
private _stmts?;
|
|
22
|
+
constructor(dbPath: string, memoryDir: string, embedding: EmbeddingProvider, searchConfig?: MemorySearchConfig);
|
|
23
|
+
/**
|
|
24
|
+
* Try to load sqlite-vec extension. Non-fatal: falls back to in-memory cosine if unavailable.
|
|
25
|
+
*/
|
|
26
|
+
private tryLoadSqliteVec;
|
|
27
|
+
/**
|
|
28
|
+
* Ensure the vec0 virtual table exists with the right dimensions.
|
|
29
|
+
* Re-creates if dimensions changed.
|
|
30
|
+
*/
|
|
31
|
+
private ensureVecTable;
|
|
32
|
+
private get stmts();
|
|
33
|
+
/**
|
|
34
|
+
* Sync all .md files from memoryDir into SQLite.
|
|
35
|
+
* Only re-processes files whose mtime or hash changed.
|
|
36
|
+
*/
|
|
37
|
+
sync(): Promise<void>;
|
|
38
|
+
private _doSync;
|
|
39
|
+
/**
|
|
40
|
+
* Hybrid search: vector similarity + FTS5 keyword.
|
|
41
|
+
* Weights, temporal decay, and MMR re-ranking are configurable via searchConfig.
|
|
42
|
+
*/
|
|
43
|
+
search(query: string, topK?: number, minScore?: number): Promise<MemorySearchResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Start watching the memory directory for file changes.
|
|
46
|
+
* Triggers a debounced sync (1.5s) on any .md file change.
|
|
47
|
+
*/
|
|
48
|
+
startWatching(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Stop watching the memory directory.
|
|
51
|
+
*/
|
|
52
|
+
stopWatching(): void;
|
|
53
|
+
/** Insert a structured investigation record into the investigations table. */
|
|
54
|
+
insertInvestigation(record: InvestigationRecord): void;
|
|
55
|
+
/** Search past investigations by structured fields. */
|
|
56
|
+
searchInvestigations(_question: string, opts?: {
|
|
57
|
+
rootCauseCategory?: string;
|
|
58
|
+
environmentTag?: string;
|
|
59
|
+
topK?: number;
|
|
60
|
+
}): InvestigationRecord[];
|
|
61
|
+
close(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Embed texts with cache: look up cached embeddings first, only call API for misses.
|
|
64
|
+
* Writes new embeddings back to the cache.
|
|
65
|
+
*/
|
|
66
|
+
private embedWithCache;
|
|
67
|
+
private listMdFiles;
|
|
68
|
+
private vectorSearch;
|
|
69
|
+
private ftsSearch;
|
|
70
|
+
}
|