@undefineds.co/xpod 0.2.45 → 0.3.0
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/dist/agents/AgentExecutorFactory.js +12 -13
- package/dist/agents/AgentExecutorFactory.js.map +1 -1
- package/dist/agents/config/agent-meta-schema.d.ts +31 -3
- package/dist/agents/config/agent-meta-schema.js +37 -3
- package/dist/agents/config/agent-meta-schema.js.map +1 -1
- package/dist/agents/config/index.d.ts +5 -5
- package/dist/agents/config/index.js +7 -6
- package/dist/agents/config/index.js.map +1 -1
- package/dist/agents/config/parse-agent-instructions.d.ts +12 -0
- package/dist/agents/config/parse-agent-instructions.js +23 -0
- package/dist/agents/config/parse-agent-instructions.js.map +1 -0
- package/dist/agents/config/resolve.d.ts +7 -12
- package/dist/agents/config/resolve.js +272 -156
- package/dist/agents/config/resolve.js.map +1 -1
- package/dist/agents/config/types.d.ts +33 -36
- package/dist/agents/config/types.js +4 -4
- package/dist/agents/config/types.js.map +1 -1
- package/dist/agents/index.d.ts +2 -7
- package/dist/agents/index.js +4 -14
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/types.d.ts +2 -2
- package/dist/agents/types.js.map +1 -1
- package/dist/ai/service/CredentialReaderImpl.js +9 -14
- package/dist/ai/service/CredentialReaderImpl.js.map +1 -1
- package/dist/api/ApiServer.d.ts +7 -0
- package/dist/api/ApiServer.js +5 -1
- package/dist/api/ApiServer.js.map +1 -1
- package/dist/api/chatkit/default-agent.js +1 -1
- package/dist/api/chatkit/default-agent.js.map +1 -1
- package/dist/api/chatkit/index.d.ts +8 -0
- package/dist/api/chatkit/index.js +15 -1
- package/dist/api/chatkit/index.js.map +1 -1
- package/dist/api/chatkit/pod-store.d.ts +80 -17
- package/dist/api/chatkit/pod-store.js +816 -162
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/runtime/AcpAgentRuntime.d.ts +41 -0
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js +573 -0
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -0
- package/dist/api/chatkit/runtime/CodexRuntimeProjector.d.ts +27 -0
- package/dist/api/chatkit/runtime/CodexRuntimeProjector.js +157 -0
- package/dist/api/chatkit/runtime/CodexRuntimeProjector.js.map +1 -0
- package/dist/api/chatkit/schema.d.ts +53 -133
- package/dist/api/chatkit/schema.js +11 -175
- package/dist/api/chatkit/schema.js.map +1 -1
- package/dist/api/chatkit/service.d.ts +15 -9
- package/dist/api/chatkit/service.js +82 -234
- package/dist/api/chatkit/service.js.map +1 -1
- package/dist/api/chatkit/store.d.ts +35 -3
- package/dist/api/chatkit/store.js +157 -3
- package/dist/api/chatkit/store.js.map +1 -1
- package/dist/api/chatkit/types.d.ts +16 -2
- package/dist/api/chatkit/types.js +24 -5
- package/dist/api/chatkit/types.js.map +1 -1
- package/dist/api/container/common.js +59 -2
- package/dist/api/container/common.js.map +1 -1
- package/dist/api/container/index.js +15 -0
- package/dist/api/container/index.js.map +1 -1
- package/dist/api/container/routes.js +11 -0
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +26 -0
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/InngestHandler.d.ts +11 -0
- package/dist/api/handlers/InngestHandler.js +19 -0
- package/dist/api/handlers/InngestHandler.js.map +1 -0
- package/dist/api/handlers/RunHandler.d.ts +7 -0
- package/dist/api/handlers/RunHandler.js +169 -0
- package/dist/api/handlers/RunHandler.js.map +1 -0
- package/dist/api/handlers/index.d.ts +1 -0
- package/dist/api/handlers/index.js +1 -0
- package/dist/api/handlers/index.js.map +1 -1
- package/dist/api/models/namespaces.d.ts +2 -2
- package/dist/api/models/namespaces.js +1 -4
- package/dist/api/models/namespaces.js.map +1 -1
- package/dist/api/runs/AgentRuntimeTypes.d.ts +83 -0
- package/dist/api/runs/AgentRuntimeTypes.js +3 -0
- package/dist/api/runs/AgentRuntimeTypes.js.map +1 -0
- package/dist/api/runs/EmbeddedInngestService.d.ts +47 -0
- package/dist/api/runs/EmbeddedInngestService.js +203 -0
- package/dist/api/runs/EmbeddedInngestService.js.map +1 -0
- package/dist/api/runs/InngestRunExecutionBackend.d.ts +416 -0
- package/dist/api/runs/InngestRunExecutionBackend.js +225 -0
- package/dist/api/runs/InngestRunExecutionBackend.js.map +1 -0
- package/dist/api/runs/ManagedRunWorker.d.ts +52 -0
- package/dist/api/runs/ManagedRunWorker.js +452 -0
- package/dist/api/runs/ManagedRunWorker.js.map +1 -0
- package/dist/api/runs/PiAgentRuntimeDriver.d.ts +66 -0
- package/dist/api/runs/PiAgentRuntimeDriver.js +614 -0
- package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -0
- package/dist/api/runs/PiAgentRuntimeWorker.d.ts +1 -0
- package/dist/api/runs/PiAgentRuntimeWorker.js +33 -0
- package/dist/api/runs/PiAgentRuntimeWorker.js.map +1 -0
- package/dist/api/runs/RunAuthContextRegistry.d.ts +19 -0
- package/dist/api/runs/RunAuthContextRegistry.js +59 -0
- package/dist/api/runs/RunAuthContextRegistry.js.map +1 -0
- package/dist/api/runs/RunExecutionBackend.d.ts +57 -0
- package/dist/api/runs/RunExecutionBackend.js +3 -0
- package/dist/api/runs/RunExecutionBackend.js.map +1 -0
- package/dist/api/runs/RunStateCenter.d.ts +82 -0
- package/dist/api/runs/RunStateCenter.js +665 -0
- package/dist/api/runs/RunStateCenter.js.map +1 -0
- package/dist/api/runs/schema.d.ts +55 -0
- package/dist/api/runs/schema.js +14 -0
- package/dist/api/runs/schema.js.map +1 -0
- package/dist/api/runs/store.d.ts +105 -0
- package/dist/api/runs/store.js +116 -0
- package/dist/api/runs/store.js.map +1 -0
- package/dist/api/runtime.d.ts +2 -0
- package/dist/api/runtime.js +40 -1
- package/dist/api/runtime.js.map +1 -1
- package/dist/api/service/VectorStoreService.d.ts +1 -0
- package/dist/api/service/VectorStoreService.js +27 -34
- package/dist/api/service/VectorStoreService.js.map +1 -1
- package/dist/api/service/provider-registry.d.ts +1 -1
- package/dist/api/service/provider-registry.js +1 -1
- package/dist/api/service/provider-registry.js.map +1 -1
- package/dist/api/tasks/InngestTaskScheduler.d.ts +751 -0
- package/dist/api/tasks/InngestTaskScheduler.js +209 -0
- package/dist/api/tasks/InngestTaskScheduler.js.map +1 -0
- package/dist/api/tasks/TaskAuthBinding.d.ts +68 -0
- package/dist/api/tasks/TaskAuthBinding.js +162 -0
- package/dist/api/tasks/TaskAuthBinding.js.map +1 -0
- package/dist/api/tasks/TaskMaterializer.d.ts +55 -0
- package/dist/api/tasks/TaskMaterializer.js +452 -0
- package/dist/api/tasks/TaskMaterializer.js.map +1 -0
- package/dist/api/tasks/TaskService.d.ts +57 -0
- package/dist/api/tasks/TaskService.js +235 -0
- package/dist/api/tasks/TaskService.js.map +1 -0
- package/dist/api/tasks/index.d.ts +6 -0
- package/dist/api/tasks/index.js +25 -0
- package/dist/api/tasks/index.js.map +1 -0
- package/dist/api/tasks/schema.d.ts +23 -0
- package/dist/api/tasks/schema.js +8 -0
- package/dist/api/tasks/schema.js.map +1 -0
- package/dist/api/tasks/store.d.ts +40 -0
- package/dist/api/tasks/store.js +34 -0
- package/dist/api/tasks/store.js.map +1 -0
- package/dist/api/workspace/types.d.ts +3 -0
- package/dist/api/workspace/types.js +23 -0
- package/dist/api/workspace/types.js.map +1 -0
- package/dist/cli/commands/config.d.ts +8 -7
- package/dist/cli/commands/config.js +72 -48
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/login.d.ts +10 -8
- package/dist/cli/commands/login.js +84 -84
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/index.js +3 -124
- package/dist/cli/index.js.map +1 -1
- package/dist/http/search/SearchHttpHandler.js +13 -18
- package/dist/http/search/SearchHttpHandler.js.map +1 -1
- package/dist/storage/vector/VectorIndexingListener.js +13 -18
- package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
- package/dist/vocab/index.d.ts +2 -6
- package/dist/vocab/index.js +2 -6
- package/dist/vocab/index.js.map +1 -1
- package/dist/vocab/udfs.d.ts +12 -0
- package/dist/vocab/udfs.js +12 -0
- package/dist/vocab/udfs.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/README.md +52 -24
- package/node_modules/@undefineds.co/drizzle-solid/README.zh-CN.md +30 -24
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/discovery/types.d.ts +6 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/discovery/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js +43 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.js +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.d.ts +5 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.js +44 -13
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.js +21 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/expressions.d.ts +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/expressions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts +76 -41
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js +443 -114
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.d.ts +28 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.js +142 -31
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.js +84 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js +29 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts +2 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +19 -51
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-conditions.d.ts +2 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-conditions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js +56 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.d.ts +14 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.js +55 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.js +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.js +33 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/defs.d.ts +11 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/defs.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts +13 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js +24 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.d.ts +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.js +28 -14
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.d.ts +9 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.js +56 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.d.ts +9 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.js +2 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts +6 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js +43 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.js +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts +5 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.js +44 -13
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.js +21 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts +76 -41
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js +443 -114
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.d.ts +28 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.js +142 -31
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.js +84 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js +29 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts +2 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +19 -51
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts +2 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js +56 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts +14 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.js +55 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.js +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.js +33 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts +11 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts +13 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js +24 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.js +28 -14
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts +9 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.js +56 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts +9 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.js +2 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts +16 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts +16 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/utils/find-by-iri.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/utils/find-by-iri.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/package.json +1 -1
- package/package.json +5 -3
- package/dist/agents/AgentManager.d.ts +0 -116
- package/dist/agents/AgentManager.js +0 -290
- package/dist/agents/AgentManager.js.map +0 -1
- package/dist/agents/IndexAgent.d.ts +0 -70
- package/dist/agents/IndexAgent.js +0 -417
- package/dist/agents/IndexAgent.js.map +0 -1
- package/dist/agents/config/parse-agent-md.d.ts +0 -33
- package/dist/agents/config/parse-agent-md.js +0 -75
- package/dist/agents/config/parse-agent-md.js.map +0 -1
- package/dist/agents/schema/agent-config.d.ts +0 -2
- package/dist/agents/schema/agent-config.js +0 -32
- package/dist/agents/schema/agent-config.js.map +0 -1
- package/dist/agents/schema/create-agent-schema.d.ts +0 -25
- package/dist/agents/schema/create-agent-schema.js +0 -35
- package/dist/agents/schema/create-agent-schema.js.map +0 -1
- package/dist/api/chatkit/runtime/PtyThreadRuntime.d.ts +0 -127
- package/dist/api/chatkit/runtime/PtyThreadRuntime.js +0 -791
- package/dist/api/chatkit/runtime/PtyThreadRuntime.js.map +0 -1
- package/dist/cli/lib/agent-session.d.ts +0 -37
- package/dist/cli/lib/agent-session.js +0 -211
- package/dist/cli/lib/agent-session.js.map +0 -1
- package/dist/cli/lib/ensure-ai-credentials.d.ts +0 -13
- package/dist/cli/lib/ensure-ai-credentials.js +0 -40
- package/dist/cli/lib/ensure-ai-credentials.js.map +0 -1
- package/dist/cli/lib/model-manager.d.ts +0 -37
- package/dist/cli/lib/model-manager.js +0 -251
- package/dist/cli/lib/model-manager.js.map +0 -1
- package/dist/cli/lib/oauth-credential-manager.d.ts +0 -37
- package/dist/cli/lib/oauth-credential-manager.js +0 -129
- package/dist/cli/lib/oauth-credential-manager.js.map +0 -1
- package/dist/cli/lib/oauth-providers/codebuddy.d.ts +0 -25
- package/dist/cli/lib/oauth-providers/codebuddy.js +0 -69
- package/dist/cli/lib/oauth-providers/codebuddy.js.map +0 -1
- package/dist/cli/lib/oauth-providers/index.d.ts +0 -12
- package/dist/cli/lib/oauth-providers/index.js +0 -23
- package/dist/cli/lib/oauth-providers/index.js.map +0 -1
- package/dist/cli/lib/pi-optional.d.ts +0 -84
- package/dist/cli/lib/pi-optional.js +0 -35
- package/dist/cli/lib/pi-optional.js.map +0 -1
- package/dist/cli/lib/pod-ai-config.d.ts +0 -26
- package/dist/cli/lib/pod-ai-config.js +0 -99
- package/dist/cli/lib/pod-ai-config.js.map +0 -1
- package/dist/cli/lib/pod-thread-store.d.ts +0 -57
- package/dist/cli/lib/pod-thread-store.js +0 -312
- package/dist/cli/lib/pod-thread-store.js.map +0 -1
- package/dist/cli/lib/secretary-prompt.d.ts +0 -6
- package/dist/cli/lib/secretary-prompt.js +0 -85
- package/dist/cli/lib/secretary-prompt.js.map +0 -1
- package/dist/task/DrizzleTaskQueue.d.ts +0 -56
- package/dist/task/DrizzleTaskQueue.js +0 -171
- package/dist/task/DrizzleTaskQueue.js.map +0 -1
- package/dist/task/TaskExecutor.d.ts +0 -82
- package/dist/task/TaskExecutor.js +0 -198
- package/dist/task/TaskExecutor.js.map +0 -1
- package/dist/task/index.d.ts +0 -10
- package/dist/task/index.js +0 -20
- package/dist/task/index.js.map +0 -1
- package/dist/task/schema.d.ts +0 -53
- package/dist/task/schema.js +0 -71
- package/dist/task/schema.js.map +0 -1
- package/dist/task/types.d.ts +0 -186
- package/dist/task/types.js +0 -12
- package/dist/task/types.js.map +0 -1
|
@@ -9,7 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.ChatKitService = void 0;
|
|
10
10
|
const global_logger_factory_1 = require("global-logger-factory");
|
|
11
11
|
const types_1 = require("./types");
|
|
12
|
-
const
|
|
12
|
+
const RunStateCenter_1 = require("../runs/RunStateCenter");
|
|
13
|
+
const types_2 = require("../workspace/types");
|
|
13
14
|
/**
|
|
14
15
|
* ChatKit Service
|
|
15
16
|
*/
|
|
@@ -19,8 +20,12 @@ class ChatKitService {
|
|
|
19
20
|
this.store = options.store;
|
|
20
21
|
this.aiProvider = options.aiProvider;
|
|
21
22
|
this.systemPrompt = options.systemPrompt ?? 'You are a helpful assistant.';
|
|
22
|
-
this.
|
|
23
|
-
this.
|
|
23
|
+
this.allowDirectAiFallback = options.allowDirectAiFallback ?? false;
|
|
24
|
+
this.runStateCenter = new RunStateCenter_1.RunStateCenter({
|
|
25
|
+
store: this.store,
|
|
26
|
+
enableAgentRuntime: options.enableAgentRuntime ?? true,
|
|
27
|
+
executionBackend: options.runExecutionBackend,
|
|
28
|
+
});
|
|
24
29
|
}
|
|
25
30
|
/**
|
|
26
31
|
* Process a ChatKit request
|
|
@@ -131,6 +136,7 @@ class ChatKitService {
|
|
|
131
136
|
const thread = {
|
|
132
137
|
id: threadId,
|
|
133
138
|
status: { type: 'active' },
|
|
139
|
+
workspace: this.resolveThreadWorkspace(params.workspace, metadata),
|
|
134
140
|
created_at: now,
|
|
135
141
|
updated_at: now,
|
|
136
142
|
metadata: this.normalizeThreadMetadata(metadata, params.chat_id),
|
|
@@ -154,7 +160,7 @@ class ChatKitService {
|
|
|
154
160
|
type: 'thread.item.done',
|
|
155
161
|
item: userMessage,
|
|
156
162
|
};
|
|
157
|
-
// Generate response (AI or
|
|
163
|
+
// Generate response (AI provider or Agent Runtime)
|
|
158
164
|
yield* this.respond(thread, userMessage, context, params.input.inference_options);
|
|
159
165
|
}
|
|
160
166
|
}
|
|
@@ -175,7 +181,7 @@ class ChatKitService {
|
|
|
175
181
|
type: 'thread.item.done',
|
|
176
182
|
item: userMessage,
|
|
177
183
|
};
|
|
178
|
-
// Generate response (AI or
|
|
184
|
+
// Generate response (AI provider or Agent Runtime)
|
|
179
185
|
yield* this.respond(thread, userMessage, context, params.input.inference_options, threadRef);
|
|
180
186
|
}
|
|
181
187
|
/**
|
|
@@ -183,97 +189,13 @@ class ChatKitService {
|
|
|
183
189
|
*/
|
|
184
190
|
async *handleThreadsAddClientToolOutput(params, context) {
|
|
185
191
|
const threadRef = this.threadRefFromParams(params);
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
status: 'completed',
|
|
194
|
-
};
|
|
195
|
-
await this.store.saveItem(threadRef, updatedItem, context);
|
|
196
|
-
yield {
|
|
197
|
-
type: 'thread.item.done',
|
|
198
|
-
item: updatedItem,
|
|
199
|
-
};
|
|
200
|
-
// ACP tool-call continuation: respond to the pending ACP request and stream follow-up output.
|
|
201
|
-
try {
|
|
202
|
-
const thread = await this.store.loadThread(threadRef, context);
|
|
203
|
-
const ptyConfig = this.getPtyConfig(thread);
|
|
204
|
-
let assistantItem;
|
|
205
|
-
let assistantText = '';
|
|
206
|
-
const idleMs = ptyConfig?.idleMs ?? 500;
|
|
207
|
-
for await (const ev of this.ptyRuntime.respondToRequest(threadId, item.call_id, params.output, { idleMs, authWaitMs: ptyConfig?.authWaitMs })) {
|
|
208
|
-
if (ev.type === 'text') {
|
|
209
|
-
if (!assistantItem) {
|
|
210
|
-
const assistantId = this.store.generateItemId('assistant_message', thread, context);
|
|
211
|
-
assistantItem = {
|
|
212
|
-
id: assistantId,
|
|
213
|
-
thread_id: threadId,
|
|
214
|
-
type: 'assistant_message',
|
|
215
|
-
content: [{ type: 'output_text', text: '' }],
|
|
216
|
-
status: 'in_progress',
|
|
217
|
-
created_at: (0, types_1.nowTimestamp)(),
|
|
218
|
-
};
|
|
219
|
-
await this.store.addThreadItem(threadRef, assistantItem, context);
|
|
220
|
-
yield { type: 'thread.item.added', item: assistantItem };
|
|
221
|
-
}
|
|
222
|
-
assistantText += ev.text;
|
|
223
|
-
yield {
|
|
224
|
-
type: 'thread.item.updated',
|
|
225
|
-
item_id: assistantItem.id,
|
|
226
|
-
update: {
|
|
227
|
-
type: 'assistant_message.content_part.text_delta',
|
|
228
|
-
part_index: 0,
|
|
229
|
-
delta: ev.text,
|
|
230
|
-
},
|
|
231
|
-
};
|
|
232
|
-
continue;
|
|
233
|
-
}
|
|
234
|
-
if (ev.type === 'auth_required') {
|
|
235
|
-
yield {
|
|
236
|
-
type: 'client_effect',
|
|
237
|
-
effect: {
|
|
238
|
-
effect_type: 'runtime.auth_required',
|
|
239
|
-
data: {
|
|
240
|
-
method: ev.method,
|
|
241
|
-
url: ev.url,
|
|
242
|
-
message: ev.message,
|
|
243
|
-
options: ev.options,
|
|
244
|
-
},
|
|
245
|
-
},
|
|
246
|
-
};
|
|
247
|
-
continue;
|
|
248
|
-
}
|
|
249
|
-
if (ev.type === 'tool_call') {
|
|
250
|
-
const toolItem = {
|
|
251
|
-
id: this.store.generateItemId('client_tool_call', thread, context),
|
|
252
|
-
thread_id: threadId,
|
|
253
|
-
type: 'client_tool_call',
|
|
254
|
-
name: ev.name,
|
|
255
|
-
arguments: ev.arguments,
|
|
256
|
-
call_id: ev.requestId,
|
|
257
|
-
status: 'pending',
|
|
258
|
-
created_at: (0, types_1.nowTimestamp)(),
|
|
259
|
-
};
|
|
260
|
-
await this.store.addThreadItem(threadRef, toolItem, context);
|
|
261
|
-
yield { type: 'thread.item.added', item: toolItem };
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
if (assistantItem) {
|
|
265
|
-
const completedItem = {
|
|
266
|
-
...assistantItem,
|
|
267
|
-
content: [{ type: 'output_text', text: assistantText }],
|
|
268
|
-
status: 'completed',
|
|
269
|
-
};
|
|
270
|
-
await this.store.saveItem(threadRef, completedItem, context);
|
|
271
|
-
yield { type: 'thread.item.done', item: completedItem };
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
catch {
|
|
275
|
-
// Ignore: non-runtime tool calls.
|
|
276
|
-
}
|
|
192
|
+
for await (const event of this.runStateCenter.completeClientToolOutput({
|
|
193
|
+
threadRef,
|
|
194
|
+
itemId: params.item_id,
|
|
195
|
+
output: params.output,
|
|
196
|
+
context,
|
|
197
|
+
})) {
|
|
198
|
+
yield this.projectRunStateEvent(event);
|
|
277
199
|
}
|
|
278
200
|
}
|
|
279
201
|
/**
|
|
@@ -368,6 +290,9 @@ class ChatKitService {
|
|
|
368
290
|
if (params.title !== undefined) {
|
|
369
291
|
thread.title = params.title;
|
|
370
292
|
}
|
|
293
|
+
if (params.workspace !== undefined) {
|
|
294
|
+
thread.workspace = params.workspace || undefined;
|
|
295
|
+
}
|
|
371
296
|
thread.updated_at = (0, types_1.nowTimestamp)();
|
|
372
297
|
await this.store.saveThread(thread, context);
|
|
373
298
|
return thread;
|
|
@@ -387,9 +312,27 @@ class ChatKitService {
|
|
|
387
312
|
* This is the main response generation logic
|
|
388
313
|
*/
|
|
389
314
|
async *respond(thread, userMessage, context, inferenceOptions, threadRef = this.threadRefFromThread(thread)) {
|
|
390
|
-
const
|
|
391
|
-
|
|
392
|
-
|
|
315
|
+
const runtimeConfig = this.runStateCenter.getAgentRuntimeConfig(thread, context)
|
|
316
|
+
?? this.runStateCenter.getDefaultAgentRuntimeConfig(context);
|
|
317
|
+
if (runtimeConfig) {
|
|
318
|
+
for await (const event of this.runStateCenter.startAgentRun({
|
|
319
|
+
thread,
|
|
320
|
+
userMessage,
|
|
321
|
+
context,
|
|
322
|
+
runtimeConfig,
|
|
323
|
+
})) {
|
|
324
|
+
yield this.projectRunStateEvent(event);
|
|
325
|
+
}
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
if (!this.allowDirectAiFallback || !this.aiProvider) {
|
|
329
|
+
yield {
|
|
330
|
+
type: 'error',
|
|
331
|
+
error: {
|
|
332
|
+
code: 'runtime_required',
|
|
333
|
+
message: 'Chat requires Agent Runtime; direct AI fallback is disabled',
|
|
334
|
+
},
|
|
335
|
+
};
|
|
393
336
|
return;
|
|
394
337
|
}
|
|
395
338
|
// Build conversation history
|
|
@@ -477,141 +420,6 @@ class ChatKitService {
|
|
|
477
420
|
}
|
|
478
421
|
}
|
|
479
422
|
}
|
|
480
|
-
getPtyConfig(thread) {
|
|
481
|
-
if (!this.enablePtyRuntime) {
|
|
482
|
-
return null;
|
|
483
|
-
}
|
|
484
|
-
const runtime = thread.metadata?.runtime;
|
|
485
|
-
if (!runtime) {
|
|
486
|
-
return null;
|
|
487
|
-
}
|
|
488
|
-
if (!runtime.workspace || !runtime.runner) {
|
|
489
|
-
throw new Error('Invalid thread.metadata.runtime: workspace/runner are required');
|
|
490
|
-
}
|
|
491
|
-
const runnerType = runtime.runner.type;
|
|
492
|
-
if (!runnerType) {
|
|
493
|
-
throw new Error('Invalid thread.metadata.runtime.runner.type');
|
|
494
|
-
}
|
|
495
|
-
// Enforce ACP-only: raw/stdio mode is removed.
|
|
496
|
-
const protocol = 'acp';
|
|
497
|
-
// Keep runner args server-owned by default, unless explicitly allowed.
|
|
498
|
-
// This avoids exposing per-runner argv details to end users.
|
|
499
|
-
const allowCustomArgv = runtime.runner.allowCustomArgv === true;
|
|
500
|
-
const argv = allowCustomArgv ? runtime.runner.argv : undefined;
|
|
501
|
-
return {
|
|
502
|
-
...runtime,
|
|
503
|
-
runner: {
|
|
504
|
-
...runtime.runner,
|
|
505
|
-
argv,
|
|
506
|
-
protocol,
|
|
507
|
-
},
|
|
508
|
-
agentConfig: runtime.agentConfig,
|
|
509
|
-
};
|
|
510
|
-
}
|
|
511
|
-
async *respondWithPty(thread, userMessage, context, ptyConfig) {
|
|
512
|
-
const userText = (0, types_1.extractUserMessageText)(userMessage.content);
|
|
513
|
-
if (!userText.trim()) {
|
|
514
|
-
return;
|
|
515
|
-
}
|
|
516
|
-
const threadRef = this.threadRefFromThread(thread);
|
|
517
|
-
await this.ptyRuntime.ensureStarted(thread.id, ptyConfig);
|
|
518
|
-
const assistantId = this.store.generateItemId('assistant_message', thread, context);
|
|
519
|
-
const assistantItem = {
|
|
520
|
-
id: assistantId,
|
|
521
|
-
thread_id: thread.id,
|
|
522
|
-
type: 'assistant_message',
|
|
523
|
-
content: [{ type: 'output_text', text: '' }],
|
|
524
|
-
status: 'in_progress',
|
|
525
|
-
created_at: (0, types_1.nowTimestamp)(),
|
|
526
|
-
};
|
|
527
|
-
await this.store.addThreadItem(threadRef, assistantItem, context);
|
|
528
|
-
yield { type: 'thread.item.added', item: assistantItem };
|
|
529
|
-
let fullText = '';
|
|
530
|
-
let sawRuntimeError;
|
|
531
|
-
const idleMs = ptyConfig.idleMs ?? 500;
|
|
532
|
-
for await (const ev of this.ptyRuntime.sendMessage(thread.id, userText, { idleMs, authWaitMs: ptyConfig.authWaitMs })) {
|
|
533
|
-
if (ev.type === 'text') {
|
|
534
|
-
fullText += ev.text;
|
|
535
|
-
yield {
|
|
536
|
-
type: 'thread.item.updated',
|
|
537
|
-
item_id: assistantId,
|
|
538
|
-
update: {
|
|
539
|
-
type: 'assistant_message.content_part.text_delta',
|
|
540
|
-
part_index: 0,
|
|
541
|
-
delta: ev.text,
|
|
542
|
-
},
|
|
543
|
-
};
|
|
544
|
-
continue;
|
|
545
|
-
}
|
|
546
|
-
if (ev.type === 'error') {
|
|
547
|
-
sawRuntimeError = ev.message;
|
|
548
|
-
yield {
|
|
549
|
-
type: 'error',
|
|
550
|
-
error: {
|
|
551
|
-
code: 'runtime_error',
|
|
552
|
-
message: ev.message,
|
|
553
|
-
},
|
|
554
|
-
};
|
|
555
|
-
break;
|
|
556
|
-
}
|
|
557
|
-
if (ev.type === 'auth_required') {
|
|
558
|
-
// Runtime-only. Do not persist sensitive auth details into thread history.
|
|
559
|
-
yield {
|
|
560
|
-
type: 'client_effect',
|
|
561
|
-
effect: {
|
|
562
|
-
effect_type: 'runtime.auth_required',
|
|
563
|
-
data: {
|
|
564
|
-
method: ev.method,
|
|
565
|
-
url: ev.url,
|
|
566
|
-
message: ev.message,
|
|
567
|
-
options: ev.options,
|
|
568
|
-
},
|
|
569
|
-
},
|
|
570
|
-
};
|
|
571
|
-
continue;
|
|
572
|
-
}
|
|
573
|
-
if (ev.type === 'tool_call') {
|
|
574
|
-
const toolItem = {
|
|
575
|
-
id: this.store.generateItemId('client_tool_call', thread, context),
|
|
576
|
-
thread_id: thread.id,
|
|
577
|
-
type: 'client_tool_call',
|
|
578
|
-
name: ev.name,
|
|
579
|
-
arguments: ev.arguments,
|
|
580
|
-
call_id: ev.requestId,
|
|
581
|
-
status: 'pending',
|
|
582
|
-
created_at: (0, types_1.nowTimestamp)(),
|
|
583
|
-
};
|
|
584
|
-
await this.store.addThreadItem(threadRef, toolItem, context);
|
|
585
|
-
yield { type: 'thread.item.added', item: toolItem };
|
|
586
|
-
// Pause: client must call threads.add_client_tool_output to continue.
|
|
587
|
-
const incomplete = {
|
|
588
|
-
...assistantItem,
|
|
589
|
-
content: [{ type: 'output_text', text: fullText }],
|
|
590
|
-
status: 'incomplete',
|
|
591
|
-
};
|
|
592
|
-
await this.store.saveItem(threadRef, incomplete, context);
|
|
593
|
-
yield { type: 'thread.item.done', item: incomplete };
|
|
594
|
-
return;
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
|
-
if (sawRuntimeError) {
|
|
598
|
-
const incomplete = {
|
|
599
|
-
...assistantItem,
|
|
600
|
-
content: [{ type: 'output_text', text: fullText }],
|
|
601
|
-
status: 'incomplete',
|
|
602
|
-
};
|
|
603
|
-
await this.store.saveItem(threadRef, incomplete, context);
|
|
604
|
-
yield { type: 'thread.item.done', item: incomplete };
|
|
605
|
-
return;
|
|
606
|
-
}
|
|
607
|
-
const completedItem = {
|
|
608
|
-
...assistantItem,
|
|
609
|
-
content: [{ type: 'output_text', text: fullText }],
|
|
610
|
-
status: 'completed',
|
|
611
|
-
};
|
|
612
|
-
await this.store.saveItem(threadRef, completedItem, context);
|
|
613
|
-
yield { type: 'thread.item.done', item: completedItem };
|
|
614
|
-
}
|
|
615
423
|
/**
|
|
616
424
|
* Build conversation history from thread items
|
|
617
425
|
*/
|
|
@@ -668,14 +476,54 @@ class ChatKitService {
|
|
|
668
476
|
}
|
|
669
477
|
return title || 'New Chat';
|
|
670
478
|
}
|
|
479
|
+
projectRunStateEvent(event) {
|
|
480
|
+
switch (event.type) {
|
|
481
|
+
case 'item_added':
|
|
482
|
+
return { type: 'thread.item.added', item: event.item };
|
|
483
|
+
case 'item_updated':
|
|
484
|
+
return {
|
|
485
|
+
type: 'thread.item.updated',
|
|
486
|
+
item_id: event.itemId,
|
|
487
|
+
update: {
|
|
488
|
+
type: 'assistant_message.content_part.text_delta',
|
|
489
|
+
part_index: 0,
|
|
490
|
+
delta: event.delta,
|
|
491
|
+
},
|
|
492
|
+
};
|
|
493
|
+
case 'item_done':
|
|
494
|
+
return { type: 'thread.item.done', item: event.item };
|
|
495
|
+
case 'client_effect':
|
|
496
|
+
return { type: 'client_effect', effect: event.effect };
|
|
497
|
+
case 'error':
|
|
498
|
+
return {
|
|
499
|
+
type: 'error',
|
|
500
|
+
error: {
|
|
501
|
+
code: event.code,
|
|
502
|
+
message: event.message,
|
|
503
|
+
},
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
}
|
|
671
507
|
normalizeThreadMetadata(metadata, chatId) {
|
|
672
508
|
const normalized = { ...(metadata ?? {}) };
|
|
673
509
|
normalized.chat_id = chatId
|
|
674
510
|
?? (typeof normalized.chat_id === 'string' && normalized.chat_id.length > 0
|
|
675
511
|
? normalized.chat_id
|
|
676
512
|
: types_1.DEFAULT_THREAD_CHAT_ID);
|
|
513
|
+
normalized.surface_id = typeof normalized.surface_id === 'string' && normalized.surface_id.length > 0
|
|
514
|
+
? normalized.surface_id
|
|
515
|
+
: normalized.chat_id;
|
|
677
516
|
return Object.keys(normalized).length > 0 ? normalized : undefined;
|
|
678
517
|
}
|
|
518
|
+
resolveThreadWorkspace(workspace, metadata) {
|
|
519
|
+
if ((0, types_2.isWorkspaceUri)(workspace)) {
|
|
520
|
+
return workspace;
|
|
521
|
+
}
|
|
522
|
+
const metadataWorkspace = metadata?.workspace;
|
|
523
|
+
return (0, types_2.isWorkspaceUri)(metadataWorkspace)
|
|
524
|
+
? metadataWorkspace
|
|
525
|
+
: undefined;
|
|
526
|
+
}
|
|
679
527
|
threadRefFromParams(params) {
|
|
680
528
|
return (0, types_1.toThreadRef)(params);
|
|
681
529
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/api/chatkit/service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ChatKit Service\n * \n * Core service for handling ChatKit protocol requests.\n * Based on https://github.com/openai/chatkit-python/blob/main/chatkit/server.py\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { ChatKitStore, StoreContext } from './store';\nimport type {\n ChatKitReq,\n StreamingReq,\n NonStreamingReq,\n ThreadCreateParams,\n ThreadAddUserMessageParams,\n ThreadAddClientToolOutputParams,\n ThreadRetryAfterItemParams,\n ThreadCustomActionParams,\n ThreadGetByIdParams,\n ItemsListParams,\n ItemFeedbackParams,\n ThreadUpdateParams,\n ThreadDeleteParams,\n ThreadMetadata,\n ThreadRef,\n ThreadItem,\n UserMessageItem,\n AssistantMessageItem,\n ThreadStreamEvent,\n ThreadCreatedEvent,\n ThreadItemAddedEvent,\n ThreadItemDoneEvent,\n ThreadItemUpdatedEvent,\n Page,\n Thread,\n UserMessageContent,\n ClientToolCallItem,\n} from './types';\nimport {\n DEFAULT_THREAD_CHAT_ID,\n getChatIdFromThreadMetadata,\n getThreadIdFromRef,\n isStreamingReq,\n generateId,\n nowTimestamp,\n toThreadRef,\n extractUserMessageText,\n} from './types';\nimport { PtyThreadRuntime, type PtyRuntimeConfig, type RunnerType } from './runtime/PtyThreadRuntime';\n\n/**\n * AI Provider interface for generating responses\n */\nexport interface AiProvider {\n /**\n * Stream a response for the given messages\n * Returns an async iterator of text chunks\n */\n streamResponse(\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>,\n options?: {\n model?: string;\n temperature?: number;\n maxTokens?: number;\n context?: unknown; // Allow passing context for auth\n },\n ): AsyncIterable<string>;\n}\n\n/**\n * ChatKit Service Options\n */\nexport interface ChatKitServiceOptions<TContext = StoreContext> {\n store: ChatKitStore<TContext>;\n aiProvider: AiProvider;\n systemPrompt?: string;\n /**\n * Enable xpod PTY runtime threads (local-only feature).\n * When enabled, thread.metadata.runtime controls the runner/worktree.\n */\n enablePtyRuntime?: boolean;\n}\n\n/**\n * Streaming result wrapper\n */\nexport interface StreamingResult {\n type: 'streaming';\n stream(): AsyncIterable<Uint8Array>;\n}\n\n/**\n * Non-streaming result wrapper\n */\nexport interface NonStreamingResult {\n type: 'non_streaming';\n json: string;\n}\n\nexport type ChatKitResult = StreamingResult | NonStreamingResult;\n\n/**\n * ChatKit Service\n */\nexport class ChatKitService<TContext = StoreContext> {\n private readonly logger = getLoggerFor(this);\n private readonly store: ChatKitStore<TContext>;\n private readonly aiProvider: AiProvider;\n private readonly systemPrompt: string;\n private readonly enablePtyRuntime: boolean;\n private readonly ptyRuntime: PtyThreadRuntime;\n\n public constructor(options: ChatKitServiceOptions<TContext>) {\n this.store = options.store;\n this.aiProvider = options.aiProvider;\n this.systemPrompt = options.systemPrompt ?? 'You are a helpful assistant.';\n this.enablePtyRuntime = options.enablePtyRuntime ?? false;\n this.ptyRuntime = new PtyThreadRuntime();\n }\n\n /**\n * Process a ChatKit request\n */\n public async process(requestBody: string | Buffer, context: TContext): Promise<ChatKitResult> {\n const requestStr = typeof requestBody === 'string' ? requestBody : requestBody.toString('utf-8');\n \n let request: ChatKitReq;\n try {\n request = JSON.parse(requestStr) as ChatKitReq;\n } catch (e) {\n throw new Error('Invalid JSON request body');\n }\n\n this.logger.debug(`Processing ChatKit request: ${request.type}`);\n\n if (isStreamingReq(request)) {\n return {\n type: 'streaming',\n stream: () => this.processStreamingAsBytes(request, context),\n };\n } else {\n const result = await this.processNonStreaming(request, context);\n return {\n type: 'non_streaming',\n json: JSON.stringify(result),\n };\n }\n }\n\n /**\n * Convert streaming events to SSE bytes\n */\n private async *processStreamingAsBytes(request: StreamingReq, context: TContext): AsyncIterable<Uint8Array> {\n const encoder = new TextEncoder();\n try {\n for await (const event of this.processStreaming(request, context)) {\n this.logger.info(`ChatKit streaming event (${request.type}): ${event.type}`);\n const data = JSON.stringify(event);\n yield encoder.encode(`data: ${data}\\n\\n`);\n }\n } catch (error: any) {\n this.logger.error(`ChatKit streaming request failed (${request.type}): ${error?.stack || error}`);\n const errorEvent: ThreadStreamEvent = {\n type: 'error',\n error: {\n code: 'internal_error',\n message: error.message || 'An error occurred',\n },\n };\n yield encoder.encode(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n }\n }\n\n /**\n * Process streaming requests\n */\n private async *processStreaming(request: StreamingReq, context: TContext): AsyncIterable<ThreadStreamEvent> {\n switch (request.type) {\n case 'threads.create':\n yield* this.handleThreadsCreate(request.params, context, request.metadata);\n break;\n case 'threads.add_user_message':\n yield* this.handleThreadsAddUserMessage(request.params, context);\n break;\n case 'threads.add_client_tool_output':\n yield* this.handleThreadsAddClientToolOutput(request.params, context);\n break;\n case 'threads.retry_after_item':\n yield* this.handleThreadsRetryAfterItem(request.params, context);\n break;\n case 'threads.custom_action':\n yield* this.handleThreadsCustomAction(request.params, context);\n break;\n }\n }\n\n /**\n * Process non-streaming requests\n */\n private async processNonStreaming(request: NonStreamingReq, context: TContext): Promise<unknown> {\n switch (request.type) {\n case 'threads.get_by_id':\n return this.handleThreadsGetById(request.params, context);\n case 'threads.list':\n return this.handleThreadsList(request.params, context);\n case 'items.list':\n return this.handleItemsList(request.params, context);\n case 'items.feedback':\n return this.handleItemsFeedback(request.params, context);\n case 'attachments.create':\n return this.handleAttachmentsCreate(request.params, context);\n case 'attachments.delete':\n return this.handleAttachmentsDelete(request.params, context);\n case 'threads.update':\n return this.handleThreadsUpdate(request.params, context);\n case 'threads.delete':\n return this.handleThreadsDelete(request.params, context);\n }\n }\n\n // =========================================================================\n // Streaming Request Handlers\n // =========================================================================\n\n /**\n * Handle threads.create - Create a new thread and optionally respond to initial message\n */\n private async *handleThreadsCreate(\n params: ThreadCreateParams,\n context: TContext,\n metadata?: Record<string, unknown>,\n ): AsyncIterable<ThreadStreamEvent> {\n // Create new thread\n const threadId = this.store.generateThreadId(context);\n const now = nowTimestamp();\n \n const thread: ThreadMetadata = {\n id: threadId,\n status: { type: 'active' },\n created_at: now,\n updated_at: now,\n metadata: this.normalizeThreadMetadata(metadata, params.chat_id),\n };\n\n await this.store.saveThread(thread, context);\n\n // Emit thread created event\n yield {\n type: 'thread.created',\n thread,\n } as ThreadCreatedEvent;\n\n // If input provided, add user message and respond\n if (params.input) {\n const threadRef = this.threadRefFromThread(thread);\n const userMessage = await this.createUserMessage(threadRef, params.input.content, context, thread);\n await this.store.addThreadItem(threadRef, userMessage, context);\n\n yield {\n type: 'thread.item.added',\n item: userMessage,\n } as ThreadItemAddedEvent;\n\n yield {\n type: 'thread.item.done',\n item: userMessage,\n } as ThreadItemDoneEvent;\n\n // Generate response (AI or PTY)\n yield* this.respond(thread, userMessage, context, params.input.inference_options);\n }\n }\n\n /**\n * Handle threads.add_user_message - Add a user message and respond\n */\n private async *handleThreadsAddUserMessage(\n params: ThreadAddUserMessageParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n\n // Create and save user message\n const userMessage = await this.createUserMessage(threadRef, params.input.content, context);\n await this.store.addThreadItem(threadRef, userMessage, context);\n\n yield {\n type: 'thread.item.added',\n item: userMessage,\n } as ThreadItemAddedEvent;\n\n yield {\n type: 'thread.item.done',\n item: userMessage,\n } as ThreadItemDoneEvent;\n\n // Generate response (AI or PTY)\n yield* this.respond(thread, userMessage, context, params.input.inference_options, threadRef);\n }\n\n /**\n * Handle threads.add_client_tool_output - Handle tool output (not fully implemented)\n */\n private async *handleThreadsAddClientToolOutput(\n params: ThreadAddClientToolOutputParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n const threadRef = this.threadRefFromParams(params);\n const threadId = getThreadIdFromRef(threadRef);\n // Update the tool call item with output\n const item = await this.store.loadItem(threadRef, params.item_id, context);\n \n if (item.type === 'client_tool_call') {\n const updatedItem = {\n ...item,\n output: params.output,\n status: 'completed' as const,\n };\n await this.store.saveItem(threadRef, updatedItem, context);\n\n yield {\n type: 'thread.item.done',\n item: updatedItem,\n } as ThreadItemDoneEvent;\n\n // ACP tool-call continuation: respond to the pending ACP request and stream follow-up output.\n try {\n const thread = await this.store.loadThread(threadRef, context);\n const ptyConfig = this.getPtyConfig(thread);\n let assistantItem: AssistantMessageItem | undefined;\n let assistantText = '';\n\n const idleMs = ptyConfig?.idleMs ?? 500;\n for await (\n const ev of this.ptyRuntime.respondToRequest(\n threadId,\n item.call_id,\n params.output,\n { idleMs, authWaitMs: ptyConfig?.authWaitMs },\n )\n ) {\n if (ev.type === 'text') {\n if (!assistantItem) {\n const assistantId = this.store.generateItemId('assistant_message', thread, context);\n assistantItem = {\n id: assistantId,\n thread_id: threadId,\n type: 'assistant_message',\n content: [{ type: 'output_text', text: '' }],\n status: 'in_progress',\n created_at: nowTimestamp(),\n };\n await this.store.addThreadItem(threadRef, assistantItem, context);\n yield { type: 'thread.item.added', item: assistantItem } as ThreadItemAddedEvent;\n }\n\n assistantText += ev.text;\n yield {\n type: 'thread.item.updated',\n item_id: assistantItem.id,\n update: {\n type: 'assistant_message.content_part.text_delta',\n part_index: 0,\n delta: ev.text,\n },\n } as ThreadItemUpdatedEvent;\n continue;\n }\n\n if (ev.type === 'auth_required') {\n yield {\n type: 'client_effect',\n effect: {\n effect_type: 'runtime.auth_required',\n data: {\n method: ev.method,\n url: ev.url,\n message: ev.message,\n options: ev.options,\n },\n },\n };\n continue;\n }\n\n if (ev.type === 'tool_call') {\n const toolItem: ClientToolCallItem = {\n id: this.store.generateItemId('client_tool_call', thread, context),\n thread_id: threadId,\n type: 'client_tool_call',\n name: ev.name,\n arguments: ev.arguments,\n call_id: ev.requestId,\n status: 'pending',\n created_at: nowTimestamp(),\n };\n await this.store.addThreadItem(threadRef, toolItem, context);\n yield { type: 'thread.item.added', item: toolItem } as ThreadItemAddedEvent;\n }\n }\n\n if (assistantItem) {\n const completedItem: AssistantMessageItem = {\n ...assistantItem,\n content: [{ type: 'output_text', text: assistantText }],\n status: 'completed',\n };\n await this.store.saveItem(threadRef, completedItem, context);\n yield { type: 'thread.item.done', item: completedItem } as ThreadItemDoneEvent;\n }\n } catch {\n // Ignore: non-runtime tool calls.\n }\n }\n }\n\n /**\n * Handle threads.retry_after_item - Retry generation after a specific item\n */\n private async *handleThreadsRetryAfterItem(\n params: ThreadRetryAfterItemParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n \n // Load all items and find the last user message before the retry point\n const items = await this.store.loadThreadItems(threadRef, undefined, 1000, 'asc', context);\n \n let lastUserMessage: UserMessageItem | undefined;\n for (const item of items.data) {\n if (item.id === params.item_id) {\n break;\n }\n if (item.type === 'user_message') {\n lastUserMessage = item;\n }\n }\n\n if (lastUserMessage) {\n yield* this.respond(thread, lastUserMessage, context, undefined, threadRef);\n }\n }\n\n /**\n * Handle threads.custom_action - Handle custom widget actions (not fully implemented)\n */\n private async *handleThreadsCustomAction(\n params: ThreadCustomActionParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n this.logger.info(`Custom action: ${params.action} on item ${params.item_id}`);\n // Custom actions can be implemented based on specific needs\n }\n\n // =========================================================================\n // Non-Streaming Request Handlers\n // =========================================================================\n\n /**\n * Handle threads.get_by_id\n */\n private async handleThreadsGetById(\n params: ThreadGetByIdParams,\n context: TContext,\n ): Promise<Thread> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n const items = await this.store.loadThreadItems(threadRef, undefined, 50, 'asc', context);\n \n return {\n ...thread,\n items,\n };\n }\n\n /**\n * Handle threads.list\n */\n private async handleThreadsList(\n params: { limit?: number; order?: string; after?: string } | undefined,\n context: TContext,\n ): Promise<Page<ThreadMetadata>> {\n return this.store.loadThreads(\n params?.limit ?? 20,\n params?.after,\n params?.order ?? 'desc',\n context,\n );\n }\n\n /**\n * Handle items.list\n */\n private async handleItemsList(\n params: ItemsListParams,\n context: TContext,\n ): Promise<Page<ThreadItem>> {\n return this.store.loadThreadItems(\n this.threadRefFromParams(params),\n params.after,\n params.limit ?? 50,\n params.order ?? 'asc',\n context,\n );\n }\n\n /**\n * Handle items.feedback (acknowledge only for now)\n */\n private async handleItemsFeedback(\n params: ItemFeedbackParams,\n context: TContext,\n ): Promise<{ success: boolean }> {\n this.logger.info(`Feedback received: ${params.feedback} for items ${params.item_ids.join(', ')}`);\n // Store feedback in metadata or separate table if needed\n return { success: true };\n }\n\n /**\n * Handle attachments.create\n */\n private async handleAttachmentsCreate(\n params: { name: string; size: number; mime_type: string },\n context: TContext,\n ): Promise<{ attachment_id: string; upload_url?: string }> {\n const attachmentId = generateId('attach');\n // For now, return a placeholder - actual upload handling would need S3/MinIO integration\n return {\n attachment_id: attachmentId,\n // upload_url would be provided for actual file upload\n };\n }\n\n /**\n * Handle attachments.delete\n */\n private async handleAttachmentsDelete(\n params: { attachment_id: string },\n context: TContext,\n ): Promise<{ success: boolean }> {\n if (this.store.deleteAttachment) {\n await this.store.deleteAttachment(params.attachment_id, context);\n }\n return { success: true };\n }\n\n /**\n * Handle threads.update\n */\n private async handleThreadsUpdate(\n params: ThreadUpdateParams,\n context: TContext,\n ): Promise<ThreadMetadata> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n \n if (params.title !== undefined) {\n thread.title = params.title;\n }\n thread.updated_at = nowTimestamp();\n\n await this.store.saveThread(thread, context);\n return thread;\n }\n\n /**\n * Handle threads.delete\n */\n private async handleThreadsDelete(\n params: ThreadDeleteParams,\n context: TContext,\n ): Promise<{ success: boolean }> {\n await this.store.deleteThread(this.threadRefFromParams(params), context);\n return { success: true };\n }\n\n // =========================================================================\n // Core Response Generation\n // =========================================================================\n\n /**\n * Generate AI response for a user message\n * This is the main response generation logic\n */\n private async *respond(\n thread: ThreadMetadata,\n userMessage: UserMessageItem,\n context: TContext,\n inferenceOptions?: any,\n threadRef: ThreadRef = this.threadRefFromThread(thread),\n ): AsyncIterable<ThreadStreamEvent> {\n const ptyConfig = this.getPtyConfig(thread);\n if (ptyConfig) {\n yield* this.respondWithPty(thread, userMessage, context, ptyConfig);\n return;\n }\n\n // Build conversation history\n const messages = await this.buildConversationHistory(threadRef, context);\n \n // Create assistant message item\n const assistantItemId = this.store.generateItemId('assistant_message', thread, context);\n const assistantItem: AssistantMessageItem = {\n id: assistantItemId,\n thread_id: thread.id,\n type: 'assistant_message',\n content: [{ type: 'output_text', text: '' }],\n status: 'in_progress',\n created_at: nowTimestamp(),\n };\n\n await this.store.addThreadItem(threadRef, assistantItem, context);\n\n // Emit item added event\n yield {\n type: 'thread.item.added',\n item: assistantItem,\n } as ThreadItemAddedEvent;\n\n // Stream AI response\n let fullText = '';\n let partIndex = 0;\n\n try {\n for await (const chunk of this.aiProvider.streamResponse(messages, {\n model: inferenceOptions?.model,\n temperature: inferenceOptions?.temperature,\n maxTokens: inferenceOptions?.max_tokens,\n context, // Pass context for auth\n })) {\n fullText += chunk;\n\n // Emit text delta update\n yield {\n type: 'thread.item.updated',\n item_id: assistantItemId,\n update: {\n type: 'assistant_message.content_part.text_delta',\n part_index: partIndex,\n delta: chunk,\n },\n } as ThreadItemUpdatedEvent;\n }\n\n // Update item with full content\n assistantItem.content = [{ type: 'output_text', text: fullText }];\n assistantItem.status = 'completed';\n await this.store.saveItem(threadRef, assistantItem, context);\n\n // Emit item done event\n yield {\n type: 'thread.item.done',\n item: assistantItem,\n } as ThreadItemDoneEvent;\n } catch (error: any) {\n this.logger.error(`AI response generation failed: ${error}`);\n\n assistantItem.content = [{ type: 'output_text', text: 'Sorry, an error occurred while generating the response.' }];\n assistantItem.status = 'incomplete';\n await this.store.saveItem(threadRef, assistantItem, context);\n\n yield {\n type: 'thread.item.done',\n item: assistantItem,\n } as ThreadItemDoneEvent;\n\n yield {\n type: 'error',\n error: {\n code: 'generation_error',\n message: error.message || 'Failed to generate response',\n },\n };\n }\n\n // Auto-generate title if this is the first exchange (outside try/catch to not affect message saving)\n if (!thread.title) {\n try {\n const title = this.generateThreadTitle(userMessage, fullText);\n thread.title = title;\n thread.updated_at = nowTimestamp();\n await this.store.saveThread(thread, context);\n\n yield {\n type: 'thread.updated',\n thread,\n };\n } catch (titleError: any) {\n this.logger.warn(`Failed to auto-generate thread title: ${titleError.message}`);\n // Don't throw - title generation failure shouldn't affect the response\n }\n }\n }\n\n private getPtyConfig(thread: ThreadMetadata): PtyRuntimeConfig | null {\n if (!this.enablePtyRuntime) {\n return null;\n }\n const runtime = (thread.metadata as any)?.runtime;\n if (!runtime) {\n return null;\n }\n if (!runtime.workspace || !runtime.runner) {\n throw new Error('Invalid thread.metadata.runtime: workspace/runner are required');\n }\n const runnerType = runtime.runner.type as RunnerType;\n if (!runnerType) {\n throw new Error('Invalid thread.metadata.runtime.runner.type');\n }\n // Enforce ACP-only: raw/stdio mode is removed.\n const protocol = 'acp';\n // Keep runner args server-owned by default, unless explicitly allowed.\n // This avoids exposing per-runner argv details to end users.\n const allowCustomArgv = runtime.runner.allowCustomArgv === true;\n const argv = allowCustomArgv ? runtime.runner.argv : undefined;\n return {\n ...runtime,\n runner: {\n ...runtime.runner,\n argv,\n protocol,\n },\n agentConfig: runtime.agentConfig,\n } as PtyRuntimeConfig;\n }\n\n private async *respondWithPty(\n thread: ThreadMetadata,\n userMessage: UserMessageItem,\n context: TContext,\n ptyConfig: PtyRuntimeConfig,\n ): AsyncIterable<ThreadStreamEvent> {\n const userText = extractUserMessageText(userMessage.content);\n if (!userText.trim()) {\n return;\n }\n\n const threadRef = this.threadRefFromThread(thread);\n\n await this.ptyRuntime.ensureStarted(thread.id, ptyConfig);\n\n const assistantId = this.store.generateItemId('assistant_message', thread, context);\n const assistantItem: AssistantMessageItem = {\n id: assistantId,\n thread_id: thread.id,\n type: 'assistant_message',\n content: [{ type: 'output_text', text: '' }],\n status: 'in_progress',\n created_at: nowTimestamp(),\n };\n\n await this.store.addThreadItem(threadRef, assistantItem, context);\n yield { type: 'thread.item.added', item: assistantItem } as ThreadItemAddedEvent;\n\n let fullText = '';\n let sawRuntimeError: string | undefined;\n const idleMs = ptyConfig.idleMs ?? 500;\n for await (const ev of this.ptyRuntime.sendMessage(thread.id, userText, { idleMs, authWaitMs: ptyConfig.authWaitMs })) {\n if (ev.type === 'text') {\n fullText += ev.text;\n yield {\n type: 'thread.item.updated',\n item_id: assistantId,\n update: {\n type: 'assistant_message.content_part.text_delta',\n part_index: 0,\n delta: ev.text,\n },\n } as ThreadItemUpdatedEvent;\n continue;\n }\n\n if (ev.type === 'error') {\n sawRuntimeError = ev.message;\n yield {\n type: 'error',\n error: {\n code: 'runtime_error',\n message: ev.message,\n },\n } as ThreadStreamEvent;\n break;\n }\n\n if (ev.type === 'auth_required') {\n // Runtime-only. Do not persist sensitive auth details into thread history.\n yield {\n type: 'client_effect',\n effect: {\n effect_type: 'runtime.auth_required',\n data: {\n method: ev.method,\n url: ev.url,\n message: ev.message,\n options: ev.options,\n },\n },\n };\n continue;\n }\n\n if (ev.type === 'tool_call') {\n const toolItem: ClientToolCallItem = {\n id: this.store.generateItemId('client_tool_call', thread, context),\n thread_id: thread.id,\n type: 'client_tool_call',\n name: ev.name,\n arguments: ev.arguments,\n call_id: ev.requestId,\n status: 'pending',\n created_at: nowTimestamp(),\n };\n await this.store.addThreadItem(threadRef, toolItem, context);\n yield { type: 'thread.item.added', item: toolItem } as ThreadItemAddedEvent;\n\n // Pause: client must call threads.add_client_tool_output to continue.\n const incomplete: AssistantMessageItem = {\n ...assistantItem,\n content: [{ type: 'output_text', text: fullText }],\n status: 'incomplete',\n };\n await this.store.saveItem(threadRef, incomplete, context);\n yield { type: 'thread.item.done', item: incomplete } as ThreadItemDoneEvent;\n return;\n }\n }\n\n if (sawRuntimeError) {\n const incomplete: AssistantMessageItem = {\n ...assistantItem,\n content: [{ type: 'output_text', text: fullText }],\n status: 'incomplete',\n };\n await this.store.saveItem(threadRef, incomplete, context);\n yield { type: 'thread.item.done', item: incomplete } as ThreadItemDoneEvent;\n return;\n }\n\n const completedItem: AssistantMessageItem = {\n ...assistantItem,\n content: [{ type: 'output_text', text: fullText }],\n status: 'completed',\n };\n await this.store.saveItem(threadRef, completedItem, context);\n yield { type: 'thread.item.done', item: completedItem } as ThreadItemDoneEvent;\n }\n\n /**\n * Build conversation history from thread items\n */\n private async buildConversationHistory(\n thread: ThreadRef,\n context: TContext,\n ): Promise<Array<{ role: 'system' | 'user' | 'assistant'; content: string }>> {\n const messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }> = [];\n\n // Add system prompt\n messages.push({ role: 'system', content: this.systemPrompt });\n\n // Load thread items\n const items = await this.store.loadThreadItems(thread, undefined, 100, 'asc', context);\n\n for (const item of items.data) {\n if (item.type === 'user_message') {\n const text = extractUserMessageText(item.content);\n if (text) {\n messages.push({ role: 'user', content: text });\n }\n } else if (item.type === 'assistant_message') {\n const text = item.content\n .filter((c) => c.type === 'output_text')\n .map((c) => c.text)\n .join('\\n');\n if (text) {\n messages.push({ role: 'assistant', content: text });\n }\n }\n }\n\n return messages;\n }\n\n /**\n * Create a user message item\n */\n private async createUserMessage(\n threadRef: ThreadRef,\n content: UserMessageContent[],\n context: TContext,\n thread?: ThreadMetadata,\n ): Promise<UserMessageItem> {\n // Use provided thread or load it\n const threadMeta = thread || await this.store.loadThread(threadRef, context);\n const threadId = getThreadIdFromRef(threadRef);\n const itemId = this.store.generateItemId('user_message', threadMeta, context);\n\n return {\n id: itemId,\n thread_id: threadId,\n type: 'user_message',\n content,\n created_at: nowTimestamp(),\n };\n }\n\n /**\n * Generate a title for the thread based on the first exchange\n */\n private generateThreadTitle(userMessage: UserMessageItem, assistantResponse: string): string {\n const userText = extractUserMessageText(userMessage.content);\n // Use the first 50 chars of user message as title\n let title = userText.slice(0, 50);\n if (userText.length > 50) {\n title += '...';\n }\n return title || 'New Chat';\n }\n\n private normalizeThreadMetadata(\n metadata: Record<string, unknown> | undefined,\n chatId?: string,\n ): Record<string, unknown> | undefined {\n const normalized = { ...(metadata ?? {}) };\n normalized.chat_id = chatId\n ?? (typeof normalized.chat_id === 'string' && normalized.chat_id.length > 0\n ? normalized.chat_id\n : DEFAULT_THREAD_CHAT_ID);\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n }\n\n private threadRefFromParams(params: { thread_id: string; chat_id?: string }): ThreadRef {\n return toThreadRef(params);\n }\n\n private threadRefFromThread(thread: ThreadMetadata): ThreadRef {\n return {\n thread_id: thread.id,\n chat_id: getChatIdFromThreadMetadata(thread),\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/api/chatkit/service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ChatKit Service\n * \n * Core service for handling ChatKit protocol requests.\n * Based on https://github.com/openai/chatkit-python/blob/main/chatkit/server.py\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { ChatKitStore, StoreContext } from './store';\nimport type {\n ChatKitReq,\n StreamingReq,\n NonStreamingReq,\n ThreadCreateParams,\n ThreadAddUserMessageParams,\n ThreadAddClientToolOutputParams,\n ThreadRetryAfterItemParams,\n ThreadCustomActionParams,\n ThreadGetByIdParams,\n ItemsListParams,\n ItemFeedbackParams,\n ThreadUpdateParams,\n ThreadDeleteParams,\n ThreadMetadata,\n ThreadRef,\n ThreadItem,\n UserMessageItem,\n AssistantMessageItem,\n ThreadStreamEvent,\n ThreadCreatedEvent,\n ThreadItemAddedEvent,\n ThreadItemDoneEvent,\n ThreadItemUpdatedEvent,\n Page,\n Thread,\n UserMessageContent,\n} from './types';\nimport {\n DEFAULT_THREAD_CHAT_ID,\n getChatIdFromThreadMetadata,\n getThreadIdFromRef,\n isStreamingReq,\n generateId,\n nowTimestamp,\n toThreadRef,\n extractUserMessageText,\n} from './types';\nimport { RunStateCenter, type RunStateEvent } from '../runs/RunStateCenter';\nimport type { RunExecutionBackend } from '../runs/RunExecutionBackend';\nimport { isWorkspaceUri } from '../workspace/types';\nimport type { WorkspaceUri } from '../workspace/types';\n\n/**\n * AI Provider interface for direct text generation in tests/dev harnesses.\n *\n * Product Chat requests go through RunStateCenter / Agent Runtime. This\n * provider is not a deployment compatibility path.\n */\nexport interface AiProvider {\n /**\n * Stream a response for the given messages\n * Returns an async iterator of text chunks\n */\n streamResponse(\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>,\n options?: {\n model?: string;\n temperature?: number;\n maxTokens?: number;\n context?: unknown; // Allow passing context for auth\n },\n ): AsyncIterable<string>;\n}\n\n/**\n * ChatKit Service Options\n */\nexport interface ChatKitServiceOptions<TContext = StoreContext> {\n store: ChatKitStore<TContext>;\n aiProvider?: AiProvider;\n systemPrompt?: string;\n /**\n * Enable xpod Agent Runtime invocation (local-only feature).\n * When enabled, thread.metadata.runtime controls the runner/worktree.\n */\n enableAgentRuntime?: boolean;\n allowDirectAiFallback?: boolean;\n runExecutionBackend?: RunExecutionBackend;\n}\n\n/**\n * Streaming result wrapper\n */\nexport interface StreamingResult {\n type: 'streaming';\n stream(): AsyncIterable<Uint8Array>;\n}\n\n/**\n * Non-streaming result wrapper\n */\nexport interface NonStreamingResult {\n type: 'non_streaming';\n json: string;\n}\n\nexport type ChatKitResult = StreamingResult | NonStreamingResult;\n\n/**\n * ChatKit Service\n */\nexport class ChatKitService<TContext = StoreContext> {\n private readonly logger = getLoggerFor(this);\n private readonly store: ChatKitStore<TContext>;\n private readonly aiProvider?: AiProvider;\n private readonly systemPrompt: string;\n private readonly allowDirectAiFallback: boolean;\n private readonly runStateCenter: RunStateCenter<TContext>;\n\n public constructor(options: ChatKitServiceOptions<TContext>) {\n this.store = options.store;\n this.aiProvider = options.aiProvider;\n this.systemPrompt = options.systemPrompt ?? 'You are a helpful assistant.';\n this.allowDirectAiFallback = options.allowDirectAiFallback ?? false;\n this.runStateCenter = new RunStateCenter({\n store: this.store,\n enableAgentRuntime: options.enableAgentRuntime ?? true,\n executionBackend: options.runExecutionBackend,\n });\n }\n\n /**\n * Process a ChatKit request\n */\n public async process(requestBody: string | Buffer, context: TContext): Promise<ChatKitResult> {\n const requestStr = typeof requestBody === 'string' ? requestBody : requestBody.toString('utf-8');\n \n let request: ChatKitReq;\n try {\n request = JSON.parse(requestStr) as ChatKitReq;\n } catch (e) {\n throw new Error('Invalid JSON request body');\n }\n\n this.logger.debug(`Processing ChatKit request: ${request.type}`);\n\n if (isStreamingReq(request)) {\n return {\n type: 'streaming',\n stream: () => this.processStreamingAsBytes(request, context),\n };\n } else {\n const result = await this.processNonStreaming(request, context);\n return {\n type: 'non_streaming',\n json: JSON.stringify(result),\n };\n }\n }\n\n /**\n * Convert streaming events to SSE bytes\n */\n private async *processStreamingAsBytes(request: StreamingReq, context: TContext): AsyncIterable<Uint8Array> {\n const encoder = new TextEncoder();\n try {\n for await (const event of this.processStreaming(request, context)) {\n this.logger.info(`ChatKit streaming event (${request.type}): ${event.type}`);\n const data = JSON.stringify(event);\n yield encoder.encode(`data: ${data}\\n\\n`);\n }\n } catch (error: any) {\n this.logger.error(`ChatKit streaming request failed (${request.type}): ${error?.stack || error}`);\n const errorEvent: ThreadStreamEvent = {\n type: 'error',\n error: {\n code: 'internal_error',\n message: error.message || 'An error occurred',\n },\n };\n yield encoder.encode(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n }\n }\n\n /**\n * Process streaming requests\n */\n private async *processStreaming(request: StreamingReq, context: TContext): AsyncIterable<ThreadStreamEvent> {\n switch (request.type) {\n case 'threads.create':\n yield* this.handleThreadsCreate(request.params, context, request.metadata);\n break;\n case 'threads.add_user_message':\n yield* this.handleThreadsAddUserMessage(request.params, context);\n break;\n case 'threads.add_client_tool_output':\n yield* this.handleThreadsAddClientToolOutput(request.params, context);\n break;\n case 'threads.retry_after_item':\n yield* this.handleThreadsRetryAfterItem(request.params, context);\n break;\n case 'threads.custom_action':\n yield* this.handleThreadsCustomAction(request.params, context);\n break;\n }\n }\n\n /**\n * Process non-streaming requests\n */\n private async processNonStreaming(request: NonStreamingReq, context: TContext): Promise<unknown> {\n switch (request.type) {\n case 'threads.get_by_id':\n return this.handleThreadsGetById(request.params, context);\n case 'threads.list':\n return this.handleThreadsList(request.params, context);\n case 'items.list':\n return this.handleItemsList(request.params, context);\n case 'items.feedback':\n return this.handleItemsFeedback(request.params, context);\n case 'attachments.create':\n return this.handleAttachmentsCreate(request.params, context);\n case 'attachments.delete':\n return this.handleAttachmentsDelete(request.params, context);\n case 'threads.update':\n return this.handleThreadsUpdate(request.params, context);\n case 'threads.delete':\n return this.handleThreadsDelete(request.params, context);\n }\n }\n\n // =========================================================================\n // Streaming Request Handlers\n // =========================================================================\n\n /**\n * Handle threads.create - Create a new thread and optionally respond to initial message\n */\n private async *handleThreadsCreate(\n params: ThreadCreateParams,\n context: TContext,\n metadata?: Record<string, unknown>,\n ): AsyncIterable<ThreadStreamEvent> {\n // Create new thread\n const threadId = this.store.generateThreadId(context);\n const now = nowTimestamp();\n \n const thread: ThreadMetadata = {\n id: threadId,\n status: { type: 'active' },\n workspace: this.resolveThreadWorkspace(params.workspace, metadata),\n created_at: now,\n updated_at: now,\n metadata: this.normalizeThreadMetadata(metadata, params.chat_id),\n };\n\n await this.store.saveThread(thread, context);\n\n // Emit thread created event\n yield {\n type: 'thread.created',\n thread,\n } as ThreadCreatedEvent;\n\n // If input provided, add user message and respond\n if (params.input) {\n const threadRef = this.threadRefFromThread(thread);\n const userMessage = await this.createUserMessage(threadRef, params.input.content, context, thread);\n await this.store.addThreadItem(threadRef, userMessage, context);\n\n yield {\n type: 'thread.item.added',\n item: userMessage,\n } as ThreadItemAddedEvent;\n\n yield {\n type: 'thread.item.done',\n item: userMessage,\n } as ThreadItemDoneEvent;\n\n // Generate response (AI provider or Agent Runtime)\n yield* this.respond(thread, userMessage, context, params.input.inference_options);\n }\n }\n\n /**\n * Handle threads.add_user_message - Add a user message and respond\n */\n private async *handleThreadsAddUserMessage(\n params: ThreadAddUserMessageParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n\n // Create and save user message\n const userMessage = await this.createUserMessage(threadRef, params.input.content, context);\n await this.store.addThreadItem(threadRef, userMessage, context);\n\n yield {\n type: 'thread.item.added',\n item: userMessage,\n } as ThreadItemAddedEvent;\n\n yield {\n type: 'thread.item.done',\n item: userMessage,\n } as ThreadItemDoneEvent;\n\n // Generate response (AI provider or Agent Runtime)\n yield* this.respond(thread, userMessage, context, params.input.inference_options, threadRef);\n }\n\n /**\n * Handle threads.add_client_tool_output - Handle tool output (not fully implemented)\n */\n private async *handleThreadsAddClientToolOutput(\n params: ThreadAddClientToolOutputParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n const threadRef = this.threadRefFromParams(params);\n for await (\n const event of this.runStateCenter.completeClientToolOutput({\n threadRef,\n itemId: params.item_id,\n output: params.output,\n context,\n })\n ) {\n yield this.projectRunStateEvent(event);\n }\n }\n\n /**\n * Handle threads.retry_after_item - Retry generation after a specific item\n */\n private async *handleThreadsRetryAfterItem(\n params: ThreadRetryAfterItemParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n \n // Load all items and find the last user message before the retry point\n const items = await this.store.loadThreadItems(threadRef, undefined, 1000, 'asc', context);\n \n let lastUserMessage: UserMessageItem | undefined;\n for (const item of items.data) {\n if (item.id === params.item_id) {\n break;\n }\n if (item.type === 'user_message') {\n lastUserMessage = item;\n }\n }\n\n if (lastUserMessage) {\n yield* this.respond(thread, lastUserMessage, context, undefined, threadRef);\n }\n }\n\n /**\n * Handle threads.custom_action - Handle custom widget actions (not fully implemented)\n */\n private async *handleThreadsCustomAction(\n params: ThreadCustomActionParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n this.logger.info(`Custom action: ${params.action} on item ${params.item_id}`);\n // Custom actions can be implemented based on specific needs\n }\n\n // =========================================================================\n // Non-Streaming Request Handlers\n // =========================================================================\n\n /**\n * Handle threads.get_by_id\n */\n private async handleThreadsGetById(\n params: ThreadGetByIdParams,\n context: TContext,\n ): Promise<Thread> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n const items = await this.store.loadThreadItems(threadRef, undefined, 50, 'asc', context);\n \n return {\n ...thread,\n items,\n };\n }\n\n /**\n * Handle threads.list\n */\n private async handleThreadsList(\n params: { limit?: number; order?: string; after?: string } | undefined,\n context: TContext,\n ): Promise<Page<ThreadMetadata>> {\n return this.store.loadThreads(\n params?.limit ?? 20,\n params?.after,\n params?.order ?? 'desc',\n context,\n );\n }\n\n /**\n * Handle items.list\n */\n private async handleItemsList(\n params: ItemsListParams,\n context: TContext,\n ): Promise<Page<ThreadItem>> {\n return this.store.loadThreadItems(\n this.threadRefFromParams(params),\n params.after,\n params.limit ?? 50,\n params.order ?? 'asc',\n context,\n );\n }\n\n /**\n * Handle items.feedback (acknowledge only for now)\n */\n private async handleItemsFeedback(\n params: ItemFeedbackParams,\n context: TContext,\n ): Promise<{ success: boolean }> {\n this.logger.info(`Feedback received: ${params.feedback} for items ${params.item_ids.join(', ')}`);\n // Store feedback in metadata or separate table if needed\n return { success: true };\n }\n\n /**\n * Handle attachments.create\n */\n private async handleAttachmentsCreate(\n params: { name: string; size: number; mime_type: string },\n context: TContext,\n ): Promise<{ attachment_id: string; upload_url?: string }> {\n const attachmentId = generateId('attach');\n // For now, return a placeholder - actual upload handling would need S3/MinIO integration\n return {\n attachment_id: attachmentId,\n // upload_url would be provided for actual file upload\n };\n }\n\n /**\n * Handle attachments.delete\n */\n private async handleAttachmentsDelete(\n params: { attachment_id: string },\n context: TContext,\n ): Promise<{ success: boolean }> {\n if (this.store.deleteAttachment) {\n await this.store.deleteAttachment(params.attachment_id, context);\n }\n return { success: true };\n }\n\n /**\n * Handle threads.update\n */\n private async handleThreadsUpdate(\n params: ThreadUpdateParams,\n context: TContext,\n ): Promise<ThreadMetadata> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n \n if (params.title !== undefined) {\n thread.title = params.title;\n }\n if (params.workspace !== undefined) {\n thread.workspace = params.workspace || undefined;\n }\n thread.updated_at = nowTimestamp();\n\n await this.store.saveThread(thread, context);\n return thread;\n }\n\n /**\n * Handle threads.delete\n */\n private async handleThreadsDelete(\n params: ThreadDeleteParams,\n context: TContext,\n ): Promise<{ success: boolean }> {\n await this.store.deleteThread(this.threadRefFromParams(params), context);\n return { success: true };\n }\n\n // =========================================================================\n // Core Response Generation\n // =========================================================================\n\n /**\n * Generate AI response for a user message\n * This is the main response generation logic\n */\n private async *respond(\n thread: ThreadMetadata,\n userMessage: UserMessageItem,\n context: TContext,\n inferenceOptions?: any,\n threadRef: ThreadRef = this.threadRefFromThread(thread),\n ): AsyncIterable<ThreadStreamEvent> {\n const runtimeConfig = this.runStateCenter.getAgentRuntimeConfig(thread, context)\n ?? this.runStateCenter.getDefaultAgentRuntimeConfig(context);\n if (runtimeConfig) {\n for await (\n const event of this.runStateCenter.startAgentRun({\n thread,\n userMessage,\n context,\n runtimeConfig,\n })\n ) {\n yield this.projectRunStateEvent(event);\n }\n return;\n }\n\n if (!this.allowDirectAiFallback || !this.aiProvider) {\n yield {\n type: 'error',\n error: {\n code: 'runtime_required',\n message: 'Chat requires Agent Runtime; direct AI fallback is disabled',\n },\n };\n return;\n }\n\n // Build conversation history\n const messages = await this.buildConversationHistory(threadRef, context);\n \n // Create assistant message item\n const assistantItemId = this.store.generateItemId('assistant_message', thread, context);\n const assistantItem: AssistantMessageItem = {\n id: assistantItemId,\n thread_id: thread.id,\n type: 'assistant_message',\n content: [{ type: 'output_text', text: '' }],\n status: 'in_progress',\n created_at: nowTimestamp(),\n };\n\n await this.store.addThreadItem(threadRef, assistantItem, context);\n\n // Emit item added event\n yield {\n type: 'thread.item.added',\n item: assistantItem,\n } as ThreadItemAddedEvent;\n\n // Stream AI response\n let fullText = '';\n let partIndex = 0;\n\n try {\n for await (const chunk of this.aiProvider.streamResponse(messages, {\n model: inferenceOptions?.model,\n temperature: inferenceOptions?.temperature,\n maxTokens: inferenceOptions?.max_tokens,\n context, // Pass context for auth\n })) {\n fullText += chunk;\n\n // Emit text delta update\n yield {\n type: 'thread.item.updated',\n item_id: assistantItemId,\n update: {\n type: 'assistant_message.content_part.text_delta',\n part_index: partIndex,\n delta: chunk,\n },\n } as ThreadItemUpdatedEvent;\n }\n\n // Update item with full content\n assistantItem.content = [{ type: 'output_text', text: fullText }];\n assistantItem.status = 'completed';\n await this.store.saveItem(threadRef, assistantItem, context);\n\n // Emit item done event\n yield {\n type: 'thread.item.done',\n item: assistantItem,\n } as ThreadItemDoneEvent;\n } catch (error: any) {\n this.logger.error(`AI response generation failed: ${error}`);\n\n assistantItem.content = [{ type: 'output_text', text: 'Sorry, an error occurred while generating the response.' }];\n assistantItem.status = 'incomplete';\n await this.store.saveItem(threadRef, assistantItem, context);\n\n yield {\n type: 'thread.item.done',\n item: assistantItem,\n } as ThreadItemDoneEvent;\n\n yield {\n type: 'error',\n error: {\n code: 'generation_error',\n message: error.message || 'Failed to generate response',\n },\n };\n }\n\n // Auto-generate title if this is the first exchange (outside try/catch to not affect message saving)\n if (!thread.title) {\n try {\n const title = this.generateThreadTitle(userMessage, fullText);\n thread.title = title;\n thread.updated_at = nowTimestamp();\n await this.store.saveThread(thread, context);\n\n yield {\n type: 'thread.updated',\n thread,\n };\n } catch (titleError: any) {\n this.logger.warn(`Failed to auto-generate thread title: ${titleError.message}`);\n // Don't throw - title generation failure shouldn't affect the response\n }\n }\n }\n\n /**\n * Build conversation history from thread items\n */\n private async buildConversationHistory(\n thread: ThreadRef,\n context: TContext,\n ): Promise<Array<{ role: 'system' | 'user' | 'assistant'; content: string }>> {\n const messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }> = [];\n\n // Add system prompt\n messages.push({ role: 'system', content: this.systemPrompt });\n\n // Load thread items\n const items = await this.store.loadThreadItems(thread, undefined, 100, 'asc', context);\n\n for (const item of items.data) {\n if (item.type === 'user_message') {\n const text = extractUserMessageText(item.content);\n if (text) {\n messages.push({ role: 'user', content: text });\n }\n } else if (item.type === 'assistant_message') {\n const text = item.content\n .filter((c) => c.type === 'output_text')\n .map((c) => c.text)\n .join('\\n');\n if (text) {\n messages.push({ role: 'assistant', content: text });\n }\n }\n }\n\n return messages;\n }\n\n /**\n * Create a user message item\n */\n private async createUserMessage(\n threadRef: ThreadRef,\n content: UserMessageContent[],\n context: TContext,\n thread?: ThreadMetadata,\n ): Promise<UserMessageItem> {\n // Use provided thread or load it\n const threadMeta = thread || await this.store.loadThread(threadRef, context);\n const threadId = getThreadIdFromRef(threadRef);\n const itemId = this.store.generateItemId('user_message', threadMeta, context);\n\n return {\n id: itemId,\n thread_id: threadId,\n type: 'user_message',\n content,\n created_at: nowTimestamp(),\n };\n }\n\n /**\n * Generate a title for the thread based on the first exchange\n */\n private generateThreadTitle(userMessage: UserMessageItem, assistantResponse: string): string {\n const userText = extractUserMessageText(userMessage.content);\n // Use the first 50 chars of user message as title\n let title = userText.slice(0, 50);\n if (userText.length > 50) {\n title += '...';\n }\n return title || 'New Chat';\n }\n\n private projectRunStateEvent(event: RunStateEvent): ThreadStreamEvent {\n switch (event.type) {\n case 'item_added':\n return { type: 'thread.item.added', item: event.item } as ThreadItemAddedEvent;\n case 'item_updated':\n return {\n type: 'thread.item.updated',\n item_id: event.itemId,\n update: {\n type: 'assistant_message.content_part.text_delta',\n part_index: 0,\n delta: event.delta,\n },\n } as ThreadItemUpdatedEvent;\n case 'item_done':\n return { type: 'thread.item.done', item: event.item } as ThreadItemDoneEvent;\n case 'client_effect':\n return { type: 'client_effect', effect: event.effect };\n case 'error':\n return {\n type: 'error',\n error: {\n code: event.code,\n message: event.message,\n },\n };\n }\n }\n\n private normalizeThreadMetadata(\n metadata: Record<string, unknown> | undefined,\n chatId?: string,\n ): Record<string, unknown> | undefined {\n const normalized = { ...(metadata ?? {}) };\n normalized.chat_id = chatId\n ?? (typeof normalized.chat_id === 'string' && normalized.chat_id.length > 0\n ? normalized.chat_id\n : DEFAULT_THREAD_CHAT_ID);\n normalized.surface_id = typeof normalized.surface_id === 'string' && normalized.surface_id.length > 0\n ? normalized.surface_id\n : normalized.chat_id;\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n }\n\n private resolveThreadWorkspace(\n workspace: WorkspaceUri | undefined,\n metadata: Record<string, unknown> | undefined,\n ): WorkspaceUri | undefined {\n if (isWorkspaceUri(workspace)) {\n return workspace;\n }\n const metadataWorkspace = metadata?.workspace;\n return isWorkspaceUri(metadataWorkspace)\n ? metadataWorkspace\n : undefined;\n }\n\n private threadRefFromParams(params: { thread_id: string; chat_id?: string }): ThreadRef {\n return toThreadRef(params);\n }\n\n private threadRefFromThread(thread: ThreadMetadata): ThreadRef {\n return {\n thread_id: thread.id,\n chat_id: getChatIdFromThreadMetadata(thread),\n };\n }\n}\n"]}
|