@nocobase/app-plugin-agents 1.0.0-beta.20 → 1.0.0-beta.22
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 +46 -0
- package/README.md +72 -12
- package/dist/cli/runner-token.js +1 -1
- package/dist/cli/runner-token.js.map +1 -1
- package/dist/client/chat/agent-mode.d.ts +47 -0
- package/dist/client/chat/agent-mode.d.ts.map +1 -0
- package/dist/client/chat/agent-mode.js +78 -0
- package/dist/client/chat/agent-mode.js.map +1 -0
- package/dist/client/chat/api.d.ts +2 -1
- package/dist/client/chat/api.d.ts.map +1 -1
- package/dist/client/chat/api.js +21 -5
- package/dist/client/chat/api.js.map +1 -1
- package/dist/client/chat/controller.d.ts +26 -0
- package/dist/client/chat/controller.d.ts.map +1 -1
- package/dist/client/chat/controller.js +328 -7
- package/dist/client/chat/controller.js.map +1 -1
- package/dist/client/chat/message-model.d.ts +10 -3
- package/dist/client/chat/message-model.d.ts.map +1 -1
- package/dist/client/chat/message-model.js +32 -4
- package/dist/client/chat/message-model.js.map +1 -1
- package/dist/client/chat/panel-state.d.ts +3 -0
- package/dist/client/chat/panel-state.d.ts.map +1 -1
- package/dist/client/chat/panel-state.js +4 -6
- package/dist/client/chat/panel-state.js.map +1 -1
- package/dist/client/chat/provider.d.ts +13 -2
- package/dist/client/chat/provider.d.ts.map +1 -1
- package/dist/client/chat/provider.js +25 -2
- package/dist/client/chat/provider.js.map +1 -1
- package/dist/client/chat/use-chat.d.ts +8 -1
- package/dist/client/chat/use-chat.d.ts.map +1 -1
- package/dist/client/chat/use-chat.js +28 -4
- package/dist/client/chat/use-chat.js.map +1 -1
- package/dist/client/chat/use-conversation-model.d.ts +4 -1
- package/dist/client/chat/use-conversation-model.d.ts.map +1 -1
- package/dist/client/chat/use-conversation-model.js +4 -3
- package/dist/client/chat/use-conversation-model.js.map +1 -1
- package/dist/client/chat.d.ts +6 -0
- package/dist/client/chat.d.ts.map +1 -1
- package/dist/client/chat.js +2 -0
- package/dist/client/chat.js.map +1 -1
- package/dist/client/components/command-line.d.ts +2 -1
- package/dist/client/components/command-line.d.ts.map +1 -1
- package/dist/client/components/command-line.js +2 -2
- package/dist/client/components/command-line.js.map +1 -1
- package/dist/client/components/variables/variable-dialogs.js +2 -2
- package/dist/client/components/variables/variable-dialogs.js.map +1 -1
- package/dist/client/lib/install.d.ts +3 -3
- package/dist/client/lib/install.d.ts.map +1 -1
- package/dist/client/lib/install.js +3 -5
- package/dist/client/lib/install.js.map +1 -1
- package/dist/client/lib/runner-tools.d.ts +4 -0
- package/dist/client/lib/runner-tools.d.ts.map +1 -0
- package/dist/client/lib/runner-tools.js +5 -0
- package/dist/client/lib/runner-tools.js.map +1 -0
- package/dist/client/locales/chat.en-US.d.ts +17 -0
- package/dist/client/locales/chat.en-US.d.ts.map +1 -1
- package/dist/client/locales/chat.en-US.js +17 -0
- package/dist/client/locales/chat.en-US.js.map +1 -1
- package/dist/client/locales/chat.zh-CN.d.ts.map +1 -1
- package/dist/client/locales/chat.zh-CN.js +17 -0
- package/dist/client/locales/chat.zh-CN.js.map +1 -1
- package/dist/client/locales/de-DE.d.ts.map +1 -1
- package/dist/client/locales/de-DE.js +8 -1
- package/dist/client/locales/de-DE.js.map +1 -1
- package/dist/client/locales/en-US.js +9 -9
- 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 +8 -1
- 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 +8 -1
- 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 +8 -1
- package/dist/client/locales/id-ID.js.map +1 -1
- package/dist/client/locales/ja-JP.d.ts.map +1 -1
- package/dist/client/locales/ja-JP.js +8 -1
- package/dist/client/locales/ja-JP.js.map +1 -1
- package/dist/client/locales/pt-BR.d.ts.map +1 -1
- package/dist/client/locales/pt-BR.js +8 -1
- package/dist/client/locales/pt-BR.js.map +1 -1
- package/dist/client/locales/runWait.en-US.js +1 -1
- package/dist/client/locales/runWait.en-US.js.map +1 -1
- package/dist/client/locales/runWait.zh-CN.js +1 -1
- package/dist/client/locales/runtimes.en-US.d.ts +10 -1
- package/dist/client/locales/runtimes.en-US.d.ts.map +1 -1
- package/dist/client/locales/runtimes.en-US.js +18 -9
- 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 +18 -9
- 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 +8 -1
- package/dist/client/locales/vi-VN.js.map +1 -1
- package/dist/client/locales/zh-CN.js +9 -9
- 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 +8 -1
- package/dist/client/locales/zh-TW.js.map +1 -1
- package/dist/client/online/service-editor.js +6 -1
- package/dist/client/online/service-editor.js.map +1 -1
- package/dist/client/pages/runtimes/connect.js +18 -8
- package/dist/client/pages/runtimes/connect.js.map +1 -1
- package/dist/client/pages/runtimes/index.js +1 -1
- package/dist/client/pages/runtimes/runner-overview.d.ts.map +1 -1
- package/dist/client/pages/runtimes/runner-overview.js +3 -2
- package/dist/client/pages/runtimes/runner-overview.js.map +1 -1
- package/dist/client/pages/usage/prices/model.d.ts +1 -1
- package/dist/client/pages/usage/prices/model.js +1 -1
- package/dist/client/plugin.js +1 -1
- package/dist/client/plugin.js.map +1 -1
- package/dist/client/routes.d.ts +1 -1
- package/dist/database/migrations/.manifest.json +4 -0
- package/dist/database/migrations/202610290001_ag_repair_runner_agents.d.ts +5 -0
- package/dist/database/migrations/202610290001_ag_repair_runner_agents.d.ts.map +1 -0
- package/dist/database/migrations/202610290001_ag_repair_runner_agents.js +72 -0
- package/dist/database/migrations/202610290001_ag_repair_runner_agents.js.map +1 -0
- package/dist/package.json +18 -1
- package/dist/server/composition.d.ts +2 -0
- package/dist/server/composition.d.ts.map +1 -1
- package/dist/server/composition.js +13 -3
- package/dist/server/composition.js.map +1 -1
- package/dist/server/core/agents/agent.store.d.ts +5 -3
- package/dist/server/core/agents/agent.store.d.ts.map +1 -1
- package/dist/server/core/agents/agent.store.js +25 -6
- package/dist/server/core/agents/agent.store.js.map +1 -1
- package/dist/server/core/conversations/attachments.d.ts +1 -1
- package/dist/server/core/conversations/attachments.d.ts.map +1 -1
- package/dist/server/core/conversations/attachments.js +2 -2
- package/dist/server/core/conversations/attachments.js.map +1 -1
- package/dist/server/core/conversations/availability.d.ts +1 -1
- package/dist/server/core/conversations/conversation.service.d.ts.map +1 -1
- package/dist/server/core/conversations/conversation.service.js +7 -0
- package/dist/server/core/conversations/conversation.service.js.map +1 -1
- package/dist/server/core/runs/claim.js +6 -6
- package/dist/server/core/runs/claim.js.map +1 -1
- package/dist/server/core/runs/eligibility.d.ts +3 -3
- package/dist/server/core/runs/eligibility.d.ts.map +1 -1
- package/dist/server/core/runs/run-requests.js +1 -1
- package/dist/server/core/runs/run-requests.js.map +1 -1
- package/dist/server/core/runs/run.service.d.ts +1 -1
- package/dist/server/core/runs/run.store.d.ts +1 -1
- package/dist/server/core/runs/run.store.d.ts.map +1 -1
- package/dist/server/core/runs/workload.js +1 -1
- package/dist/server/core/runs/workload.js.map +1 -1
- package/dist/server/core/variables/variable.service.d.ts +2 -2
- package/dist/server/core/variables/variable.service.js +1 -1
- package/dist/server/core/variables/variable.service.js.map +1 -1
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/jobs/job.service.d.ts +1 -1
- package/dist/server/jobs/job.service.js +1 -1
- package/dist/server/jobs/spec.d.ts +1 -1
- package/dist/server/jobs/spec.d.ts.map +1 -1
- package/dist/server/jobs/spec.js +2 -2
- package/dist/server/jobs/spec.js.map +1 -1
- package/dist/server/kernel/events.d.ts +9 -0
- package/dist/server/kernel/events.d.ts.map +1 -1
- package/dist/server/kernel/events.js.map +1 -1
- package/dist/server/online/agent/configuration.d.ts +2 -0
- package/dist/server/online/agent/configuration.d.ts.map +1 -1
- package/dist/server/online/agent/configuration.js +21 -2
- package/dist/server/online/agent/configuration.js.map +1 -1
- package/dist/server/online/agent/contracts.d.ts +5 -3
- package/dist/server/online/agent/contracts.d.ts.map +1 -1
- package/dist/server/online/agent/index.d.ts +1 -0
- package/dist/server/online/agent/index.d.ts.map +1 -1
- package/dist/server/online/agent/index.js.map +1 -1
- package/dist/server/online/agent/messages/projection.d.ts.map +1 -1
- package/dist/server/online/agent/messages/projection.js +3 -0
- package/dist/server/online/agent/messages/projection.js.map +1 -1
- package/dist/server/online/agent/messages/resend.d.ts +7 -0
- package/dist/server/online/agent/messages/resend.d.ts.map +1 -0
- package/dist/server/online/agent/messages/resend.js +58 -0
- package/dist/server/online/agent/messages/resend.js.map +1 -0
- package/dist/server/online/agent/native/backend.d.ts +6 -0
- package/dist/server/online/agent/native/backend.d.ts.map +1 -1
- package/dist/server/online/agent/native/backend.js +17 -24
- package/dist/server/online/agent/native/backend.js.map +1 -1
- package/dist/server/online/agent/native/execution.d.ts +8 -12
- package/dist/server/online/agent/native/execution.d.ts.map +1 -1
- package/dist/server/online/agent/native/execution.js +89 -17
- package/dist/server/online/agent/native/execution.js.map +1 -1
- package/dist/server/online/agent/native/session.d.ts +2 -0
- package/dist/server/online/agent/native/session.d.ts.map +1 -1
- package/dist/server/online/agent/native/session.js +11 -0
- package/dist/server/online/agent/native/session.js.map +1 -1
- package/dist/server/online/agent/native/types.d.ts +20 -0
- package/dist/server/online/agent/native/types.d.ts.map +1 -1
- package/dist/server/online/agent/persistence/manager.d.ts +1 -2
- package/dist/server/online/agent/persistence/manager.d.ts.map +1 -1
- package/dist/server/online/agent/persistence/manager.js +0 -7
- package/dist/server/online/agent/persistence/manager.js.map +1 -1
- package/dist/server/online/agent/persistence/store.d.ts +25 -7
- package/dist/server/online/agent/persistence/store.d.ts.map +1 -1
- package/dist/server/online/agent/persistence/store.js +165 -47
- package/dist/server/online/agent/persistence/store.js.map +1 -1
- package/dist/server/online/agent/runner/backend.d.ts +1 -0
- package/dist/server/online/agent/runner/backend.d.ts.map +1 -1
- package/dist/server/online/agent/runner/backend.js +3 -0
- package/dist/server/online/agent/runner/backend.js.map +1 -1
- package/dist/server/online/agent/service.d.ts +4 -0
- package/dist/server/online/agent/service.d.ts.map +1 -1
- package/dist/server/online/agent/service.js +2 -0
- package/dist/server/online/agent/service.js.map +1 -1
- package/dist/server/online/agent/types.d.ts +5 -0
- package/dist/server/online/agent/types.d.ts.map +1 -1
- package/dist/server/online/agent/web-search.d.ts +13 -0
- package/dist/server/online/agent/web-search.d.ts.map +1 -0
- package/dist/server/online/agent/web-search.js +65 -0
- package/dist/server/online/agent/web-search.js.map +1 -0
- package/dist/server/online/files/cache.d.ts +19 -0
- package/dist/server/online/files/cache.d.ts.map +1 -0
- package/dist/server/online/files/cache.js +52 -0
- package/dist/server/online/files/cache.js.map +1 -0
- package/dist/server/online/files/errors.d.ts +8 -0
- package/dist/server/online/files/errors.d.ts.map +1 -0
- package/dist/server/online/files/errors.js +14 -0
- package/dist/server/online/files/errors.js.map +1 -0
- package/dist/server/online/files/input.d.ts +23 -0
- package/dist/server/online/files/input.d.ts.map +1 -0
- package/dist/server/online/files/input.js +129 -0
- package/dist/server/online/files/input.js.map +1 -0
- package/dist/server/online/files/kimi.d.ts +11 -0
- package/dist/server/online/files/kimi.d.ts.map +1 -0
- package/dist/server/online/files/kimi.js +177 -0
- package/dist/server/online/files/kimi.js.map +1 -0
- package/dist/server/online/files/profiles.d.ts +13 -0
- package/dist/server/online/files/profiles.d.ts.map +1 -0
- package/dist/server/online/files/profiles.js +124 -0
- package/dist/server/online/files/profiles.js.map +1 -0
- package/dist/server/online/files/service.d.ts +35 -0
- package/dist/server/online/files/service.d.ts.map +1 -0
- package/dist/server/online/files/service.js +174 -0
- package/dist/server/online/files/service.js.map +1 -0
- package/dist/server/online/files/types.d.ts +32 -0
- package/dist/server/online/files/types.d.ts.map +1 -0
- package/dist/server/online/files/types.js +2 -0
- package/dist/server/online/files/types.js.map +1 -0
- package/dist/server/online/gateway.d.ts +13 -0
- package/dist/server/online/gateway.d.ts.map +1 -1
- package/dist/server/online/gateway.js +116 -2
- package/dist/server/online/gateway.js.map +1 -1
- package/dist/server/online/index.d.ts +1 -1
- package/dist/server/online/index.d.ts.map +1 -1
- package/dist/server/online/index.js.map +1 -1
- package/dist/server/online/providers.d.ts +6 -0
- package/dist/server/online/providers.d.ts.map +1 -1
- package/dist/server/online/providers.js +29 -1
- package/dist/server/online/providers.js.map +1 -1
- package/dist/server/online/search/alibaba.d.ts +10 -0
- package/dist/server/online/search/alibaba.d.ts.map +1 -0
- package/dist/server/online/search/alibaba.js +34 -0
- package/dist/server/online/search/alibaba.js.map +1 -0
- package/dist/server/online/search/anthropic.d.ts +12 -0
- package/dist/server/online/search/anthropic.d.ts.map +1 -0
- package/dist/server/online/search/anthropic.js +62 -0
- package/dist/server/online/search/anthropic.js.map +1 -0
- package/dist/server/online/search/budget.d.ts +13 -0
- package/dist/server/online/search/budget.d.ts.map +1 -0
- package/dist/server/online/search/budget.js +63 -0
- package/dist/server/online/search/budget.js.map +1 -0
- package/dist/server/online/search/capabilities.d.ts +7 -0
- package/dist/server/online/search/capabilities.d.ts.map +1 -0
- package/dist/server/online/search/capabilities.js +90 -0
- package/dist/server/online/search/capabilities.js.map +1 -0
- package/dist/server/online/search/contracts.d.ts +20 -0
- package/dist/server/online/search/contracts.d.ts.map +1 -0
- package/dist/server/online/search/contracts.js +2 -0
- package/dist/server/online/search/contracts.js.map +1 -0
- package/dist/server/online/search/google.d.ts +12 -0
- package/dist/server/online/search/google.d.ts.map +1 -0
- package/dist/server/online/search/google.js +51 -0
- package/dist/server/online/search/google.js.map +1 -0
- package/dist/server/online/search/openai.d.ts +18 -0
- package/dist/server/online/search/openai.d.ts.map +1 -0
- package/dist/server/online/search/openai.js +51 -0
- package/dist/server/online/search/openai.js.map +1 -0
- package/dist/server/online/search/prompts.d.ts +5 -0
- package/dist/server/online/search/prompts.d.ts.map +1 -0
- package/dist/server/online/search/prompts.js +28 -0
- package/dist/server/online/search/prompts.js.map +1 -0
- package/dist/server/online/search/results.d.ts +2 -0
- package/dist/server/online/search/results.d.ts.map +1 -0
- package/dist/server/online/search/results.js +2 -0
- package/dist/server/online/search/results.js.map +1 -0
- package/dist/server/online/services.d.ts +2 -0
- package/dist/server/online/services.d.ts.map +1 -1
- package/dist/server/online/services.js +17 -2
- package/dist/server/online/services.js.map +1 -1
- package/dist/server/providers/agents.d.ts +1 -0
- package/dist/server/providers/agents.d.ts.map +1 -1
- package/dist/server/providers/agents.js +12 -0
- package/dist/server/providers/agents.js.map +1 -1
- package/dist/server/providers/authorization.d.ts +2 -2
- package/dist/server/providers/authorization.js +2 -2
- package/dist/server/routes/admin.js +3 -3
- 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 +34 -1
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/run-requests.js +1 -1
- package/dist/server/routes/run-requests.js.map +1 -1
- package/dist/server/routes/runners/admin.js +6 -6
- package/dist/server/routes/runners/admin.js.map +1 -1
- package/dist/server/routes/runners/install.js +1 -1
- package/dist/server/routes/schemas.d.ts +3 -0
- package/dist/server/routes/schemas.d.ts.map +1 -1
- package/dist/server/routes/schemas.js +25 -6
- package/dist/server/routes/schemas.js.map +1 -1
- package/dist/server/runners/runner.service.js +1 -1
- package/dist/server/vendor/just-bash.js +117 -117
- package/dist/shared/access.d.ts +2 -2
- package/dist/shared/access.js +2 -2
- package/dist/shared/agents.d.ts +2 -2
- package/dist/shared/agents.d.ts.map +1 -1
- package/dist/shared/conversations.d.ts +13 -1
- package/dist/shared/conversations.d.ts.map +1 -1
- package/dist/shared/conversations.js.map +1 -1
- package/dist/shared/file-input-failures.d.ts +5 -0
- package/dist/shared/file-input-failures.d.ts.map +1 -0
- package/dist/shared/file-input-failures.js +20 -0
- package/dist/shared/file-input-failures.js.map +1 -0
- package/dist/shared/locales/access.en-US.js +3 -3
- package/dist/shared/locales/access.en-US.js.map +1 -1
- package/dist/shared/locales/access.zh-CN.js +3 -3
- package/dist/shared/locales/access.zh-CN.js.map +1 -1
- package/dist/shared/models.d.ts +11 -0
- package/dist/shared/models.d.ts.map +1 -1
- package/dist/shared/models.js.map +1 -1
- package/dist/shared/resend.d.ts +10 -0
- package/dist/shared/resend.d.ts.map +1 -0
- package/dist/shared/resend.js +2 -0
- package/dist/shared/resend.js.map +1 -0
- package/dist/shared/runners.d.ts +4 -4
- package/dist/shared/runners.d.ts.map +1 -1
- package/dist/shared/runners.js +2 -2
- package/dist/shared/runs.d.ts +5 -5
- package/dist/shared/runs.d.ts.map +1 -1
- package/dist/shared/runs.js +1 -1
- package/dist/shared/variables.d.ts +3 -3
- package/dist/shared/variables.d.ts.map +1 -1
- package/dist/shared/variables.js +1 -1
- package/dist/shared/web-search-results.d.ts +16 -0
- package/dist/shared/web-search-results.d.ts.map +1 -0
- package/dist/shared/web-search-results.js +103 -0
- package/dist/shared/web-search-results.js.map +1 -0
- package/dist/shared/web-search.d.ts +40 -0
- package/dist/shared/web-search.d.ts.map +1 -0
- package/dist/shared/web-search.js +15 -0
- package/dist/shared/web-search.js.map +1 -0
- package/docs/execution-history.md +1 -1
- package/docs/message-resend.md +39 -0
- package/docs/native-web-search.md +76 -0
- package/docs/runner-agents.md +3 -3
- package/docs/ui-message-clients.md +7 -1
- package/package.json +11 -2
- package/skills/nocobase-app-plugin-agents/SKILL.md +9 -2
- package/skills/nocobase-app-plugin-agents/references/extension-points.md +1 -1
- package/skills/nocobase-app-plugin-agents/references/online-agent.md +9 -1
- package/skills/nocobase-app-plugin-agents/references/runners.md +7 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../client/chat/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../client/chat/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
import type { OnlineAgentResendOptions } from '../../shared/resend.js';
|
|
2
|
+
import type { ConversationChanged } from '../../shared/conversations.js';
|
|
3
|
+
export type ResendResult = {
|
|
4
|
+
outcome: 'accepted' | 'rejected' | 'unknown';
|
|
5
|
+
needsSync?: boolean;
|
|
6
|
+
error?: unknown;
|
|
7
|
+
};
|
|
8
|
+
type HistoryReplacement = Extract<ConversationChanged, {
|
|
9
|
+
kind: 'conversation.historyReplaced';
|
|
10
|
+
}>;
|
|
1
11
|
import { Chat } from '@ai-sdk/react';
|
|
2
12
|
import { type ReactElement, type ReactNode } from 'react';
|
|
3
13
|
import type { ConversationDetail } from '../../shared/conversations.js';
|
|
@@ -13,6 +23,10 @@ export type StreamState = {
|
|
|
13
23
|
/** Application coordination around one SDK Chat per conversation, shared by every surface. */
|
|
14
24
|
export declare class ChatController {
|
|
15
25
|
readonly api: ChatApi;
|
|
26
|
+
private historyEpochs;
|
|
27
|
+
private replacements;
|
|
28
|
+
private resendRequests;
|
|
29
|
+
private reconciles;
|
|
16
30
|
readonly submissions: ChatSubmissions;
|
|
17
31
|
private chats;
|
|
18
32
|
private histories;
|
|
@@ -46,6 +60,17 @@ export declare class ChatController {
|
|
|
46
60
|
};
|
|
47
61
|
private historyMeta;
|
|
48
62
|
dispatch(id: string, action: MessagesAction): void;
|
|
63
|
+
private historyLifetime;
|
|
64
|
+
private invalidateHistoryReads;
|
|
65
|
+
historyReplaced(event: HistoryReplacement): void;
|
|
66
|
+
private replaceHistory;
|
|
67
|
+
private resendAccepted;
|
|
68
|
+
isResending(id: string): boolean;
|
|
69
|
+
resend(id: string, options: OnlineAgentResendOptions & {
|
|
70
|
+
messageId: string;
|
|
71
|
+
}): Promise<ResendResult>;
|
|
72
|
+
/** Only a successful read of every requested ID proves absence; never delete an unqueried message. */
|
|
73
|
+
private reconcile;
|
|
49
74
|
loadHistory(id: string, older?: boolean, fresh?: boolean): Promise<void>;
|
|
50
75
|
reread(id: string, ids: readonly string[]): Promise<AppUIMessage[]>;
|
|
51
76
|
watch(id: string): () => void;
|
|
@@ -80,4 +105,5 @@ export declare function ChatClientProvider({ children, }: {
|
|
|
80
105
|
export declare function useChatController(): ChatController;
|
|
81
106
|
export declare function useChatStream(id: string | null): StreamState | undefined;
|
|
82
107
|
export declare function useChatStreamState(id: string | null): StreamState | undefined;
|
|
108
|
+
export {};
|
|
83
109
|
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../client/chat/controller.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../client/chat/controller.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAGzE,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AACF,KAAK,kBAAkB,GAAG,OAAO,CAC/B,mBAAmB,EACnB;IAAE,IAAI,EAAE,8BAA8B,CAAA;CAAE,CACzC,CAAC;AAGF,OAAO,EAAE,IAAI,EAAyB,MAAM,eAAe,CAAC;AAC5D,OAAO,EAQL,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EACvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAuB,MAAM,kBAAkB,CAAC;AAGxE,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAE5B,+GAA+G;AAC/G,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB,CAAC;AAmBF,8FAA8F;AAC9F,qBAAa,cAAc;IA0Cb,QAAQ,CAAC,GAAG,EAAE,OAAO;IAzCjC,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,YAAY,CAGhB;IACJ,OAAO,CAAC,cAAc,CAGlB;IACJ,OAAO,CAAC,UAAU,CAAoC;IACtD,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,UAAU,CAGd;IACJ,OAAO,CAAC,OAAO,CAGX;IACJ,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,aAAa,CAGjB;IACJ,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,eAAe,CAA6B;gBAC/B,GAAG,EAAE,OAAO;IAoBjC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;IA2BpC,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG;QACnB,KAAK,EAAE,aAAa,CAAC;QACrB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,YAAY,EAAE,OAAO,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB;IAaD,OAAO,CAAC,WAAW;IAQnB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;IA+ElD,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,sBAAsB;IAW9B,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAuBhD,OAAO,CAAC,cAAc;YAsBR,cAAc;IAkC5B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI1B,MAAM,CACV,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,wBAAwB,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GACxD,OAAO,CAAC,YAAY,CAAC;IAoIxB,sGAAsG;YACxF,SAAS;IAkHjB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,UAAQ,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAoEpE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAwBzE,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,IAAI;IA2B7B,SAAS,IAAI,IAAI;IAMjB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;YA4CvD,SAAS;IA8EvB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAS1C,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAgB/C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+EjC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BjE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASnC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+ExC,OAAO,CAAC,eAAe;IAQvB,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAU/C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAGzB,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkBnD,QAAQ,IAAI,MAAM,OAAO;IAIzB,OAAO,CAAC,iBAAiB;IAKzB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,OAAO;IAKxC,OAAO,CAAC,QAAQ;IAMV,OAAO,CAAC,CAAC,EACb,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,kBAAkB,GACxC,OAAO,CAAC,CAAC,CAAC;IAeb,SAAS,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAG9C;IACF,QAAQ,QAAO,MAAM,CAAkB;IACvC,OAAO,CAAC,OAAO;IAIf,QAAQ,IAAI,IAAI;IAGhB,UAAU,IAAI,IAAI;IA8BlB,OAAO,IAAI,IAAI;CAOhB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GAAG,YAAY,CA8Bf;AACD,wBAAgB,iBAAiB,IAAI,cAAc,CAIlD;AACD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,CAYxE;AACD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,CAS7E"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
|
|
2
|
+
import { ApiClientError } from '@nocobase/app-client';
|
|
3
3
|
import { CancelledError } from '@tanstack/react-query';
|
|
4
4
|
import { isToolUIPart } from 'ai';
|
|
5
5
|
import { Chat, useChat as useSDKChat } from '@ai-sdk/react';
|
|
@@ -22,6 +22,10 @@ function deferred() {
|
|
|
22
22
|
/** Application coordination around one SDK Chat per conversation, shared by every surface. */
|
|
23
23
|
export class ChatController {
|
|
24
24
|
api;
|
|
25
|
+
historyEpochs = new Map();
|
|
26
|
+
replacements = new Map();
|
|
27
|
+
resendRequests = new Map();
|
|
28
|
+
reconciles = new Map();
|
|
25
29
|
submissions;
|
|
26
30
|
chats = new Map();
|
|
27
31
|
histories = new Map();
|
|
@@ -65,7 +69,7 @@ export class ChatController {
|
|
|
65
69
|
const admission = this.admissions.get(id);
|
|
66
70
|
if (!this.disposed && admission?.clientId === clientId)
|
|
67
71
|
admission.gate.resolve();
|
|
68
|
-
}),
|
|
72
|
+
}, (options) => this.resendAccepted(id, options)),
|
|
69
73
|
onFinish: () => {
|
|
70
74
|
if (!this.disposed && this.chats.get(id) === chat)
|
|
71
75
|
this.scheduleRefresh(id);
|
|
@@ -127,6 +131,15 @@ export class ChatController {
|
|
|
127
131
|
this.submissions.editRejected(action.clientId);
|
|
128
132
|
return;
|
|
129
133
|
}
|
|
134
|
+
if (action.type === 'confirmed') {
|
|
135
|
+
const boundary = this.replacements.get(id), seq = action.message.metadata?.seq;
|
|
136
|
+
if (boundary &&
|
|
137
|
+
seq !== undefined &&
|
|
138
|
+
seq > boundary.seq &&
|
|
139
|
+
seq <= boundary.lastSeq &&
|
|
140
|
+
action.message.metadata?.executionId !== boundary.executionId)
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
130
143
|
const current = this.historyMeta(id);
|
|
131
144
|
const before = this.history(id).state;
|
|
132
145
|
const next = messagesReducer(before, action);
|
|
@@ -154,6 +167,8 @@ export class ChatController {
|
|
|
154
167
|
});
|
|
155
168
|
chat.messages = mergeUIMessages(chat.messages, batch, activeId);
|
|
156
169
|
}
|
|
170
|
+
if (action.type === 'replaceHistory')
|
|
171
|
+
chat.messages = [...next.items];
|
|
157
172
|
const { items: _items, pending: _pending, ...page } = next;
|
|
158
173
|
this.histories.set(id, {
|
|
159
174
|
...current,
|
|
@@ -164,6 +179,296 @@ export class ChatController {
|
|
|
164
179
|
});
|
|
165
180
|
this.publish();
|
|
166
181
|
}
|
|
182
|
+
historyLifetime(id) {
|
|
183
|
+
const active = this.lifetime(), epoch = this.historyEpochs.get(id) ?? 0;
|
|
184
|
+
return () => active() && (this.historyEpochs.get(id) ?? 0) === epoch;
|
|
185
|
+
}
|
|
186
|
+
invalidateHistoryReads(id) {
|
|
187
|
+
this.historyEpochs.set(id, (this.historyEpochs.get(id) ?? 0) + 1);
|
|
188
|
+
this.loads.delete(id);
|
|
189
|
+
this.refreshAgain.delete(id);
|
|
190
|
+
this.revisionQueue.delete(id);
|
|
191
|
+
this.deferredReads.delete(id);
|
|
192
|
+
for (const key of this.messageVersions.keys())
|
|
193
|
+
if (key.startsWith(`${id}:`))
|
|
194
|
+
this.messageVersions.delete(key);
|
|
195
|
+
this.historyMeta(id).loadingOlder = false;
|
|
196
|
+
}
|
|
197
|
+
historyReplaced(event) {
|
|
198
|
+
if (this.disposed || !this.replaceHistory(event))
|
|
199
|
+
return;
|
|
200
|
+
const active = this.historyLifetime(event.conversationId);
|
|
201
|
+
void this.reread(event.conversationId, [event.messageId])
|
|
202
|
+
.then(async () => {
|
|
203
|
+
if (!active())
|
|
204
|
+
return;
|
|
205
|
+
await this.refresh(event.conversationId);
|
|
206
|
+
if (!this.disposed &&
|
|
207
|
+
!this.resendRequests.has(event.conversationId) &&
|
|
208
|
+
this.replacements.get(event.conversationId)?.executionId ===
|
|
209
|
+
event.executionId)
|
|
210
|
+
await this.resume(event.conversationId);
|
|
211
|
+
})
|
|
212
|
+
.catch((error) => {
|
|
213
|
+
if (active()) {
|
|
214
|
+
this.historyMeta(event.conversationId).error = error;
|
|
215
|
+
this.publish();
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
replaceHistory(event) {
|
|
220
|
+
const id = event.conversationId, previous = this.replacements.get(id);
|
|
221
|
+
if (previous?.executionId === event.executionId ||
|
|
222
|
+
(previous && previous.lastSeq > event.lastSeq))
|
|
223
|
+
return false;
|
|
224
|
+
this.invalidateHistoryReads(id);
|
|
225
|
+
this.resuming.delete(id);
|
|
226
|
+
this.replacements.set(id, event);
|
|
227
|
+
this.dispatch(id, { type: 'replaceHistory', ...event });
|
|
228
|
+
this.historyMeta(id).loadedThrough = Math.max(this.historyMeta(id).loadedThrough, event.lastSeq);
|
|
229
|
+
const chat = this.chat(id);
|
|
230
|
+
// A replacement owns a different response. Detach only the local subscriber, never business Stop.
|
|
231
|
+
if (!this.resendRequests.has(id))
|
|
232
|
+
this.renewChat(id, chat.messages);
|
|
233
|
+
return true;
|
|
234
|
+
}
|
|
235
|
+
async resendAccepted(id, options) {
|
|
236
|
+
const request = this.resendRequests.get(id);
|
|
237
|
+
if (!request || this.disposed)
|
|
238
|
+
throw new CancelledError({ silent: true });
|
|
239
|
+
request.accepted = true;
|
|
240
|
+
const active = this.lifetime();
|
|
241
|
+
try {
|
|
242
|
+
const page = await this.api.messages(id, { ids: options.messageId });
|
|
243
|
+
if (!active() || this.resendRequests.get(id) !== request)
|
|
244
|
+
throw new CancelledError({ silent: true });
|
|
245
|
+
const target = page.items.find((m) => m.id === options.messageId && m.role === 'user');
|
|
246
|
+
if (!target?.metadata?.executionId || target.metadata.seq === undefined)
|
|
247
|
+
throw new Error('Accepted input requires history synchronization.');
|
|
248
|
+
this.replaceHistory({
|
|
249
|
+
kind: 'conversation.historyReplaced',
|
|
250
|
+
conversationId: id,
|
|
251
|
+
messageId: target.id,
|
|
252
|
+
seq: target.metadata.seq,
|
|
253
|
+
revision: target.metadata.revision,
|
|
254
|
+
lastSeq: page.lastSeq,
|
|
255
|
+
executionId: target.metadata.executionId,
|
|
256
|
+
});
|
|
257
|
+
this.dispatch(id, { type: 'confirmed', message: target });
|
|
258
|
+
request.gate.resolve({ outcome: 'accepted' });
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
request.gate.resolve({ outcome: 'accepted', needsSync: true, error });
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
isResending(id) {
|
|
266
|
+
return this.resendRequests.has(id);
|
|
267
|
+
}
|
|
268
|
+
async resend(id, options) {
|
|
269
|
+
const detail = agentsQueryClient().getQueryData(chatKeys.conversation(id));
|
|
270
|
+
const chat = this.chat(id);
|
|
271
|
+
if (this.disposed ||
|
|
272
|
+
this.resendRequests.has(id) ||
|
|
273
|
+
this.approvalRequests.has(id) ||
|
|
274
|
+
this.stopRequests.has(id) ||
|
|
275
|
+
chat.status === 'submitted' ||
|
|
276
|
+
chat.status === 'streaming' ||
|
|
277
|
+
(detail && (detail.mode !== 'online' || chatIsRunning(detail))))
|
|
278
|
+
return {
|
|
279
|
+
outcome: 'rejected',
|
|
280
|
+
error: new Error('This conversation is busy or does not support resend.'),
|
|
281
|
+
};
|
|
282
|
+
const request = { accepted: false, gate: deferred() };
|
|
283
|
+
this.resendRequests.set(id, request);
|
|
284
|
+
this.publish();
|
|
285
|
+
const active = this.lifetime();
|
|
286
|
+
this.commandVersions.set(id, (this.commandVersions.get(id) ?? 0) + 1);
|
|
287
|
+
this.nextDetailVersion(id);
|
|
288
|
+
try {
|
|
289
|
+
await agentsQueryClient().cancelQueries({
|
|
290
|
+
queryKey: chatKeys.conversation(id),
|
|
291
|
+
exact: true,
|
|
292
|
+
});
|
|
293
|
+
if (!active())
|
|
294
|
+
throw new CancelledError({ silent: true });
|
|
295
|
+
let target = chat.messages.find((message) => message.id === options.messageId && message.role === 'user');
|
|
296
|
+
if (!target) {
|
|
297
|
+
const lookupActive = this.historyLifetime(id);
|
|
298
|
+
try {
|
|
299
|
+
const page = await this.api.messages(id, { ids: options.messageId });
|
|
300
|
+
if (!active() || !lookupActive())
|
|
301
|
+
throw new CancelledError({ silent: true });
|
|
302
|
+
target = page.items.find((message) => message.id === options.messageId && message.role === 'user');
|
|
303
|
+
if (target)
|
|
304
|
+
this.dispatch(id, { type: 'confirmed', message: target });
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
return { outcome: 'rejected', error };
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (!target)
|
|
311
|
+
return {
|
|
312
|
+
outcome: 'rejected',
|
|
313
|
+
error: new Error('The resend target is no longer available.'),
|
|
314
|
+
};
|
|
315
|
+
const before = [...chat.messages];
|
|
316
|
+
this.invalidateHistoryReads(id);
|
|
317
|
+
const historyActive = this.historyLifetime(id);
|
|
318
|
+
chat.clearError();
|
|
319
|
+
const body = { resendInput: structuredClone(options) };
|
|
320
|
+
let textReplaced = false;
|
|
321
|
+
const sending = options.input
|
|
322
|
+
? chat.sendMessage({
|
|
323
|
+
...target,
|
|
324
|
+
messageId: target.id,
|
|
325
|
+
parts: [
|
|
326
|
+
...target.parts.flatMap((part) => {
|
|
327
|
+
if (part.type !== 'text')
|
|
328
|
+
return [part];
|
|
329
|
+
if (textReplaced)
|
|
330
|
+
return [];
|
|
331
|
+
textReplaced = true;
|
|
332
|
+
return [
|
|
333
|
+
{ type: 'text', text: options.input.text },
|
|
334
|
+
];
|
|
335
|
+
}),
|
|
336
|
+
...(!target.parts.some((part) => part.type === 'text')
|
|
337
|
+
? [{ type: 'text', text: options.input.text }]
|
|
338
|
+
: []),
|
|
339
|
+
],
|
|
340
|
+
}, { body })
|
|
341
|
+
: chat.regenerate({ messageId: target.id, body });
|
|
342
|
+
const failed = async (error) => {
|
|
343
|
+
if (request.accepted) {
|
|
344
|
+
request.gate.resolve({ outcome: 'accepted', needsSync: true, error });
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
const rejected = error instanceof ApiClientError &&
|
|
348
|
+
error.status >= 400 &&
|
|
349
|
+
error.status < 500 &&
|
|
350
|
+
error.status !== 408 &&
|
|
351
|
+
error.status !== 499;
|
|
352
|
+
const outcome = rejected ? 'rejected' : 'unknown';
|
|
353
|
+
let needsSync = false;
|
|
354
|
+
if (active() && historyActive()) {
|
|
355
|
+
if (outcome === 'rejected')
|
|
356
|
+
chat.messages = before;
|
|
357
|
+
try {
|
|
358
|
+
// Unknown admission never restores a stale snapshot or retries the POST.
|
|
359
|
+
await this.reread(id, before.map((message) => message.id));
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
needsSync = true;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
request.gate.resolve({ outcome, needsSync, error });
|
|
366
|
+
};
|
|
367
|
+
void sending.then(() => {
|
|
368
|
+
if (!request.accepted)
|
|
369
|
+
return failed(chat.error ??
|
|
370
|
+
new Error('Resend admission is unknown. Synchronize before trying again.'));
|
|
371
|
+
}, failed);
|
|
372
|
+
return await request.gate.promise;
|
|
373
|
+
}
|
|
374
|
+
finally {
|
|
375
|
+
if (active() && this.resendRequests.get(id) === request) {
|
|
376
|
+
this.resendRequests.delete(id);
|
|
377
|
+
this.publish();
|
|
378
|
+
void this.refresh(id).catch(() => { });
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/** Only a successful read of every requested ID proves absence; never delete an unqueried message. */
|
|
383
|
+
async reconcile(id, detail) {
|
|
384
|
+
const pending = this.reconciles.get(id);
|
|
385
|
+
if (pending)
|
|
386
|
+
return pending;
|
|
387
|
+
if (this.resendRequests.has(id))
|
|
388
|
+
return;
|
|
389
|
+
this.invalidateHistoryReads(id);
|
|
390
|
+
const active = this.historyLifetime(id);
|
|
391
|
+
const initial = this.chat(id).messages.filter((m) => m.metadata?.seq !== undefined);
|
|
392
|
+
const task = (async () => {
|
|
393
|
+
const found = [];
|
|
394
|
+
for (let offset = 0; offset < initial.length; offset += 100) {
|
|
395
|
+
const page = await this.api.messages(id, {
|
|
396
|
+
ids: initial
|
|
397
|
+
.slice(offset, offset + 100)
|
|
398
|
+
.map((m) => m.id)
|
|
399
|
+
.join(','),
|
|
400
|
+
});
|
|
401
|
+
if (!active())
|
|
402
|
+
return;
|
|
403
|
+
found.push(...page.items);
|
|
404
|
+
}
|
|
405
|
+
const present = new Set(found.map((m) => m.id));
|
|
406
|
+
const missing = new Set(initial.filter((m) => !present.has(m.id)).map((m) => m.id));
|
|
407
|
+
let window;
|
|
408
|
+
if (missing.size) {
|
|
409
|
+
const oldest = Math.min(...initial.map((m) => m.metadata.seq));
|
|
410
|
+
const seen = new Set();
|
|
411
|
+
do {
|
|
412
|
+
window = await this.api.messages(id, window?.nextCursor ? { pageToken: window.nextCursor } : {});
|
|
413
|
+
if (!active())
|
|
414
|
+
return;
|
|
415
|
+
found.push(...window.items);
|
|
416
|
+
if (!window.nextCursor ||
|
|
417
|
+
!window.items.length ||
|
|
418
|
+
window.items[0].metadata.seq <= oldest)
|
|
419
|
+
break;
|
|
420
|
+
if (seen.has(window.nextCursor))
|
|
421
|
+
throw new Error('History pagination did not advance.');
|
|
422
|
+
seen.add(window.nextCursor);
|
|
423
|
+
} while (window.nextCursor);
|
|
424
|
+
}
|
|
425
|
+
if (!active())
|
|
426
|
+
return;
|
|
427
|
+
const changed = found.find((m) => m.role === 'user' &&
|
|
428
|
+
initial.some((old) => old.id === m.id &&
|
|
429
|
+
(old.metadata?.revision ?? 0) < (m.metadata?.revision ?? 0)));
|
|
430
|
+
if (changed?.metadata?.executionId &&
|
|
431
|
+
changed.metadata.seq !== undefined) {
|
|
432
|
+
this.replaceHistory({
|
|
433
|
+
kind: 'conversation.historyReplaced',
|
|
434
|
+
conversationId: id,
|
|
435
|
+
messageId: changed.id,
|
|
436
|
+
seq: changed.metadata.seq,
|
|
437
|
+
revision: changed.metadata.revision,
|
|
438
|
+
lastSeq: window?.lastSeq ?? this.history(id).state.lastSeq,
|
|
439
|
+
executionId: changed.metadata.executionId,
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
const owner = this.chat(id), response = owner.messages.at(-1);
|
|
443
|
+
if (owner.status === 'streaming' &&
|
|
444
|
+
response?.id &&
|
|
445
|
+
detail.execution?.messageId &&
|
|
446
|
+
response.id !== detail.execution.messageId) {
|
|
447
|
+
this.renewChat(id, owner.messages.filter((m) => m.id !== response.id));
|
|
448
|
+
}
|
|
449
|
+
const chat = this.chat(id);
|
|
450
|
+
const receiving = chat.status === 'submitted' || chat.status === 'streaming';
|
|
451
|
+
const activeId = receiving && chat.messages.at(-1)?.id === detail.execution?.messageId
|
|
452
|
+
? chat.messages.at(-1)?.id
|
|
453
|
+
: undefined;
|
|
454
|
+
chat.messages = mergeUIMessages(chat.messages.filter((m) => !missing.has(m.id) || m.id === activeId), found, activeId);
|
|
455
|
+
if (window)
|
|
456
|
+
this.historyMeta(id).page = {
|
|
457
|
+
...this.historyMeta(id).page,
|
|
458
|
+
hasMore: window.hasMore,
|
|
459
|
+
olderToken: window.nextCursor,
|
|
460
|
+
};
|
|
461
|
+
this.publish();
|
|
462
|
+
})();
|
|
463
|
+
this.reconciles.set(id, task);
|
|
464
|
+
try {
|
|
465
|
+
await task;
|
|
466
|
+
}
|
|
467
|
+
finally {
|
|
468
|
+
if (this.reconciles.get(id) === task)
|
|
469
|
+
this.reconciles.delete(id);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
167
472
|
async loadHistory(id, older = false, fresh = false) {
|
|
168
473
|
if (this.disposed)
|
|
169
474
|
return;
|
|
@@ -173,7 +478,7 @@ export class ChatController {
|
|
|
173
478
|
this.refreshAgain.add(id);
|
|
174
479
|
return pending;
|
|
175
480
|
}
|
|
176
|
-
const active = this.
|
|
481
|
+
const active = this.historyLifetime(id);
|
|
177
482
|
const initial = this.history(id);
|
|
178
483
|
if (older && !initial.state.olderToken)
|
|
179
484
|
return;
|
|
@@ -240,7 +545,7 @@ export class ChatController {
|
|
|
240
545
|
if (this.disposed)
|
|
241
546
|
return [];
|
|
242
547
|
const found = [];
|
|
243
|
-
const active = this.
|
|
548
|
+
const active = this.historyLifetime(id);
|
|
244
549
|
for (let offset = 0; offset < ids.length; offset += 100) {
|
|
245
550
|
const page = await this.api.messages(id, {
|
|
246
551
|
ids: ids.slice(offset, offset + 100).join(','),
|
|
@@ -274,7 +579,7 @@ export class ChatController {
|
|
|
274
579
|
if (Date.now() - current.last < interval)
|
|
275
580
|
return;
|
|
276
581
|
current.last = Date.now();
|
|
277
|
-
void this.
|
|
582
|
+
void this.refresh(id).catch(() => { });
|
|
278
583
|
}, 5000);
|
|
279
584
|
watch = { refs: 0, timer, last: Date.now() };
|
|
280
585
|
this.watches.set(id, watch);
|
|
@@ -290,7 +595,9 @@ export class ChatController {
|
|
|
290
595
|
}
|
|
291
596
|
reconnect() {
|
|
292
597
|
for (const id of this.watches.keys())
|
|
293
|
-
void this.
|
|
598
|
+
void this.refresh(id)
|
|
599
|
+
.then(() => this.resume(id))
|
|
600
|
+
.catch(() => { });
|
|
294
601
|
}
|
|
295
602
|
messageUpdated(id, messageId, revision) {
|
|
296
603
|
const key = `${id}:${messageId}`;
|
|
@@ -306,7 +613,7 @@ export class ChatController {
|
|
|
306
613
|
}
|
|
307
614
|
const queue = { pending: new Set([messageId]), task: Promise.resolve() };
|
|
308
615
|
this.revisionQueue.set(id, queue);
|
|
309
|
-
const active = this.
|
|
616
|
+
const active = this.historyLifetime(id);
|
|
310
617
|
queue.task = (async () => {
|
|
311
618
|
const attempted = new Set();
|
|
312
619
|
try {
|
|
@@ -340,6 +647,8 @@ export class ChatController {
|
|
|
340
647
|
const chat = this.chat(id);
|
|
341
648
|
if (chat.status === 'submitted' || chat.status === 'streaming')
|
|
342
649
|
throw new Error('This conversation is already receiving a response.');
|
|
650
|
+
if (this.resendRequests.has(id))
|
|
651
|
+
throw new Error('This conversation is busy.');
|
|
343
652
|
const admitted = deferred();
|
|
344
653
|
this.admissions.set(id, { clientId: input.clientId, gate: admitted });
|
|
345
654
|
this.recoveryErrors.delete(id);
|
|
@@ -427,7 +736,9 @@ export class ChatController {
|
|
|
427
736
|
if (chat.status === 'submitted' || chat.status === 'streaming')
|
|
428
737
|
return;
|
|
429
738
|
const active = this.lifetime();
|
|
739
|
+
const replacement = this.replacements.get(id);
|
|
430
740
|
const canResume = () => active() &&
|
|
741
|
+
this.replacements.get(id) === replacement &&
|
|
431
742
|
this.chats.get(id) === chat &&
|
|
432
743
|
chat.status !== 'submitted' &&
|
|
433
744
|
chat.status !== 'streaming';
|
|
@@ -496,6 +807,7 @@ export class ChatController {
|
|
|
496
807
|
throw new CancelledError({ silent: true });
|
|
497
808
|
const chat = this.chat(id);
|
|
498
809
|
if (this.approvalRequests.has(id) ||
|
|
810
|
+
this.resendRequests.has(id) ||
|
|
499
811
|
chat.status === 'submitted' ||
|
|
500
812
|
chat.status === 'streaming')
|
|
501
813
|
throw new Error('This conversation is busy.');
|
|
@@ -536,6 +848,9 @@ export class ChatController {
|
|
|
536
848
|
return;
|
|
537
849
|
const active = this.lifetime(), ordered = this.detailRequest(id);
|
|
538
850
|
const detail = await this.api.conversation(id);
|
|
851
|
+
if (!active() || !ordered())
|
|
852
|
+
return;
|
|
853
|
+
await this.reconcile(id, detail);
|
|
539
854
|
if (!active() || !ordered())
|
|
540
855
|
return;
|
|
541
856
|
await this.loadHistory(id, false, true);
|
|
@@ -691,6 +1006,12 @@ export class ChatController {
|
|
|
691
1006
|
void chat.stop();
|
|
692
1007
|
for (const admission of this.admissions.values())
|
|
693
1008
|
admission.gate.reject(new CancelledError({ silent: true }));
|
|
1009
|
+
for (const request of this.resendRequests.values())
|
|
1010
|
+
request.gate.reject(new CancelledError({ silent: true }));
|
|
1011
|
+
this.resendRequests.clear();
|
|
1012
|
+
this.historyEpochs.clear();
|
|
1013
|
+
this.replacements.clear();
|
|
1014
|
+
this.reconciles.clear();
|
|
694
1015
|
for (const watch of this.watches.values())
|
|
695
1016
|
clearInterval(watch.timer);
|
|
696
1017
|
this.watches.clear();
|