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,700 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentBox HTTP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides HTTP API for Gateway to call, with SSE streaming support.
|
|
5
|
+
*/
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import http from "node:http";
|
|
9
|
+
import https from "node:https";
|
|
10
|
+
import { hasOpenAIProvider, ensureProxy } from "../core/llm-proxy.js";
|
|
11
|
+
import { deepSearchEvents } from "../tools/deep-search/events.js";
|
|
12
|
+
import { createChecklist, buildActivationMessage } from "../tools/dp-tools.js";
|
|
13
|
+
import { loadConfig } from "../core/config.js";
|
|
14
|
+
import { GatewayClient } from "./gateway-client.js";
|
|
15
|
+
import { getResourceHandler } from "./resource-handlers.js";
|
|
16
|
+
import { RESOURCE_DESCRIPTORS } from "../shared/resource-sync.js";
|
|
17
|
+
/**
|
|
18
|
+
* Parse JSON body
|
|
19
|
+
*/
|
|
20
|
+
async function parseJsonBody(req) {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
let body = "";
|
|
23
|
+
req.on("data", (chunk) => (body += chunk));
|
|
24
|
+
req.on("end", () => {
|
|
25
|
+
try {
|
|
26
|
+
resolve(body ? JSON.parse(body) : {});
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
reject(new Error("Invalid JSON"));
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
req.on("error", reject);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Send JSON response
|
|
37
|
+
*/
|
|
38
|
+
function sendJson(res, status, data) {
|
|
39
|
+
res.writeHead(status, { "Content-Type": "application/json" });
|
|
40
|
+
res.end(JSON.stringify(data));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create HTTP or HTTPS server (auto-detects certificates)
|
|
44
|
+
*/
|
|
45
|
+
export function createHttpServer(sessionManager) {
|
|
46
|
+
// Pre-start LLM proxy (fire-and-forget, ready before first prompt)
|
|
47
|
+
if (hasOpenAIProvider()) {
|
|
48
|
+
ensureProxy().catch(err => console.warn("[agentbox] LLM proxy pre-start failed:", err));
|
|
49
|
+
}
|
|
50
|
+
// ── Idle self-destruct: exit when no SSE connections and no sessions for 5 min ──
|
|
51
|
+
const IDLE_TIMEOUT_MS = 5 * 60 * 1000;
|
|
52
|
+
let activeSseCount = 0;
|
|
53
|
+
let idleTimer = null;
|
|
54
|
+
function resetIdleTimer() {
|
|
55
|
+
if (idleTimer) {
|
|
56
|
+
clearTimeout(idleTimer);
|
|
57
|
+
idleTimer = null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function checkIdle() {
|
|
61
|
+
if (activeSseCount === 0 && sessionManager.activeCount() === 0) {
|
|
62
|
+
if (idleTimer)
|
|
63
|
+
return; // already scheduled
|
|
64
|
+
idleTimer = setTimeout(() => {
|
|
65
|
+
// Re-check before exiting (new connection may have arrived)
|
|
66
|
+
if (activeSseCount === 0 && sessionManager.activeCount() === 0) {
|
|
67
|
+
console.log("[agentbox] No connections for 5 min, shutting down");
|
|
68
|
+
process.exit(0);
|
|
69
|
+
}
|
|
70
|
+
idleTimer = null;
|
|
71
|
+
}, IDLE_TIMEOUT_MS);
|
|
72
|
+
console.log(`[agentbox] Idle detected, will shut down in ${IDLE_TIMEOUT_MS / 1000}s if no activity`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Start initial idle check (pod may never receive any connections)
|
|
76
|
+
checkIdle();
|
|
77
|
+
// Wire session release → idle check (session released after TTL)
|
|
78
|
+
sessionManager.onSessionRelease = () => checkIdle();
|
|
79
|
+
const routes = [];
|
|
80
|
+
// Route registration helper
|
|
81
|
+
function addRoute(method, path, handler) {
|
|
82
|
+
const paramNames = [];
|
|
83
|
+
const patternStr = path.replace(/:(\w+)/g, (_, name) => {
|
|
84
|
+
paramNames.push(name);
|
|
85
|
+
return "([^/]+)";
|
|
86
|
+
});
|
|
87
|
+
routes.push({
|
|
88
|
+
method,
|
|
89
|
+
pattern: new RegExp(`^${patternStr}$`),
|
|
90
|
+
paramNames,
|
|
91
|
+
handler,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// ==================== Routes ====================
|
|
95
|
+
/**
|
|
96
|
+
* GET /health - health check
|
|
97
|
+
*/
|
|
98
|
+
addRoute("GET", "/health", async (_req, res) => {
|
|
99
|
+
sendJson(res, 200, {
|
|
100
|
+
status: "ok",
|
|
101
|
+
sessions: sessionManager.list().length,
|
|
102
|
+
timestamp: new Date().toISOString(),
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
/**
|
|
106
|
+
* GET /api/sessions - list all sessions
|
|
107
|
+
*/
|
|
108
|
+
addRoute("GET", "/api/sessions", async (_req, res) => {
|
|
109
|
+
const sessions = sessionManager.list().map((s) => ({
|
|
110
|
+
id: s.id,
|
|
111
|
+
createdAt: s.createdAt.toISOString(),
|
|
112
|
+
lastActiveAt: s.lastActiveAt.toISOString(),
|
|
113
|
+
}));
|
|
114
|
+
sendJson(res, 200, { sessions });
|
|
115
|
+
});
|
|
116
|
+
/**
|
|
117
|
+
* POST /api/prompt - send a message
|
|
118
|
+
*
|
|
119
|
+
* Body: { sessionId?: string, text: string }
|
|
120
|
+
* Response: { ok: true, sessionId: string }
|
|
121
|
+
*
|
|
122
|
+
* The message is sent to the Agent, and responses are returned via SSE stream.
|
|
123
|
+
*/
|
|
124
|
+
addRoute("POST", "/api/prompt", async (req, res) => {
|
|
125
|
+
const body = (await parseJsonBody(req));
|
|
126
|
+
if (!body.text) {
|
|
127
|
+
sendJson(res, 400, { error: "Missing 'text' field" });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const managed = await sessionManager.getOrCreate(body.sessionId, body.mode, body.brainType);
|
|
131
|
+
// Materialize credential files from payload (sent by gateway in prompt body)
|
|
132
|
+
if (body.credentials?.files?.length) {
|
|
133
|
+
const credDir = path.resolve(process.cwd(), loadConfig().paths.credentialsDir);
|
|
134
|
+
fs.mkdirSync(credDir, { recursive: true });
|
|
135
|
+
// Clear existing files
|
|
136
|
+
for (const entry of fs.readdirSync(credDir)) {
|
|
137
|
+
fs.rmSync(path.join(credDir, entry), { recursive: true });
|
|
138
|
+
}
|
|
139
|
+
// Write credential files
|
|
140
|
+
for (const file of body.credentials.files) {
|
|
141
|
+
fs.writeFileSync(path.join(credDir, file.name), file.content, file.mode ? { mode: file.mode } : undefined);
|
|
142
|
+
}
|
|
143
|
+
// Write manifest
|
|
144
|
+
fs.writeFileSync(path.join(credDir, "manifest.json"), JSON.stringify(body.credentials.manifest, null, 2));
|
|
145
|
+
managed.kubeconfigRef.credentialsDir = credDir;
|
|
146
|
+
console.log(`[agentbox-http] Materialized ${body.credentials.files.length} credential files to ${credDir}`);
|
|
147
|
+
}
|
|
148
|
+
// Dynamically register provider config from gateway DB (before findModel)
|
|
149
|
+
if (body.modelConfig && body.modelProvider && managed.brain.registerProvider) {
|
|
150
|
+
try {
|
|
151
|
+
managed.brain.registerProvider(body.modelProvider, body.modelConfig);
|
|
152
|
+
console.log(`[agentbox-http] Registered provider "${body.modelProvider}" from gateway DB config`);
|
|
153
|
+
// Update LLM config ref so deep_search sub-agents follow the main model
|
|
154
|
+
const mc = body.modelConfig;
|
|
155
|
+
if (mc.baseUrl && mc.apiKey) {
|
|
156
|
+
managed.llmConfigRef.apiKey = mc.apiKey;
|
|
157
|
+
managed.llmConfigRef.baseUrl = mc.baseUrl;
|
|
158
|
+
if (mc.api) {
|
|
159
|
+
managed.llmConfigRef.api = mc.api;
|
|
160
|
+
}
|
|
161
|
+
// Use the specific modelId from the prompt if available
|
|
162
|
+
if (body.modelId) {
|
|
163
|
+
managed.llmConfigRef.model = body.modelId;
|
|
164
|
+
}
|
|
165
|
+
console.log(`[agentbox-http] Updated llmConfigRef: baseUrl=${mc.baseUrl.slice(0, 40)}... model=${managed.llmConfigRef.model}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
console.warn(`[agentbox-http] Failed to register provider "${body.modelProvider}":`, err instanceof Error ? err.message : err);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Set model if specified in prompt request (ensures model is applied before first prompt)
|
|
173
|
+
if (body.modelProvider && body.modelId) {
|
|
174
|
+
const found = managed.brain.findModel(body.modelProvider, body.modelId);
|
|
175
|
+
if (found) {
|
|
176
|
+
const currentModel = managed.brain.getModel();
|
|
177
|
+
if (!currentModel || currentModel.id !== found.id || currentModel.provider !== found.provider) {
|
|
178
|
+
console.log(`[agentbox-http] Setting model for session ${managed.id}: ${found.provider}/${found.id}`);
|
|
179
|
+
await managed.brain.setModel(found);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Reset prompt state and start buffering events before async execution
|
|
184
|
+
managed._promptDone = false;
|
|
185
|
+
managed._aborted = false;
|
|
186
|
+
managed._eventBuffer = [];
|
|
187
|
+
// Unsubscribe previous buffer listener if any
|
|
188
|
+
if (managed._bufferUnsub) {
|
|
189
|
+
managed._bufferUnsub();
|
|
190
|
+
}
|
|
191
|
+
// Subscribe to buffer events so SSE can replay them even if it connects late
|
|
192
|
+
const brainUnsub = managed.brain.subscribe((event) => {
|
|
193
|
+
if (!managed._promptDone) {
|
|
194
|
+
managed._eventBuffer.push(event);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
// Also buffer deep_search progress events (same stream as session events)
|
|
198
|
+
const deepProgressBufHandler = (event) => {
|
|
199
|
+
if (!managed._promptDone) {
|
|
200
|
+
managed._eventBuffer.push({
|
|
201
|
+
type: "tool_progress",
|
|
202
|
+
toolName: "deep_search",
|
|
203
|
+
progress: event,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
deepSearchEvents.on("progress", deepProgressBufHandler);
|
|
208
|
+
managed._bufferUnsub = () => {
|
|
209
|
+
brainUnsub();
|
|
210
|
+
deepSearchEvents.off("progress", deepProgressBufHandler);
|
|
211
|
+
};
|
|
212
|
+
// --- DP input transformation (SDK brain only — pi-agent uses extension input handlers) ---
|
|
213
|
+
let promptText = body.text;
|
|
214
|
+
if (managed.dpState) {
|
|
215
|
+
const dpState = managed.dpState;
|
|
216
|
+
const DP_MARKER = "[Deep Investigation]\n";
|
|
217
|
+
const EXIT_MARKER = "[DP_EXIT]\n";
|
|
218
|
+
if (promptText.startsWith(DP_MARKER)) {
|
|
219
|
+
const question = promptText.slice(DP_MARKER.length).trim();
|
|
220
|
+
if (question) {
|
|
221
|
+
dpState.checklist = createChecklist(question);
|
|
222
|
+
promptText = buildActivationMessage(question);
|
|
223
|
+
console.log(`[agentbox-http] DP activated for SDK brain, session ${managed.id}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
else if (promptText.startsWith(EXIT_MARKER)) {
|
|
227
|
+
const userText = promptText.slice(EXIT_MARKER.length).trim();
|
|
228
|
+
if (dpState.checklist) {
|
|
229
|
+
for (const item of dpState.checklist.items) {
|
|
230
|
+
if (item.status === "pending" || item.status === "in_progress") {
|
|
231
|
+
item.status = "skipped";
|
|
232
|
+
item.summary = "User exited investigation";
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
dpState.checklist = null;
|
|
237
|
+
promptText = `The user has exited deep investigation mode. ${userText}`;
|
|
238
|
+
console.log(`[agentbox-http] DP exited for SDK brain, session ${managed.id}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Execute prompt asynchronously; notify SSE to close on completion
|
|
242
|
+
console.log(`[agentbox-http] Starting prompt for session ${managed.id}`);
|
|
243
|
+
const actuallyFinish = () => {
|
|
244
|
+
managed._promptDone = true;
|
|
245
|
+
// Stop buffering
|
|
246
|
+
if (managed._bufferUnsub) {
|
|
247
|
+
managed._bufferUnsub();
|
|
248
|
+
managed._bufferUnsub = null;
|
|
249
|
+
}
|
|
250
|
+
for (const cb of managed._promptDoneCallbacks) {
|
|
251
|
+
cb();
|
|
252
|
+
}
|
|
253
|
+
managed._promptDoneCallbacks.clear();
|
|
254
|
+
// Schedule delayed release — gives frontend time to query context/model
|
|
255
|
+
// after SSE closes. If a new prompt arrives before the TTL, the timer is
|
|
256
|
+
// cancelled in getOrCreate() and the session stays alive.
|
|
257
|
+
sessionManager.scheduleRelease(managed.id);
|
|
258
|
+
};
|
|
259
|
+
const onPromptFinish = () => {
|
|
260
|
+
// If the agent is still active, auto-compaction is in progress, or an
|
|
261
|
+
// auto-retry is pending, defer SSE close until the agent is truly done —
|
|
262
|
+
// otherwise the frontend misses events.
|
|
263
|
+
if (managed.isAgentActive || managed.isCompacting || managed.isRetrying) {
|
|
264
|
+
console.log(`[agentbox-http] Prompt resolved but agent still busy for session ${managed.id} (active=${managed.isAgentActive} compacting=${managed.isCompacting} retrying=${managed.isRetrying}), deferring SSE close`);
|
|
265
|
+
const unsub = managed.brain.subscribe((event) => {
|
|
266
|
+
if (event.type === "agent_end" || event.type === "auto_compaction_end" || event.type === "auto_retry_end") {
|
|
267
|
+
// Use setTimeout to let synchronous follow-up events (e.g.
|
|
268
|
+
// auto_compaction_start right after agent_end, or agent_start
|
|
269
|
+
// right after auto_retry_end) fire first.
|
|
270
|
+
setTimeout(() => {
|
|
271
|
+
if (!managed.isCompacting && !managed.isAgentActive && !managed.isRetrying) {
|
|
272
|
+
unsub();
|
|
273
|
+
actuallyFinish();
|
|
274
|
+
}
|
|
275
|
+
}, 50);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
actuallyFinish();
|
|
281
|
+
};
|
|
282
|
+
managed.brain.prompt(promptText).then(() => {
|
|
283
|
+
console.log(`[agentbox-http] Prompt completed for session ${managed.id}`);
|
|
284
|
+
onPromptFinish();
|
|
285
|
+
}).catch((err) => {
|
|
286
|
+
console.error(`[agentbox-http] Prompt error for session ${managed.id}:`, err);
|
|
287
|
+
onPromptFinish();
|
|
288
|
+
});
|
|
289
|
+
sendJson(res, 200, { ok: true, sessionId: managed.id, brainType: managed.brainType });
|
|
290
|
+
});
|
|
291
|
+
/**
|
|
292
|
+
* GET /api/stream/:sessionId - SSE event stream
|
|
293
|
+
*
|
|
294
|
+
* Subscribe to the event stream of the specified session.
|
|
295
|
+
*/
|
|
296
|
+
addRoute("GET", "/api/stream/:sessionId", async (req, res, params) => {
|
|
297
|
+
const { sessionId } = params;
|
|
298
|
+
console.log(`[agentbox-http] SSE stream request for session ${sessionId}`);
|
|
299
|
+
const managed = sessionManager.get(sessionId);
|
|
300
|
+
if (!managed) {
|
|
301
|
+
console.log(`[agentbox-http] Session ${sessionId} not found`);
|
|
302
|
+
sendJson(res, 404, { error: "Session not found" });
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
console.log(`[agentbox-http] Starting SSE stream for session ${sessionId}`);
|
|
306
|
+
// Track active SSE connections for idle self-destruct
|
|
307
|
+
activeSseCount++;
|
|
308
|
+
resetIdleTimer();
|
|
309
|
+
// Set SSE response headers
|
|
310
|
+
res.writeHead(200, {
|
|
311
|
+
"Content-Type": "text/event-stream",
|
|
312
|
+
"Cache-Control": "no-cache",
|
|
313
|
+
Connection: "keep-alive",
|
|
314
|
+
"Access-Control-Allow-Origin": "*",
|
|
315
|
+
});
|
|
316
|
+
// Track connection state
|
|
317
|
+
let closed = false;
|
|
318
|
+
let sseEventCount = 0;
|
|
319
|
+
// Write a single SSE event
|
|
320
|
+
const writeEvent = (event) => {
|
|
321
|
+
if (closed || res.writableEnded)
|
|
322
|
+
return;
|
|
323
|
+
try {
|
|
324
|
+
sseEventCount++;
|
|
325
|
+
const data = JSON.stringify(event);
|
|
326
|
+
res.write(`data: ${data}\n\n`);
|
|
327
|
+
}
|
|
328
|
+
catch (err) {
|
|
329
|
+
console.warn(`[agentbox-http] SSE write error for session ${sessionId}:`, err);
|
|
330
|
+
closed = true;
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
// Close SSE helper
|
|
334
|
+
const closeSSE = () => {
|
|
335
|
+
if (!closed && !res.writableEnded) {
|
|
336
|
+
closed = true;
|
|
337
|
+
res.end();
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
// Replay any buffered events (emitted before SSE connected)
|
|
341
|
+
for (const event of managed._eventBuffer) {
|
|
342
|
+
writeEvent(event);
|
|
343
|
+
}
|
|
344
|
+
// If prompt already finished before SSE connected, close immediately
|
|
345
|
+
if (managed._promptDone) {
|
|
346
|
+
console.log(`[agentbox-http] Prompt already done for session ${sessionId}, closing SSE after replay (${managed._eventBuffer.length} events)`);
|
|
347
|
+
closeSSE();
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
// Subscribe to Agent events (live, after buffer replay)
|
|
351
|
+
const unsubscribe = managed.brain.subscribe((event) => {
|
|
352
|
+
writeEvent(event);
|
|
353
|
+
});
|
|
354
|
+
// Also forward deep_search progress events as tool_progress SSE events
|
|
355
|
+
const deepProgressSSEHandler = (event) => {
|
|
356
|
+
writeEvent({
|
|
357
|
+
type: "tool_progress",
|
|
358
|
+
toolName: "deep_search",
|
|
359
|
+
progress: event,
|
|
360
|
+
});
|
|
361
|
+
};
|
|
362
|
+
deepSearchEvents.on("progress", deepProgressSSEHandler);
|
|
363
|
+
// Heartbeat: send SSE comment every 30s to keep connection alive
|
|
364
|
+
// during long agent thinking periods (prevents proxy/fetch body timeouts)
|
|
365
|
+
const heartbeat = setInterval(() => {
|
|
366
|
+
if (closed || res.writableEnded) {
|
|
367
|
+
clearInterval(heartbeat);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
try {
|
|
371
|
+
res.write(": heartbeat\n\n");
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
clearInterval(heartbeat);
|
|
375
|
+
}
|
|
376
|
+
}, 30_000);
|
|
377
|
+
// Cleanup helper: unsubscribe from all event sources
|
|
378
|
+
const unsubAll = () => {
|
|
379
|
+
unsubscribe();
|
|
380
|
+
deepSearchEvents.off("progress", deepProgressSSEHandler);
|
|
381
|
+
};
|
|
382
|
+
// Decrement SSE counter and check idle (called once per SSE lifecycle)
|
|
383
|
+
let sseCountDecremented = false;
|
|
384
|
+
const decrementSse = () => {
|
|
385
|
+
if (!sseCountDecremented) {
|
|
386
|
+
sseCountDecremented = true;
|
|
387
|
+
activeSseCount--;
|
|
388
|
+
checkIdle();
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
// Close SSE when prompt completes
|
|
392
|
+
const cleanup = () => {
|
|
393
|
+
console.log(`[agentbox-http] SSE closing for session ${sessionId} (prompt done, ${sseEventCount} events sent)`);
|
|
394
|
+
clearInterval(heartbeat);
|
|
395
|
+
unsubAll();
|
|
396
|
+
closeSSE();
|
|
397
|
+
decrementSse();
|
|
398
|
+
};
|
|
399
|
+
managed._promptDoneCallbacks.add(cleanup);
|
|
400
|
+
// Unsubscribe when client disconnects
|
|
401
|
+
req.on("close", () => {
|
|
402
|
+
console.log(`[agentbox-http] SSE client disconnected for session ${sessionId} (${sseEventCount} events sent)`);
|
|
403
|
+
closed = true;
|
|
404
|
+
clearInterval(heartbeat);
|
|
405
|
+
managed._promptDoneCallbacks.delete(cleanup);
|
|
406
|
+
unsubAll();
|
|
407
|
+
decrementSse();
|
|
408
|
+
});
|
|
409
|
+
// Handle response errors
|
|
410
|
+
res.on("error", (err) => {
|
|
411
|
+
console.warn(`[agentbox-http] SSE response error for session ${sessionId}:`, err);
|
|
412
|
+
closed = true;
|
|
413
|
+
clearInterval(heartbeat);
|
|
414
|
+
managed._promptDoneCallbacks.delete(cleanup);
|
|
415
|
+
unsubAll();
|
|
416
|
+
decrementSse();
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
/**
|
|
420
|
+
* POST /api/sessions/:sessionId/steer - send a steer instruction (insert user message after current tool is interrupted)
|
|
421
|
+
*/
|
|
422
|
+
addRoute("POST", "/api/sessions/:sessionId/steer", async (req, res, params) => {
|
|
423
|
+
const { sessionId } = params;
|
|
424
|
+
const managed = sessionManager.get(sessionId);
|
|
425
|
+
if (!managed) {
|
|
426
|
+
sendJson(res, 404, { error: "Session not found" });
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
const body = (await parseJsonBody(req));
|
|
430
|
+
if (!body.text) {
|
|
431
|
+
sendJson(res, 400, { error: "Missing 'text' field" });
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
console.log(`[agentbox-http] Steering session ${sessionId}: ${body.text.slice(0, 80)}`);
|
|
435
|
+
try {
|
|
436
|
+
await managed.brain.steer(body.text);
|
|
437
|
+
sendJson(res, 200, { ok: true });
|
|
438
|
+
}
|
|
439
|
+
catch (err) {
|
|
440
|
+
console.error(`[agentbox-http] Steer error for session ${sessionId}:`, err);
|
|
441
|
+
sendJson(res, 500, { error: "Steer failed" });
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
/**
|
|
445
|
+
* POST /api/sessions/:sessionId/clear-queue - clear queued steer/followUp messages
|
|
446
|
+
*/
|
|
447
|
+
addRoute("POST", "/api/sessions/:sessionId/clear-queue", async (_req, res, params) => {
|
|
448
|
+
const { sessionId } = params;
|
|
449
|
+
const managed = sessionManager.get(sessionId);
|
|
450
|
+
if (!managed) {
|
|
451
|
+
sendJson(res, 404, { error: "Session not found" });
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
console.log(`[agentbox-http] Clearing queue for session ${sessionId}`);
|
|
455
|
+
const cleared = managed.brain.clearQueue();
|
|
456
|
+
sendJson(res, 200, { ok: true, ...cleared });
|
|
457
|
+
});
|
|
458
|
+
/**
|
|
459
|
+
* POST /api/sessions/:sessionId/abort - abort the current prompt
|
|
460
|
+
*/
|
|
461
|
+
addRoute("POST", "/api/sessions/:sessionId/abort", async (_req, res, params) => {
|
|
462
|
+
const { sessionId } = params;
|
|
463
|
+
const managed = sessionManager.get(sessionId);
|
|
464
|
+
if (!managed) {
|
|
465
|
+
sendJson(res, 404, { error: "Session not found" });
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
console.log(`[agentbox-http] Aborting session ${sessionId} (abort endpoint called)`);
|
|
469
|
+
console.trace(`[agentbox-http] Abort stack trace for session ${sessionId}`);
|
|
470
|
+
managed._aborted = true;
|
|
471
|
+
try {
|
|
472
|
+
await managed.brain.abort();
|
|
473
|
+
sendJson(res, 200, { ok: true });
|
|
474
|
+
}
|
|
475
|
+
catch (err) {
|
|
476
|
+
console.error(`[agentbox-http] Abort error for session ${sessionId}:`, err);
|
|
477
|
+
sendJson(res, 500, { error: "Abort failed" });
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
/**
|
|
481
|
+
* POST /api/reload-{mcp,skills} — unified resource reload endpoints
|
|
482
|
+
*
|
|
483
|
+
* Each endpoint delegates to the matching AgentBoxResourceHandler:
|
|
484
|
+
* fetch → materialize → postReload.
|
|
485
|
+
* URL paths are preserved for backward compatibility.
|
|
486
|
+
*/
|
|
487
|
+
let _reloadGatewayClient = null;
|
|
488
|
+
function getReloadGatewayClient() {
|
|
489
|
+
const gatewayUrl = process.env.SICLAW_GATEWAY_URL;
|
|
490
|
+
if (!gatewayUrl)
|
|
491
|
+
return null;
|
|
492
|
+
if (!_reloadGatewayClient)
|
|
493
|
+
_reloadGatewayClient = new GatewayClient({ gatewayUrl });
|
|
494
|
+
return _reloadGatewayClient;
|
|
495
|
+
}
|
|
496
|
+
for (const descriptor of Object.values(RESOURCE_DESCRIPTORS)) {
|
|
497
|
+
addRoute("POST", descriptor.reloadPath, async (_req, res) => {
|
|
498
|
+
const resourceType = descriptor.type;
|
|
499
|
+
console.log(`[agentbox-http] Reloading ${resourceType} configuration`);
|
|
500
|
+
const client = getReloadGatewayClient();
|
|
501
|
+
if (!client) {
|
|
502
|
+
console.warn(`[agentbox-http] No SICLAW_GATEWAY_URL configured, skipping ${resourceType} reload`);
|
|
503
|
+
sendJson(res, 200, { ok: true, count: 0, type: resourceType });
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
const handler = getResourceHandler(resourceType);
|
|
507
|
+
if (!handler) {
|
|
508
|
+
sendJson(res, 500, { error: `No handler for resource type "${resourceType}"` });
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
try {
|
|
512
|
+
const payload = await handler.fetch(client.toClientLike());
|
|
513
|
+
const count = await handler.materialize(payload);
|
|
514
|
+
// Build session list for postReload (skills needs brain.reload())
|
|
515
|
+
const sessions = sessionManager.list().map((s) => ({
|
|
516
|
+
id: s.id,
|
|
517
|
+
brain: s.brain,
|
|
518
|
+
}));
|
|
519
|
+
if (handler.postReload) {
|
|
520
|
+
await handler.postReload({ sessions });
|
|
521
|
+
}
|
|
522
|
+
console.log(`[agentbox-http] ${resourceType} reloaded: ${count} items`);
|
|
523
|
+
sendJson(res, 200, { ok: true, count, type: resourceType });
|
|
524
|
+
}
|
|
525
|
+
catch (err) {
|
|
526
|
+
console.error(`[agentbox-http] Failed to reload ${resourceType}: ${err.message}`);
|
|
527
|
+
sendJson(res, 500, { error: `${resourceType} reload failed: ${err.message}` });
|
|
528
|
+
}
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* GET /api/models - list available models (read from settings.json)
|
|
533
|
+
*/
|
|
534
|
+
addRoute("GET", "/api/models", async (_req, res) => {
|
|
535
|
+
const config = loadConfig();
|
|
536
|
+
const models = [];
|
|
537
|
+
for (const [provider, providerConfig] of Object.entries(config.providers)) {
|
|
538
|
+
for (const m of providerConfig.models) {
|
|
539
|
+
models.push({
|
|
540
|
+
id: m.id,
|
|
541
|
+
name: m.name,
|
|
542
|
+
provider,
|
|
543
|
+
contextWindow: m.contextWindow ?? 0,
|
|
544
|
+
maxTokens: m.maxTokens ?? 0,
|
|
545
|
+
reasoning: m.reasoning ?? false,
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
sendJson(res, 200, { models });
|
|
550
|
+
});
|
|
551
|
+
/**
|
|
552
|
+
* GET /api/sessions/:sessionId/model - get current model
|
|
553
|
+
*/
|
|
554
|
+
addRoute("GET", "/api/sessions/:sessionId/model", async (_req, res, params) => {
|
|
555
|
+
const { sessionId } = params;
|
|
556
|
+
const managed = sessionManager.get(sessionId);
|
|
557
|
+
if (!managed) {
|
|
558
|
+
sendJson(res, 404, { error: "Session not found" });
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
const model = managed.brain.getModel();
|
|
562
|
+
sendJson(res, 200, {
|
|
563
|
+
model: model ?? null,
|
|
564
|
+
brainType: managed.brainType,
|
|
565
|
+
});
|
|
566
|
+
});
|
|
567
|
+
/**
|
|
568
|
+
* POST /api/sessions/:sessionId/model - switch model
|
|
569
|
+
*/
|
|
570
|
+
addRoute("POST", "/api/sessions/:sessionId/model", async (req, res, params) => {
|
|
571
|
+
const { sessionId } = params;
|
|
572
|
+
const managed = sessionManager.get(sessionId);
|
|
573
|
+
if (!managed) {
|
|
574
|
+
sendJson(res, 404, { error: "Session not found" });
|
|
575
|
+
return;
|
|
576
|
+
}
|
|
577
|
+
const body = (await parseJsonBody(req));
|
|
578
|
+
if (!body.provider || !body.modelId) {
|
|
579
|
+
sendJson(res, 400, { error: "Missing 'provider' and/or 'modelId'" });
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
const model = managed.brain.findModel(body.provider, body.modelId);
|
|
583
|
+
if (!model) {
|
|
584
|
+
sendJson(res, 404, { error: "Model not found" });
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
console.log(`[agentbox-http] Switching model for session ${sessionId}: ${model.provider}/${model.id}`);
|
|
588
|
+
await managed.brain.setModel(model);
|
|
589
|
+
sendJson(res, 200, { ok: true, model });
|
|
590
|
+
});
|
|
591
|
+
/**
|
|
592
|
+
* GET /api/sessions/:sessionId/context - get context usage
|
|
593
|
+
*/
|
|
594
|
+
addRoute("GET", "/api/sessions/:sessionId/context", async (_req, res, params) => {
|
|
595
|
+
const { sessionId } = params;
|
|
596
|
+
const managed = sessionManager.get(sessionId);
|
|
597
|
+
if (!managed) {
|
|
598
|
+
sendJson(res, 404, { error: "Session not found" });
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
const usage = managed.brain.getContextUsage();
|
|
602
|
+
const stats = managed.brain.getSessionStats();
|
|
603
|
+
sendJson(res, 200, {
|
|
604
|
+
tokens: usage?.tokens ?? 0,
|
|
605
|
+
contextWindow: usage?.contextWindow ?? 0,
|
|
606
|
+
percent: usage?.percent ?? 0,
|
|
607
|
+
isCompacting: managed.isCompacting,
|
|
608
|
+
inputTokens: stats.tokens.input,
|
|
609
|
+
outputTokens: stats.tokens.output,
|
|
610
|
+
cacheReadTokens: stats.tokens.cacheRead,
|
|
611
|
+
cacheWriteTokens: stats.tokens.cacheWrite,
|
|
612
|
+
cost: stats.cost,
|
|
613
|
+
});
|
|
614
|
+
});
|
|
615
|
+
/**
|
|
616
|
+
* POST /api/sessions/:sessionId/close - close session
|
|
617
|
+
*/
|
|
618
|
+
addRoute("POST", "/api/sessions/:sessionId/close", async (_req, res, params) => {
|
|
619
|
+
const { sessionId } = params;
|
|
620
|
+
await sessionManager.close(sessionId);
|
|
621
|
+
sendJson(res, 200, { ok: true });
|
|
622
|
+
});
|
|
623
|
+
// ==================== Server ====================
|
|
624
|
+
/** Main request handler shared by HTTP and HTTPS servers */
|
|
625
|
+
const requestHandler = async (req, res) => {
|
|
626
|
+
const method = req.method || "GET";
|
|
627
|
+
const url = new URL(req.url || "/", `http://${req.headers.host}`);
|
|
628
|
+
const pathname = url.pathname;
|
|
629
|
+
// CORS preflight
|
|
630
|
+
if (method === "OPTIONS") {
|
|
631
|
+
res.writeHead(200, {
|
|
632
|
+
"Access-Control-Allow-Origin": "*",
|
|
633
|
+
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
|
|
634
|
+
"Access-Control-Allow-Headers": "Content-Type, Authorization",
|
|
635
|
+
});
|
|
636
|
+
res.end();
|
|
637
|
+
return;
|
|
638
|
+
}
|
|
639
|
+
// mTLS Gateway identity check (HTTPS only, skip /health for K8s probes)
|
|
640
|
+
if (useTls && pathname !== "/health") {
|
|
641
|
+
const tlsSocket = req.socket;
|
|
642
|
+
const peerCert = tlsSocket.getPeerCertificate?.();
|
|
643
|
+
if (!peerCert || !peerCert.subject) {
|
|
644
|
+
sendJson(res, 403, { error: "Client certificate required" });
|
|
645
|
+
return;
|
|
646
|
+
}
|
|
647
|
+
if (peerCert.subject.OU !== "Gateway") {
|
|
648
|
+
console.warn(`[agentbox-http] Rejected request from OU=${peerCert.subject.OU} (expected Gateway)`);
|
|
649
|
+
sendJson(res, 403, { error: "Forbidden: only Gateway can access this API" });
|
|
650
|
+
return;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
// Match route
|
|
654
|
+
for (const route of routes) {
|
|
655
|
+
if (route.method !== method)
|
|
656
|
+
continue;
|
|
657
|
+
const match = pathname.match(route.pattern);
|
|
658
|
+
if (!match)
|
|
659
|
+
continue;
|
|
660
|
+
// Extract path parameters
|
|
661
|
+
const params = {};
|
|
662
|
+
route.paramNames.forEach((name, i) => {
|
|
663
|
+
params[name] = match[i + 1];
|
|
664
|
+
});
|
|
665
|
+
try {
|
|
666
|
+
await route.handler(req, res, params);
|
|
667
|
+
}
|
|
668
|
+
catch (err) {
|
|
669
|
+
console.error(`[agentbox-http] Error handling ${method} ${pathname}:`, err);
|
|
670
|
+
if (!res.headersSent) {
|
|
671
|
+
sendJson(res, 500, { error: "Internal server error" });
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
return;
|
|
675
|
+
}
|
|
676
|
+
// 404
|
|
677
|
+
sendJson(res, 404, { error: "Not found" });
|
|
678
|
+
};
|
|
679
|
+
// Detect TLS certificates
|
|
680
|
+
const certPath = process.env.SICLAW_CERT_PATH || "/etc/siclaw/certs";
|
|
681
|
+
const certFile = path.join(certPath, "tls.crt");
|
|
682
|
+
const keyFile = path.join(certPath, "tls.key");
|
|
683
|
+
const caFile = path.join(certPath, "ca.crt");
|
|
684
|
+
const useTls = fs.existsSync(certFile) && fs.existsSync(keyFile) && fs.existsSync(caFile);
|
|
685
|
+
if (useTls) {
|
|
686
|
+
console.log(`[agentbox-http] TLS certificates found at ${certPath}, starting HTTPS server`);
|
|
687
|
+
const server = https.createServer({
|
|
688
|
+
cert: fs.readFileSync(certFile),
|
|
689
|
+
key: fs.readFileSync(keyFile),
|
|
690
|
+
ca: fs.readFileSync(caFile),
|
|
691
|
+
requestCert: true,
|
|
692
|
+
rejectUnauthorized: false, // Allow K8s probes without client cert; app-layer checks OU for non-health routes
|
|
693
|
+
}, requestHandler);
|
|
694
|
+
return server;
|
|
695
|
+
}
|
|
696
|
+
console.log("[agentbox-http] No TLS certificates found, starting HTTP server (dev mode)");
|
|
697
|
+
const server = http.createServer(requestHandler);
|
|
698
|
+
return server;
|
|
699
|
+
}
|
|
700
|
+
//# sourceMappingURL=http-server.js.map
|