@nocobase/app-plugin-agents 2.0.0-beta.0 → 2.0.0-beta.10
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 +199 -0
- package/README.md +26 -4
- package/dist/client/chat/api.d.ts +6 -1
- package/dist/client/chat/api.d.ts.map +1 -1
- package/dist/client/chat/api.js +18 -0
- package/dist/client/chat/api.js.map +1 -1
- package/dist/client/chat/coalesced-invalidation.d.ts +3 -8
- package/dist/client/chat/coalesced-invalidation.d.ts.map +1 -1
- package/dist/client/chat/coalesced-invalidation.js +16 -21
- package/dist/client/chat/coalesced-invalidation.js.map +1 -1
- package/dist/client/chat/controller.d.ts +30 -3
- package/dist/client/chat/controller.d.ts.map +1 -1
- package/dist/client/chat/controller.js +477 -78
- package/dist/client/chat/controller.js.map +1 -1
- package/dist/client/chat/notices.d.ts +12 -0
- package/dist/client/chat/notices.d.ts.map +1 -0
- package/dist/client/chat/notices.js +15 -0
- package/dist/client/chat/notices.js.map +1 -0
- package/dist/client/chat/provider.d.ts.map +1 -1
- package/dist/client/chat/provider.js +7 -4
- package/dist/client/chat/provider.js.map +1 -1
- package/dist/client/chat/submissions.d.ts +16 -0
- package/dist/client/chat/submissions.d.ts.map +1 -1
- package/dist/client/chat/submissions.js +22 -0
- package/dist/client/chat/submissions.js.map +1 -1
- package/dist/client/chat/use-chat.d.ts +4 -2
- package/dist/client/chat/use-chat.d.ts.map +1 -1
- package/dist/client/chat/use-chat.js +83 -51
- package/dist/client/chat/use-chat.js.map +1 -1
- package/dist/client/chat.d.ts +1 -0
- package/dist/client/chat.d.ts.map +1 -1
- package/dist/client/chat.js +1 -0
- package/dist/client/chat.js.map +1 -1
- package/dist/client/components/page-container.js +1 -1
- package/dist/client/components/page-container.js.map +1 -1
- package/dist/client/components/route-child-page.d.ts +1 -1
- package/dist/client/components/route-child-page.d.ts.map +1 -1
- package/dist/client/components/route-child-page.js +18 -2
- package/dist/client/components/route-child-page.js.map +1 -1
- package/dist/client/components/route-overlay.d.ts +4 -1
- package/dist/client/components/route-overlay.d.ts.map +1 -1
- package/dist/client/components/route-overlay.js +32 -3
- package/dist/client/components/route-overlay.js.map +1 -1
- package/dist/client/components/ui/alert-dialog.d.ts +3 -1
- package/dist/client/components/ui/alert-dialog.d.ts.map +1 -1
- package/dist/client/components/ui/alert-dialog.js +2 -2
- package/dist/client/components/ui/alert-dialog.js.map +1 -1
- package/dist/client/components/unsaved-changes.d.ts.map +1 -1
- package/dist/client/components/unsaved-changes.js +17 -4
- package/dist/client/components/unsaved-changes.js.map +1 -1
- package/dist/client/components/use-route-overlay.d.ts +2 -9
- package/dist/client/components/use-route-overlay.d.ts.map +1 -1
- package/dist/client/components/use-route-overlay.js +5 -3
- package/dist/client/components/use-route-overlay.js.map +1 -1
- package/dist/client/hooks/use-realtime-topic.d.ts +1 -1
- package/dist/client/hooks/use-realtime-topic.d.ts.map +1 -1
- package/dist/client/hooks/use-realtime-topic.js +8 -4
- package/dist/client/hooks/use-realtime-topic.js.map +1 -1
- package/dist/client/kit.d.ts.map +1 -1
- package/dist/client/kit.js +30 -5
- package/dist/client/kit.js.map +1 -1
- package/dist/client/locales/de-DE.d.ts.map +1 -1
- package/dist/client/locales/de-DE.js +137 -109
- package/dist/client/locales/de-DE.js.map +1 -1
- package/dist/client/locales/en-US.d.ts +2 -0
- package/dist/client/locales/en-US.d.ts.map +1 -1
- package/dist/client/locales/en-US.js +4 -2
- package/dist/client/locales/en-US.js.map +1 -1
- package/dist/client/locales/es-ES.d.ts.map +1 -1
- package/dist/client/locales/es-ES.js +214 -186
- package/dist/client/locales/es-ES.js.map +1 -1
- package/dist/client/locales/fr-FR.d.ts.map +1 -1
- package/dist/client/locales/fr-FR.js +146 -118
- package/dist/client/locales/fr-FR.js.map +1 -1
- package/dist/client/locales/id-ID.d.ts.map +1 -1
- package/dist/client/locales/id-ID.js +135 -107
- package/dist/client/locales/id-ID.js.map +1 -1
- package/dist/client/locales/index.d.ts.map +1 -1
- package/dist/client/locales/index.js +2 -0
- package/dist/client/locales/index.js.map +1 -1
- package/dist/client/locales/ja-JP.d.ts.map +1 -1
- package/dist/client/locales/ja-JP.js +218 -190
- package/dist/client/locales/ja-JP.js.map +1 -1
- package/dist/client/locales/ko-KR.d.ts +5 -0
- package/dist/client/locales/ko-KR.d.ts.map +1 -0
- package/dist/client/locales/ko-KR.js +1311 -0
- package/dist/client/locales/ko-KR.js.map +1 -0
- package/dist/client/locales/pt-BR.d.ts.map +1 -1
- package/dist/client/locales/pt-BR.js +208 -180
- package/dist/client/locales/pt-BR.js.map +1 -1
- package/dist/client/locales/ru-RU.d.ts +5 -0
- package/dist/client/locales/ru-RU.d.ts.map +1 -0
- package/dist/client/locales/ru-RU.js +1341 -0
- package/dist/client/locales/ru-RU.js.map +1 -0
- package/dist/client/locales/runWait.en-US.d.ts +2 -0
- package/dist/client/locales/runWait.en-US.d.ts.map +1 -1
- package/dist/client/locales/runWait.en-US.js +2 -0
- package/dist/client/locales/runWait.en-US.js.map +1 -1
- package/dist/client/locales/runWait.zh-CN.d.ts.map +1 -1
- package/dist/client/locales/runWait.zh-CN.js +2 -0
- package/dist/client/locales/runWait.zh-CN.js.map +1 -1
- package/dist/client/locales/runtimes.en-US.d.ts +1 -0
- package/dist/client/locales/runtimes.en-US.d.ts.map +1 -1
- package/dist/client/locales/runtimes.en-US.js +3 -2
- package/dist/client/locales/runtimes.en-US.js.map +1 -1
- package/dist/client/locales/runtimes.zh-CN.d.ts.map +1 -1
- package/dist/client/locales/runtimes.zh-CN.js +3 -2
- package/dist/client/locales/runtimes.zh-CN.js.map +1 -1
- package/dist/client/locales/vi-VN.d.ts.map +1 -1
- package/dist/client/locales/vi-VN.js +174 -146
- package/dist/client/locales/vi-VN.js.map +1 -1
- package/dist/client/locales/zh-CN.d.ts.map +1 -1
- package/dist/client/locales/zh-CN.js +4 -2
- package/dist/client/locales/zh-CN.js.map +1 -1
- package/dist/client/locales/zh-TW.d.ts.map +1 -1
- package/dist/client/locales/zh-TW.js +151 -123
- package/dist/client/locales/zh-TW.js.map +1 -1
- package/dist/client/pages/agents/agent-dialog.js +4 -1
- package/dist/client/pages/agents/agent-dialog.js.map +1 -1
- package/dist/client/pages/runtimes/quota.d.ts +3 -2
- package/dist/client/pages/runtimes/quota.d.ts.map +1 -1
- package/dist/client/pages/runtimes/quota.js +8 -3
- package/dist/client/pages/runtimes/quota.js.map +1 -1
- package/dist/client/pages/runtimes/runner-runs.d.ts.map +1 -1
- package/dist/client/pages/runtimes/runner-runs.js +2 -8
- package/dist/client/pages/runtimes/runner-runs.js.map +1 -1
- package/dist/client/pages/runtimes/runner-tools.d.ts.map +1 -1
- package/dist/client/pages/runtimes/runner-tools.js +7 -16
- package/dist/client/pages/runtimes/runner-tools.js.map +1 -1
- package/dist/client/pages/runtimes/workspace-diagnostics.js +3 -3
- package/dist/client/pages/runtimes/workspace-diagnostics.js.map +1 -1
- package/dist/client/pages/usage/date-range-picker.d.ts.map +1 -1
- package/dist/client/pages/usage/date-range-picker.js +3 -1
- package/dist/client/pages/usage/date-range-picker.js.map +1 -1
- package/dist/client/routes.d.ts.map +1 -1
- package/dist/client/routes.js +7 -0
- package/dist/client/routes.js.map +1 -1
- package/dist/client/runs/format-wait.d.ts.map +1 -1
- package/dist/client/runs/format-wait.js +2 -0
- package/dist/client/runs/format-wait.js.map +1 -1
- package/dist/database/migrations/.manifest.json +16 -0
- package/dist/database/migrations/202611070001_ag_run_runner_pin.d.ts +4 -0
- package/dist/database/migrations/202611070001_ag_run_runner_pin.d.ts.map +1 -0
- package/dist/database/migrations/202611070001_ag_run_runner_pin.js +17 -0
- package/dist/database/migrations/202611070001_ag_run_runner_pin.js.map +1 -0
- package/dist/database/migrations/202611080001_ag_conversation_shares.d.ts +4 -0
- package/dist/database/migrations/202611080001_ag_conversation_shares.d.ts.map +1 -0
- package/dist/database/migrations/202611080001_ag_conversation_shares.js +25 -0
- package/dist/database/migrations/202611080001_ag_conversation_shares.js.map +1 -0
- package/dist/database/migrations/202611080002_ag_run_failure_params.d.ts +4 -0
- package/dist/database/migrations/202611080002_ag_run_failure_params.d.ts.map +1 -0
- package/dist/database/migrations/202611080002_ag_run_failure_params.js +17 -0
- package/dist/database/migrations/202611080002_ag_run_failure_params.js.map +1 -0
- package/dist/database/migrations/202611090001_ag_runner_preference.d.ts +9 -0
- package/dist/database/migrations/202611090001_ag_runner_preference.d.ts.map +1 -0
- package/dist/database/migrations/202611090001_ag_runner_preference.js +28 -0
- package/dist/database/migrations/202611090001_ag_runner_preference.js.map +1 -0
- package/dist/package.json +1 -1
- package/dist/server/composition.d.ts +7 -1
- package/dist/server/composition.d.ts.map +1 -1
- package/dist/server/composition.js +14 -2
- package/dist/server/composition.js.map +1 -1
- package/dist/server/core/agents/agent.service.d.ts +2 -1
- package/dist/server/core/agents/agent.service.d.ts.map +1 -1
- package/dist/server/core/agents/agent.service.js.map +1 -1
- package/dist/server/core/agents/agent.store.d.ts +2 -2
- package/dist/server/core/agents/agent.store.d.ts.map +1 -1
- package/dist/server/core/agents/agent.store.js +8 -2
- package/dist/server/core/agents/agent.store.js.map +1 -1
- package/dist/server/core/brief/brief.d.ts +10 -5
- package/dist/server/core/brief/brief.d.ts.map +1 -1
- package/dist/server/core/brief/brief.js +36 -13
- package/dist/server/core/brief/brief.js.map +1 -1
- package/dist/server/core/brief/index.d.ts +1 -1
- package/dist/server/core/brief/index.d.ts.map +1 -1
- package/dist/server/core/brief/index.js +1 -1
- package/dist/server/core/brief/index.js.map +1 -1
- package/dist/server/core/conversations/attachments.d.ts +2 -12
- package/dist/server/core/conversations/attachments.d.ts.map +1 -1
- package/dist/server/core/conversations/attachments.js +56 -14
- package/dist/server/core/conversations/attachments.js.map +1 -1
- package/dist/server/core/conversations/chat-settings.d.ts +1 -1
- package/dist/server/core/conversations/chat-settings.d.ts.map +1 -1
- package/dist/server/core/conversations/chat-settings.js +6 -0
- package/dist/server/core/conversations/chat-settings.js.map +1 -1
- package/dist/server/core/conversations/conversation.service.d.ts +3 -1
- package/dist/server/core/conversations/conversation.service.d.ts.map +1 -1
- package/dist/server/core/conversations/conversation.service.js +212 -21
- package/dist/server/core/conversations/conversation.service.js.map +1 -1
- package/dist/server/core/conversations/conversation.store.d.ts +2 -0
- package/dist/server/core/conversations/conversation.store.d.ts.map +1 -1
- package/dist/server/core/conversations/conversation.store.js.map +1 -1
- package/dist/server/core/conversations/index.d.ts +1 -0
- package/dist/server/core/conversations/index.d.ts.map +1 -1
- package/dist/server/core/conversations/links.d.ts +3 -0
- package/dist/server/core/conversations/links.d.ts.map +1 -1
- package/dist/server/core/conversations/links.js +43 -5
- package/dist/server/core/conversations/links.js.map +1 -1
- package/dist/server/core/conversations/ports.d.ts +8 -2
- package/dist/server/core/conversations/ports.d.ts.map +1 -1
- package/dist/server/core/conversations/shares.d.ts +38 -0
- package/dist/server/core/conversations/shares.d.ts.map +1 -0
- package/dist/server/core/conversations/shares.js +189 -0
- package/dist/server/core/conversations/shares.js.map +1 -0
- package/dist/server/core/runs/claim.d.ts +22 -3
- package/dist/server/core/runs/claim.d.ts.map +1 -1
- package/dist/server/core/runs/claim.js +260 -42
- package/dist/server/core/runs/claim.js.map +1 -1
- package/dist/server/core/runs/extensions.d.ts +30 -2
- package/dist/server/core/runs/extensions.d.ts.map +1 -1
- package/dist/server/core/runs/extensions.js +18 -1
- package/dist/server/core/runs/extensions.js.map +1 -1
- package/dist/server/core/runs/git-credentials.d.ts.map +1 -1
- package/dist/server/core/runs/git-credentials.js +24 -2
- package/dist/server/core/runs/git-credentials.js.map +1 -1
- package/dist/server/core/runs/identity.d.ts.map +1 -1
- package/dist/server/core/runs/identity.js +9 -0
- package/dist/server/core/runs/identity.js.map +1 -1
- package/dist/server/core/runs/index.d.ts +3 -2
- package/dist/server/core/runs/index.d.ts.map +1 -1
- package/dist/server/core/runs/index.js +2 -1
- package/dist/server/core/runs/index.js.map +1 -1
- package/dist/server/core/runs/lifecycle.d.ts.map +1 -1
- package/dist/server/core/runs/lifecycle.js +14 -0
- package/dist/server/core/runs/lifecycle.js.map +1 -1
- package/dist/server/core/runs/npm-credentials.d.ts +35 -0
- package/dist/server/core/runs/npm-credentials.d.ts.map +1 -0
- package/dist/server/core/runs/npm-credentials.js +83 -0
- package/dist/server/core/runs/npm-credentials.js.map +1 -0
- package/dist/server/core/runs/ports.d.ts +19 -2
- package/dist/server/core/runs/ports.d.ts.map +1 -1
- package/dist/server/core/runs/ports.js.map +1 -1
- package/dist/server/core/runs/preview.d.ts +1 -4
- package/dist/server/core/runs/preview.d.ts.map +1 -1
- package/dist/server/core/runs/preview.js +10 -5
- package/dist/server/core/runs/preview.js.map +1 -1
- package/dist/server/core/runs/quota-wait.d.ts +7 -0
- package/dist/server/core/runs/quota-wait.d.ts.map +1 -0
- package/dist/server/core/runs/quota-wait.js +56 -0
- package/dist/server/core/runs/quota-wait.js.map +1 -0
- package/dist/server/core/runs/run-data-purge.d.ts.map +1 -1
- package/dist/server/core/runs/run-data-purge.js +1 -0
- package/dist/server/core/runs/run-data-purge.js.map +1 -1
- package/dist/server/core/runs/run.service.d.ts +29 -5
- package/dist/server/core/runs/run.service.d.ts.map +1 -1
- package/dist/server/core/runs/run.service.js +101 -10
- package/dist/server/core/runs/run.service.js.map +1 -1
- package/dist/server/core/runs/run.store.d.ts +24 -0
- package/dist/server/core/runs/run.store.d.ts.map +1 -1
- package/dist/server/core/runs/run.store.js +44 -0
- package/dist/server/core/runs/run.store.js.map +1 -1
- package/dist/server/core/runs/sweeper.d.ts.map +1 -1
- package/dist/server/core/runs/sweeper.js +2 -0
- package/dist/server/core/runs/sweeper.js.map +1 -1
- package/dist/server/core/runs/transitions.d.ts +1 -0
- package/dist/server/core/runs/transitions.d.ts.map +1 -1
- package/dist/server/core/runs/transitions.js +15 -1
- package/dist/server/core/runs/transitions.js.map +1 -1
- package/dist/server/core/runs/workload.d.ts +2 -2
- package/dist/server/core/runs/workload.d.ts.map +1 -1
- package/dist/server/core/runs/workload.js +62 -9
- package/dist/server/core/runs/workload.js.map +1 -1
- package/dist/server/kernel/clock.d.ts +2 -0
- package/dist/server/kernel/clock.d.ts.map +1 -1
- package/dist/server/kernel/clock.js +14 -0
- package/dist/server/kernel/clock.js.map +1 -1
- package/dist/server/kernel/events.d.ts +6 -1
- package/dist/server/kernel/events.d.ts.map +1 -1
- package/dist/server/kernel/events.js.map +1 -1
- package/dist/server/locales/de-DE.js +3 -3
- package/dist/server/locales/de-DE.js.map +1 -1
- package/dist/server/locales/es-ES.js +6 -6
- package/dist/server/locales/es-ES.js.map +1 -1
- package/dist/server/locales/fr-FR.js +4 -4
- package/dist/server/locales/fr-FR.js.map +1 -1
- package/dist/server/locales/id-ID.js +5 -5
- package/dist/server/locales/id-ID.js.map +1 -1
- package/dist/server/locales/index.d.ts.map +1 -1
- package/dist/server/locales/index.js +2 -0
- package/dist/server/locales/index.js.map +1 -1
- package/dist/server/locales/ja-JP.d.ts.map +1 -1
- package/dist/server/locales/ja-JP.js +6 -6
- package/dist/server/locales/ja-JP.js.map +1 -1
- package/dist/server/locales/ko-KR.d.ts +5 -0
- package/dist/server/locales/ko-KR.d.ts.map +1 -0
- package/dist/server/locales/ko-KR.js +59 -0
- package/dist/server/locales/ko-KR.js.map +1 -0
- package/dist/server/locales/pt-BR.js +6 -6
- package/dist/server/locales/pt-BR.js.map +1 -1
- package/dist/server/locales/ru-RU.d.ts +5 -0
- package/dist/server/locales/ru-RU.d.ts.map +1 -0
- package/dist/server/locales/ru-RU.js +59 -0
- package/dist/server/locales/ru-RU.js.map +1 -0
- package/dist/server/locales/vi-VN.js +6 -6
- package/dist/server/locales/vi-VN.js.map +1 -1
- package/dist/server/locales/zh-TW.d.ts.map +1 -1
- package/dist/server/locales/zh-TW.js +6 -6
- package/dist/server/locales/zh-TW.js.map +1 -1
- package/dist/server/online/agent/persistence/store.d.ts.map +1 -1
- package/dist/server/online/agent/persistence/store.js +3 -0
- package/dist/server/online/agent/persistence/store.js.map +1 -1
- package/dist/server/online/agent/runner/backend.d.ts.map +1 -1
- package/dist/server/online/agent/runner/backend.js +17 -8
- package/dist/server/online/agent/runner/backend.js.map +1 -1
- package/dist/server/online/agent/runner/projection.d.ts +1 -1
- package/dist/server/online/agent/runner/projection.d.ts.map +1 -1
- package/dist/server/online/agent/runner/projection.js +8 -1
- package/dist/server/online/agent/runner/projection.js.map +1 -1
- package/dist/server/providers/agents.d.ts.map +1 -1
- package/dist/server/providers/agents.js +3 -0
- package/dist/server/providers/agents.js.map +1 -1
- package/dist/server/routes/admin.d.ts +1 -0
- package/dist/server/routes/admin.d.ts.map +1 -1
- package/dist/server/routes/admin.js +32 -2
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/chat.d.ts.map +1 -1
- package/dist/server/routes/chat.js +99 -16
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/index.d.ts.map +1 -1
- package/dist/server/routes/index.js +8 -2
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/run.js +1 -1
- package/dist/server/routes/run.js.map +1 -1
- package/dist/server/routes/runners/admin.d.ts.map +1 -1
- package/dist/server/routes/runners/admin.js +3 -3
- package/dist/server/routes/runners/admin.js.map +1 -1
- package/dist/server/routes/runners/install.d.ts.map +1 -1
- package/dist/server/routes/runners/install.js +5 -0
- package/dist/server/routes/runners/install.js.map +1 -1
- package/dist/server/routes/runners/runner.d.ts.map +1 -1
- package/dist/server/routes/runners/runner.js +13 -22
- package/dist/server/routes/runners/runner.js.map +1 -1
- package/dist/server/routes/runners/runs.d.ts +1 -1
- package/dist/server/routes/runners/runs.d.ts.map +1 -1
- package/dist/server/routes/runners/runs.js +20 -1
- package/dist/server/routes/runners/runs.js.map +1 -1
- package/dist/server/routes/schemas.d.ts +5 -1
- package/dist/server/routes/schemas.d.ts.map +1 -1
- package/dist/server/routes/schemas.js +33 -8
- package/dist/server/routes/schemas.js.map +1 -1
- package/dist/server/runners/runner.service.d.ts.map +1 -1
- package/dist/server/runners/runner.service.js +17 -5
- package/dist/server/runners/runner.service.js.map +1 -1
- package/dist/server/tokens.d.ts +1 -1
- package/dist/server/tokens.d.ts.map +1 -1
- package/dist/server/tokens.js.map +1 -1
- package/dist/shared/briefs.d.ts +2 -6
- package/dist/shared/briefs.d.ts.map +1 -1
- package/dist/shared/conversations.d.ts +38 -1
- package/dist/shared/conversations.d.ts.map +1 -1
- package/dist/shared/conversations.js +10 -0
- package/dist/shared/conversations.js.map +1 -1
- package/dist/shared/runs.d.ts +11 -3
- package/dist/shared/runs.d.ts.map +1 -1
- package/dist/shared/runs.js +2 -0
- package/dist/shared/runs.js.map +1 -1
- package/dist/shared/ui-message.d.ts +2 -2
- package/dist/shared/ui-message.d.ts.map +1 -1
- package/dist/shared/ui-message.js +1 -1
- package/dist/shared/ui-message.js.map +1 -1
- package/docs/conversation-sharing.md +55 -0
- package/package.json +16 -16
- package/skills/nocobase-app-plugin-agents/references/extension-points.md +2 -0
- package/skills/nocobase-app-plugin-agents/references/runners.md +1 -1
- package/skills/nocobase-app-plugin-agents/references/verification-and-troubleshooting.md +2 -1
|
@@ -12,6 +12,8 @@ import { type ConversationRecord } from './conversation.store.js';
|
|
|
12
12
|
import type { ConversationService } from './ports.js';
|
|
13
13
|
import type { AppUIMessage } from '../../../shared/online-agent.js';
|
|
14
14
|
export interface ConversationServiceDeps {
|
|
15
|
+
/** Reuse the native backend's registered public tool projections, without an executable session facade. */
|
|
16
|
+
readonly nativeHistory?: (messages: unknown[]) => Promise<AppUIMessage[]>;
|
|
15
17
|
readonly nativeNotice?: (unit: Tx, record: ConversationRecord, id: string, parts: AppUIMessage['parts']) => Promise<unknown>;
|
|
16
18
|
readonly tx: TxRunner;
|
|
17
19
|
readonly measure?: (phase: string, durationMs: number) => void;
|
|
@@ -20,7 +22,7 @@ export interface ConversationServiceDeps {
|
|
|
20
22
|
readonly agents: Pick<AgentService, 'mayInvoke' | 'get' | 'list'>;
|
|
21
23
|
readonly runners: Pick<RunnerService, 'list' | 'all'>;
|
|
22
24
|
readonly eligibility: Pick<ClaimEligibility, 'canClaim' | 'runnersFor' | 'prepare'>;
|
|
23
|
-
readonly runs: Pick<RunService, 'enqueue' | 'cancel' | 'withdrawQueued' | 'get' | 'detail'>;
|
|
25
|
+
readonly runs: Pick<RunService, 'enqueue' | 'cancel' | 'withdrawQueued' | 'get' | 'detail' | 'queueWait'>;
|
|
24
26
|
readonly people: People;
|
|
25
27
|
readonly settings: ChatSettingsService;
|
|
26
28
|
readonly contextKinds: PageContextKinds;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.service.d.ts","sourceRoot":"","sources":["../../../../server/core/conversations/conversation.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"conversation.service.d.ts","sourceRoot":"","sources":["../../../../server/core/conversations/conversation.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { conversationAccess, createConversationShares, sharesRepo, } from './shares.js';
|
|
2
|
+
import { runnerUIPage } from '../../online/agent/runner/projection.js';
|
|
3
|
+
import { NativeMessages } from '../../online/agent/messages/projection.js';
|
|
4
|
+
import { OnlineAgentConfigurator } from '../../online/agent/configuration.js';
|
|
1
5
|
import { outputBlock, TERMINAL_RUN_STATUSES } from '@nocobase/agent-protocol';
|
|
2
6
|
import { historicalPageContext, hasContent, renderPageContext, } from './page-context.js';
|
|
3
7
|
import { nativeExecutionStatus, runnerBinding, } from '../../online/agent/persistence/state.js';
|
|
@@ -206,6 +210,12 @@ export function createConversationService(deps) {
|
|
|
206
210
|
return workspace.resolve(conn, conversation, prepared);
|
|
207
211
|
}
|
|
208
212
|
const sources = createSources();
|
|
213
|
+
const shares = createConversationShares({
|
|
214
|
+
tx,
|
|
215
|
+
ids,
|
|
216
|
+
people: deps.people,
|
|
217
|
+
now,
|
|
218
|
+
});
|
|
209
219
|
const links = createConversationLinks({
|
|
210
220
|
tx,
|
|
211
221
|
ids,
|
|
@@ -264,6 +274,7 @@ export function createConversationService(deps) {
|
|
|
264
274
|
: null;
|
|
265
275
|
}
|
|
266
276
|
async function summaries(conn, records) {
|
|
277
|
+
const linked = await links.summaries(conn, records);
|
|
267
278
|
const agents = new Map();
|
|
268
279
|
for (const record of records)
|
|
269
280
|
for (const id of [
|
|
@@ -279,6 +290,7 @@ export function createConversationService(deps) {
|
|
|
279
290
|
const machines = new Map((runnerIds.length ? await deps.runners.all(conn, runnerIds) : []).map((runner) => [runner.id, runner]));
|
|
280
291
|
return Promise.all(records.map(async (record) => ({
|
|
281
292
|
id: record.id,
|
|
293
|
+
links: linked.get(record.id) ?? [],
|
|
282
294
|
title: record.title,
|
|
283
295
|
titleSource: record.titleSource,
|
|
284
296
|
category: record.category,
|
|
@@ -392,6 +404,9 @@ export function createConversationService(deps) {
|
|
|
392
404
|
effort: typeof jsonObject(record.metadata).effort === 'string'
|
|
393
405
|
? jsonObject(record.metadata).effort
|
|
394
406
|
: null,
|
|
407
|
+
wait: summary.mode === 'runner' && summary.run?.status === 'queued'
|
|
408
|
+
? await deps.runs.queueWait(summary.run.id, record.runnerId)
|
|
409
|
+
: null,
|
|
395
410
|
availability: await availabilityFor(conn, agent, record.userId),
|
|
396
411
|
canFallback: Boolean(target),
|
|
397
412
|
canRestore: !runnerBinding(record.metadata) &&
|
|
@@ -400,7 +415,48 @@ export function createConversationService(deps) {
|
|
|
400
415
|
}
|
|
401
416
|
async function detail(userId, id) {
|
|
402
417
|
const conn = tx.read();
|
|
403
|
-
|
|
418
|
+
const { record, share } = await conversationAccess(conn, userId, id);
|
|
419
|
+
if (!share)
|
|
420
|
+
return detailOf(conn, record);
|
|
421
|
+
// Whitelist snapshot fields: no latest runner, project, execution, usage, wait or owner attention.
|
|
422
|
+
return {
|
|
423
|
+
id,
|
|
424
|
+
title: share.title,
|
|
425
|
+
titleSource: 'user',
|
|
426
|
+
category: 'chat',
|
|
427
|
+
showInChatList: false,
|
|
428
|
+
source: 'panel',
|
|
429
|
+
mode: record.mode,
|
|
430
|
+
agent: jsonObject(record.metadata).onlineAgent
|
|
431
|
+
? {
|
|
432
|
+
id: 'online',
|
|
433
|
+
name: 'Online agent',
|
|
434
|
+
nameText: null,
|
|
435
|
+
avatar: null,
|
|
436
|
+
archived: false,
|
|
437
|
+
}
|
|
438
|
+
: {
|
|
439
|
+
...agentRef(record.agentId, record.agentId ? await findAgent(conn, record.agentId) : null),
|
|
440
|
+
avatar: null,
|
|
441
|
+
archived: false,
|
|
442
|
+
},
|
|
443
|
+
fallbackFrom: null,
|
|
444
|
+
read: true,
|
|
445
|
+
lastMessageAt: share.snapshotAt,
|
|
446
|
+
archivedAt: null,
|
|
447
|
+
createdAt: record.createdAt,
|
|
448
|
+
updatedAt: share.updatedAt,
|
|
449
|
+
run: null,
|
|
450
|
+
lastSeq: Number(share.cutoffSeq),
|
|
451
|
+
links: [],
|
|
452
|
+
availability: { online: false, reason: null, onlineRunners: 0 },
|
|
453
|
+
canFallback: false,
|
|
454
|
+
canRestore: false,
|
|
455
|
+
snapshot: {
|
|
456
|
+
cutoffSeq: Number(share.cutoffSeq),
|
|
457
|
+
snapshotAt: share.snapshotAt,
|
|
458
|
+
},
|
|
459
|
+
};
|
|
404
460
|
}
|
|
405
461
|
// -------------------------------------------------------------------------------------------------------------------
|
|
406
462
|
// Writing
|
|
@@ -594,10 +650,11 @@ export function createConversationService(deps) {
|
|
|
594
650
|
// Turning run events into messages
|
|
595
651
|
// -------------------------------------------------------------------------------------------------------------------
|
|
596
652
|
/** Appends the run's new text events as assistant messages, in the caller's transaction. */
|
|
597
|
-
async function syncIn(unit, run) {
|
|
653
|
+
async function syncIn(unit, run, lockedRecord) {
|
|
598
654
|
if (run.subject.kind !== CONVERSATION_SUBJECT)
|
|
599
655
|
return;
|
|
600
|
-
const record =
|
|
656
|
+
const record = lockedRecord ??
|
|
657
|
+
(await lockConversation(unit.conn, run.subject.id, now()));
|
|
601
658
|
if (!record || record.userId !== run.actorUserId)
|
|
602
659
|
return;
|
|
603
660
|
let after;
|
|
@@ -739,6 +796,9 @@ export function createConversationService(deps) {
|
|
|
739
796
|
const released = deps.attachments
|
|
740
797
|
? await deps.attachments.release(unit.conn, record.id)
|
|
741
798
|
: async () => { };
|
|
799
|
+
await sharesRepo(unit.conn).deleteMany({
|
|
800
|
+
filter: { conversationId: record.id },
|
|
801
|
+
});
|
|
742
802
|
await messagesRepo(unit.conn).deleteMany({
|
|
743
803
|
filter: { conversationId: record.id },
|
|
744
804
|
});
|
|
@@ -1097,6 +1157,35 @@ export function createConversationService(deps) {
|
|
|
1097
1157
|
messageId: `runner:${run.id}`,
|
|
1098
1158
|
revision: Number(answered.seq) + 1,
|
|
1099
1159
|
});
|
|
1160
|
+
// Stop ends this turn; messages the Agent never acknowledged retain their identity in the next one.
|
|
1161
|
+
// A queued withdrawal or system cancellation must not start more work.
|
|
1162
|
+
if (run.status === 'cancelled' &&
|
|
1163
|
+
run.cancelRequestedAt !== null &&
|
|
1164
|
+
run.cancelledById === record.userId &&
|
|
1165
|
+
record.mode === 'runner' &&
|
|
1166
|
+
record.agentId === run.agentId) {
|
|
1167
|
+
const queued = await messagesRepo(unit.conn).findMany({
|
|
1168
|
+
filter: (f) => f.and([
|
|
1169
|
+
f.string('conversationId').eq(record.id),
|
|
1170
|
+
f.string('runId').eq(run.id),
|
|
1171
|
+
f.string('role').eq('user'),
|
|
1172
|
+
f.json('metadata').path(['queued']).eq(true),
|
|
1173
|
+
]),
|
|
1174
|
+
sort: (sort) => sort.field('seq').asc(),
|
|
1175
|
+
});
|
|
1176
|
+
const pending = queued.filter((message) => {
|
|
1177
|
+
const metadata = metadataOf(message);
|
|
1178
|
+
return !metadata.pickedUp && !metadata.withdrawn;
|
|
1179
|
+
});
|
|
1180
|
+
if (pending.length) {
|
|
1181
|
+
await wake(unit, record, pending);
|
|
1182
|
+
for (const message of pending)
|
|
1183
|
+
changed(unit, record, {
|
|
1184
|
+
messageId: message.id,
|
|
1185
|
+
revision: Number(message.seq),
|
|
1186
|
+
});
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1100
1189
|
await attend(unit, record.id, run);
|
|
1101
1190
|
},
|
|
1102
1191
|
},
|
|
@@ -1211,6 +1300,12 @@ export function createConversationService(deps) {
|
|
|
1211
1300
|
((switching || !record.runnerId) &&
|
|
1212
1301
|
!(await canAnswer(unit.conn, agent, userId))))
|
|
1213
1302
|
throw conflict('This agent has no available execution environment.');
|
|
1303
|
+
if (realtime.queue) {
|
|
1304
|
+
// Keep already received replies before this follow-up, under the admission's existing conversation lock.
|
|
1305
|
+
const working = open.find((run) => run.status !== 'queued');
|
|
1306
|
+
await syncIn(unit, working, record);
|
|
1307
|
+
record = (await findConversation(unit.conn, id));
|
|
1308
|
+
}
|
|
1214
1309
|
turnEffort =
|
|
1215
1310
|
typeof jsonObject(record.metadata).turnEffort === 'string'
|
|
1216
1311
|
? jsonObject(record.metadata).turnEffort
|
|
@@ -1319,6 +1414,81 @@ export function createConversationService(deps) {
|
|
|
1319
1414
|
}
|
|
1320
1415
|
const service = {
|
|
1321
1416
|
binding,
|
|
1417
|
+
shares,
|
|
1418
|
+
async snapshotMessages(userId, id, query) {
|
|
1419
|
+
const conn = tx.read();
|
|
1420
|
+
const { record, share } = await conversationAccess(conn, userId, id);
|
|
1421
|
+
if (!share)
|
|
1422
|
+
return null;
|
|
1423
|
+
const cutoff = Number(share.cutoffSeq);
|
|
1424
|
+
let page;
|
|
1425
|
+
if (record.mode === 'runner' || !jsonObject(record.metadata).onlineAgent)
|
|
1426
|
+
page = await runnerUIPage(tx, id, cutoff, query, deps.basePath?.() ?? '', cutoff);
|
|
1427
|
+
else {
|
|
1428
|
+
const rows = await messagesRepo(conn).findMany({
|
|
1429
|
+
filter: (f) => f.and([
|
|
1430
|
+
f.string('conversationId').eq(id),
|
|
1431
|
+
f.number('seq').lte(cutoff),
|
|
1432
|
+
...(query.ids
|
|
1433
|
+
? [f.or(query.ids.map((key) => f.string('id').eq(key)))]
|
|
1434
|
+
: []),
|
|
1435
|
+
...(query.before !== undefined
|
|
1436
|
+
? [f.number('seq').lt(query.before)]
|
|
1437
|
+
: []),
|
|
1438
|
+
...(query.after !== undefined
|
|
1439
|
+
? [f.number('seq').gt(query.after)]
|
|
1440
|
+
: []),
|
|
1441
|
+
]),
|
|
1442
|
+
sort: (s) => query.after !== undefined || query.ids
|
|
1443
|
+
? s.field('seq').asc()
|
|
1444
|
+
: s.field('seq').desc(),
|
|
1445
|
+
limit: query.ids ? query.ids.length : query.limit + 1,
|
|
1446
|
+
});
|
|
1447
|
+
const hasMore = !query.ids && rows.length > query.limit;
|
|
1448
|
+
const selected = rows.slice(0, query.ids ? rows.length : query.limit);
|
|
1449
|
+
if (query.after === undefined && !query.ids)
|
|
1450
|
+
selected.reverse();
|
|
1451
|
+
const native = new NativeMessages(new OnlineAgentConfigurator());
|
|
1452
|
+
page = {
|
|
1453
|
+
items: selected.length
|
|
1454
|
+
? await (deps.nativeHistory ??
|
|
1455
|
+
(async (values) => native.public(await native.validate(values))))(selected.map((row) => jsonObject(row.content).original))
|
|
1456
|
+
: [],
|
|
1457
|
+
lastSeq: cutoff,
|
|
1458
|
+
hasMore,
|
|
1459
|
+
...(query.after !== undefined && hasMore && selected.length
|
|
1460
|
+
? { nextAfter: Number(selected.at(-1).seq) }
|
|
1461
|
+
: {}),
|
|
1462
|
+
};
|
|
1463
|
+
}
|
|
1464
|
+
for (const message of page.items) {
|
|
1465
|
+
if (message.metadata) {
|
|
1466
|
+
delete message.metadata.queue;
|
|
1467
|
+
delete message.metadata.executionId;
|
|
1468
|
+
delete message.metadata.turnId;
|
|
1469
|
+
}
|
|
1470
|
+
// A shared transcript contains historical content; linked records are always resolved as this viewer.
|
|
1471
|
+
if (message.metadata?.context) {
|
|
1472
|
+
const context = message.metadata.context;
|
|
1473
|
+
message.metadata.context = await deps.contextKinds.resolve(conn, userId, {
|
|
1474
|
+
route: '',
|
|
1475
|
+
items: context.items.map(({ kind, id }) => ({ kind, id })),
|
|
1476
|
+
});
|
|
1477
|
+
}
|
|
1478
|
+
const indexes = message.parts.flatMap((part, index) => part.type === 'data-turn' || part.type === 'data-phase'
|
|
1479
|
+
? []
|
|
1480
|
+
: [index]);
|
|
1481
|
+
if (message.metadata?.sourceRecords)
|
|
1482
|
+
message.metadata.sourceRecords = message.metadata.sourceRecords
|
|
1483
|
+
.filter((source) => indexes.includes(source.partIndex))
|
|
1484
|
+
.map((source) => ({
|
|
1485
|
+
...source,
|
|
1486
|
+
partIndex: indexes.indexOf(source.partIndex),
|
|
1487
|
+
}));
|
|
1488
|
+
message.parts = indexes.map((index) => message.parts[index]);
|
|
1489
|
+
}
|
|
1490
|
+
return page;
|
|
1491
|
+
},
|
|
1322
1492
|
contextKinds: deps.contextKinds,
|
|
1323
1493
|
sources,
|
|
1324
1494
|
ownedTitles,
|
|
@@ -1598,7 +1768,7 @@ export function createConversationService(deps) {
|
|
|
1598
1768
|
sendRealtime: (userId, id, request, input) => sendMessage(userId, id, request, input),
|
|
1599
1769
|
async withdraw(userId, id, messageId) {
|
|
1600
1770
|
await tx.run(async (unit) => {
|
|
1601
|
-
|
|
1771
|
+
let record = await owned(unit.conn, userId, id);
|
|
1602
1772
|
const message = await messagesRepo(unit.conn).findOne({
|
|
1603
1773
|
filter: { id: messageId, conversationId: id },
|
|
1604
1774
|
});
|
|
@@ -1607,25 +1777,44 @@ export function createConversationService(deps) {
|
|
|
1607
1777
|
const metadata = jsonObject(message.metadata);
|
|
1608
1778
|
if (metadata.withdrawn)
|
|
1609
1779
|
return;
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1780
|
+
if (!metadata.queued && message.runId) {
|
|
1781
|
+
// Match claim's run-before-conversation order. An initial turn has no queued-follow-up marker.
|
|
1782
|
+
// End only a still-unclaimed run, using the existing guarded queued withdrawal. If claim wins, the transaction rolls back and the running turn is kept.
|
|
1783
|
+
const run = await findRunRecord(unit.conn, message.runId);
|
|
1784
|
+
if (!run || run.status !== 'queued' || run.runnerId !== null)
|
|
1785
|
+
throw conversationConflict('messageTaken', 'The agent already has this message.');
|
|
1786
|
+
const ended = await deps.runs.withdrawQueued({
|
|
1787
|
+
subject: subjectOf(id),
|
|
1788
|
+
agentId: record.agentId,
|
|
1789
|
+
actorUserId: userId,
|
|
1790
|
+
byUserId: userId,
|
|
1791
|
+
}, unit);
|
|
1792
|
+
if (!ended.some((run) => run.id === message.runId))
|
|
1793
|
+
throw conversationConflict('messageTaken', 'The agent already has this message.');
|
|
1794
|
+
record = await lockOwned(unit, userId, id, true);
|
|
1795
|
+
}
|
|
1796
|
+
else {
|
|
1797
|
+
record = await lockOwned(unit, userId, id, true);
|
|
1798
|
+
// Taken back only while no runner has it: one conditional update, which a delivery racing it cannot both
|
|
1799
|
+
// pass (`markDelivered` updates only an input not handled).
|
|
1800
|
+
const taken = !metadata.queued ||
|
|
1801
|
+
metadata.pickedUp ||
|
|
1802
|
+
typeof metadata.inputId !== 'string' ||
|
|
1803
|
+
(await inputsRepo(unit.conn).updateMany({
|
|
1804
|
+
filter: (f) => f.and([
|
|
1805
|
+
f.string('id').eq(metadata.inputId),
|
|
1806
|
+
f.date('deliveredAt').empty(),
|
|
1807
|
+
f.date('handledAt').empty(),
|
|
1808
|
+
]),
|
|
1809
|
+
values: { handledAt: now() },
|
|
1810
|
+
})).updatedCount !== 1;
|
|
1811
|
+
if (taken)
|
|
1812
|
+
throw conversationConflict('messageTaken', 'The agent already has this message.');
|
|
1813
|
+
}
|
|
1625
1814
|
await messagesRepo(unit.conn).updateMany({
|
|
1626
1815
|
filter: { id: message.id },
|
|
1627
1816
|
values: {
|
|
1628
|
-
metadata: asJson({ ...metadata, withdrawn: true }),
|
|
1817
|
+
metadata: asJson({ ...metadata, queued: true, withdrawn: true }),
|
|
1629
1818
|
updatedAt: now(),
|
|
1630
1819
|
},
|
|
1631
1820
|
});
|
|
@@ -1690,7 +1879,9 @@ export function createConversationService(deps) {
|
|
|
1690
1879
|
filter: { id },
|
|
1691
1880
|
values,
|
|
1692
1881
|
});
|
|
1693
|
-
changed(unit, record
|
|
1882
|
+
changed(unit, record, values.seenSeq === undefined
|
|
1883
|
+
? undefined
|
|
1884
|
+
: { seenSeq: values.seenSeq });
|
|
1694
1885
|
});
|
|
1695
1886
|
return detail(userId, id);
|
|
1696
1887
|
},
|