agim-cli 1.4.9 → 1.5.1
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/CHANGELOG.md +437 -402
- package/README.md +43 -7
- package/README.zh-CN.md +42 -7
- package/bin/agim_rpc.py +12 -12
- package/dist/cli-ui/cmd-handlers.d.ts +25 -4
- package/dist/cli-ui/cmd-handlers.d.ts.map +1 -1
- package/dist/cli-ui/cmd-handlers.js +315 -59
- package/dist/cli-ui/cmd-handlers.js.map +1 -1
- package/dist/cli-ui/config-wizard.d.ts +13 -1
- package/dist/cli-ui/config-wizard.d.ts.map +1 -1
- package/dist/cli-ui/config-wizard.js +120 -48
- package/dist/cli-ui/config-wizard.js.map +1 -1
- package/dist/cli-ui/doctor.d.ts +15 -0
- package/dist/cli-ui/doctor.d.ts.map +1 -0
- package/dist/cli-ui/doctor.js +151 -0
- package/dist/cli-ui/doctor.js.map +1 -0
- package/dist/cli-ui/entry-menu.d.ts +6 -0
- package/dist/cli-ui/entry-menu.d.ts.map +1 -1
- package/dist/cli-ui/entry-menu.js +67 -30
- package/dist/cli-ui/entry-menu.js.map +1 -1
- package/dist/cli-ui/env-file.d.ts +4 -4
- package/dist/cli-ui/env-file.js +13 -13
- package/dist/cli-ui/env-file.js.map +1 -1
- package/dist/cli-ui/i18n.d.ts +17 -8
- package/dist/cli-ui/i18n.d.ts.map +1 -1
- package/dist/cli-ui/i18n.js +39 -21
- package/dist/cli-ui/i18n.js.map +1 -1
- package/dist/cli-ui/lang-picker.js +1 -1
- package/dist/cli-ui/lang-picker.js.map +1 -1
- package/dist/cli-ui/paths.d.ts.map +1 -1
- package/dist/cli-ui/paths.js +2 -4
- package/dist/cli-ui/paths.js.map +1 -1
- package/dist/cli-ui/quickstart.d.ts +3 -0
- package/dist/cli-ui/quickstart.d.ts.map +1 -0
- package/dist/cli-ui/quickstart.js +108 -0
- package/dist/cli-ui/quickstart.js.map +1 -0
- package/dist/cli-ui/readiness.d.ts +10 -0
- package/dist/cli-ui/readiness.d.ts.map +1 -0
- package/dist/cli-ui/readiness.js +75 -0
- package/dist/cli-ui/readiness.js.map +1 -0
- package/dist/cli-ui/service.d.ts +30 -7
- package/dist/cli-ui/service.d.ts.map +1 -1
- package/dist/cli-ui/service.js +171 -77
- package/dist/cli-ui/service.js.map +1 -1
- package/dist/cli-ui/tui/app.js +2 -2
- package/dist/cli-ui/tui/app.js.map +1 -1
- package/dist/cli-ui/tui/index.js +6 -6
- package/dist/cli-ui/tui/index.js.map +1 -1
- package/dist/cli-ui/tui/mouse-stdin.js +1 -1
- package/dist/cli-ui/tui/mouse-stdin.js.map +1 -1
- package/dist/cli-ui/tui/stream-reveal.d.ts +2 -2
- package/dist/cli-ui/tui/stream-reveal.d.ts.map +1 -1
- package/dist/cli-ui/tui/stream-reveal.js +4 -4
- package/dist/cli-ui/tui/stream-reveal.js.map +1 -1
- package/dist/cli.js +118 -436
- package/dist/cli.js.map +1 -1
- package/dist/core/a2a-notify.js +5 -5
- package/dist/core/a2a-notify.js.map +1 -1
- package/dist/core/a2a.d.ts +2 -2
- package/dist/core/a2a.d.ts.map +1 -1
- package/dist/core/a2a.js +12 -12
- package/dist/core/a2a.js.map +1 -1
- package/dist/core/access-token.d.ts +1 -1
- package/dist/core/access-token.js +7 -7
- package/dist/core/access-token.js.map +1 -1
- package/dist/core/acp-server.d.ts.map +1 -1
- package/dist/core/acp-server.js +21 -7
- package/dist/core/acp-server.js.map +1 -1
- package/dist/core/admin-allowlist.js +5 -5
- package/dist/core/admin-allowlist.js.map +1 -1
- package/dist/core/agent-base.d.ts +1 -1
- package/dist/core/agent-base.js +3 -3
- package/dist/core/agent-base.js.map +1 -1
- package/dist/core/agent-cwd.d.ts +13 -6
- package/dist/core/agent-cwd.d.ts.map +1 -1
- package/dist/core/agent-cwd.js +72 -23
- package/dist/core/agent-cwd.js.map +1 -1
- package/dist/core/agim-paths.d.ts +1 -4
- package/dist/core/agim-paths.d.ts.map +1 -1
- package/dist/core/agim-paths.js +18 -35
- package/dist/core/agim-paths.js.map +1 -1
- package/dist/core/approval-bus.d.ts +4 -4
- package/dist/core/approval-bus.d.ts.map +1 -1
- package/dist/core/approval-bus.js +14 -14
- package/dist/core/approval-bus.js.map +1 -1
- package/dist/core/approval-router.js +2 -2
- package/dist/core/artifacts.js +3 -3
- package/dist/core/artifacts.js.map +1 -1
- package/dist/core/ask-user-rpc.js +1 -1
- package/dist/core/ask-user-rpc.js.map +1 -1
- package/dist/core/audit-log.js +2 -2
- package/dist/core/audit-log.js.map +1 -1
- package/dist/core/bgjob-reader.d.ts +1 -1
- package/dist/core/bgjob-reader.js +4 -4
- package/dist/core/bgjob-reader.js.map +1 -1
- package/dist/core/commands/approval.js +2 -2
- package/dist/core/commands/approval.js.map +1 -1
- package/dist/core/commands/builtin.d.ts.map +1 -1
- package/dist/core/commands/builtin.js +12 -2
- package/dist/core/commands/builtin.js.map +1 -1
- package/dist/core/commands/heartbeat.js +2 -2
- package/dist/core/commands/heartbeat.js.map +1 -1
- package/dist/core/commands/memo.js +1 -1
- package/dist/core/commands/memo.js.map +1 -1
- package/dist/core/commands/model.d.ts.map +1 -1
- package/dist/core/commands/model.js +32 -3
- package/dist/core/commands/model.js.map +1 -1
- package/dist/core/commands/plan.js +3 -3
- package/dist/core/commands/plan.js.map +1 -1
- package/dist/core/commands/router-compare.js +3 -3
- package/dist/core/commands/router-compare.js.map +1 -1
- package/dist/core/commands/service.d.ts.map +1 -1
- package/dist/core/commands/service.js +1 -3
- package/dist/core/commands/service.js.map +1 -1
- package/dist/core/commands/sessions.js +4 -4
- package/dist/core/commands/sessions.js.map +1 -1
- package/dist/core/commands/skill.js +1 -1
- package/dist/core/commands/skill.js.map +1 -1
- package/dist/core/commands/stats.js +1 -1
- package/dist/core/commands/stats.js.map +1 -1
- package/dist/core/commands/web.js +5 -5
- package/dist/core/commands/web.js.map +1 -1
- package/dist/core/config-schema.js +1 -1
- package/dist/core/coord-systems.d.ts +1 -1
- package/dist/core/coord-systems.js +4 -4
- package/dist/core/coord-systems.js.map +1 -1
- package/dist/core/event-bus.d.ts +5 -5
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +3 -3
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/feature-flags.d.ts +2 -2
- package/dist/core/feature-flags.js +4 -4
- package/dist/core/feature-flags.js.map +1 -1
- package/dist/core/goal-rpc.js +2 -2
- package/dist/core/goal-rpc.js.map +1 -1
- package/dist/core/goals.d.ts +1 -1
- package/dist/core/goals.js +3 -3
- package/dist/core/goals.js.map +1 -1
- package/dist/core/heartbeat-store.d.ts +1 -1
- package/dist/core/heartbeat-store.d.ts.map +1 -1
- package/dist/core/heartbeat-store.js +3 -3
- package/dist/core/heartbeat-store.js.map +1 -1
- package/dist/core/heartbeat.js +4 -4
- package/dist/core/heartbeat.js.map +1 -1
- package/dist/core/intent-llm.d.ts +2 -2
- package/dist/core/intent-llm.js +5 -5
- package/dist/core/intent-llm.js.map +1 -1
- package/dist/core/job-board.d.ts +5 -5
- package/dist/core/job-board.d.ts.map +1 -1
- package/dist/core/job-board.js +17 -17
- package/dist/core/job-board.js.map +1 -1
- package/dist/core/llm/agent-loop.d.ts +3 -3
- package/dist/core/llm/agent-loop.js +14 -14
- package/dist/core/llm/agent-loop.js.map +1 -1
- package/dist/core/llm/{imhub-dispatcher.d.ts → agim-dispatcher.d.ts} +4 -4
- package/dist/core/llm/agim-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/{imhub-dispatcher.js → agim-dispatcher.js} +43 -43
- package/dist/core/llm/agim-dispatcher.js.map +1 -0
- package/dist/core/llm/agim-rpc-server.js +17 -17
- package/dist/core/llm/agim-rpc-server.js.map +1 -1
- package/dist/core/llm/anthropic-provider.js +2 -1
- package/dist/core/llm/anthropic-provider.js.map +1 -1
- package/dist/core/llm/auto-compact.d.ts +3 -3
- package/dist/core/llm/auto-compact.d.ts.map +1 -1
- package/dist/core/llm/auto-compact.js +5 -5
- package/dist/core/llm/auto-compact.js.map +1 -1
- package/dist/core/llm/builtin-dispatcher.js +3 -3
- package/dist/core/llm/builtin-dispatcher.js.map +1 -1
- package/dist/core/llm/exec-dispatcher.d.ts +2 -2
- package/dist/core/llm/exec-dispatcher.d.ts.map +1 -1
- package/dist/core/llm/exec-dispatcher.js +20 -22
- package/dist/core/llm/exec-dispatcher.js.map +1 -1
- package/dist/core/llm/fs-dispatcher.js +8 -8
- package/dist/core/llm/fs-dispatcher.js.map +1 -1
- package/dist/core/llm/goal-critic.js +4 -4
- package/dist/core/llm/goal-critic.js.map +1 -1
- package/dist/core/llm/hallucination-detector.js +2 -2
- package/dist/core/llm/hallucination-detector.js.map +1 -1
- package/dist/core/llm/mcp-client.d.ts +1 -1
- package/dist/core/llm/mcp-client.js +3 -3
- package/dist/core/llm/mcp-client.js.map +1 -1
- package/dist/core/llm/mcp-registry.js +3 -3
- package/dist/core/llm/mcp-registry.js.map +1 -1
- package/dist/core/llm/openai-compat-provider.d.ts +1 -1
- package/dist/core/llm/openai-compat-provider.js +5 -4
- package/dist/core/llm/openai-compat-provider.js.map +1 -1
- package/dist/core/llm/provider-base.d.ts +5 -5
- package/dist/core/llm/provider-base.d.ts.map +1 -1
- package/dist/core/llm/provider-base.js +1 -1
- package/dist/core/llm/provider-base.js.map +1 -1
- package/dist/core/llm/secrets.d.ts +2 -2
- package/dist/core/llm/secrets.d.ts.map +1 -1
- package/dist/core/llm/tool-dispatcher.d.ts +1 -1
- package/dist/core/llm/web-dispatcher.d.ts +1 -1
- package/dist/core/llm/web-dispatcher.js +15 -15
- package/dist/core/llm/web-dispatcher.js.map +1 -1
- package/dist/core/logger.d.ts +1 -1
- package/dist/core/logger.js +3 -3
- package/dist/core/logger.js.map +1 -1
- package/dist/core/memo-rpc.js +3 -3
- package/dist/core/memo-rpc.js.map +1 -1
- package/dist/core/memory-consolidate.js +4 -4
- package/dist/core/memory-consolidate.js.map +1 -1
- package/dist/core/memory-distill.js +4 -4
- package/dist/core/memory-distill.js.map +1 -1
- package/dist/core/memory-distiller.js +9 -9
- package/dist/core/memory-distiller.js.map +1 -1
- package/dist/core/memory-vector.js +9 -9
- package/dist/core/memory-vector.js.map +1 -1
- package/dist/core/memory.js +2 -2
- package/dist/core/memory.js.map +1 -1
- package/dist/core/memos.js +6 -6
- package/dist/core/memos.js.map +1 -1
- package/dist/core/message-sink.js +13 -13
- package/dist/core/message-sink.js.map +1 -1
- package/dist/core/notification-evaluator.d.ts +2 -2
- package/dist/core/notification-evaluator.js +4 -4
- package/dist/core/notification-evaluator.js.map +1 -1
- package/dist/core/onboarding.js +3 -3
- package/dist/core/onboarding.js.map +1 -1
- package/dist/core/outbox.js +2 -2
- package/dist/core/outbox.js.map +1 -1
- package/dist/core/persona.d.ts +1 -1
- package/dist/core/persona.d.ts.map +1 -1
- package/dist/core/persona.js +2 -2
- package/dist/core/persona.js.map +1 -1
- package/dist/core/plan-history.js +1 -1
- package/dist/core/plan-history.js.map +1 -1
- package/dist/core/plan-intent.js +5 -5
- package/dist/core/plan-intent.js.map +1 -1
- package/dist/core/plan-mode-state.d.ts +1 -1
- package/dist/core/plan-mode-state.js +4 -4
- package/dist/core/plan-mode-state.js.map +1 -1
- package/dist/core/push-rpc.d.ts +1 -1
- package/dist/core/push-rpc.js +6 -6
- package/dist/core/push-rpc.js.map +1 -1
- package/dist/core/registry.d.ts +4 -4
- package/dist/core/registry.js +10 -10
- package/dist/core/registry.js.map +1 -1
- package/dist/core/reminders.js +1 -1
- package/dist/core/reminders.js.map +1 -1
- package/dist/core/restart-flow.d.ts.map +1 -1
- package/dist/core/restart-flow.js +5 -7
- package/dist/core/restart-flow.js.map +1 -1
- package/dist/core/router.d.ts +1 -1
- package/dist/core/router.js +5 -5
- package/dist/core/router.js.map +1 -1
- package/dist/core/schedule.d.ts +2 -2
- package/dist/core/schedule.js +4 -4
- package/dist/core/schedule.js.map +1 -1
- package/dist/core/self-protect.js +3 -3
- package/dist/core/self-protect.js.map +1 -1
- package/dist/core/sender-allowlist.js +7 -7
- package/dist/core/sender-allowlist.js.map +1 -1
- package/dist/core/sensitive-paths.d.ts.map +1 -1
- package/dist/core/sensitive-paths.js +1 -2
- package/dist/core/sensitive-paths.js.map +1 -1
- package/dist/core/session.js +2 -2
- package/dist/core/session.js.map +1 -1
- package/dist/core/skills/builtin/ECC_NOTICE.md +1 -1
- package/dist/core/skills/builtin/agim-memory/SKILL.md +1 -1
- package/dist/core/skills/builtin/agim-reminders/SKILL.md +2 -2
- package/dist/core/skills/builtin/agim-self/SKILL.md +9 -9
- package/dist/core/skills/builtin/agim-skill-discovery/SKILL.md +5 -5
- package/dist/core/skills/builtin/image-generation/SKILL.md +2 -2
- package/dist/core/skills/builtin/long-goal/SKILL.md +7 -7
- package/dist/core/skills/builtin/my/SKILL.md +2 -2
- package/dist/core/skills/builtin/skill-creator/SKILL.md +2 -2
- package/dist/core/skills/loader.d.ts +4 -4
- package/dist/core/skills/loader.js +22 -22
- package/dist/core/skills/loader.js.map +1 -1
- package/dist/core/skills-rpc.js +1 -1
- package/dist/core/skills-rpc.js.map +1 -1
- package/dist/core/transcribe.js +13 -13
- package/dist/core/transcribe.js.map +1 -1
- package/dist/core/tunnel.js +1 -1
- package/dist/core/tunnel.js.map +1 -1
- package/dist/core/types.d.ts +2 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/user-coord-prefs.js +1 -1
- package/dist/core/user-coord-prefs.js.map +1 -1
- package/dist/core/viewer-config.d.ts +8 -8
- package/dist/core/viewer-config.js +17 -17
- package/dist/core/viewer-config.js.map +1 -1
- package/dist/core/viewer-local.js +4 -4
- package/dist/core/viewer-local.js.map +1 -1
- package/dist/core/viewer-remote.js +1 -1
- package/dist/core/viewer-remote.js.map +1 -1
- package/dist/plugins/agents/acp/url-guard.d.ts +1 -1
- package/dist/plugins/agents/acp/url-guard.js +2 -2
- package/dist/plugins/agents/acp/url-guard.js.map +1 -1
- package/dist/plugins/agents/antigravity/ensure-mcp-config.d.ts +6 -6
- package/dist/plugins/agents/antigravity/ensure-mcp-config.d.ts.map +1 -1
- package/dist/plugins/agents/antigravity/ensure-mcp-config.js +12 -12
- package/dist/plugins/agents/antigravity/ensure-mcp-config.js.map +1 -1
- package/dist/plugins/agents/antigravity/index.js +10 -10
- package/dist/plugins/agents/antigravity/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/index.d.ts +2 -2
- package/dist/plugins/agents/claude-code/index.js +16 -16
- package/dist/plugins/agents/claude-code/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.js +13 -13
- package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
- package/dist/plugins/agents/codex/build-mcp-cli-args.d.ts +4 -4
- package/dist/plugins/agents/codex/build-mcp-cli-args.js +14 -14
- package/dist/plugins/agents/codex/build-mcp-cli-args.js.map +1 -1
- package/dist/plugins/agents/codex/index.d.ts +3 -3
- package/dist/plugins/agents/codex/index.js +14 -14
- package/dist/plugins/agents/codex/index.js.map +1 -1
- package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts +5 -5
- package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts.map +1 -1
- package/dist/plugins/agents/cursor/ensure-mcp-config.js +11 -11
- package/dist/plugins/agents/cursor/ensure-mcp-config.js.map +1 -1
- package/dist/plugins/agents/cursor/index.d.ts +1 -1
- package/dist/plugins/agents/cursor/index.js +12 -12
- package/dist/plugins/agents/cursor/index.js.map +1 -1
- package/dist/plugins/agents/native/index.d.ts +1 -0
- package/dist/plugins/agents/native/index.d.ts.map +1 -1
- package/dist/plugins/agents/native/index.js +28 -14
- package/dist/plugins/agents/native/index.js.map +1 -1
- package/dist/plugins/agents/native/tool-registry.d.ts +3 -3
- package/dist/plugins/agents/native/tool-registry.d.ts.map +1 -1
- package/dist/plugins/agents/native/tool-registry.js +5 -5
- package/dist/plugins/agents/native/tool-registry.js.map +1 -1
- package/dist/plugins/agents/opencode/ensure-mcp-config.d.ts +1 -1
- package/dist/plugins/agents/opencode/ensure-mcp-config.js +9 -9
- package/dist/plugins/agents/opencode/ensure-mcp-config.js.map +1 -1
- package/dist/plugins/agents/opencode/index.js +3 -3
- package/dist/plugins/agents/opencode/index.js.map +1 -1
- package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts +4 -0
- package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/opencode-http-adapter.js +16 -12
- package/dist/plugins/agents/opencode/opencode-http-adapter.js.map +1 -1
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +2 -2
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +7 -5
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
- package/dist/plugins/agents/opencode/serve-manager.d.ts +1 -1
- package/dist/plugins/agents/opencode/serve-manager.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/serve-manager.js +10 -10
- package/dist/plugins/agents/opencode/serve-manager.js.map +1 -1
- package/dist/plugins/agents/pi-native/factory.d.ts.map +1 -1
- package/dist/plugins/agents/pi-native/factory.js +29 -13
- package/dist/plugins/agents/pi-native/factory.js.map +1 -1
- package/dist/plugins/agents/pi-native/index.d.ts +14 -3
- package/dist/plugins/agents/pi-native/index.d.ts.map +1 -1
- package/dist/plugins/agents/pi-native/index.js +58 -4
- package/dist/plugins/agents/pi-native/index.js.map +1 -1
- package/dist/plugins/agents/pi-native/provider-resolver.d.ts +2 -0
- package/dist/plugins/agents/pi-native/provider-resolver.d.ts.map +1 -1
- package/dist/plugins/agents/pi-native/provider-resolver.js +9 -1
- package/dist/plugins/agents/pi-native/provider-resolver.js.map +1 -1
- package/dist/plugins/agents/pi-native/tool-bridge.js +1 -1
- package/dist/plugins/agents/pi-native/tool-bridge.js.map +1 -1
- package/dist/plugins/agents/pi-native/tools.js +4 -4
- package/dist/plugins/agents/pi-native/tools.js.map +1 -1
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.d.ts +1 -1
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js +2 -2
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js.map +1 -1
- package/dist/plugins/messengers/email/email-adapter.js +15 -15
- package/dist/plugins/messengers/email/email-adapter.js.map +1 -1
- package/dist/plugins/messengers/telegram/media-download.d.ts +1 -1
- package/dist/plugins/messengers/telegram/media-download.js +4 -4
- package/dist/plugins/messengers/telegram/media-download.js.map +1 -1
- package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +1 -1
- package/dist/plugins/messengers/telegram/telegram-adapter.js +3 -3
- package/dist/plugins/messengers/telegram/telegram-adapter.js.map +1 -1
- package/dist/plugins/messengers/wechat/context-store.js +1 -1
- package/dist/plugins/messengers/wechat/context-store.js.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-client.js +1 -1
- package/dist/plugins/messengers/wechat/ilink-client.js.map +1 -1
- package/dist/plugins/messengers/wechat/media-download.js +1 -1
- package/dist/plugins/messengers/wechat/media-download.js.map +1 -1
- package/dist/scripts/migrate-gcj02-to-wgs84.js +1 -1
- package/dist/scripts/migrate-gcj02-to-wgs84.js.map +1 -1
- package/dist/web/public/assets/a2a-CTsDMefo.js +7 -0
- package/dist/web/public/assets/a2a-CTsDMefo.js.map +1 -0
- package/dist/web/public/assets/{activity-BnlFGipw.js → activity-ul8Os7Pz.js} +2 -2
- package/dist/web/public/assets/{activity-BnlFGipw.js.map → activity-ul8Os7Pz.js.map} +1 -1
- package/dist/web/public/assets/{admins-CH84Rw1d.js → admins-ByMAuquy.js} +3 -3
- package/dist/web/public/assets/{admins-CH84Rw1d.js.map → admins-ByMAuquy.js.map} +1 -1
- package/dist/web/public/assets/agents-Ds1zyxBj.js +2 -0
- package/dist/web/public/assets/agents-Ds1zyxBj.js.map +1 -0
- package/dist/web/public/assets/{approvals-DnzjbDR6.js → approvals-DOWlWI7Z.js} +3 -3
- package/dist/web/public/assets/{approvals-DnzjbDR6.js.map → approvals-DOWlWI7Z.js.map} +1 -1
- package/dist/web/public/assets/{arrow-down-DxlRHrs8.js → arrow-down-7i0xwCI2.js} +2 -2
- package/dist/web/public/assets/{arrow-down-DxlRHrs8.js.map → arrow-down-7i0xwCI2.js.map} +1 -1
- package/dist/web/public/assets/arrow-right-A889Wof8.js +7 -0
- package/dist/web/public/assets/arrow-right-A889Wof8.js.map +1 -0
- package/dist/web/public/assets/{arrow-up-CAiQ2jy-.js → arrow-up-Dm0U4-6U.js} +2 -2
- package/dist/web/public/assets/{arrow-up-CAiQ2jy-.js.map → arrow-up-Dm0U4-6U.js.map} +1 -1
- package/dist/web/public/assets/{asks-DyUQopay.js → asks-DGuBsrJ7.js} +3 -3
- package/dist/web/public/assets/{asks-DyUQopay.js.map → asks-DGuBsrJ7.js.map} +1 -1
- package/dist/web/public/assets/{audit-BVHTMS82.js → audit-BRXsplJ2.js} +2 -2
- package/dist/web/public/assets/{audit-BVHTMS82.js.map → audit-BRXsplJ2.js.map} +1 -1
- package/dist/web/public/assets/{bell-D7iS7ctN.js → bell-B-UdeJsp.js} +2 -2
- package/dist/web/public/assets/{bell-D7iS7ctN.js.map → bell-B-UdeJsp.js.map} +1 -1
- package/dist/web/public/assets/bgjobs-CcRiffyJ.js +2 -0
- package/dist/web/public/assets/bgjobs-CcRiffyJ.js.map +1 -0
- package/dist/web/public/assets/book-open-CSCq5cjL.js +7 -0
- package/dist/web/public/assets/book-open-CSCq5cjL.js.map +1 -0
- package/dist/web/public/assets/{brain-CCF25Egu.js → brain-Dl4DF5kX.js} +2 -2
- package/dist/web/public/assets/{brain-CCF25Egu.js.map → brain-Dl4DF5kX.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-BMLMD8nM.js → briefcase-CeKUkFSq.js} +2 -2
- package/dist/web/public/assets/{briefcase-BMLMD8nM.js.map → briefcase-CeKUkFSq.js.map} +1 -1
- package/dist/web/public/assets/chat-rLJMdJBk.js +12 -0
- package/dist/web/public/assets/chat-rLJMdJBk.js.map +1 -0
- package/dist/web/public/assets/{chevron-left-BDO3vw8G.js → chevron-left-01fAFVpo.js} +2 -2
- package/dist/web/public/assets/{chevron-left-BDO3vw8G.js.map → chevron-left-01fAFVpo.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-5ZUC2opg.js → chevron-right-CFRb-SM_.js} +3 -3
- package/dist/web/public/assets/{chevron-right-5ZUC2opg.js.map → chevron-right-CFRb-SM_.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-DHAHqUlS.js → circle-check-big-DBg2BD6o.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-DHAHqUlS.js.map → circle-check-big-DBg2BD6o.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-7VaoZ7dY.js → circle-x-CqFMzO-x.js} +2 -2
- package/dist/web/public/assets/{circle-x-7VaoZ7dY.js.map → circle-x-CqFMzO-x.js.map} +1 -1
- package/dist/web/public/assets/clipboard-list-lnqdk2_J.js +7 -0
- package/dist/web/public/assets/clipboard-list-lnqdk2_J.js.map +1 -0
- package/dist/web/public/assets/{clock-ZPVXnd6V.js → clock-4hd1joQe.js} +3 -3
- package/dist/web/public/assets/{clock-ZPVXnd6V.js.map → clock-4hd1joQe.js.map} +1 -1
- package/dist/web/public/assets/confirm-dialog-BDb0NLny.js +2 -0
- package/dist/web/public/assets/{confirm-dialog-CgpJL9oN.js.map → confirm-dialog-BDb0NLny.js.map} +1 -1
- package/dist/web/public/assets/{copy-BaZl52tH.js → copy-CD4A7VD8.js} +3 -3
- package/dist/web/public/assets/{copy-BaZl52tH.js.map → copy-CD4A7VD8.js.map} +1 -1
- package/dist/web/public/assets/dashboard-CG3WiG7h.js +2 -0
- package/dist/web/public/assets/dashboard-CG3WiG7h.js.map +1 -0
- package/dist/web/public/assets/{data-table-BLYG79TX.js → data-table-BkUshOZz.js} +2 -2
- package/dist/web/public/assets/{data-table-BLYG79TX.js.map → data-table-BkUshOZz.js.map} +1 -1
- package/dist/web/public/assets/database-lQzk64rV.js +7 -0
- package/dist/web/public/assets/database-lQzk64rV.js.map +1 -0
- package/dist/web/public/assets/distill-CPurVW3v.js +7 -0
- package/dist/web/public/assets/distill-CPurVW3v.js.map +1 -0
- package/dist/web/public/assets/{download-bzCepctg.js → download-CVZnHcwj.js} +2 -2
- package/dist/web/public/assets/{download-bzCepctg.js.map → download-CVZnHcwj.js.map} +1 -1
- package/dist/web/public/assets/dropdown-menu-BNH5SrVb.js +7 -0
- package/dist/web/public/assets/dropdown-menu-BNH5SrVb.js.map +1 -0
- package/dist/web/public/assets/email-YlI4MWLp.js +7 -0
- package/dist/web/public/assets/email-YlI4MWLp.js.map +1 -0
- package/dist/web/public/assets/{empty-state-96qpPTNg.js → empty-state-CuiqdZiB.js} +2 -2
- package/dist/web/public/assets/{empty-state-96qpPTNg.js.map → empty-state-CuiqdZiB.js.map} +1 -1
- package/dist/web/public/assets/{external-link-J4nIlCem.js → external-link-1WPpVvdu.js} +2 -2
- package/dist/web/public/assets/{external-link-J4nIlCem.js.map → external-link-1WPpVvdu.js.map} +1 -1
- package/dist/web/public/assets/{eye-BvsBLK42.js → eye-BfPyNFzk.js} +2 -2
- package/dist/web/public/assets/{eye-BvsBLK42.js.map → eye-BfPyNFzk.js.map} +1 -1
- package/dist/web/public/assets/{facts-DMucDXYd.js → facts-xT_24pH8.js} +2 -2
- package/dist/web/public/assets/{facts-DMucDXYd.js.map → facts-xT_24pH8.js.map} +1 -1
- package/dist/web/public/assets/file-text-BxfdLM0-.js +7 -0
- package/dist/web/public/assets/file-text-BxfdLM0-.js.map +1 -0
- package/dist/web/public/assets/{goals-B9ETHgL0.js → goals-C8ZQfbhj.js} +3 -3
- package/dist/web/public/assets/{goals-B9ETHgL0.js.map → goals-C8ZQfbhj.js.map} +1 -1
- package/dist/web/public/assets/health-A2StNEfn.js +2 -0
- package/dist/web/public/assets/{health-DLzZ7KHc.js.map → health-A2StNEfn.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-CVEeD2sz.js → heart-pulse-DXlE9oic.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-CVEeD2sz.js.map → heart-pulse-DXlE9oic.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-B1BEBHge.js → heartbeat-ClO5gJrj.js} +3 -3
- package/dist/web/public/assets/{heartbeat-B1BEBHge.js.map → heartbeat-ClO5gJrj.js.map} +1 -1
- package/dist/web/public/assets/hot-bfTA-V_z.js +7 -0
- package/dist/web/public/assets/{hot-Yc7iad0D.js.map → hot-bfTA-V_z.js.map} +1 -1
- package/dist/web/public/assets/index-Bi2qWb-u.css +1 -0
- package/dist/web/public/assets/index-DCfdN5R7.js +244 -0
- package/dist/web/public/assets/index-DCfdN5R7.js.map +1 -0
- package/dist/web/public/assets/{injection-Ca-9gbo0.js → injection-omvCR6-p.js} +2 -2
- package/dist/web/public/assets/{injection-Ca-9gbo0.js.map → injection-omvCR6-p.js.map} +1 -1
- package/dist/web/public/assets/{installed-Zz34apdi.js → installed-DL6r3ktm.js} +4 -9
- package/dist/web/public/assets/installed-DL6r3ktm.js.map +1 -0
- package/dist/web/public/assets/jobs-Biy5lYd4.js +2 -0
- package/dist/web/public/assets/jobs-Biy5lYd4.js.map +1 -0
- package/dist/web/public/assets/layout-BLm6NJ3V.js +2 -0
- package/dist/web/public/assets/layout-BLm6NJ3V.js.map +1 -0
- package/dist/web/public/assets/layout-BTKafRVZ.js +2 -0
- package/dist/web/public/assets/layout-BTKafRVZ.js.map +1 -0
- package/dist/web/public/assets/layout-Bm-2s2fp.js +2 -0
- package/dist/web/public/assets/layout-Bm-2s2fp.js.map +1 -0
- package/dist/web/public/assets/layout-DsZ8eR4i.js +2 -0
- package/dist/web/public/assets/layout-DsZ8eR4i.js.map +1 -0
- package/dist/web/public/assets/{layout-CtDc2i7w.js → layout-sxvovjEH.js} +2 -2
- package/dist/web/public/assets/{layout-CtDc2i7w.js.map → layout-sxvovjEH.js.map} +1 -1
- package/dist/web/public/assets/llm-JjZDbBvJ.js +37 -0
- package/dist/web/public/assets/llm-JjZDbBvJ.js.map +1 -0
- package/dist/web/public/assets/loader-circle-DDdmcH0k.js +7 -0
- package/dist/web/public/assets/{loader-circle-D8L1w9c1.js.map → loader-circle-DDdmcH0k.js.map} +1 -1
- package/dist/web/public/assets/{map-pin--GMunU9n.js → map-pin-C_jAxukI.js} +2 -2
- package/dist/web/public/assets/{map-pin--GMunU9n.js.map → map-pin-C_jAxukI.js.map} +1 -1
- package/dist/web/public/assets/{mcp-DhnXhO9B.js → mcp-vKajK1F8.js} +3 -3
- package/dist/web/public/assets/{mcp-DhnXhO9B.js.map → mcp-vKajK1F8.js.map} +1 -1
- package/dist/web/public/assets/memos-DAt4k3DO.js +7 -0
- package/dist/web/public/assets/memos-DAt4k3DO.js.map +1 -0
- package/dist/web/public/assets/messengers-GYVTFlAj.js +2 -0
- package/dist/web/public/assets/messengers-GYVTFlAj.js.map +1 -0
- package/dist/web/public/assets/{mobile-CUZ359rQ.js → mobile-VUyTo40E.js} +3 -3
- package/dist/web/public/assets/{mobile-CUZ359rQ.js.map → mobile-VUyTo40E.js.map} +1 -1
- package/dist/web/public/assets/{network-BBdRdrH_.js → network-BUeWK3bs.js} +2 -2
- package/dist/web/public/assets/{network-BBdRdrH_.js.map → network-BUeWK3bs.js.map} +1 -1
- package/dist/web/public/assets/outbox-CEE0rwN3.js +2 -0
- package/dist/web/public/assets/outbox-CEE0rwN3.js.map +1 -0
- package/dist/web/public/assets/overview-BSOZ5gTD.js +12 -0
- package/dist/web/public/assets/overview-BSOZ5gTD.js.map +1 -0
- package/dist/web/public/assets/overview-COop5K2Y.js +12 -0
- package/dist/web/public/assets/overview-COop5K2Y.js.map +1 -0
- package/dist/web/public/assets/overview-DeH5ud6d.js +2 -0
- package/dist/web/public/assets/overview-DeH5ud6d.js.map +1 -0
- package/dist/web/public/assets/{pagination-DcsgDXXM.js → pagination-BBicLzXP.js} +3 -3
- package/dist/web/public/assets/{pagination-DcsgDXXM.js.map → pagination-BBicLzXP.js.map} +1 -1
- package/dist/web/public/assets/persona-CElXQZ4p.js +2 -0
- package/dist/web/public/assets/{persona-ig2ac4mY.js.map → persona-CElXQZ4p.js.map} +1 -1
- package/dist/web/public/assets/{plans-Bzbk8eUr.js → plans-Bo5LlLeH.js} +3 -8
- package/dist/web/public/assets/plans-Bo5LlLeH.js.map +1 -0
- package/dist/web/public/assets/{play-Di1jqulh.js → play-DX5wp4WH.js} +2 -2
- package/dist/web/public/assets/{play-Di1jqulh.js.map → play-DX5wp4WH.js.map} +1 -1
- package/dist/web/public/assets/{plus-C2zyJ1mF.js → plus-DH4J_YhN.js} +2 -2
- package/dist/web/public/assets/{plus-C2zyJ1mF.js.map → plus-DH4J_YhN.js.map} +1 -1
- package/dist/web/public/assets/policy-BrgOuDt_.js +2 -0
- package/dist/web/public/assets/policy-BrgOuDt_.js.map +1 -0
- package/dist/web/public/assets/{qr-code-C-ACsKv_.js → qr-code-YrEuhMPC.js} +2 -2
- package/dist/web/public/assets/{qr-code-C-ACsKv_.js.map → qr-code-YrEuhMPC.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-7HdadG5V.js → refresh-ccw-DlAd-eTQ.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-7HdadG5V.js.map → refresh-ccw-DlAd-eTQ.js.map} +1 -1
- package/dist/web/public/assets/{reminders-BDeiVYTC.js → reminders-DBEE0zXG.js} +3 -3
- package/dist/web/public/assets/{reminders-BDeiVYTC.js.map → reminders-DBEE0zXG.js.map} +1 -1
- package/dist/web/public/assets/{save-BYFmz9gD.js → save-BDOtZrfp.js} +2 -2
- package/dist/web/public/assets/{save-BYFmz9gD.js.map → save-BDOtZrfp.js.map} +1 -1
- package/dist/web/public/assets/schedules-DAyhVI8-.js +2 -0
- package/dist/web/public/assets/schedules-DAyhVI8-.js.map +1 -0
- package/dist/web/public/assets/search-55mtgHrB.js +17 -0
- package/dist/web/public/assets/search-55mtgHrB.js.map +1 -0
- package/dist/web/public/assets/{search-DxkvV-8p.js → search-CAICU3aU.js} +2 -2
- package/dist/web/public/assets/{search-DxkvV-8p.js.map → search-CAICU3aU.js.map} +1 -1
- package/dist/web/public/assets/security-CbP4QgVp.js +2 -0
- package/dist/web/public/assets/security-CbP4QgVp.js.map +1 -0
- package/dist/web/public/assets/server-Dg4e8pvm.js +7 -0
- package/dist/web/public/assets/server-Dg4e8pvm.js.map +1 -0
- package/dist/web/public/assets/service-gWZa3sup.js +7 -0
- package/dist/web/public/assets/service-gWZa3sup.js.map +1 -0
- package/dist/web/public/assets/{shield-alert-DXGk9Rak.js → shield-alert-DOKK9EnJ.js} +2 -2
- package/dist/web/public/assets/{shield-alert-DXGk9Rak.js.map → shield-alert-DOKK9EnJ.js.map} +1 -1
- package/dist/web/public/assets/sparkles-G0QIs9nP.js +7 -0
- package/dist/web/public/assets/sparkles-G0QIs9nP.js.map +1 -0
- package/dist/web/public/assets/start-D-abhl3q.js +2 -0
- package/dist/web/public/assets/start-D-abhl3q.js.map +1 -0
- package/dist/web/public/assets/{status-badge-D0nbFSom.js → status-badge-CyLdpsXq.js} +2 -2
- package/dist/web/public/assets/{status-badge-D0nbFSom.js.map → status-badge-CyLdpsXq.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-DFiAXvDp.js → subtasks-BnEjSGUR.js} +3 -3
- package/dist/web/public/assets/{subtasks-DFiAXvDp.js.map → subtasks-BnEjSGUR.js.map} +1 -1
- package/dist/web/public/assets/{table-_WsrnZ_T.js → table-sCMZBe_Z.js} +2 -2
- package/dist/web/public/assets/{table-_WsrnZ_T.js.map → table-sCMZBe_Z.js.map} +1 -1
- package/dist/web/public/assets/terminal-_pXeEjXG.js +7 -0
- package/dist/web/public/assets/terminal-_pXeEjXG.js.map +1 -0
- package/dist/web/public/assets/{topn-C2PHE4tX.js → topn-D1B-gS1M.js} +3 -3
- package/dist/web/public/assets/{topn-C2PHE4tX.js.map → topn-D1B-gS1M.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-1Km439fW.js → trash-2-D2x2UPuZ.js} +2 -2
- package/dist/web/public/assets/{trash-2-1Km439fW.js.map → trash-2-D2x2UPuZ.js.map} +1 -1
- package/dist/web/public/assets/use-a2a-C98e2Via.js +2 -0
- package/dist/web/public/assets/use-a2a-C98e2Via.js.map +1 -0
- package/dist/web/public/assets/{use-agim-skills-COSqZrdH.js → use-agim-skills-BbuJP3NT.js} +2 -2
- package/dist/web/public/assets/{use-agim-skills-COSqZrdH.js.map → use-agim-skills-BbuJP3NT.js.map} +1 -1
- package/dist/web/public/assets/use-background-tasks-CwFmOokw.js +2 -0
- package/dist/web/public/assets/{use-background-tasks-wCL7jn68.js.map → use-background-tasks-CwFmOokw.js.map} +1 -1
- package/dist/web/public/assets/use-jobs-BJjeJ5lh.js +2 -0
- package/dist/web/public/assets/use-jobs-BJjeJ5lh.js.map +1 -0
- package/dist/web/public/assets/use-memory-CXDwKCco.js +2 -0
- package/dist/web/public/assets/{use-memory-B9oRyQC8.js.map → use-memory-CXDwKCco.js.map} +1 -1
- package/dist/web/public/assets/use-observability-CY5ZUPrC.js +2 -0
- package/dist/web/public/assets/{use-observability-DGkN80qa.js.map → use-observability-CY5ZUPrC.js.map} +1 -1
- package/dist/web/public/assets/use-outbox-DT_XWB_7.js +7 -0
- package/dist/web/public/assets/use-outbox-DT_XWB_7.js.map +1 -0
- package/dist/web/public/assets/use-schedules-D4W8fMwo.js +7 -0
- package/dist/web/public/assets/use-schedules-D4W8fMwo.js.map +1 -0
- package/dist/web/public/assets/use-settings-DGIjmUX0.js +2 -0
- package/dist/web/public/assets/use-settings-DGIjmUX0.js.map +1 -0
- package/dist/web/public/assets/use-skills-D2bMM580.js +7 -0
- package/dist/web/public/assets/use-skills-D2bMM580.js.map +1 -0
- package/dist/web/public/assets/use-vector-BYOFwjU0.js +2 -0
- package/dist/web/public/assets/use-vector-BYOFwjU0.js.map +1 -0
- package/dist/web/public/assets/use-workspace-CuytyHwb.js +2 -0
- package/dist/web/public/assets/{use-workspace-BDXP5XO1.js.map → use-workspace-CuytyHwb.js.map} +1 -1
- package/dist/web/public/assets/vector-CL8ezpSR.js +2 -0
- package/dist/web/public/assets/vector-CL8ezpSR.js.map +1 -0
- package/dist/web/public/assets/viewer-CD0iEfPU.js +7 -0
- package/dist/web/public/assets/viewer-CD0iEfPU.js.map +1 -0
- package/dist/web/public/assets/workspace-BA1_hso3.js +17 -0
- package/dist/web/public/assets/workspace-BA1_hso3.js.map +1 -0
- package/dist/web/public/assets/workspaces-DyGLJUgB.js +7 -0
- package/dist/web/public/assets/workspaces-DyGLJUgB.js.map +1 -0
- package/dist/web/public/index.html +2 -2
- package/dist/web/public/loc.html +1 -1
- package/dist/web/public/login.html +2 -2
- package/dist/web/server.d.ts +2 -5
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +256 -122
- package/dist/web/server.js.map +1 -1
- package/package.json +2 -3
- package/dist/core/llm/imhub-dispatcher.d.ts.map +0 -1
- package/dist/core/llm/imhub-dispatcher.js.map +0 -1
- package/dist/web/public/assets/a2a-CZxwvgvh.js +0 -7
- package/dist/web/public/assets/a2a-CZxwvgvh.js.map +0 -1
- package/dist/web/public/assets/agents-CFB4Uj6b.js +0 -7
- package/dist/web/public/assets/agents-CFB4Uj6b.js.map +0 -1
- package/dist/web/public/assets/bgjobs-BYCQhd_1.js +0 -7
- package/dist/web/public/assets/bgjobs-BYCQhd_1.js.map +0 -1
- package/dist/web/public/assets/chat-DPkKy5y_.js +0 -17
- package/dist/web/public/assets/chat-DPkKy5y_.js.map +0 -1
- package/dist/web/public/assets/circle-check-COhM5JsK.js +0 -7
- package/dist/web/public/assets/circle-check-COhM5JsK.js.map +0 -1
- package/dist/web/public/assets/confirm-dialog-CgpJL9oN.js +0 -2
- package/dist/web/public/assets/distill-D9p8O8Jf.js +0 -7
- package/dist/web/public/assets/distill-D9p8O8Jf.js.map +0 -1
- package/dist/web/public/assets/email-Douv-rZ5.js +0 -7
- package/dist/web/public/assets/email-Douv-rZ5.js.map +0 -1
- package/dist/web/public/assets/health-DLzZ7KHc.js +0 -2
- package/dist/web/public/assets/hot-Yc7iad0D.js +0 -12
- package/dist/web/public/assets/index-DY2Zglku.js +0 -209
- package/dist/web/public/assets/index-DY2Zglku.js.map +0 -1
- package/dist/web/public/assets/index-DknVjPYB.css +0 -1
- package/dist/web/public/assets/installed-Zz34apdi.js.map +0 -1
- package/dist/web/public/assets/jobs-CtVRpl0r.js +0 -2
- package/dist/web/public/assets/jobs-CtVRpl0r.js.map +0 -1
- package/dist/web/public/assets/layout-BTCLgkgN.js +0 -2
- package/dist/web/public/assets/layout-BTCLgkgN.js.map +0 -1
- package/dist/web/public/assets/layout-Cxch59sI.js +0 -2
- package/dist/web/public/assets/layout-Cxch59sI.js.map +0 -1
- package/dist/web/public/assets/layout-DnANw2Q2.js +0 -2
- package/dist/web/public/assets/layout-DnANw2Q2.js.map +0 -1
- package/dist/web/public/assets/layout-yIZG87fq.js +0 -2
- package/dist/web/public/assets/layout-yIZG87fq.js.map +0 -1
- package/dist/web/public/assets/llm-CMMa85Ig.js +0 -27
- package/dist/web/public/assets/llm-CMMa85Ig.js.map +0 -1
- package/dist/web/public/assets/loader-circle-D8L1w9c1.js +0 -7
- package/dist/web/public/assets/memos-DQZc7llR.js +0 -12
- package/dist/web/public/assets/memos-DQZc7llR.js.map +0 -1
- package/dist/web/public/assets/messengers-DwSmauLs.js +0 -2
- package/dist/web/public/assets/messengers-DwSmauLs.js.map +0 -1
- package/dist/web/public/assets/outbox-CmN0U35l.js +0 -7
- package/dist/web/public/assets/outbox-CmN0U35l.js.map +0 -1
- package/dist/web/public/assets/persona-ig2ac4mY.js +0 -2
- package/dist/web/public/assets/plans-Bzbk8eUr.js.map +0 -1
- package/dist/web/public/assets/policy-yD1c2Pcn.js +0 -2
- package/dist/web/public/assets/policy-yD1c2Pcn.js.map +0 -1
- package/dist/web/public/assets/schedules-BddzBrxI.js +0 -7
- package/dist/web/public/assets/schedules-BddzBrxI.js.map +0 -1
- package/dist/web/public/assets/search-B8PlbtLg.js +0 -17
- package/dist/web/public/assets/search-B8PlbtLg.js.map +0 -1
- package/dist/web/public/assets/security-DpOGp3nS.js +0 -2
- package/dist/web/public/assets/security-DpOGp3nS.js.map +0 -1
- package/dist/web/public/assets/service-BsY8CaNG.js +0 -7
- package/dist/web/public/assets/service-BsY8CaNG.js.map +0 -1
- package/dist/web/public/assets/use-background-tasks-wCL7jn68.js +0 -2
- package/dist/web/public/assets/use-memory-B9oRyQC8.js +0 -2
- package/dist/web/public/assets/use-observability-DGkN80qa.js +0 -2
- package/dist/web/public/assets/use-settings-Co-iafXD.js +0 -2
- package/dist/web/public/assets/use-settings-Co-iafXD.js.map +0 -1
- package/dist/web/public/assets/use-workspace-BDXP5XO1.js +0 -2
- package/dist/web/public/assets/vector-BfIEx8xX.js +0 -2
- package/dist/web/public/assets/vector-BfIEx8xX.js.map +0 -1
- package/dist/web/public/assets/viewer-BPMZkT05.js +0 -12
- package/dist/web/public/assets/viewer-BPMZkT05.js.map +0 -1
- package/dist/web/public/assets/workspace-BbCchiHE.js +0 -17
- package/dist/web/public/assets/workspace-BbCchiHE.js.map +0 -1
- package/dist/web/public/assets/workspaces-5HE7pjdA.js +0 -7
- package/dist/web/public/assets/workspaces-5HE7pjdA.js.map +0 -1
package/dist/web/server.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Web chat server — HTTP + WebSocket for browser-based agent interaction
|
|
2
2
|
import { createServer } from 'node:http';
|
|
3
|
+
import { createServer as createNetServer } from 'node:net';
|
|
3
4
|
import { readFileSync, existsSync, readdirSync } from 'node:fs';
|
|
4
5
|
import { readdir, stat, readFile, writeFile, rename, unlink, realpath, open } from 'node:fs/promises';
|
|
5
6
|
import { join, dirname, resolve as resolvePath, sep as pathSep, relative as relativePath } from 'node:path';
|
|
@@ -109,7 +110,7 @@ function hasForwardedPeerHeaders(req) {
|
|
|
109
110
|
function isTrustedLoopbackPeer(req) {
|
|
110
111
|
if (!isLoopbackPeer(req))
|
|
111
112
|
return false;
|
|
112
|
-
if (isEnvOff('
|
|
113
|
+
if (isEnvOff('AGIM_TRUST_LOOPBACK'))
|
|
113
114
|
return false;
|
|
114
115
|
// A reverse proxy on the same host makes remote users appear as
|
|
115
116
|
// 127.0.0.1. Treat forwarded requests as network traffic and require
|
|
@@ -183,7 +184,7 @@ function extractToken(req, url) {
|
|
|
183
184
|
/** Returns true if the request is authenticated (or auth not required). */
|
|
184
185
|
function checkAuth(req, res, url) {
|
|
185
186
|
// 1. Disabled by env → pass through.
|
|
186
|
-
if ((process.env.
|
|
187
|
+
if ((process.env.AGIM_WEB_AUTH || '').toLowerCase() === 'off')
|
|
187
188
|
return true;
|
|
188
189
|
// 2. Trusted loopback → pass through (local CLI / browser-on-same-host).
|
|
189
190
|
if (isTrustedLoopbackPeer(req))
|
|
@@ -242,7 +243,7 @@ function verifyTokenSync(raw) {
|
|
|
242
243
|
* - otherwise → 'web:unknown' (request should already have been rejected
|
|
243
244
|
* by checkAuth — this branch exists for defensive logging). */
|
|
244
245
|
function getRequestActor(req) {
|
|
245
|
-
if ((process.env.
|
|
246
|
+
if ((process.env.AGIM_WEB_AUTH || '').toLowerCase() === 'off')
|
|
246
247
|
return 'web:auth-off';
|
|
247
248
|
if (isTrustedLoopbackPeer(req))
|
|
248
249
|
return 'web:loopback';
|
|
@@ -266,17 +267,17 @@ function getRequestActor(req) {
|
|
|
266
267
|
* can't elevate to control plane (R13 A1).
|
|
267
268
|
*
|
|
268
269
|
* Trust order:
|
|
269
|
-
* 1.
|
|
270
|
+
* 1. AGIM_WEB_AUTH=off → admin (operator explicitly disabled auth)
|
|
270
271
|
* 2. Trusted loopback → admin (operator on the host)
|
|
271
272
|
* 3. Bearer token → token.role === 'admin'
|
|
272
273
|
* 4. Otherwise → not admin
|
|
273
274
|
*
|
|
274
275
|
* Note: when no token has been created yet (pre-bootstrap), the
|
|
275
276
|
* trusted-loopback branch still grants admin so the CLI bootstrap flow
|
|
276
|
-
* works. Disable it with
|
|
277
|
+
* works. Disable it with AGIM_TRUST_LOOPBACK=off. Reverse-proxied
|
|
277
278
|
* requests with Forwarded / X-Forwarded-* peer headers never qualify. */
|
|
278
279
|
function isRequestAdmin(req) {
|
|
279
|
-
if ((process.env.
|
|
280
|
+
if ((process.env.AGIM_WEB_AUTH || '').toLowerCase() === 'off')
|
|
280
281
|
return true;
|
|
281
282
|
if (isTrustedLoopbackPeer(req))
|
|
282
283
|
return true;
|
|
@@ -330,9 +331,44 @@ export function createSerialQueue() {
|
|
|
330
331
|
/**
|
|
331
332
|
* Start the web chat server
|
|
332
333
|
*/
|
|
334
|
+
async function assertPortCanListen(port, bindHost) {
|
|
335
|
+
await new Promise((resolve, reject) => {
|
|
336
|
+
const probe = createNetServer();
|
|
337
|
+
const cleanup = () => {
|
|
338
|
+
probe.off('error', onError);
|
|
339
|
+
probe.off('listening', onListening);
|
|
340
|
+
};
|
|
341
|
+
const onError = (err) => {
|
|
342
|
+
cleanup();
|
|
343
|
+
try {
|
|
344
|
+
probe.close();
|
|
345
|
+
}
|
|
346
|
+
catch { /* not listening */ }
|
|
347
|
+
reject(err);
|
|
348
|
+
};
|
|
349
|
+
const onListening = () => {
|
|
350
|
+
cleanup();
|
|
351
|
+
probe.close(() => resolve());
|
|
352
|
+
};
|
|
353
|
+
probe.once('error', onError);
|
|
354
|
+
probe.once('listening', onListening);
|
|
355
|
+
try {
|
|
356
|
+
probe.listen(port, bindHost);
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
cleanup();
|
|
360
|
+
try {
|
|
361
|
+
probe.close();
|
|
362
|
+
}
|
|
363
|
+
catch { /* not listening */ }
|
|
364
|
+
reject(err);
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
}
|
|
333
368
|
export async function startWebServer(options) {
|
|
334
369
|
const port = options.port || DEFAULT_PORT;
|
|
335
|
-
const bindHost = process.env.
|
|
370
|
+
const bindHost = process.env.AGIM_WEB_BIND || '127.0.0.1';
|
|
371
|
+
await assertPortCanListen(port, bindHost);
|
|
336
372
|
const clients = new Map();
|
|
337
373
|
// R9: threadId → tokenId ownership. A WS peer claims a threadId on
|
|
338
374
|
// first connection (verifyClient already verified the token); later
|
|
@@ -344,7 +380,7 @@ export async function startWebServer(options) {
|
|
|
344
380
|
// v1.1.10+: token-based auth for the web console.
|
|
345
381
|
// ─ loopback peers (127.0.0.1 / ::1) bypass auth (local CLI / curl)
|
|
346
382
|
// ─ public viewer pages (/v/:id, /loc, /l/<token>) remain public
|
|
347
|
-
// ─
|
|
383
|
+
// ─ AGIM_WEB_AUTH=off disables the gate entirely (for ops with proxy auth)
|
|
348
384
|
// On first start, bootstrapIfEmpty() generates a one-time bootstrap token
|
|
349
385
|
// and prints it to stdout + the logger so the operator finds it in journalctl.
|
|
350
386
|
const accessTokenModule = await import('../core/access-token.js');
|
|
@@ -361,16 +397,16 @@ export async function startWebServer(options) {
|
|
|
361
397
|
webLog.warn({
|
|
362
398
|
event: 'web.auth_disabled_on_public_bind',
|
|
363
399
|
bind: bindHost,
|
|
364
|
-
}, '
|
|
400
|
+
}, 'AGIM_WEB_AUTH=off + public bind — auth deliberately off, ensure your reverse proxy handles access control');
|
|
365
401
|
}
|
|
366
402
|
// R13 C2 — when binding to a non-loopback address, the operator
|
|
367
403
|
// almost certainly intends to put a TLS-terminating reverse proxy
|
|
368
404
|
// in front of agim. We can't reliably detect from inside whether
|
|
369
405
|
// that's been done (X-Forwarded-Proto could be forged), so we
|
|
370
406
|
// surface a one-time banner + audit row at boot. Suppress with
|
|
371
|
-
//
|
|
407
|
+
// AGIM_WEB_TLS_ACK=1 for the operator who's already done the
|
|
372
408
|
// checklist and wants quiet logs.
|
|
373
|
-
if (isPublicBind && process.env.
|
|
409
|
+
if (isPublicBind && process.env.AGIM_WEB_TLS_ACK !== '1') {
|
|
374
410
|
const banner = [
|
|
375
411
|
'',
|
|
376
412
|
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━',
|
|
@@ -383,7 +419,7 @@ export async function startWebServer(options) {
|
|
|
383
419
|
' any network you do not control.',
|
|
384
420
|
'',
|
|
385
421
|
' Silence this banner once your terminator is verified:',
|
|
386
|
-
'
|
|
422
|
+
' AGIM_WEB_TLS_ACK=1',
|
|
387
423
|
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━',
|
|
388
424
|
'',
|
|
389
425
|
].join('\n');
|
|
@@ -392,7 +428,7 @@ export async function startWebServer(options) {
|
|
|
392
428
|
event: 'web.public_bind_no_tls_ack',
|
|
393
429
|
bind: bindHost,
|
|
394
430
|
port,
|
|
395
|
-
}, `non-loopback bind without
|
|
431
|
+
}, `non-loopback bind without AGIM_WEB_TLS_ACK=1 — confirm reverse-proxy TLS termination`);
|
|
396
432
|
try {
|
|
397
433
|
void (async () => {
|
|
398
434
|
const { logAuditEvent } = await import('../core/audit-log.js');
|
|
@@ -411,8 +447,8 @@ export async function startWebServer(options) {
|
|
|
411
447
|
event: 'web.auth_mode',
|
|
412
448
|
bind: bindHost,
|
|
413
449
|
enabled: isAuthEnabled(),
|
|
414
|
-
trustLoopback: !isEnvOff('
|
|
415
|
-
}, `Web console auth: ${isAuthEnabled() ? 'token-gated' : 'disabled (
|
|
450
|
+
trustLoopback: !isEnvOff('AGIM_TRUST_LOOPBACK'),
|
|
451
|
+
}, `Web console auth: ${isAuthEnabled() ? 'token-gated' : 'disabled (AGIM_WEB_AUTH=off)'}`);
|
|
416
452
|
// HTTP request handler — static files + REST API
|
|
417
453
|
const httpServer = createServer(async (req, res) => {
|
|
418
454
|
const url = new URL(req.url || '/', `http://localhost:${port}`);
|
|
@@ -423,7 +459,7 @@ export async function startWebServer(options) {
|
|
|
423
459
|
return;
|
|
424
460
|
// v1.2.72 — v2 SPA is the only web admin. The legacy v1 monolithic
|
|
425
461
|
// HTML pages (settings.html / tasks.html / reminders.html /
|
|
426
|
-
// memos.html / _app.js) have been removed; the `
|
|
462
|
+
// memos.html / _app.js) have been removed; the `AGIM_WEB_V2` env
|
|
427
463
|
// gate is gone — there is no v1 fallback anymore. Operators who
|
|
428
464
|
// were on the legacy layout flipped over automatically when they
|
|
429
465
|
// upgraded past 1.2.21 (default switch); the env knob remained as
|
|
@@ -591,7 +627,7 @@ export async function startWebServer(options) {
|
|
|
591
627
|
// - PC browsers anywhere: WGS-84.
|
|
592
628
|
// Default to WGS-84 pass-through (matches the most common Chinese
|
|
593
629
|
// mobile path — WeChat — which was silently miscalibrated before
|
|
594
|
-
// the 2026-05-12 fix). iOS users in China set
|
|
630
|
+
// the 2026-05-12 fix). iOS users in China set AGIM_H5_COORDS_GCJ02=1
|
|
595
631
|
// to restore the GCJ→WGS path. See core/coord-systems.ts.
|
|
596
632
|
const norm = normalizeIncomingCoords('h5-browser-geolocation', rawLat, rawLng);
|
|
597
633
|
const lat = norm.lat;
|
|
@@ -775,7 +811,7 @@ export async function startWebServer(options) {
|
|
|
775
811
|
return;
|
|
776
812
|
return handleDeleteMemo(req, res, Number.parseInt(memoIdMatch[1], 10));
|
|
777
813
|
}
|
|
778
|
-
// /api/env — read/write SMTP + Baidu AK +
|
|
814
|
+
// /api/env — read/write SMTP + Baidu AK + AGIM_WEB_BIND. Values
|
|
779
815
|
// sensitive enough that GET returns them masked (only the last 4 chars
|
|
780
816
|
// visible) unless an explicit ?reveal=1 is passed. Keep the settings
|
|
781
817
|
// surface admin-only: even masked values disclose configured providers.
|
|
@@ -791,7 +827,7 @@ export async function startWebServer(options) {
|
|
|
791
827
|
}
|
|
792
828
|
// v1.2.67 — Security diagnostics. Surfaces boot-time observations the
|
|
793
829
|
// Security UI page renders as read-only badges (uid, env file perms,
|
|
794
|
-
// bwrap availability,
|
|
830
|
+
// bwrap availability, AGIM_ALLOWED_USERS configured? …).
|
|
795
831
|
if (url.pathname === '/api/security/diagnostics' && req.method === 'GET') {
|
|
796
832
|
if (!requireAdmin(req, res))
|
|
797
833
|
return;
|
|
@@ -1174,6 +1210,11 @@ export async function startWebServer(options) {
|
|
|
1174
1210
|
if (url.pathname === '/api/service/status' && req.method === 'GET') {
|
|
1175
1211
|
return handleServiceStatus(res);
|
|
1176
1212
|
}
|
|
1213
|
+
if (url.pathname === '/api/service/log-tail' && req.method === 'GET') {
|
|
1214
|
+
if (!requireAdmin(req, res))
|
|
1215
|
+
return;
|
|
1216
|
+
return handleServiceLogTail(res, url);
|
|
1217
|
+
}
|
|
1177
1218
|
if (url.pathname === '/api/service/start' && req.method === 'POST') {
|
|
1178
1219
|
if (!requireAdmin(req, res))
|
|
1179
1220
|
return;
|
|
@@ -1232,7 +1273,7 @@ export async function startWebServer(options) {
|
|
|
1232
1273
|
}
|
|
1233
1274
|
// Auth-off / trusted-loopback bypass — mirror checkAuth's two short-circuits
|
|
1234
1275
|
// so dev / local CLI sessions still work without a token.
|
|
1235
|
-
if ((process.env.
|
|
1276
|
+
if ((process.env.AGIM_WEB_AUTH || '').toLowerCase() === 'off')
|
|
1236
1277
|
return cb(true);
|
|
1237
1278
|
if (isTrustedLoopbackPeer(info.req))
|
|
1238
1279
|
return cb(true);
|
|
@@ -1270,9 +1311,9 @@ export async function startWebServer(options) {
|
|
|
1270
1311
|
// M3: cap concurrent WS clients so a leaked / shared web token can't OOM
|
|
1271
1312
|
// the host by opening unbounded connections. Default 100 is generous for
|
|
1272
1313
|
// a single-user / small-team setup; production multi-tenant should set
|
|
1273
|
-
//
|
|
1314
|
+
// AGIM_MAX_WS_CLIENTS to a higher value.
|
|
1274
1315
|
const maxWsClients = (() => {
|
|
1275
|
-
const raw = process.env.
|
|
1316
|
+
const raw = process.env.AGIM_MAX_WS_CLIENTS;
|
|
1276
1317
|
if (raw) {
|
|
1277
1318
|
const n = parseInt(raw, 10);
|
|
1278
1319
|
if (Number.isFinite(n) && n > 0)
|
|
@@ -1285,14 +1326,14 @@ export async function startWebServer(options) {
|
|
|
1285
1326
|
// token can still spawn N parallel browser tabs / processes and
|
|
1286
1327
|
// saturate the file-descriptor pool.
|
|
1287
1328
|
//
|
|
1288
|
-
//
|
|
1289
|
-
//
|
|
1329
|
+
// AGIM_WS_MAX_PER_IP active connections per IP (default 20)
|
|
1330
|
+
// AGIM_WS_MAX_NEW_PER_IP_PER_MIN new connections per IP per minute (default 30)
|
|
1290
1331
|
//
|
|
1291
1332
|
// Trusted loopback bypasses both — local dev / CLI tooling makes many
|
|
1292
1333
|
// short connections legitimately. Reverse-proxied loopback traffic is
|
|
1293
1334
|
// still counted as network traffic.
|
|
1294
1335
|
const wsMaxPerIp = (() => {
|
|
1295
|
-
const raw = process.env.
|
|
1336
|
+
const raw = process.env.AGIM_WS_MAX_PER_IP;
|
|
1296
1337
|
if (raw) {
|
|
1297
1338
|
const n = parseInt(raw, 10);
|
|
1298
1339
|
if (Number.isFinite(n) && n > 0)
|
|
@@ -1301,7 +1342,7 @@ export async function startWebServer(options) {
|
|
|
1301
1342
|
return 20;
|
|
1302
1343
|
})();
|
|
1303
1344
|
const wsMaxNewPerIpPerMin = (() => {
|
|
1304
|
-
const raw = process.env.
|
|
1345
|
+
const raw = process.env.AGIM_WS_MAX_NEW_PER_IP_PER_MIN;
|
|
1305
1346
|
if (raw) {
|
|
1306
1347
|
const n = parseInt(raw, 10);
|
|
1307
1348
|
if (Number.isFinite(n) && n > 0)
|
|
@@ -1546,10 +1587,34 @@ export async function startWebServer(options) {
|
|
|
1546
1587
|
});
|
|
1547
1588
|
});
|
|
1548
1589
|
// Default to loopback; operators can opt into LAN/public exposure with
|
|
1549
|
-
//
|
|
1590
|
+
// AGIM_WEB_BIND=0.0.0.0 behind their firewall/reverse proxy.
|
|
1550
1591
|
await new Promise((resolve, reject) => {
|
|
1551
|
-
|
|
1552
|
-
|
|
1592
|
+
const onError = (err) => {
|
|
1593
|
+
httpServer.off('listening', onListening);
|
|
1594
|
+
try {
|
|
1595
|
+
httpServer.close();
|
|
1596
|
+
}
|
|
1597
|
+
catch { /* not listening yet */ }
|
|
1598
|
+
reject(err);
|
|
1599
|
+
};
|
|
1600
|
+
const onListening = () => {
|
|
1601
|
+
httpServer.off('error', onError);
|
|
1602
|
+
resolve();
|
|
1603
|
+
};
|
|
1604
|
+
httpServer.once('error', onError);
|
|
1605
|
+
httpServer.once('listening', onListening);
|
|
1606
|
+
try {
|
|
1607
|
+
httpServer.listen(port, bindHost);
|
|
1608
|
+
}
|
|
1609
|
+
catch (err) {
|
|
1610
|
+
httpServer.off('error', onError);
|
|
1611
|
+
httpServer.off('listening', onListening);
|
|
1612
|
+
try {
|
|
1613
|
+
httpServer.close();
|
|
1614
|
+
}
|
|
1615
|
+
catch { /* not listening yet */ }
|
|
1616
|
+
reject(err);
|
|
1617
|
+
}
|
|
1553
1618
|
});
|
|
1554
1619
|
webLog.info({ port, bindHost }, `Chat UI available at http://${bindHost === '0.0.0.0' ? 'localhost' : bindHost}:${port}`);
|
|
1555
1620
|
// ============================================================
|
|
@@ -1700,7 +1765,7 @@ async function handleGetConfig(_req, res) {
|
|
|
1700
1765
|
const showGlobalIm = isGlobalImEnabled();
|
|
1701
1766
|
const showRemoteAgent = isRemoteAgentEnabled();
|
|
1702
1767
|
// v1.2.69 — IM platform blacklist. When an operator sets
|
|
1703
|
-
//
|
|
1768
|
+
// AGIM_PLATFORM_BLACKLIST=telegram,discord (etc.), those platforms
|
|
1704
1769
|
// are hidden from the admin SPA entirely — credentials still live
|
|
1705
1770
|
// on disk but the UI shows nothing for that platform AND the
|
|
1706
1771
|
// registry refuses to register the adapter at boot. Default empty.
|
|
@@ -2190,6 +2255,68 @@ async function handleServiceStatus(res) {
|
|
|
2190
2255
|
sendJson(res, 500, { error: err instanceof Error ? err.message : String(err) });
|
|
2191
2256
|
}
|
|
2192
2257
|
}
|
|
2258
|
+
async function handleServiceLogTail(res, url) {
|
|
2259
|
+
try {
|
|
2260
|
+
const { LOG_FILE } = await import('../cli-ui/service.js');
|
|
2261
|
+
const requestedLines = parseInt(url.searchParams.get('lines') || '120', 10);
|
|
2262
|
+
const lines = Math.min(Math.max(Number.isFinite(requestedLines) ? requestedLines : 120, 20), 500);
|
|
2263
|
+
const maxBytes = 256 * 1024;
|
|
2264
|
+
let st;
|
|
2265
|
+
try {
|
|
2266
|
+
st = await stat(LOG_FILE);
|
|
2267
|
+
}
|
|
2268
|
+
catch (err) {
|
|
2269
|
+
const e = err;
|
|
2270
|
+
if (e.code === 'ENOENT') {
|
|
2271
|
+
sendJson(res, 200, {
|
|
2272
|
+
path: LOG_FILE,
|
|
2273
|
+
exists: false,
|
|
2274
|
+
content: '',
|
|
2275
|
+
lines: 0,
|
|
2276
|
+
truncated: false,
|
|
2277
|
+
size: 0,
|
|
2278
|
+
mtime: null,
|
|
2279
|
+
});
|
|
2280
|
+
return;
|
|
2281
|
+
}
|
|
2282
|
+
throw err;
|
|
2283
|
+
}
|
|
2284
|
+
if (!st.isFile()) {
|
|
2285
|
+
sendJson(res, 400, { error: 'Service log path is not a regular file' });
|
|
2286
|
+
return;
|
|
2287
|
+
}
|
|
2288
|
+
const start = Math.max(0, st.size - maxBytes);
|
|
2289
|
+
const len = st.size - start;
|
|
2290
|
+
let buf;
|
|
2291
|
+
const fd = await open(LOG_FILE, 'r');
|
|
2292
|
+
try {
|
|
2293
|
+
buf = Buffer.alloc(len);
|
|
2294
|
+
const { bytesRead } = await fd.read(buf, 0, len, start);
|
|
2295
|
+
buf = buf.subarray(0, bytesRead);
|
|
2296
|
+
}
|
|
2297
|
+
finally {
|
|
2298
|
+
await fd.close();
|
|
2299
|
+
}
|
|
2300
|
+
let text = buf.toString('utf8');
|
|
2301
|
+
if (start > 0)
|
|
2302
|
+
text = text.replace(/^[^\n]*(\n|$)/, '');
|
|
2303
|
+
const allLines = text.split(/\r?\n/);
|
|
2304
|
+
const selected = allLines.slice(-lines);
|
|
2305
|
+
const content = selected.join('\n');
|
|
2306
|
+
sendJson(res, 200, {
|
|
2307
|
+
path: LOG_FILE,
|
|
2308
|
+
exists: true,
|
|
2309
|
+
content,
|
|
2310
|
+
lines: content ? selected.length : 0,
|
|
2311
|
+
truncated: start > 0 || allLines.length > lines,
|
|
2312
|
+
size: st.size,
|
|
2313
|
+
mtime: st.mtime.toISOString(),
|
|
2314
|
+
});
|
|
2315
|
+
}
|
|
2316
|
+
catch (err) {
|
|
2317
|
+
sendJson(res, 500, { error: err instanceof Error ? err.message : String(err) });
|
|
2318
|
+
}
|
|
2319
|
+
}
|
|
2193
2320
|
async function handleServiceStart(res) {
|
|
2194
2321
|
try {
|
|
2195
2322
|
const { detectService, spawnBackground, reapStrayAgimProcesses } = await import('../cli-ui/service.js');
|
|
@@ -2227,7 +2354,7 @@ async function handleServiceStart(res) {
|
|
|
2227
2354
|
}
|
|
2228
2355
|
try {
|
|
2229
2356
|
const { spawn } = await import('node:child_process');
|
|
2230
|
-
const unitName =
|
|
2357
|
+
const unitName = 'agim.service';
|
|
2231
2358
|
// Detached + fire-and-forget so the HTTP response isn't held
|
|
2232
2359
|
// for the full systemd activation timeline.
|
|
2233
2360
|
const child = spawn('systemctl', ['start', unitName], { detached: true, stdio: 'ignore' });
|
|
@@ -2261,8 +2388,7 @@ async function handleServiceStop(res) {
|
|
|
2261
2388
|
// systemctl stop handles the kill for us — no self-exit needed.
|
|
2262
2389
|
try {
|
|
2263
2390
|
const { execSync } = await import('node:child_process');
|
|
2264
|
-
|
|
2265
|
-
const unitName = existsSync('/etc/systemd/system/agim.service') ? 'agim.service' : 'im-hub.service';
|
|
2391
|
+
const unitName = 'agim.service';
|
|
2266
2392
|
execSync(`systemctl stop ${unitName}`);
|
|
2267
2393
|
// R14 §四 — sweep stray pids after systemctl stop, same way
|
|
2268
2394
|
// restart does pre-stop. systemctl reports success when its
|
|
@@ -2345,7 +2471,7 @@ async function handleServiceRestart(res) {
|
|
|
2345
2471
|
}
|
|
2346
2472
|
try {
|
|
2347
2473
|
const { spawn } = await import('node:child_process');
|
|
2348
|
-
const unitName =
|
|
2474
|
+
const unitName = 'agim.service';
|
|
2349
2475
|
// v1.5 — fire-and-forget. execSync blocked the HTTP response until
|
|
2350
2476
|
// systemctl had finished stop+start (5-10s), making the web button
|
|
2351
2477
|
// look frozen to the user. Detach the child so we can ACK the
|
|
@@ -2822,82 +2948,82 @@ async function handleDeleteMemo(_req, res, id) {
|
|
|
2822
2948
|
}
|
|
2823
2949
|
// ─── env file (SMTP + Baidu AK + …) ────────────────────────────────────
|
|
2824
2950
|
const ENV_EDITABLE_KEYS = [
|
|
2825
|
-
'
|
|
2826
|
-
'
|
|
2827
|
-
'
|
|
2828
|
-
'
|
|
2951
|
+
'AGIM_SMTP_HOST', 'AGIM_SMTP_PORT', 'AGIM_SMTP_USER', 'AGIM_SMTP_PASS',
|
|
2952
|
+
'AGIM_SMTP_FROM', 'AGIM_SMTP_SECURE',
|
|
2953
|
+
'AGIM_BAIDU_MAP_AK',
|
|
2954
|
+
'AGIM_LOC_BASE_URL', 'AGIM_TZ_OFFSET_HOURS',
|
|
2829
2955
|
// Safety card toggle — drives the Claude --dangerously-skip-permissions
|
|
2830
2956
|
// branch in plugins/agents/claude-code/index.ts. Not a secret, plain '1'/'0'.
|
|
2831
|
-
'
|
|
2957
|
+
'AGIM_DANGEROUSLY_SKIP_PERMISSIONS',
|
|
2832
2958
|
// Approval Policy card — 'allow' | 'deny' (default deny). Decides what the
|
|
2833
2959
|
// approval bus does when a tool-use prompt times out with no human reply.
|
|
2834
2960
|
// Hot-reload: handlePutEnv mutates process.env so approval-bus picks up the
|
|
2835
2961
|
// new value on the next timer fire, no restart needed.
|
|
2836
|
-
'
|
|
2962
|
+
'AGIM_TIMEOUT_DEFAULT',
|
|
2837
2963
|
// v1.2 — IM long-message viewer. Operator sets the public URL pointing at
|
|
2838
2964
|
// their reverse-proxied agim web port; thresholds tune when routing kicks
|
|
2839
2965
|
// in. Hot-reload works because viewer-config reads process.env every call.
|
|
2840
|
-
'
|
|
2841
|
-
'
|
|
2842
|
-
'
|
|
2843
|
-
'
|
|
2844
|
-
'
|
|
2845
|
-
'
|
|
2846
|
-
'
|
|
2966
|
+
'AGIM_VIEWER_ENABLED',
|
|
2967
|
+
'AGIM_VIEWER_PUBLIC_BASE_URL',
|
|
2968
|
+
'AGIM_VIEWER_CHARS',
|
|
2969
|
+
'AGIM_VIEWER_LINES',
|
|
2970
|
+
'AGIM_VIEWER_CODE_LINES',
|
|
2971
|
+
'AGIM_VIEWER_MAX_PASTES',
|
|
2972
|
+
'AGIM_VIEWER_TUNNEL_MODE',
|
|
2847
2973
|
// v1.2.43 — opt out of community default paste server (viewer.iclaw.host).
|
|
2848
|
-
'
|
|
2974
|
+
'AGIM_VIEWER_NO_DEFAULT_REMOTE',
|
|
2849
2975
|
// v1.1.10 — A2A notification settings (see src/core/a2a-notify.ts).
|
|
2850
|
-
'
|
|
2851
|
-
'
|
|
2852
|
-
'
|
|
2853
|
-
'
|
|
2854
|
-
'
|
|
2976
|
+
'AGIM_A2A_TIMEOUT_DEFAULT_MS',
|
|
2977
|
+
'AGIM_A2A_MAX_TIMEOUT_MS',
|
|
2978
|
+
'AGIM_A2A_NOTIFY_MODE',
|
|
2979
|
+
'AGIM_A2A_NOTIFY_MAX_DEPTH',
|
|
2980
|
+
'AGIM_A2A_HEARTBEAT_MIN',
|
|
2855
2981
|
// v1.5 — long-term memory (see src/core/memory.ts + persona.ts).
|
|
2856
|
-
'
|
|
2982
|
+
'AGIM_MEMORY_ENABLED',
|
|
2857
2983
|
// P1/P2 — dream distillation (background fact extraction; see
|
|
2858
2984
|
// src/core/memory-distiller.ts).
|
|
2859
|
-
'
|
|
2860
|
-
'
|
|
2861
|
-
'
|
|
2862
|
-
'
|
|
2863
|
-
'
|
|
2864
|
-
'
|
|
2865
|
-
'
|
|
2985
|
+
'AGIM_MEMORY_DISTILL_ENABLED',
|
|
2986
|
+
'AGIM_MEMORY_DISTILL_SOURCE',
|
|
2987
|
+
'AGIM_MEMORY_DISTILL_AGENT',
|
|
2988
|
+
'AGIM_MEMORY_DISTILL_INTERVAL_MS',
|
|
2989
|
+
'AGIM_MEMORY_DISTILL_FLOOR_MIN',
|
|
2990
|
+
'AGIM_MEMORY_DISTILL_BATCH_MAX',
|
|
2991
|
+
'AGIM_MEMORY_DISTILL_MAX_PENDING',
|
|
2866
2992
|
// v1.6 — vector retrieval (opt-in, OFF by default).
|
|
2867
|
-
'
|
|
2868
|
-
'
|
|
2869
|
-
'
|
|
2870
|
-
'
|
|
2871
|
-
'
|
|
2872
|
-
'
|
|
2873
|
-
'
|
|
2993
|
+
'AGIM_MEMORY_VECTOR_BACKEND',
|
|
2994
|
+
'AGIM_MEMORY_VECTOR_LOCAL_MODEL',
|
|
2995
|
+
'AGIM_MEMORY_VECTOR_OPENAI_BASE_URL',
|
|
2996
|
+
'AGIM_MEMORY_VECTOR_OPENAI_MODEL',
|
|
2997
|
+
'AGIM_MEMORY_VECTOR_OPENAI_API_KEY',
|
|
2998
|
+
'AGIM_MEMORY_VECTOR_BATCH_SIZE',
|
|
2999
|
+
'AGIM_MEMORY_VECTOR_HYBRID_WEIGHT',
|
|
2874
3000
|
// v1.2.67 — Security page surfaces these (added in v1.2.58–v1.2.66).
|
|
2875
3001
|
// Sender allowlist — who can talk to the bot at all.
|
|
2876
|
-
'
|
|
3002
|
+
'AGIM_ALLOWED_USERS',
|
|
2877
3003
|
// Native fs tools — workspace restriction + per-tool timeout.
|
|
2878
|
-
'
|
|
2879
|
-
'
|
|
3004
|
+
'AGIM_NATIVE_FS_RESTRICT',
|
|
3005
|
+
'AGIM_NATIVE_FS_TIMEOUT_MS',
|
|
2880
3006
|
// Native web tools — SSRF guards.
|
|
2881
|
-
'
|
|
2882
|
-
'
|
|
2883
|
-
'
|
|
3007
|
+
'AGIM_NATIVE_WEB_ALLOW_PRIVATE',
|
|
3008
|
+
'AGIM_NATIVE_WEB_SSRF_WHITELIST',
|
|
3009
|
+
'AGIM_NATIVE_WEB_TIMEOUT_MS',
|
|
2884
3010
|
// Native exec tool — bwrap sandbox + sub-knobs.
|
|
2885
|
-
'
|
|
2886
|
-
'
|
|
2887
|
-
'
|
|
2888
|
-
'
|
|
3011
|
+
'AGIM_EXEC_SANDBOX',
|
|
3012
|
+
'AGIM_EXEC_SANDBOX_NET',
|
|
3013
|
+
'AGIM_EXEC_TIMEOUT_MS',
|
|
3014
|
+
'AGIM_EXEC_MAX_OUTPUT',
|
|
2889
3015
|
// Native call_agent per-turn cap.
|
|
2890
|
-
'
|
|
3016
|
+
'AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN',
|
|
2891
3017
|
// v1.2.69 — IM platform blacklist (CSV of platform ids). Default
|
|
2892
3018
|
// empty (no blocks); listed platforms vanish from web + CLI + are
|
|
2893
3019
|
// refused at registry.registerMessenger.
|
|
2894
|
-
'
|
|
3020
|
+
'AGIM_PLATFORM_BLACKLIST',
|
|
2895
3021
|
// v1.2.126 — web_search provider chain (CSV) + each provider's API
|
|
2896
|
-
// key. `
|
|
3022
|
+
// key. `AGIM_WEB_SEARCH_PROVIDERS` orders the fallback chain (e.g.
|
|
2897
3023
|
// 'tavily,brave,duckduckgo'); a missing/empty value falls back to
|
|
2898
3024
|
// DEFAULT_PROVIDER_ORDER in web-dispatcher. The 5 *_API_KEY values
|
|
2899
3025
|
// gate per-provider availability (duckduckgo needs no key).
|
|
2900
|
-
'
|
|
3026
|
+
'AGIM_WEB_SEARCH_PROVIDERS',
|
|
2901
3027
|
'TAVILY_API_KEY',
|
|
2902
3028
|
'BRAVE_API_KEY',
|
|
2903
3029
|
'SERPER_API_KEY',
|
|
@@ -2907,47 +3033,47 @@ const ENV_EDITABLE_KEYS = [
|
|
|
2907
3033
|
// timeout / blank-response retry / length-recovery retry). Hot-
|
|
2908
3034
|
// reload: each subsystem re-reads process.env on every call, so
|
|
2909
3035
|
// editing these takes effect without a restart.
|
|
2910
|
-
'
|
|
2911
|
-
'
|
|
2912
|
-
'
|
|
2913
|
-
'
|
|
3036
|
+
'AGIM_NATIVE_TOOL_RESULT_MAX_CHARS',
|
|
3037
|
+
'AGIM_NATIVE_TOOL_TIMEOUT_MS',
|
|
3038
|
+
'AGIM_NATIVE_BLANK_RETRY_MAX',
|
|
3039
|
+
'AGIM_NATIVE_LENGTH_RECOVERY_MAX',
|
|
2914
3040
|
// v1.2.127 — A2A sub-agent spawn (depth / timeout / in-process /
|
|
2915
3041
|
// per-turn cap). All hot-read; flipping in-process to 'off' makes
|
|
2916
3042
|
// the next call_agent('native', …) reboot via the subprocess CLI
|
|
2917
3043
|
// adapter instead of the v1.2.121 fast path.
|
|
2918
|
-
'
|
|
2919
|
-
'
|
|
2920
|
-
'
|
|
2921
|
-
'
|
|
3044
|
+
'AGIM_A2A_MAX_DEPTH',
|
|
3045
|
+
'AGIM_A2A_TIMEOUT_DEFAULT_MS',
|
|
3046
|
+
'AGIM_NATIVE_CALL_AGENT_IN_PROCESS',
|
|
3047
|
+
'AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN',
|
|
2922
3048
|
// v1.2.127 — early-stop + critic. Semantic stuck-loop default ON
|
|
2923
3049
|
// catches the v1.2.122 case (3 different tools, same salient arg).
|
|
2924
3050
|
// Critic default OFF — opt-in goal-divergence detector.
|
|
2925
|
-
'
|
|
2926
|
-
'
|
|
2927
|
-
'
|
|
2928
|
-
'
|
|
3051
|
+
'AGIM_NATIVE_SEMANTIC_STUCK_LOOP',
|
|
3052
|
+
'AGIM_NATIVE_CRITIC',
|
|
3053
|
+
'AGIM_NATIVE_CRITIC_ROLE',
|
|
3054
|
+
'AGIM_NATIVE_PLAN_MODE',
|
|
2929
3055
|
// v1.2.135 — auto-enter heuristic + custom phrase list.
|
|
2930
|
-
'
|
|
2931
|
-
'
|
|
3056
|
+
'AGIM_PLAN_INTENT_AUTO',
|
|
3057
|
+
'AGIM_PLAN_INTENT_PHRASES',
|
|
2932
3058
|
// v1.2.127 — auto-compact 4 sliders (OpenHands Condenser pattern).
|
|
2933
3059
|
// KEEP_FIRST defaults to 1 since v1.2.125 (original user goal at idx 0).
|
|
2934
|
-
'
|
|
2935
|
-
'
|
|
2936
|
-
'
|
|
2937
|
-
'
|
|
3060
|
+
'AGIM_NATIVE_COMPACT_TRIGGER_CHARS',
|
|
3061
|
+
'AGIM_NATIVE_COMPACT_KEEP_TURNS',
|
|
3062
|
+
'AGIM_NATIVE_COMPACT_KEEP_FIRST',
|
|
3063
|
+
'AGIM_NATIVE_COMPACT_SUMMARY_CHARS',
|
|
2938
3064
|
// v1.2.127 — streaming + iteration cap. STREAM_PARTIAL default ON
|
|
2939
3065
|
// preserves partial assistant text on IM's 30-min hard timeout.
|
|
2940
|
-
'
|
|
2941
|
-
'
|
|
3066
|
+
'AGIM_NATIVE_STREAM_PARTIAL',
|
|
3067
|
+
'AGIM_NATIVE_AGENT_MAX_ITER',
|
|
2942
3068
|
// v1.2.138 — first-token retry on transient stream errors (terminated /
|
|
2943
3069
|
// ECONNRESET / fetch failed / socket hang up). Default retries once.
|
|
2944
|
-
'
|
|
2945
|
-
'
|
|
3070
|
+
'AGIM_NATIVE_FIRSTTOKEN_RETRY_MAX',
|
|
3071
|
+
'AGIM_NATIVE_FIRSTTOKEN_RETRY_DELAY_MS',
|
|
2946
3072
|
];
|
|
2947
3073
|
const SECRET_KEYS = new Set([
|
|
2948
|
-
'
|
|
2949
|
-
'
|
|
2950
|
-
'
|
|
3074
|
+
'AGIM_SMTP_PASS',
|
|
3075
|
+
'AGIM_BAIDU_MAP_AK',
|
|
3076
|
+
'AGIM_MEMORY_VECTOR_OPENAI_API_KEY',
|
|
2951
3077
|
// v1.2.126 — web search keys are bearer tokens / API keys, so
|
|
2952
3078
|
// they're masked on GET and refused if echoed back on PUT.
|
|
2953
3079
|
'TAVILY_API_KEY',
|
|
@@ -3002,10 +3128,10 @@ async function handleSecurityDiagnostics(_req, res) {
|
|
|
3002
3128
|
// (process.env, which is what runtime sees) without round-tripping
|
|
3003
3129
|
// through the env file.
|
|
3004
3130
|
liveEnv: {
|
|
3005
|
-
|
|
3006
|
-
|
|
3007
|
-
|
|
3008
|
-
|
|
3131
|
+
AGIM_EXEC_SANDBOX: process.env.AGIM_EXEC_SANDBOX ?? null,
|
|
3132
|
+
AGIM_NATIVE_FS_RESTRICT: process.env.AGIM_NATIVE_FS_RESTRICT ?? null,
|
|
3133
|
+
AGIM_TIMEOUT_DEFAULT: process.env.AGIM_TIMEOUT_DEFAULT ?? null,
|
|
3134
|
+
AGIM_DANGEROUSLY_SKIP_PERMISSIONS: process.env.AGIM_DANGEROUSLY_SKIP_PERMISSIONS ?? null,
|
|
3009
3135
|
},
|
|
3010
3136
|
},
|
|
3011
3137
|
});
|
|
@@ -3100,9 +3226,9 @@ async function handleEmailTest(req, res) {
|
|
|
3100
3226
|
// Drain body even though we don't use it, so the connection doesn't
|
|
3101
3227
|
// stall under keep-alive.
|
|
3102
3228
|
await readBody(req, res);
|
|
3103
|
-
const host = process.env.
|
|
3104
|
-
const user = process.env.
|
|
3105
|
-
const pass = process.env.
|
|
3229
|
+
const host = process.env.AGIM_SMTP_HOST?.trim();
|
|
3230
|
+
const user = process.env.AGIM_SMTP_USER?.trim();
|
|
3231
|
+
const pass = process.env.AGIM_SMTP_PASS;
|
|
3106
3232
|
if (!host || !user || !pass) {
|
|
3107
3233
|
sendError(res, 400, 'EMAIL_NOT_CONFIGURED', {
|
|
3108
3234
|
message: 'SMTP not configured (host / user / pass required)',
|
|
@@ -3110,10 +3236,10 @@ async function handleEmailTest(req, res) {
|
|
|
3110
3236
|
});
|
|
3111
3237
|
return;
|
|
3112
3238
|
}
|
|
3113
|
-
const portRaw = process.env.
|
|
3239
|
+
const portRaw = process.env.AGIM_SMTP_PORT?.trim();
|
|
3114
3240
|
const portNum = portRaw ? Number.parseInt(portRaw, 10) : 465;
|
|
3115
3241
|
const port = Number.isFinite(portNum) && portNum > 0 && portNum <= 65535 ? portNum : 465;
|
|
3116
|
-
const secureRaw = process.env.
|
|
3242
|
+
const secureRaw = process.env.AGIM_SMTP_SECURE?.trim().toLowerCase();
|
|
3117
3243
|
const secure = secureRaw !== undefined
|
|
3118
3244
|
? (secureRaw === '1' || secureRaw === 'true' || secureRaw === 'yes')
|
|
3119
3245
|
: port === 465;
|
|
@@ -3989,7 +4115,7 @@ async function handleSkillsList(_req, res) {
|
|
|
3989
4115
|
// install still happens via the skillhub CLI on the host (see docs).
|
|
3990
4116
|
//
|
|
3991
4117
|
// Enterprise / air-gapped deployments can disable this endpoint via
|
|
3992
|
-
// `
|
|
4118
|
+
// `AGIM_SKILLHUB_ENABLED=0`. When disabled, the API returns a stub
|
|
3993
4119
|
// shape `{ disabled: true, items: [] }` so the UI can show "disabled
|
|
3994
4120
|
// by enterprise policy" without breaking the page. This is the only
|
|
3995
4121
|
// product-default outbound call to a non-IM domain, so the toggle
|
|
@@ -3997,7 +4123,7 @@ async function handleSkillsList(_req, res) {
|
|
|
3997
4123
|
let remoteHotCache = null;
|
|
3998
4124
|
const REMOTE_HOT_TTL_MS = 5 * 60_000;
|
|
3999
4125
|
function isSkillhubEnabled() {
|
|
4000
|
-
const v = (process.env.
|
|
4126
|
+
const v = (process.env.AGIM_SKILLHUB_ENABLED ?? '1').trim().toLowerCase();
|
|
4001
4127
|
return v !== '0' && v !== 'false' && v !== 'no' && v !== 'off';
|
|
4002
4128
|
}
|
|
4003
4129
|
async function handleSkillsRemoteHot(_req, res) {
|
|
@@ -4006,7 +4132,7 @@ async function handleSkillsRemoteHot(_req, res) {
|
|
|
4006
4132
|
// so the SPA can render "disabled" copy without a network error
|
|
4007
4133
|
// toast. Status 200 because this is a deliberate operator choice,
|
|
4008
4134
|
// not a transient failure.
|
|
4009
|
-
sendJson(res, 200, { disabled: true, items: [], reason: '
|
|
4135
|
+
sendJson(res, 200, { disabled: true, items: [], reason: 'AGIM_SKILLHUB_ENABLED=0' });
|
|
4010
4136
|
return;
|
|
4011
4137
|
}
|
|
4012
4138
|
try {
|
|
@@ -4484,10 +4610,18 @@ async function handleWorkspaceFileWrite(req, res, url) {
|
|
|
4484
4610
|
throw err;
|
|
4485
4611
|
}
|
|
4486
4612
|
const finalSt = await stat(target);
|
|
4613
|
+
const savedPath = relativePath(base, target);
|
|
4614
|
+
if (savedPath === 'MEMORY.md') {
|
|
4615
|
+
try {
|
|
4616
|
+
const { ensureAgentMemoryLink } = await import('../core/agent-cwd.js');
|
|
4617
|
+
await ensureAgentMemoryLink(agent);
|
|
4618
|
+
}
|
|
4619
|
+
catch { /* best-effort: memory file itself was saved successfully */ }
|
|
4620
|
+
}
|
|
4487
4621
|
sendJson(res, 200, {
|
|
4488
4622
|
ok: true,
|
|
4489
4623
|
agent,
|
|
4490
|
-
path:
|
|
4624
|
+
path: savedPath,
|
|
4491
4625
|
size: finalSt.size,
|
|
4492
4626
|
mtime: finalSt.mtime.toISOString(),
|
|
4493
4627
|
});
|
|
@@ -5448,14 +5582,14 @@ function sendToClient(ws, data) {
|
|
|
5448
5582
|
*
|
|
5449
5583
|
* Polls every 50 ms — node's `ws` doesn't emit a `drain` event we can hook,
|
|
5450
5584
|
* but the buffered amount drops monotonically once the kernel ACKs flush.
|
|
5451
|
-
* Bounded by
|
|
5585
|
+
* Bounded by AGIM_WS_BACKPRESSURE_TIMEOUT_MS (default 5 s) so a frozen
|
|
5452
5586
|
* client can't wedge the agent's chunk producer indefinitely.
|
|
5453
5587
|
*/
|
|
5454
5588
|
async function awaitWsDrain(ws) {
|
|
5455
5589
|
if (ws.bufferedAmount < WS_BACKPRESSURE_HIGHWATER_BYTES)
|
|
5456
5590
|
return;
|
|
5457
5591
|
const timeoutMs = (() => {
|
|
5458
|
-
const raw = process.env.
|
|
5592
|
+
const raw = process.env.AGIM_WS_BACKPRESSURE_TIMEOUT_MS;
|
|
5459
5593
|
if (raw) {
|
|
5460
5594
|
const n = parseInt(raw, 10);
|
|
5461
5595
|
if (Number.isFinite(n) && n > 0)
|