agim-cli 1.2.44 → 1.2.48
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 +295 -0
- package/README.md +39 -5
- package/README.zh-CN.md +40 -6
- package/dist/cli-ui/config-wizard.js +15 -2
- package/dist/cli-ui/config-wizard.js.map +1 -1
- package/dist/cli-ui/diag.d.ts +29 -0
- package/dist/cli-ui/diag.d.ts.map +1 -0
- package/dist/cli-ui/diag.js +135 -0
- package/dist/cli-ui/diag.js.map +1 -0
- package/dist/cli-ui/i18n.d.ts +36 -0
- package/dist/cli-ui/i18n.d.ts.map +1 -1
- package/dist/cli-ui/i18n.js +97 -0
- package/dist/cli-ui/i18n.js.map +1 -1
- package/dist/cli-ui/setup-llm.d.ts +30 -0
- package/dist/cli-ui/setup-llm.d.ts.map +1 -0
- package/dist/cli-ui/setup-llm.js +460 -0
- package/dist/cli-ui/setup-llm.js.map +1 -0
- package/dist/cli-ui/setup-mcp.d.ts +19 -0
- package/dist/cli-ui/setup-mcp.d.ts.map +1 -0
- package/dist/cli-ui/setup-mcp.js +308 -0
- package/dist/cli-ui/setup-mcp.js.map +1 -0
- package/dist/cli-ui/token-menu.js +2 -2
- package/dist/cli-ui/token-menu.js.map +1 -1
- package/dist/cli.js +100 -22
- package/dist/cli.js.map +1 -1
- package/dist/core/access-token.d.ts +16 -5
- package/dist/core/access-token.d.ts.map +1 -1
- package/dist/core/access-token.js +82 -13
- package/dist/core/access-token.js.map +1 -1
- package/dist/core/agent-cwd.d.ts.map +1 -1
- package/dist/core/agent-cwd.js +46 -0
- package/dist/core/agent-cwd.js.map +1 -1
- package/dist/core/approval-bus.d.ts +22 -0
- package/dist/core/approval-bus.d.ts.map +1 -1
- package/dist/core/approval-bus.js +93 -0
- package/dist/core/approval-bus.js.map +1 -1
- package/dist/core/ask-user-router.d.ts +24 -0
- package/dist/core/ask-user-router.d.ts.map +1 -0
- package/dist/core/ask-user-router.js +84 -0
- package/dist/core/ask-user-router.js.map +1 -0
- package/dist/core/ask-user-rpc.d.ts +80 -0
- package/dist/core/ask-user-rpc.d.ts.map +1 -0
- package/dist/core/ask-user-rpc.js +388 -0
- package/dist/core/ask-user-rpc.js.map +1 -0
- package/dist/core/audit-log.d.ts +1 -1
- package/dist/core/audit-log.d.ts.map +1 -1
- package/dist/core/audit-log.js.map +1 -1
- package/dist/core/commands/builtin.d.ts.map +1 -1
- package/dist/core/commands/builtin.js +21 -5
- package/dist/core/commands/builtin.js.map +1 -1
- package/dist/core/commands/goal.d.ts +3 -0
- package/dist/core/commands/goal.d.ts.map +1 -0
- package/dist/core/commands/goal.js +240 -0
- package/dist/core/commands/goal.js.map +1 -0
- package/dist/core/commands/heartbeat.d.ts +3 -0
- package/dist/core/commands/heartbeat.d.ts.map +1 -0
- package/dist/core/commands/heartbeat.js +219 -0
- package/dist/core/commands/heartbeat.js.map +1 -0
- package/dist/core/commands/router-compare.d.ts +3 -0
- package/dist/core/commands/router-compare.d.ts.map +1 -0
- package/dist/core/commands/router-compare.js +81 -0
- package/dist/core/commands/router-compare.js.map +1 -0
- package/dist/core/commands/router.d.ts.map +1 -1
- package/dist/core/commands/router.js +9 -1
- package/dist/core/commands/router.js.map +1 -1
- package/dist/core/commands/skill.d.ts +3 -0
- package/dist/core/commands/skill.d.ts.map +1 -0
- package/dist/core/commands/skill.js +91 -0
- package/dist/core/commands/skill.js.map +1 -0
- package/dist/core/config-schema.d.ts +28 -0
- package/dist/core/config-schema.d.ts.map +1 -1
- package/dist/core/config-schema.js +124 -0
- package/dist/core/config-schema.js.map +1 -1
- package/dist/core/goals.d.ts +81 -0
- package/dist/core/goals.d.ts.map +1 -0
- package/dist/core/goals.js +361 -0
- package/dist/core/goals.js.map +1 -0
- package/dist/core/heartbeat-store.d.ts +90 -0
- package/dist/core/heartbeat-store.d.ts.map +1 -0
- package/dist/core/heartbeat-store.js +302 -0
- package/dist/core/heartbeat-store.js.map +1 -0
- package/dist/core/heartbeat.d.ts +35 -0
- package/dist/core/heartbeat.d.ts.map +1 -0
- package/dist/core/heartbeat.js +332 -0
- package/dist/core/heartbeat.js.map +1 -0
- package/dist/core/intent-llm.d.ts +9 -0
- package/dist/core/intent-llm.d.ts.map +1 -1
- package/dist/core/intent-llm.js +77 -32
- package/dist/core/intent-llm.js.map +1 -1
- package/dist/core/llm/agent-loop.d.ts +112 -0
- package/dist/core/llm/agent-loop.d.ts.map +1 -0
- package/dist/core/llm/agent-loop.js +313 -0
- package/dist/core/llm/agent-loop.js.map +1 -0
- package/dist/core/llm/anthropic-provider.d.ts +53 -0
- package/dist/core/llm/anthropic-provider.d.ts.map +1 -0
- package/dist/core/llm/anthropic-provider.js +339 -0
- package/dist/core/llm/anthropic-provider.js.map +1 -0
- package/dist/core/llm/auto-compact.d.ts +35 -0
- package/dist/core/llm/auto-compact.d.ts.map +1 -0
- package/dist/core/llm/auto-compact.js +149 -0
- package/dist/core/llm/auto-compact.js.map +1 -0
- package/dist/core/llm/builtin-dispatcher.d.ts +21 -0
- package/dist/core/llm/builtin-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/builtin-dispatcher.js +196 -0
- package/dist/core/llm/builtin-dispatcher.js.map +1 -0
- package/dist/core/llm/imhub-dispatcher.d.ts +27 -0
- package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/imhub-dispatcher.js +308 -0
- package/dist/core/llm/imhub-dispatcher.js.map +1 -0
- package/dist/core/llm/index.d.ts +11 -0
- package/dist/core/llm/index.d.ts.map +1 -0
- package/dist/core/llm/index.js +16 -0
- package/dist/core/llm/index.js.map +1 -0
- package/dist/core/llm/introspection.d.ts +73 -0
- package/dist/core/llm/introspection.d.ts.map +1 -0
- package/dist/core/llm/introspection.js +90 -0
- package/dist/core/llm/introspection.js.map +1 -0
- package/dist/core/llm/mcp-client.d.ts +80 -0
- package/dist/core/llm/mcp-client.d.ts.map +1 -0
- package/dist/core/llm/mcp-client.js +270 -0
- package/dist/core/llm/mcp-client.js.map +1 -0
- package/dist/core/llm/mcp-registry.d.ts +57 -0
- package/dist/core/llm/mcp-registry.d.ts.map +1 -0
- package/dist/core/llm/mcp-registry.js +155 -0
- package/dist/core/llm/mcp-registry.js.map +1 -0
- package/dist/core/llm/openai-compat-provider.d.ts +65 -0
- package/dist/core/llm/openai-compat-provider.d.ts.map +1 -0
- package/dist/core/llm/openai-compat-provider.js +451 -0
- package/dist/core/llm/openai-compat-provider.js.map +1 -0
- package/dist/core/llm/policy-approval-gate.d.ts +30 -0
- package/dist/core/llm/policy-approval-gate.d.ts.map +1 -0
- package/dist/core/llm/policy-approval-gate.js +86 -0
- package/dist/core/llm/policy-approval-gate.js.map +1 -0
- package/dist/core/llm/provider-base.d.ts +302 -0
- package/dist/core/llm/provider-base.d.ts.map +1 -0
- package/dist/core/llm/provider-base.js +222 -0
- package/dist/core/llm/provider-base.js.map +1 -0
- package/dist/core/llm/registry.d.ts +44 -0
- package/dist/core/llm/registry.d.ts.map +1 -0
- package/dist/core/llm/registry.js +160 -0
- package/dist/core/llm/registry.js.map +1 -0
- package/dist/core/llm/secrets.d.ts +46 -0
- package/dist/core/llm/secrets.d.ts.map +1 -0
- package/dist/core/llm/secrets.js +157 -0
- package/dist/core/llm/secrets.js.map +1 -0
- package/dist/core/llm/tool-dispatcher.d.ts +37 -0
- package/dist/core/llm/tool-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/tool-dispatcher.js +85 -0
- package/dist/core/llm/tool-dispatcher.js.map +1 -0
- package/dist/core/memory-consolidate.d.ts.map +1 -1
- package/dist/core/memory-consolidate.js +38 -23
- package/dist/core/memory-consolidate.js.map +1 -1
- package/dist/core/memory-distill.d.ts.map +1 -1
- package/dist/core/memory-distill.js +51 -25
- package/dist/core/memory-distill.js.map +1 -1
- package/dist/core/memory-rpc.d.ts.map +1 -1
- package/dist/core/memory-rpc.js +6 -0
- package/dist/core/memory-rpc.js.map +1 -1
- package/dist/core/message-sink.d.ts.map +1 -1
- package/dist/core/message-sink.js +76 -0
- package/dist/core/message-sink.js.map +1 -1
- package/dist/core/notification-evaluator.d.ts +49 -0
- package/dist/core/notification-evaluator.d.ts.map +1 -0
- package/dist/core/notification-evaluator.js +232 -0
- package/dist/core/notification-evaluator.js.map +1 -0
- package/dist/core/onboarding.d.ts.map +1 -1
- package/dist/core/onboarding.js +10 -0
- package/dist/core/onboarding.js.map +1 -1
- package/dist/core/persona.d.ts +10 -0
- package/dist/core/persona.d.ts.map +1 -1
- package/dist/core/persona.js +28 -14
- package/dist/core/persona.js.map +1 -1
- package/dist/core/push-rpc.d.ts +8 -0
- package/dist/core/push-rpc.d.ts.map +1 -1
- package/dist/core/push-rpc.js +41 -1
- package/dist/core/push-rpc.js.map +1 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +6 -0
- package/dist/core/registry.js.map +1 -1
- package/dist/core/render-router.d.ts.map +1 -1
- package/dist/core/render-router.js +23 -6
- package/dist/core/render-router.js.map +1 -1
- package/dist/core/router-compare.d.ts +76 -0
- package/dist/core/router-compare.d.ts.map +1 -0
- package/dist/core/router-compare.js +253 -0
- package/dist/core/router-compare.js.map +1 -0
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +25 -1
- package/dist/core/router.js.map +1 -1
- package/dist/core/skills/builtin/agim-self/SKILL.md +81 -0
- package/dist/core/skills/loader.d.ts +120 -0
- package/dist/core/skills/loader.d.ts.map +1 -0
- package/dist/core/skills/loader.js +577 -0
- package/dist/core/skills/loader.js.map +1 -0
- package/dist/core/skills-rpc.d.ts +44 -0
- package/dist/core/skills-rpc.d.ts.map +1 -0
- package/dist/core/skills-rpc.js +71 -0
- package/dist/core/skills-rpc.js.map +1 -0
- package/dist/core/types.d.ts +35 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/util/format-age.d.ts +20 -0
- package/dist/core/util/format-age.d.ts.map +1 -0
- package/dist/core/util/format-age.js +86 -0
- package/dist/core/util/format-age.js.map +1 -0
- package/dist/core/viewer-config.d.ts +15 -7
- package/dist/core/viewer-config.d.ts.map +1 -1
- package/dist/core/viewer-config.js +18 -12
- package/dist/core/viewer-config.js.map +1 -1
- package/dist/plugins/agents/acp/acp-adapter.d.ts +3 -0
- package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/acp/acp-adapter.js +12 -0
- package/dist/plugins/agents/acp/acp-adapter.js.map +1 -1
- package/dist/plugins/agents/antigravity/index.d.ts +1 -0
- package/dist/plugins/agents/antigravity/index.d.ts.map +1 -1
- package/dist/plugins/agents/antigravity/index.js +1 -0
- package/dist/plugins/agents/antigravity/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/index.d.ts +1 -0
- package/dist/plugins/agents/claude-code/index.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/index.js +1 -0
- package/dist/plugins/agents/claude-code/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +22 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.js +157 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
- package/dist/plugins/agents/codex/index.d.ts +1 -0
- package/dist/plugins/agents/codex/index.d.ts.map +1 -1
- package/dist/plugins/agents/codex/index.js +1 -0
- package/dist/plugins/agents/codex/index.js.map +1 -1
- package/dist/plugins/agents/native/index.d.ts +34 -0
- package/dist/plugins/agents/native/index.d.ts.map +1 -0
- package/dist/plugins/agents/native/index.js +598 -0
- package/dist/plugins/agents/native/index.js.map +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +4 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js +26 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
- package/dist/web/agim-skills-api.d.ts +4 -0
- package/dist/web/agim-skills-api.d.ts.map +1 -0
- package/dist/web/agim-skills-api.js +150 -0
- package/dist/web/agim-skills-api.js.map +1 -0
- package/dist/web/background-tasks-api.d.ts +7 -0
- package/dist/web/background-tasks-api.d.ts.map +1 -0
- package/dist/web/background-tasks-api.js +225 -0
- package/dist/web/background-tasks-api.js.map +1 -0
- package/dist/web/llm-api.d.ts +8 -0
- package/dist/web/llm-api.d.ts.map +1 -0
- package/dist/web/llm-api.js +300 -0
- package/dist/web/llm-api.js.map +1 -0
- package/dist/web/mcp-api.d.ts +8 -0
- package/dist/web/mcp-api.d.ts.map +1 -0
- package/dist/web/mcp-api.js +205 -0
- package/dist/web/mcp-api.js.map +1 -0
- package/dist/web/public/assets/{a2a-Bg_mT0z1.js → a2a-Mke0F7ZM.js} +3 -3
- package/dist/web/public/assets/{a2a-Bg_mT0z1.js.map → a2a-Mke0F7ZM.js.map} +1 -1
- package/dist/web/public/assets/{activity-U9AaNlDt.js → activity-0zGnf1_m.js} +2 -2
- package/dist/web/public/assets/{activity-U9AaNlDt.js.map → activity-0zGnf1_m.js.map} +1 -1
- package/dist/web/public/assets/{admins-BTC_YEK9.js → admins-DSi3KRky.js} +3 -3
- package/dist/web/public/assets/{admins-BTC_YEK9.js.map → admins-DSi3KRky.js.map} +1 -1
- package/dist/web/public/assets/agents-BLWe20EJ.js +7 -0
- package/dist/web/public/assets/agents-BLWe20EJ.js.map +1 -0
- package/dist/web/public/assets/{approvals-Boj7iXz4.js → approvals-Cu_JdM-8.js} +3 -3
- package/dist/web/public/assets/{approvals-Boj7iXz4.js.map → approvals-Cu_JdM-8.js.map} +1 -1
- package/dist/web/public/assets/asks-DfV8vxey.js +7 -0
- package/dist/web/public/assets/asks-DfV8vxey.js.map +1 -0
- package/dist/web/public/assets/{audit-MprCFoy_.js → audit-2EVhhvGV.js} +2 -2
- package/dist/web/public/assets/{audit-MprCFoy_.js.map → audit-2EVhhvGV.js.map} +1 -1
- package/dist/web/public/assets/bell-Wz_wuOa_.js +7 -0
- package/dist/web/public/assets/bell-Wz_wuOa_.js.map +1 -0
- package/dist/web/public/assets/{bgjobs-B6XvxURz.js → bgjobs-DXROZFAW.js} +2 -2
- package/dist/web/public/assets/{bgjobs-B6XvxURz.js.map → bgjobs-DXROZFAW.js.map} +1 -1
- package/dist/web/public/assets/{brain-C5HejASN.js → brain-Dh5VOzRL.js} +2 -2
- package/dist/web/public/assets/{brain-C5HejASN.js.map → brain-Dh5VOzRL.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-DkCTxO1A.js → briefcase-DfxbvM9i.js} +2 -2
- package/dist/web/public/assets/{briefcase-DkCTxO1A.js.map → briefcase-DfxbvM9i.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-DEyrYFz4.js → chevron-right-DU8Xla1M.js} +2 -2
- package/dist/web/public/assets/{chevron-right-DEyrYFz4.js.map → chevron-right-DU8Xla1M.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-bADFEXGw.js → circle-check-Be_S993G.js} +2 -2
- package/dist/web/public/assets/{circle-check-bADFEXGw.js.map → circle-check-Be_S993G.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-U4xrkHiS.js → circle-check-big-CsQkLR1u.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-U4xrkHiS.js.map → circle-check-big-CsQkLR1u.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-C6qY5UUl.js → circle-x-qkQu1Swu.js} +2 -2
- package/dist/web/public/assets/{circle-x-C6qY5UUl.js.map → circle-x-qkQu1Swu.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-B53cbWzX.js → confirm-dialog-Bm6MsLXZ.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-B53cbWzX.js.map → confirm-dialog-Bm6MsLXZ.js.map} +1 -1
- package/dist/web/public/assets/{data-table-BKTemkw9.js → data-table-Dw4Df09-.js} +5 -5
- package/dist/web/public/assets/{data-table-BKTemkw9.js.map → data-table-Dw4Df09-.js.map} +1 -1
- package/dist/web/public/assets/{dialog-Cevi7KvQ.js → dialog-CNsc4COh.js} +3 -3
- package/dist/web/public/assets/{dialog-Cevi7KvQ.js.map → dialog-CNsc4COh.js.map} +1 -1
- package/dist/web/public/assets/{download-DwJNwdwV.js → download-Bnhk_vDY.js} +2 -2
- package/dist/web/public/assets/{download-DwJNwdwV.js.map → download-Bnhk_vDY.js.map} +1 -1
- package/dist/web/public/assets/{email-CZVaRhG_.js → email-jgAX8liM.js} +3 -3
- package/dist/web/public/assets/{email-CZVaRhG_.js.map → email-jgAX8liM.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-C87S9Wor.js → empty-state-D8QXQ5y9.js} +2 -2
- package/dist/web/public/assets/{empty-state-C87S9Wor.js.map → empty-state-D8QXQ5y9.js.map} +1 -1
- package/dist/web/public/assets/{external-link-CIM1wjHP.js → external-link-C8AYvhBb.js} +2 -2
- package/dist/web/public/assets/{external-link-CIM1wjHP.js.map → external-link-C8AYvhBb.js.map} +1 -1
- package/dist/web/public/assets/{eye-TUAOhz72.js → eye-pmI_4E8x.js} +4 -4
- package/dist/web/public/assets/{eye-TUAOhz72.js.map → eye-pmI_4E8x.js.map} +1 -1
- package/dist/web/public/assets/{facts-ByM1VHCp.js → facts-BRHLLX2u.js} +2 -2
- package/dist/web/public/assets/{facts-ByM1VHCp.js.map → facts-BRHLLX2u.js.map} +1 -1
- package/dist/web/public/assets/goals-p7cNp01l.js +17 -0
- package/dist/web/public/assets/goals-p7cNp01l.js.map +1 -0
- package/dist/web/public/assets/{health-B4GF06J-.js → health-CuGIXg8C.js} +2 -2
- package/dist/web/public/assets/{health-B4GF06J-.js.map → health-CuGIXg8C.js.map} +1 -1
- package/dist/web/public/assets/heart-pulse-D0AHQl1d.js +7 -0
- package/dist/web/public/assets/heart-pulse-D0AHQl1d.js.map +1 -0
- package/dist/web/public/assets/heartbeat-DJRDS2GQ.js +7 -0
- package/dist/web/public/assets/heartbeat-DJRDS2GQ.js.map +1 -0
- package/dist/web/public/assets/hot-B1qKTiGD.js +17 -0
- package/dist/web/public/assets/hot-B1qKTiGD.js.map +1 -0
- package/dist/web/public/assets/index-B7QRVy9N.css +1 -0
- package/dist/web/public/assets/index-XJngV1gH.js +166 -0
- package/dist/web/public/assets/index-XJngV1gH.js.map +1 -0
- package/dist/web/public/assets/installed-Dz4-KevJ.js +31 -0
- package/dist/web/public/assets/installed-Dz4-KevJ.js.map +1 -0
- package/dist/web/public/assets/{jobs-DwA9Ip87.js → jobs-kwOypiWd.js} +2 -2
- package/dist/web/public/assets/{jobs-DwA9Ip87.js.map → jobs-kwOypiWd.js.map} +1 -1
- package/dist/web/public/assets/layout-01n3Aibo.js +2 -0
- package/dist/web/public/assets/layout-01n3Aibo.js.map +1 -0
- package/dist/web/public/assets/layout-CVYe2vN8.js +2 -0
- package/dist/web/public/assets/layout-CVYe2vN8.js.map +1 -0
- package/dist/web/public/assets/{layout-CR5gLapT.js → layout-CbHxH58i.js} +2 -2
- package/dist/web/public/assets/{layout-CR5gLapT.js.map → layout-CbHxH58i.js.map} +1 -1
- package/dist/web/public/assets/layout-DD1Dei48.js +2 -0
- package/dist/web/public/assets/layout-DD1Dei48.js.map +1 -0
- package/dist/web/public/assets/{layout-zotlJ5fW.js → layout-s11iwkL-.js} +2 -2
- package/dist/web/public/assets/{layout-zotlJ5fW.js.map → layout-s11iwkL-.js.map} +1 -1
- package/dist/web/public/assets/llm-DPlK10Lg.js +7 -0
- package/dist/web/public/assets/llm-DPlK10Lg.js.map +1 -0
- package/dist/web/public/assets/{loader-circle-BFp6Oc8_.js → loader-circle-DymEG5Cl.js} +2 -2
- package/dist/web/public/assets/{loader-circle-BFp6Oc8_.js.map → loader-circle-DymEG5Cl.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-DPqnsBIG.js → map-pin-CyZg1-Jk.js} +2 -2
- package/dist/web/public/assets/{map-pin-DPqnsBIG.js.map → map-pin-CyZg1-Jk.js.map} +1 -1
- package/dist/web/public/assets/mcp-CiifW_qp.js +7 -0
- package/dist/web/public/assets/mcp-CiifW_qp.js.map +1 -0
- package/dist/web/public/assets/{memos-DCACQN26.js → memos-Bsiq64qW.js} +2 -2
- package/dist/web/public/assets/{memos-DCACQN26.js.map → memos-Bsiq64qW.js.map} +1 -1
- package/dist/web/public/assets/{messengers-CwWP1qI4.js → messengers-alGJK9dO.js} +3 -3
- package/dist/web/public/assets/{messengers-CwWP1qI4.js.map → messengers-alGJK9dO.js.map} +1 -1
- package/dist/web/public/assets/native-agent-CgzcqRsU.js +7 -0
- package/dist/web/public/assets/native-agent-CgzcqRsU.js.map +1 -0
- package/dist/web/public/assets/{network-CrMEVz4-.js → network-BSRJfeGk.js} +2 -2
- package/dist/web/public/assets/{network-CrMEVz4-.js.map → network-BSRJfeGk.js.map} +1 -1
- package/dist/web/public/assets/{outbox-C7FpZzwS.js → outbox-DSDls9xU.js} +3 -3
- package/dist/web/public/assets/{outbox-C7FpZzwS.js.map → outbox-DSDls9xU.js.map} +1 -1
- package/dist/web/public/assets/{pagination-Cgt8W6EX.js → pagination-DVXNZ2ti.js} +3 -3
- package/dist/web/public/assets/{pagination-Cgt8W6EX.js.map → pagination-DVXNZ2ti.js.map} +1 -1
- package/dist/web/public/assets/{persona-Bjty6uqM.js → persona-BB1gIwTX.js} +2 -2
- package/dist/web/public/assets/{persona-Bjty6uqM.js.map → persona-BB1gIwTX.js.map} +1 -1
- package/dist/web/public/assets/{play-CEoS1N8t.js → play-CcECAHfL.js} +2 -2
- package/dist/web/public/assets/{play-CEoS1N8t.js.map → play-CcECAHfL.js.map} +1 -1
- package/dist/web/public/assets/plus-DrStBHss.js +7 -0
- package/dist/web/public/assets/plus-DrStBHss.js.map +1 -0
- package/dist/web/public/assets/policy-BgDYTxy7.js +2 -0
- package/dist/web/public/assets/{policy-DwI-ov9J.js.map → policy-BgDYTxy7.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-CPSYEbgh.js → refresh-ccw-BBRPVLH8.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-CPSYEbgh.js.map → refresh-ccw-BBRPVLH8.js.map} +1 -1
- package/dist/web/public/assets/{reminders-X-QFSWvZ.js → reminders-jwy196Xw.js} +4 -9
- package/dist/web/public/assets/reminders-jwy196Xw.js.map +1 -0
- package/dist/web/public/assets/{save-tS3IBPf3.js → save-iBtyruco.js} +2 -2
- package/dist/web/public/assets/{save-tS3IBPf3.js.map → save-iBtyruco.js.map} +1 -1
- package/dist/web/public/assets/{schedules-CfCNvhCV.js → schedules-DDl_Sr5r.js} +3 -3
- package/dist/web/public/assets/{schedules-CfCNvhCV.js.map → schedules-DDl_Sr5r.js.map} +1 -1
- package/dist/web/public/assets/{search-BPvPCccn.js → search-Yb1S22sv.js} +2 -2
- package/dist/web/public/assets/{search-BPvPCccn.js.map → search-Yb1S22sv.js.map} +1 -1
- package/dist/web/public/assets/{service-DSitDFzD.js → service-jrg0kMtK.js} +3 -3
- package/dist/web/public/assets/{service-DSitDFzD.js.map → service-jrg0kMtK.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-HSHkhdur.js → status-badge-Arxyw3TL.js} +2 -2
- package/dist/web/public/assets/{status-badge-HSHkhdur.js.map → status-badge-Arxyw3TL.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-eKq_P0v6.js → subtasks-CkyuMv_X.js} +3 -3
- package/dist/web/public/assets/{subtasks-eKq_P0v6.js.map → subtasks-CkyuMv_X.js.map} +1 -1
- package/dist/web/public/assets/{table-BBISYTH-.js → table-BKdG9tsY.js} +2 -2
- package/dist/web/public/assets/{table-BBISYTH-.js.map → table-BKdG9tsY.js.map} +1 -1
- package/dist/web/public/assets/{topn-JA8llaUI.js → topn-BpX8BKWS.js} +3 -3
- package/dist/web/public/assets/{topn-JA8llaUI.js.map → topn-BpX8BKWS.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-D8F96aYm.js → trash-2-DxKJo_-6.js} +3 -3
- package/dist/web/public/assets/{trash-2-D8F96aYm.js.map → trash-2-DxKJo_-6.js.map} +1 -1
- package/dist/web/public/assets/use-background-tasks-vqoDXiAq.js +2 -0
- package/dist/web/public/assets/use-background-tasks-vqoDXiAq.js.map +1 -0
- package/dist/web/public/assets/use-llm-admin-D4snixaM.js +2 -0
- package/dist/web/public/assets/use-llm-admin-D4snixaM.js.map +1 -0
- package/dist/web/public/assets/{use-memory-BDa1R8Tf.js → use-memory-Cqf3xywK.js} +2 -2
- package/dist/web/public/assets/{use-memory-BDa1R8Tf.js.map → use-memory-Cqf3xywK.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-XgxLMQsY.js → use-observability-Thh7LWoE.js} +2 -2
- package/dist/web/public/assets/{use-observability-XgxLMQsY.js.map → use-observability-Thh7LWoE.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-Bc4s-JUD.js → use-settings-DRhH8owt.js} +2 -2
- package/dist/web/public/assets/{use-settings-Bc4s-JUD.js.map → use-settings-DRhH8owt.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-JalfqH6H.js → use-workspace-iLKz-h_7.js} +2 -2
- package/dist/web/public/assets/{use-workspace-JalfqH6H.js.map → use-workspace-iLKz-h_7.js.map} +1 -1
- package/dist/web/public/assets/useQuery-gnz30xMJ.js +2 -0
- package/dist/web/public/assets/{useQuery-DFryK9Pn.js.map → useQuery-gnz30xMJ.js.map} +1 -1
- package/dist/web/public/assets/{vector-G2dN_aut.js → vector-COjljy_4.js} +2 -2
- package/dist/web/public/assets/{vector-G2dN_aut.js.map → vector-COjljy_4.js.map} +1 -1
- package/dist/web/public/assets/viewer-AQHSc8hZ.js +12 -0
- package/dist/web/public/assets/viewer-AQHSc8hZ.js.map +1 -0
- package/dist/web/public/assets/{workspace-BaLZIgGn.js → workspace-DRtSCbx5.js} +4 -4
- package/dist/web/public/assets/{workspace-BaLZIgGn.js.map → workspace-DRtSCbx5.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-cX_rV523.js → workspaces-BLR5ZBu6.js} +3 -3
- package/dist/web/public/assets/{workspaces-cX_rV523.js.map → workspaces-BLR5ZBu6.js.map} +1 -1
- package/dist/web/public/assets/{x-D5196-9X.js → x-DGQ0qjhc.js} +2 -2
- package/dist/web/public/assets/{x-D5196-9X.js.map → x-DGQ0qjhc.js.map} +1 -1
- package/dist/web/public/index.html +2 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +45 -0
- package/dist/web/server.js.map +1 -1
- package/package.json +2 -2
- package/dist/web/public/assets/agents-o9odac79.js +0 -12
- package/dist/web/public/assets/agents-o9odac79.js.map +0 -1
- package/dist/web/public/assets/hot-O9Z19xXa.js +0 -17
- package/dist/web/public/assets/hot-O9Z19xXa.js.map +0 -1
- package/dist/web/public/assets/index-CITyis5g.js +0 -166
- package/dist/web/public/assets/index-CITyis5g.js.map +0 -1
- package/dist/web/public/assets/index-Cvacw7Jg.css +0 -1
- package/dist/web/public/assets/installed-CM34mlDU.js +0 -7
- package/dist/web/public/assets/installed-CM34mlDU.js.map +0 -1
- package/dist/web/public/assets/layout-BxrFilDN.js +0 -2
- package/dist/web/public/assets/layout-BxrFilDN.js.map +0 -1
- package/dist/web/public/assets/layout-CcJQxFci.js +0 -2
- package/dist/web/public/assets/layout-CcJQxFci.js.map +0 -1
- package/dist/web/public/assets/layout-DRRveTaR.js +0 -2
- package/dist/web/public/assets/layout-DRRveTaR.js.map +0 -1
- package/dist/web/public/assets/policy-DwI-ov9J.js +0 -2
- package/dist/web/public/assets/reminders-X-QFSWvZ.js.map +0 -1
- package/dist/web/public/assets/use-skills-DCOYAQ8s.js +0 -2
- package/dist/web/public/assets/use-skills-DCOYAQ8s.js.map +0 -1
- package/dist/web/public/assets/useQuery-DFryK9Pn.js +0 -2
- package/dist/web/public/assets/viewer-DliYQkQQ.js +0 -12
- package/dist/web/public/assets/viewer-DliYQkQQ.js.map +0 -1
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
// goals — sustained-objective tracking for IM threads (P0 #2).
|
|
2
|
+
//
|
|
3
|
+
// Distinct from reminders / cron / heartbeats:
|
|
4
|
+
// - `/remind` — one-shot: fire at time T, deliver text, done.
|
|
5
|
+
// - `/cron` — repeating: same fire shape, no agent state across runs.
|
|
6
|
+
// - `/heartbeat` — periodic self-check that asks the agent if anything
|
|
7
|
+
// is worth doing right now (binding body = what to
|
|
8
|
+
// watch). Each tick is independent.
|
|
9
|
+
// - `/goal` — sustained MULTI-TURN objective: "ship v1.3.0 by
|
|
10
|
+
// Friday" / "research X over the next week". The
|
|
11
|
+
// agent sees the active goal injected into EVERY
|
|
12
|
+
// turn's prompt so it can keep the user on-mission
|
|
13
|
+
// across many back-and-forths. Users / agent log
|
|
14
|
+
// progress notes; on completion the row stays for
|
|
15
|
+
// historical browsing.
|
|
16
|
+
//
|
|
17
|
+
// One ACTIVE goal per thread at a time. Older goals are kept on disk
|
|
18
|
+
// for /goal list browsing but never injected into prompts.
|
|
19
|
+
//
|
|
20
|
+
// Storage: ~/.agim/goals.db (SQLite), same fail-soft helper as the
|
|
21
|
+
// rest of agim's per-user state.
|
|
22
|
+
import { join } from 'node:path';
|
|
23
|
+
import { AGIM_HOME } from './agim-paths.js';
|
|
24
|
+
import { logger as rootLogger } from './logger.js';
|
|
25
|
+
import { createSqliteHelper } from './sqlite-helper.js';
|
|
26
|
+
const GOALS_DB = process.env.IMHUB_GOALS_DB ?? join(AGIM_HOME, 'goals.db');
|
|
27
|
+
/** Hard caps. Goals are user-typed prose; tight limits keep prompt
|
|
28
|
+
* injection from blowing the context window on a single thread. */
|
|
29
|
+
export const MAX_TITLE_CHARS = 200;
|
|
30
|
+
export const MAX_BODY_CHARS = 4_000;
|
|
31
|
+
export const MAX_PROGRESS_NOTE_CHARS = 500;
|
|
32
|
+
export const MAX_PROGRESS_NOTES_INJECTED = 5; // most recent
|
|
33
|
+
/** Most-recent N progress notes shown in /goal show output. */
|
|
34
|
+
const MAX_PROGRESS_NOTES_LISTED = 20;
|
|
35
|
+
const helper = createSqliteHelper({
|
|
36
|
+
file: GOALS_DB,
|
|
37
|
+
component: 'goals',
|
|
38
|
+
logger: rootLogger,
|
|
39
|
+
schema: `
|
|
40
|
+
CREATE TABLE IF NOT EXISTS goals (
|
|
41
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
42
|
+
platform TEXT NOT NULL,
|
|
43
|
+
channel_id TEXT NOT NULL,
|
|
44
|
+
thread_id TEXT NOT NULL,
|
|
45
|
+
user_id TEXT NOT NULL DEFAULT '',
|
|
46
|
+
title TEXT NOT NULL,
|
|
47
|
+
body TEXT NOT NULL DEFAULT '',
|
|
48
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
49
|
+
progress_log TEXT NOT NULL DEFAULT '[]',
|
|
50
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
51
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
52
|
+
closed_at TEXT
|
|
53
|
+
);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_goals_thread ON goals(platform, channel_id, thread_id, status);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_goals_status ON goals(status, updated_at);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_goals_owner ON goals(platform, user_id, status);
|
|
57
|
+
`,
|
|
58
|
+
});
|
|
59
|
+
function getDb() {
|
|
60
|
+
return helper.get();
|
|
61
|
+
}
|
|
62
|
+
function rowFromRaw(r) {
|
|
63
|
+
let progress = [];
|
|
64
|
+
try {
|
|
65
|
+
const parsed = JSON.parse(r.progress_log || '[]');
|
|
66
|
+
if (Array.isArray(parsed)) {
|
|
67
|
+
progress = parsed
|
|
68
|
+
.filter((n) => (typeof n === 'object' && n !== null &&
|
|
69
|
+
typeof n.ts === 'string' &&
|
|
70
|
+
typeof n.by === 'string' &&
|
|
71
|
+
typeof n.text === 'string'));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch { /* malformed JSON; fall back to empty list */ }
|
|
75
|
+
return {
|
|
76
|
+
id: r.id,
|
|
77
|
+
platform: r.platform,
|
|
78
|
+
channelId: r.channel_id,
|
|
79
|
+
threadId: r.thread_id,
|
|
80
|
+
userId: r.user_id,
|
|
81
|
+
title: r.title,
|
|
82
|
+
body: r.body,
|
|
83
|
+
status: (r.status || 'active'),
|
|
84
|
+
progressLog: progress,
|
|
85
|
+
createdAt: r.created_at,
|
|
86
|
+
updatedAt: r.updated_at,
|
|
87
|
+
closedAt: r.closed_at,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Set (or replace) the ACTIVE goal for a thread. Idempotent semantics:
|
|
92
|
+
* if there's already an active goal, it's auto-paused first (kept in
|
|
93
|
+
* the table) and a fresh row replaces it. This avoids accidental
|
|
94
|
+
* silent drops of partially-tracked work — the operator can /goal
|
|
95
|
+
* list to find paused predecessors and /goal resume <id> if they
|
|
96
|
+
* changed their mind.
|
|
97
|
+
*/
|
|
98
|
+
export function setActiveGoal(input) {
|
|
99
|
+
const d = getDb();
|
|
100
|
+
if (!d)
|
|
101
|
+
return null;
|
|
102
|
+
const title = input.title.trim().slice(0, MAX_TITLE_CHARS);
|
|
103
|
+
const body = (input.body ?? '').trim().slice(0, MAX_BODY_CHARS);
|
|
104
|
+
if (!title)
|
|
105
|
+
return null;
|
|
106
|
+
try {
|
|
107
|
+
// Auto-pause any existing ACTIVE goal in this thread so there's
|
|
108
|
+
// never more than one row to inject. Older paused/completed
|
|
109
|
+
// rows are untouched.
|
|
110
|
+
d.prepare(`
|
|
111
|
+
UPDATE goals SET
|
|
112
|
+
status = 'paused',
|
|
113
|
+
updated_at = datetime('now')
|
|
114
|
+
WHERE platform = ? AND channel_id = ? AND thread_id = ? AND status = 'active'
|
|
115
|
+
`).run(input.platform, input.channelId, input.threadId);
|
|
116
|
+
const info = d.prepare(`
|
|
117
|
+
INSERT INTO goals (platform, channel_id, thread_id, user_id, title, body, status, progress_log)
|
|
118
|
+
VALUES (?, ?, ?, ?, ?, ?, 'active', '[]')
|
|
119
|
+
`).run(input.platform, input.channelId, input.threadId, input.userId, title, body);
|
|
120
|
+
return getGoalById(Number(info.lastInsertRowid));
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
rootLogger.warn({ event: 'goals.set_active_failed', err: String(err) });
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** Append a progress note to a goal. Caller picks `by` (typically
|
|
128
|
+
* 'user' for /goal progress, 'agent' for future MCP tool call,
|
|
129
|
+
* 'system' for status transitions). */
|
|
130
|
+
export function appendProgress(goalId, by, text) {
|
|
131
|
+
const d = getDb();
|
|
132
|
+
if (!d)
|
|
133
|
+
return false;
|
|
134
|
+
const note = {
|
|
135
|
+
ts: new Date().toISOString(),
|
|
136
|
+
by,
|
|
137
|
+
text: text.trim().slice(0, MAX_PROGRESS_NOTE_CHARS),
|
|
138
|
+
};
|
|
139
|
+
if (!note.text)
|
|
140
|
+
return false;
|
|
141
|
+
try {
|
|
142
|
+
// Read-modify-write inside one transaction so two near-simultaneous
|
|
143
|
+
// /goal progress calls don't clobber each other.
|
|
144
|
+
const tx = d.transaction(() => {
|
|
145
|
+
const row = d.prepare(`SELECT progress_log FROM goals WHERE id = ?`).get(goalId);
|
|
146
|
+
if (!row)
|
|
147
|
+
return false;
|
|
148
|
+
let list;
|
|
149
|
+
try {
|
|
150
|
+
const parsed = JSON.parse(row.progress_log || '[]');
|
|
151
|
+
list = Array.isArray(parsed) ? parsed : [];
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
list = [];
|
|
155
|
+
}
|
|
156
|
+
list.push(note);
|
|
157
|
+
d.prepare(`
|
|
158
|
+
UPDATE goals SET progress_log = ?, updated_at = datetime('now')
|
|
159
|
+
WHERE id = ?
|
|
160
|
+
`).run(JSON.stringify(list), goalId);
|
|
161
|
+
return true;
|
|
162
|
+
});
|
|
163
|
+
return tx();
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
rootLogger.warn({ event: 'goals.append_progress_failed', err: String(err) });
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
export function updateStatus(goalId, status) {
|
|
171
|
+
const d = getDb();
|
|
172
|
+
if (!d)
|
|
173
|
+
return false;
|
|
174
|
+
const isClose = status === 'completed' || status === 'cancelled';
|
|
175
|
+
try {
|
|
176
|
+
const info = d.prepare(`
|
|
177
|
+
UPDATE goals SET
|
|
178
|
+
status = ?,
|
|
179
|
+
updated_at = datetime('now'),
|
|
180
|
+
closed_at = CASE WHEN ? THEN datetime('now') ELSE closed_at END
|
|
181
|
+
WHERE id = ?
|
|
182
|
+
`).run(status, isClose ? 1 : 0, goalId);
|
|
183
|
+
return info.changes > 0;
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
rootLogger.warn({ event: 'goals.update_status_failed', err: String(err) });
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/** Resume a paused goal — also auto-pauses any currently-active goal
|
|
191
|
+
* in the same thread so there's never more than one active. */
|
|
192
|
+
export function resumeGoal(goalId) {
|
|
193
|
+
const d = getDb();
|
|
194
|
+
if (!d)
|
|
195
|
+
return false;
|
|
196
|
+
try {
|
|
197
|
+
const row = d.prepare(`SELECT platform, channel_id, thread_id, status FROM goals WHERE id = ?`)
|
|
198
|
+
.get(goalId);
|
|
199
|
+
if (!row)
|
|
200
|
+
return false;
|
|
201
|
+
if (row.status === 'completed' || row.status === 'cancelled')
|
|
202
|
+
return false;
|
|
203
|
+
const tx = d.transaction(() => {
|
|
204
|
+
d.prepare(`
|
|
205
|
+
UPDATE goals SET status = 'paused', updated_at = datetime('now')
|
|
206
|
+
WHERE platform = ? AND channel_id = ? AND thread_id = ? AND status = 'active'
|
|
207
|
+
`).run(row.platform, row.channel_id, row.thread_id);
|
|
208
|
+
d.prepare(`
|
|
209
|
+
UPDATE goals SET status = 'active', updated_at = datetime('now')
|
|
210
|
+
WHERE id = ?
|
|
211
|
+
`).run(goalId);
|
|
212
|
+
});
|
|
213
|
+
tx();
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
rootLogger.warn({ event: 'goals.resume_failed', err: String(err) });
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
export function getGoalById(id) {
|
|
222
|
+
const d = getDb();
|
|
223
|
+
if (!d)
|
|
224
|
+
return null;
|
|
225
|
+
try {
|
|
226
|
+
const row = d.prepare(`SELECT * FROM goals WHERE id = ?`).get(id);
|
|
227
|
+
return row ? rowFromRaw(row) : null;
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
rootLogger.warn({ event: 'goals.get_by_id_failed', err: String(err) });
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/** The single active goal for a thread (or null if none). */
|
|
235
|
+
export function getActiveGoal(platform, channelId, threadId) {
|
|
236
|
+
const d = getDb();
|
|
237
|
+
if (!d)
|
|
238
|
+
return null;
|
|
239
|
+
try {
|
|
240
|
+
const row = d.prepare(`
|
|
241
|
+
SELECT * FROM goals
|
|
242
|
+
WHERE platform = ? AND channel_id = ? AND thread_id = ? AND status = 'active'
|
|
243
|
+
ORDER BY id DESC LIMIT 1
|
|
244
|
+
`).get(platform, channelId, threadId);
|
|
245
|
+
return row ? rowFromRaw(row) : null;
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
rootLogger.warn({ event: 'goals.get_active_failed', err: String(err) });
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/** All goals (any status) for a thread, newest first. Used by /goal list. */
|
|
253
|
+
export function listGoalsForThread(platform, channelId, threadId, limit = 20) {
|
|
254
|
+
const d = getDb();
|
|
255
|
+
if (!d)
|
|
256
|
+
return [];
|
|
257
|
+
try {
|
|
258
|
+
const rows = d.prepare(`
|
|
259
|
+
SELECT * FROM goals
|
|
260
|
+
WHERE platform = ? AND channel_id = ? AND thread_id = ?
|
|
261
|
+
ORDER BY id DESC LIMIT ?
|
|
262
|
+
`).all(platform, channelId, threadId, limit);
|
|
263
|
+
return rows.map(rowFromRaw);
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
rootLogger.warn({ event: 'goals.list_thread_failed', err: String(err) });
|
|
267
|
+
return [];
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/** Admin / debug — every active goal across the install. */
|
|
271
|
+
export function listAllActiveGoals() {
|
|
272
|
+
const d = getDb();
|
|
273
|
+
if (!d)
|
|
274
|
+
return [];
|
|
275
|
+
try {
|
|
276
|
+
const rows = d.prepare(`
|
|
277
|
+
SELECT * FROM goals WHERE status = 'active' ORDER BY id ASC
|
|
278
|
+
`).all();
|
|
279
|
+
return rows.map(rowFromRaw);
|
|
280
|
+
}
|
|
281
|
+
catch (err) {
|
|
282
|
+
rootLogger.warn({ event: 'goals.list_all_failed', err: String(err) });
|
|
283
|
+
return [];
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Build the per-turn prompt-prefix snippet for the active goal. Bounded
|
|
288
|
+
* to ~MAX_PROGRESS_NOTES_INJECTED recent notes + truncated body so a
|
|
289
|
+
* verbose goal doesn't dominate the prompt budget. Empty string when no
|
|
290
|
+
* active goal — router treats falsy snippets as "skip this block".
|
|
291
|
+
*
|
|
292
|
+
* The snippet is OVER THE WIRE only — it's prepended to the prompt the
|
|
293
|
+
* agent sees but NOT stored in session history, so it doesn't bloat the
|
|
294
|
+
* persisted conversation.
|
|
295
|
+
*/
|
|
296
|
+
export function buildGoalSnippet(platform, channelId, threadId) {
|
|
297
|
+
const goal = getActiveGoal(platform, channelId, threadId);
|
|
298
|
+
if (!goal)
|
|
299
|
+
return '';
|
|
300
|
+
const lines = [];
|
|
301
|
+
lines.push(`[agim context — active goal #${goal.id} for this thread]`);
|
|
302
|
+
lines.push(`Title: ${goal.title}`);
|
|
303
|
+
if (goal.body) {
|
|
304
|
+
const truncated = goal.body.length > 800 ? `${goal.body.slice(0, 800)}…` : goal.body;
|
|
305
|
+
lines.push('Body:');
|
|
306
|
+
lines.push(truncated);
|
|
307
|
+
}
|
|
308
|
+
if (goal.progressLog.length > 0) {
|
|
309
|
+
lines.push('Recent progress:');
|
|
310
|
+
const recent = goal.progressLog.slice(-MAX_PROGRESS_NOTES_INJECTED);
|
|
311
|
+
for (const note of recent) {
|
|
312
|
+
// Strip seconds/ms for compactness; UTC suffix omitted (already understood).
|
|
313
|
+
const t = note.ts.slice(0, 16).replace('T', ' ');
|
|
314
|
+
lines.push(` - ${t} (${note.by}) ${note.text}`);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
lines.push('Use this goal to keep replies on-mission. Ignore if the user explicitly changes topic.');
|
|
318
|
+
lines.push('');
|
|
319
|
+
return lines.join('\n');
|
|
320
|
+
}
|
|
321
|
+
/** For /goal show — render an operator-facing summary including ALL
|
|
322
|
+
* retained progress notes (capped at MAX_PROGRESS_NOTES_LISTED so the
|
|
323
|
+
* IM bubble doesn't explode). */
|
|
324
|
+
export function formatGoalShow(goal) {
|
|
325
|
+
const out = [];
|
|
326
|
+
const statusFlag = ({
|
|
327
|
+
active: '✅ active',
|
|
328
|
+
paused: '⏸ paused',
|
|
329
|
+
completed: '🎯 completed',
|
|
330
|
+
cancelled: '✖ cancelled',
|
|
331
|
+
})[goal.status];
|
|
332
|
+
out.push(`🎯 Goal #${goal.id} — ${statusFlag}`);
|
|
333
|
+
out.push(`Title: ${goal.title}`);
|
|
334
|
+
out.push(`Updated: ${goal.updatedAt} UTC`);
|
|
335
|
+
if (goal.closedAt)
|
|
336
|
+
out.push(`Closed: ${goal.closedAt} UTC`);
|
|
337
|
+
if (goal.body) {
|
|
338
|
+
out.push('');
|
|
339
|
+
out.push('Body:');
|
|
340
|
+
out.push('```');
|
|
341
|
+
out.push(goal.body);
|
|
342
|
+
out.push('```');
|
|
343
|
+
}
|
|
344
|
+
if (goal.progressLog.length > 0) {
|
|
345
|
+
out.push('');
|
|
346
|
+
out.push(`Progress (${goal.progressLog.length} notes):`);
|
|
347
|
+
const recent = goal.progressLog.slice(-MAX_PROGRESS_NOTES_LISTED).reverse();
|
|
348
|
+
for (const n of recent) {
|
|
349
|
+
out.push(` - ${n.ts.slice(0, 19).replace('T', ' ')} UTC (${n.by}) ${n.text}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return out.join('\n');
|
|
353
|
+
}
|
|
354
|
+
/** Test-only. Drops everything; safe to call repeatedly in beforeEach. */
|
|
355
|
+
export function _truncateForTests() {
|
|
356
|
+
const d = getDb();
|
|
357
|
+
if (!d)
|
|
358
|
+
return;
|
|
359
|
+
d.exec('DELETE FROM goals');
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=goals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goals.js","sourceRoot":"","sources":["../../src/core/goals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/** Per-thread tick recurrence, in minutes. The default lines up with
|
|
2
|
+
* nanobot's 30-min cadence; operators can override per binding with
|
|
3
|
+
* `/heartbeat interval N` or the IMHUB_HEARTBEAT_DEFAULT_INTERVAL env. */
|
|
4
|
+
export declare const DEFAULT_INTERVAL_MIN = 30;
|
|
5
|
+
/** Hard lower bound on the recurrence. 1-minute heartbeats are almost
|
|
6
|
+
* always a misconfiguration (the agent burns through API calls and
|
|
7
|
+
* there's no time for the previous tick to even finish). */
|
|
8
|
+
export declare const MIN_INTERVAL_MIN = 5;
|
|
9
|
+
/** Hard upper bound — 24h. Above this just use cron + reminders. */
|
|
10
|
+
export declare const MAX_INTERVAL_MIN: number;
|
|
11
|
+
/** Max characters in a heartbeat body. Keeps prompt size bounded; the
|
|
12
|
+
* body is the entire context the cheap decide-step LLM sees, so
|
|
13
|
+
* unbounded text would silently blow the context window. */
|
|
14
|
+
export declare const MAX_BODY_CHARS = 8000;
|
|
15
|
+
/** Tick statuses recorded per attempt. */
|
|
16
|
+
export type TickStatus = 'pending' | 'skipped' | 'delivered' | 'suppressed' | 'no-agent' | 'failed';
|
|
17
|
+
export interface HeartbeatRow {
|
|
18
|
+
id: number;
|
|
19
|
+
/** IM coordinates — the binding scope. */
|
|
20
|
+
platform: string;
|
|
21
|
+
channelId: string;
|
|
22
|
+
threadId: string;
|
|
23
|
+
/** Owner of this binding (the IM user who ran /heartbeat bind). Used
|
|
24
|
+
* for audit and for picking the same agent the user is chatting
|
|
25
|
+
* with at tick time. */
|
|
26
|
+
userId: string;
|
|
27
|
+
/** Markdown body — what the decide-step LLM and the execute-step
|
|
28
|
+
* agent reason against. Plain UTF-8; users can include lists, code
|
|
29
|
+
* fences, whatever they want. Max MAX_BODY_CHARS. */
|
|
30
|
+
body: string;
|
|
31
|
+
/** Tick recurrence (minutes). MIN_INTERVAL_MIN ≤ x ≤ MAX_INTERVAL_MIN. */
|
|
32
|
+
intervalMinutes: number;
|
|
33
|
+
/** Soft kill-switch. Disabled rows survive but never tick. */
|
|
34
|
+
enabled: boolean;
|
|
35
|
+
/** ISO timestamp of the last attempted tick (null = never ticked). */
|
|
36
|
+
lastTickAt: string | null;
|
|
37
|
+
/** Status of that last tick. */
|
|
38
|
+
lastStatus: TickStatus;
|
|
39
|
+
/** Operator-facing one-liner from the last tick. */
|
|
40
|
+
lastReason: string;
|
|
41
|
+
/** First MAX_PREVIEW_CHARS of the last successfully delivered text. */
|
|
42
|
+
lastTextPreview: string;
|
|
43
|
+
createdAt: string;
|
|
44
|
+
updatedAt: string;
|
|
45
|
+
}
|
|
46
|
+
/** Read the operator-provided default interval (env override or constant). */
|
|
47
|
+
export declare function defaultIntervalMinutes(): number;
|
|
48
|
+
/**
|
|
49
|
+
* Create or replace the heartbeat for a thread. UPSERT semantics — one
|
|
50
|
+
* binding per thread, calling bind() again overwrites the body and
|
|
51
|
+
* resets last_tick_at so the new body takes effect on the next tick
|
|
52
|
+
* (not 30 min later).
|
|
53
|
+
*/
|
|
54
|
+
export declare function upsertBinding(input: {
|
|
55
|
+
platform: string;
|
|
56
|
+
channelId: string;
|
|
57
|
+
threadId: string;
|
|
58
|
+
userId: string;
|
|
59
|
+
body: string;
|
|
60
|
+
intervalMinutes?: number;
|
|
61
|
+
}): HeartbeatRow | null;
|
|
62
|
+
/** Disable (don't delete) a binding for the given thread. */
|
|
63
|
+
export declare function disableBinding(platform: string, channelId: string, threadId: string): boolean;
|
|
64
|
+
/** Soft-enable an existing binding (no-op if missing). */
|
|
65
|
+
export declare function enableBinding(platform: string, channelId: string, threadId: string): boolean;
|
|
66
|
+
/** Replace the interval for an existing binding (no-op if missing). */
|
|
67
|
+
export declare function updateInterval(platform: string, channelId: string, threadId: string, intervalMinutes: number): boolean;
|
|
68
|
+
/** Stamp the outcome of a tick. Caller is the scheduler / runForBinding. */
|
|
69
|
+
export declare function recordTick(input: {
|
|
70
|
+
id: number;
|
|
71
|
+
status: TickStatus;
|
|
72
|
+
reason: string;
|
|
73
|
+
/** When delivered, the (truncated) body text. Ignored for non-delivered. */
|
|
74
|
+
deliveredText?: string;
|
|
75
|
+
}): void;
|
|
76
|
+
export declare function getBinding(platform: string, channelId: string, threadId: string): HeartbeatRow | null;
|
|
77
|
+
/** All bindings, regardless of enabled state. Admin-facing /heartbeat list. */
|
|
78
|
+
export declare function listAllBindings(): HeartbeatRow[];
|
|
79
|
+
/**
|
|
80
|
+
* All enabled bindings whose next tick is due. "Due" = `last_tick_at IS
|
|
81
|
+
* NULL` OR `datetime(last_tick_at) <= datetime('now', '-N minutes')`.
|
|
82
|
+
*
|
|
83
|
+
* Each row carries its own interval, so we can't precompute a single
|
|
84
|
+
* cutoff — the SQL filter checks per-row using interval_minutes.
|
|
85
|
+
*/
|
|
86
|
+
export declare function listDueBindings(): HeartbeatRow[];
|
|
87
|
+
/** Strictly for tests: drop the table contents. NEVER call from runtime
|
|
88
|
+
* paths — the alternative is `disableBinding` per row. */
|
|
89
|
+
export declare function _truncateForTests(): void;
|
|
90
|
+
//# sourceMappingURL=heartbeat-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat-store.d.ts","sourceRoot":"","sources":["../../src/core/heartbeat-store.ts"],"names":[],"mappings":"AA2BA;;2EAE2E;AAC3E,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC;;6DAE6D;AAC7D,eAAO,MAAM,gBAAgB,IAAI,CAAA;AAEjC,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,QAAU,CAAA;AAEvC;;6DAE6D;AAC7D,eAAO,MAAM,cAAc,OAAQ,CAAA;AAMnC,0CAA0C;AAC1C,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,SAAS,GACT,WAAW,GACX,YAAY,GACZ,UAAU,GACV,QAAQ,CAAA;AAEZ,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB;;6BAEyB;IACzB,MAAM,EAAE,MAAM,CAAA;IACd;;0DAEsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,0EAA0E;IAC1E,eAAe,EAAE,MAAM,CAAA;IACvB,8DAA8D;IAC9D,OAAO,EAAE,OAAO,CAAA;IAChB,sEAAsE;IACtE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,gCAAgC;IAChC,UAAU,EAAE,UAAU,CAAA;IACtB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAqED,8EAA8E;AAC9E,wBAAgB,sBAAsB,IAAI,MAAM,CAS/C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,GAAG,YAAY,GAAG,IAAI,CAmCtB;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAa7F;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAa5F;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EACrD,eAAe,EAAE,MAAM,GACtB,OAAO,CAeT;AAED,4EAA4E;AAC5E,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,UAAU,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,IAAI,CA4BP;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAarG;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAUhD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAmBhD;AAED;2DAC2D;AAC3D,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC"}
|