@nocobase/app-plugin-agents 2.0.0-beta.1 → 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 +168 -0
- package/README.md +20 -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/controller.d.ts +5 -0
- package/dist/client/chat/controller.d.ts.map +1 -1
- package/dist/client/chat/controller.js +37 -13
- 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/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.map +1 -1
- package/dist/client/chat/use-chat.js +1 -0
- 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/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/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 +198 -18
- 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.map +1 -1
- package/dist/server/core/conversations/links.js +10 -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 +28 -4
- package/dist/server/core/runs/run.service.d.ts.map +1 -1
- package/dist/server/core/runs/run.service.js +94 -9
- 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 +4 -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/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/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 +4 -0
- package/dist/server/routes/schemas.d.ts.map +1 -1
- package/dist/server/routes/schemas.js +28 -6
- 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 +34 -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/docs/conversation-sharing.md +55 -0
- package/package.json +15 -15
- 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
|
@@ -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,
|
|
@@ -394,6 +404,9 @@ export function createConversationService(deps) {
|
|
|
394
404
|
effort: typeof jsonObject(record.metadata).effort === 'string'
|
|
395
405
|
? jsonObject(record.metadata).effort
|
|
396
406
|
: null,
|
|
407
|
+
wait: summary.mode === 'runner' && summary.run?.status === 'queued'
|
|
408
|
+
? await deps.runs.queueWait(summary.run.id, record.runnerId)
|
|
409
|
+
: null,
|
|
397
410
|
availability: await availabilityFor(conn, agent, record.userId),
|
|
398
411
|
canFallback: Boolean(target),
|
|
399
412
|
canRestore: !runnerBinding(record.metadata) &&
|
|
@@ -402,7 +415,48 @@ export function createConversationService(deps) {
|
|
|
402
415
|
}
|
|
403
416
|
async function detail(userId, id) {
|
|
404
417
|
const conn = tx.read();
|
|
405
|
-
|
|
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
|
+
};
|
|
406
460
|
}
|
|
407
461
|
// -------------------------------------------------------------------------------------------------------------------
|
|
408
462
|
// Writing
|
|
@@ -742,6 +796,9 @@ export function createConversationService(deps) {
|
|
|
742
796
|
const released = deps.attachments
|
|
743
797
|
? await deps.attachments.release(unit.conn, record.id)
|
|
744
798
|
: async () => { };
|
|
799
|
+
await sharesRepo(unit.conn).deleteMany({
|
|
800
|
+
filter: { conversationId: record.id },
|
|
801
|
+
});
|
|
745
802
|
await messagesRepo(unit.conn).deleteMany({
|
|
746
803
|
filter: { conversationId: record.id },
|
|
747
804
|
});
|
|
@@ -1100,6 +1157,35 @@ export function createConversationService(deps) {
|
|
|
1100
1157
|
messageId: `runner:${run.id}`,
|
|
1101
1158
|
revision: Number(answered.seq) + 1,
|
|
1102
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
|
+
}
|
|
1103
1189
|
await attend(unit, record.id, run);
|
|
1104
1190
|
},
|
|
1105
1191
|
},
|
|
@@ -1328,6 +1414,81 @@ export function createConversationService(deps) {
|
|
|
1328
1414
|
}
|
|
1329
1415
|
const service = {
|
|
1330
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
|
+
},
|
|
1331
1492
|
contextKinds: deps.contextKinds,
|
|
1332
1493
|
sources,
|
|
1333
1494
|
ownedTitles,
|
|
@@ -1607,7 +1768,7 @@ export function createConversationService(deps) {
|
|
|
1607
1768
|
sendRealtime: (userId, id, request, input) => sendMessage(userId, id, request, input),
|
|
1608
1769
|
async withdraw(userId, id, messageId) {
|
|
1609
1770
|
await tx.run(async (unit) => {
|
|
1610
|
-
|
|
1771
|
+
let record = await owned(unit.conn, userId, id);
|
|
1611
1772
|
const message = await messagesRepo(unit.conn).findOne({
|
|
1612
1773
|
filter: { id: messageId, conversationId: id },
|
|
1613
1774
|
});
|
|
@@ -1616,25 +1777,44 @@ export function createConversationService(deps) {
|
|
|
1616
1777
|
const metadata = jsonObject(message.metadata);
|
|
1617
1778
|
if (metadata.withdrawn)
|
|
1618
1779
|
return;
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
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
|
+
}
|
|
1634
1814
|
await messagesRepo(unit.conn).updateMany({
|
|
1635
1815
|
filter: { id: message.id },
|
|
1636
1816
|
values: {
|
|
1637
|
-
metadata: asJson({ ...metadata, withdrawn: true }),
|
|
1817
|
+
metadata: asJson({ ...metadata, queued: true, withdrawn: true }),
|
|
1638
1818
|
updatedAt: now(),
|
|
1639
1819
|
},
|
|
1640
1820
|
});
|