@nodetool-ai/websocket 0.8.2 → 0.8.4-a24.1
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/README.md +5 -0
- package/dist/.nodetool-build-stamp +1 -1
- package/dist/agent/run-node-tool.d.ts.map +1 -1
- package/dist/agent/run-node-tool.js +11 -1
- package/dist/agent/run-node-tool.js.map +1 -1
- package/dist/chat-prediction-forwarder.d.ts +5 -3
- package/dist/chat-prediction-forwarder.d.ts.map +1 -1
- package/dist/chat-prediction-forwarder.js +6 -4
- package/dist/chat-prediction-forwarder.js.map +1 -1
- package/dist/chat-turn-registry.d.ts +2 -1
- package/dist/chat-turn-registry.d.ts.map +1 -1
- package/dist/chat-turn-registry.js +8 -1
- package/dist/chat-turn-registry.js.map +1 -1
- package/dist/collection-api.d.ts.map +1 -1
- package/dist/collection-api.js +3 -5
- package/dist/collection-api.js.map +1 -1
- package/dist/custom-providers.d.ts.map +1 -1
- package/dist/custom-providers.js +6 -1
- package/dist/custom-providers.js.map +1 -1
- package/dist/e2e-server.js +1 -1
- package/dist/e2e-server.js.map +1 -1
- package/dist/example-workflows.d.ts.map +1 -1
- package/dist/example-workflows.js +7 -1
- package/dist/example-workflows.js.map +1 -1
- package/dist/fake-runtime.d.ts +54 -8
- package/dist/fake-runtime.d.ts.map +1 -1
- package/dist/fake-runtime.js +228 -15
- package/dist/fake-runtime.js.map +1 -1
- package/dist/file-api.d.ts.map +1 -1
- package/dist/file-api.js +6 -8
- package/dist/file-api.js.map +1 -1
- package/dist/generation-recovery.d.ts.map +1 -1
- package/dist/generation-recovery.js +7 -4
- package/dist/generation-recovery.js.map +1 -1
- package/dist/headless-job-runner.d.ts.map +1 -1
- package/dist/headless-job-runner.js +8 -2
- package/dist/headless-job-runner.js.map +1 -1
- package/dist/http-api.d.ts +4 -2
- package/dist/http-api.d.ts.map +1 -1
- package/dist/http-api.js +67 -16
- package/dist/http-api.js.map +1 -1
- package/dist/http-body-schemas.d.ts +2 -0
- package/dist/http-body-schemas.d.ts.map +1 -1
- package/dist/http-body-schemas.js +8 -1
- package/dist/http-body-schemas.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/job-control.d.ts +8 -0
- package/dist/job-control.d.ts.map +1 -1
- package/dist/job-control.js +12 -0
- package/dist/job-control.js.map +1 -1
- package/dist/lib/admin.d.ts +7 -0
- package/dist/lib/admin.d.ts.map +1 -0
- package/dist/lib/admin.js +19 -0
- package/dist/lib/admin.js.map +1 -0
- package/dist/lib/app-instances-service.d.ts +35 -0
- package/dist/lib/app-instances-service.d.ts.map +1 -1
- package/dist/lib/app-instances-service.js +3 -4
- package/dist/lib/app-instances-service.js.map +1 -1
- package/dist/lib/app-project-export.d.ts +12 -0
- package/dist/lib/app-project-export.d.ts.map +1 -0
- package/dist/lib/app-project-export.js +42 -0
- package/dist/lib/app-project-export.js.map +1 -0
- package/dist/lib/applications-service.d.ts.map +1 -1
- package/dist/lib/applications-service.js +7 -2
- package/dist/lib/applications-service.js.map +1 -1
- package/dist/lib/asset-export.d.ts +7 -3
- package/dist/lib/asset-export.d.ts.map +1 -1
- package/dist/lib/asset-export.js +16 -8
- package/dist/lib/asset-export.js.map +1 -1
- package/dist/lib/asset-paths.d.ts +1 -1
- package/dist/lib/asset-paths.js +1 -1
- package/dist/lib/asset-response.d.ts.map +1 -1
- package/dist/lib/asset-response.js +13 -6
- package/dist/lib/asset-response.js.map +1 -1
- package/dist/lib/cloud-profile.d.ts +10 -0
- package/dist/lib/cloud-profile.d.ts.map +1 -0
- package/dist/lib/cloud-profile.js +13 -0
- package/dist/lib/cloud-profile.js.map +1 -0
- package/dist/lib/example-apps.d.ts +3 -0
- package/dist/lib/example-apps.d.ts.map +1 -1
- package/dist/lib/example-apps.js +3 -2
- package/dist/lib/example-apps.js.map +1 -1
- package/dist/lib/http-user-id.d.ts +2 -0
- package/dist/lib/http-user-id.d.ts.map +1 -0
- package/dist/lib/http-user-id.js +4 -0
- package/dist/lib/http-user-id.js.map +1 -0
- package/dist/lib/json-body.d.ts +11 -0
- package/dist/lib/json-body.d.ts.map +1 -0
- package/dist/lib/json-body.js +13 -0
- package/dist/lib/json-body.js.map +1 -0
- package/dist/lib/project-archive-host.d.ts +14 -0
- package/dist/lib/project-archive-host.d.ts.map +1 -0
- package/dist/lib/project-archive-host.js +24 -0
- package/dist/lib/project-archive-host.js.map +1 -0
- package/dist/lib/project-archive.d.ts +103 -0
- package/dist/lib/project-archive.d.ts.map +1 -0
- package/dist/lib/project-archive.js +610 -0
- package/dist/lib/project-archive.js.map +1 -0
- package/dist/lib/public-routes.d.ts +15 -0
- package/dist/lib/public-routes.d.ts.map +1 -1
- package/dist/lib/public-routes.js +27 -0
- package/dist/lib/public-routes.js.map +1 -1
- package/dist/lib/public-workflow-share.d.ts +12 -1
- package/dist/lib/public-workflow-share.d.ts.map +1 -1
- package/dist/lib/public-workflow-share.js +45 -2
- package/dist/lib/public-workflow-share.js.map +1 -1
- package/dist/lib/python-metadata-roots.d.ts +27 -0
- package/dist/lib/python-metadata-roots.d.ts.map +1 -0
- package/dist/lib/python-metadata-roots.js +92 -0
- package/dist/lib/python-metadata-roots.js.map +1 -0
- package/dist/lib/runtime-detection.d.ts +1 -1
- package/dist/lib/runtime-detection.d.ts.map +1 -1
- package/dist/lib/runtime-detection.js +2 -1
- package/dist/lib/runtime-detection.js.map +1 -1
- package/dist/lib/server-auth-token.d.ts +18 -0
- package/dist/lib/server-auth-token.d.ts.map +1 -0
- package/dist/lib/server-auth-token.js +28 -0
- package/dist/lib/server-auth-token.js.map +1 -0
- package/dist/lib/thumbnail.d.ts.map +1 -1
- package/dist/lib/thumbnail.js +3 -1
- package/dist/lib/thumbnail.js.map +1 -1
- package/dist/lib/timeline-bundle.d.ts +70 -0
- package/dist/lib/timeline-bundle.d.ts.map +1 -1
- package/dist/lib/timeline-bundle.js +28 -10
- package/dist/lib/timeline-bundle.js.map +1 -1
- package/dist/lib/timeline-media-export.d.ts +18 -0
- package/dist/lib/timeline-media-export.d.ts.map +1 -0
- package/dist/lib/timeline-media-export.js +66 -0
- package/dist/lib/timeline-media-export.js.map +1 -0
- package/dist/lib/timeline-premiere-import.d.ts +24 -0
- package/dist/lib/timeline-premiere-import.d.ts.map +1 -0
- package/dist/lib/timeline-premiere-import.js +112 -0
- package/dist/lib/timeline-premiere-import.js.map +1 -0
- package/dist/lib/timeline-premiere.d.ts +38 -0
- package/dist/lib/timeline-premiere.d.ts.map +1 -0
- package/dist/lib/timeline-premiere.js +87 -0
- package/dist/lib/timeline-premiere.js.map +1 -0
- package/dist/lib/zip-stream.d.ts +3 -0
- package/dist/lib/zip-stream.d.ts.map +1 -1
- package/dist/lib/zip-stream.js +6 -0
- package/dist/lib/zip-stream.js.map +1 -1
- package/dist/mcp-agent-tools.d.ts +48 -0
- package/dist/mcp-agent-tools.d.ts.map +1 -1
- package/dist/mcp-agent-tools.js +15 -2
- package/dist/mcp-agent-tools.js.map +1 -1
- package/dist/mcp-server.d.ts +7 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +163 -16
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-skill-prompts.d.ts +23 -0
- package/dist/mcp-skill-prompts.d.ts.map +1 -0
- package/dist/mcp-skill-prompts.js +91 -0
- package/dist/mcp-skill-prompts.js.map +1 -0
- package/dist/mcp-tool-deps.d.ts.map +1 -1
- package/dist/mcp-tool-deps.js +8 -1
- package/dist/mcp-tool-deps.js.map +1 -1
- package/dist/model-download-runtime.d.ts.map +1 -1
- package/dist/model-download-runtime.js +2 -1
- package/dist/model-download-runtime.js.map +1 -1
- package/dist/models-api.d.ts.map +1 -1
- package/dist/models-api.js +6 -2
- package/dist/models-api.js.map +1 -1
- package/dist/node-registry-setup.d.ts +8 -5
- package/dist/node-registry-setup.d.ts.map +1 -1
- package/dist/node-registry-setup.js +22 -10
- package/dist/node-registry-setup.js.map +1 -1
- package/dist/oauth-api.d.ts.map +1 -1
- package/dist/oauth-api.js +45 -23
- package/dist/oauth-api.js.map +1 -1
- package/dist/openai-api.d.ts.map +1 -1
- package/dist/openai-api.js +10 -2
- package/dist/openai-api.js.map +1 -1
- package/dist/pack-source.d.ts +15 -0
- package/dist/pack-source.d.ts.map +1 -0
- package/dist/pack-source.js +85 -0
- package/dist/pack-source.js.map +1 -0
- package/dist/plugins/websocket.d.ts.map +1 -1
- package/dist/plugins/websocket.js +31 -5
- package/dist/plugins/websocket.js.map +1 -1
- package/dist/routes/applications.d.ts +1 -0
- package/dist/routes/applications.d.ts.map +1 -1
- package/dist/routes/applications.js +24 -0
- package/dist/routes/applications.js.map +1 -1
- package/dist/routes/assets.d.ts.map +1 -1
- package/dist/routes/assets.js +31 -41
- package/dist/routes/assets.js.map +1 -1
- package/dist/routes/config.d.ts.map +1 -1
- package/dist/routes/config.js +6 -0
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/documents.d.ts.map +1 -1
- package/dist/routes/documents.js +32 -1
- package/dist/routes/documents.js.map +1 -1
- package/dist/routes/fal-pricing-estimate.d.ts.map +1 -1
- package/dist/routes/fal-pricing-estimate.js +2 -0
- package/dist/routes/fal-pricing-estimate.js.map +1 -1
- package/dist/routes/files.d.ts.map +1 -1
- package/dist/routes/files.js +2 -0
- package/dist/routes/files.js.map +1 -1
- package/dist/routes/games.d.ts +38 -0
- package/dist/routes/games.d.ts.map +1 -0
- package/dist/routes/games.js +159 -0
- package/dist/routes/games.js.map +1 -0
- package/dist/routes/integrations.d.ts.map +1 -1
- package/dist/routes/integrations.js +22 -26
- package/dist/routes/integrations.js.map +1 -1
- package/dist/routes/js-scripts.d.ts +1 -1
- package/dist/routes/js-scripts.d.ts.map +1 -1
- package/dist/routes/js-scripts.js +1 -1
- package/dist/routes/js-scripts.js.map +1 -1
- package/dist/routes/kie-pricing.js +1 -1
- package/dist/routes/kie-pricing.js.map +1 -1
- package/dist/routes/nodes.d.ts.map +1 -1
- package/dist/routes/nodes.js +13 -1
- package/dist/routes/nodes.js.map +1 -1
- package/dist/routes/project-archive.d.ts +18 -0
- package/dist/routes/project-archive.d.ts.map +1 -0
- package/dist/routes/project-archive.js +98 -0
- package/dist/routes/project-archive.js.map +1 -0
- package/dist/routes/storage.d.ts.map +1 -1
- package/dist/routes/storage.js +2 -0
- package/dist/routes/storage.js.map +1 -1
- package/dist/routes/storyboards.d.ts.map +1 -1
- package/dist/routes/storyboards.js +6 -3
- package/dist/routes/storyboards.js.map +1 -1
- package/dist/routes/timelines.d.ts +8 -4
- package/dist/routes/timelines.d.ts.map +1 -1
- package/dist/routes/timelines.js +209 -16
- package/dist/routes/timelines.js.map +1 -1
- package/dist/screenshot-docs-seed.d.ts +24 -0
- package/dist/screenshot-docs-seed.d.ts.map +1 -0
- package/dist/screenshot-docs-seed.js +421 -0
- package/dist/screenshot-docs-seed.js.map +1 -0
- package/dist/screenshot-projects.d.ts.map +1 -1
- package/dist/screenshot-projects.js +9 -9
- package/dist/screenshot-projects.js.map +1 -1
- package/dist/screenshot-server.js +274 -17
- package/dist/screenshot-server.js.map +1 -1
- package/dist/sdk/sdk-node-type-inventory-service.d.ts +1 -1
- package/dist/sdk/sdk-node-type-inventory-service.d.ts.map +1 -1
- package/dist/sdk/sdk-node-type-inventory-service.js +4 -4
- package/dist/sdk/sdk-node-type-inventory-service.js.map +1 -1
- package/dist/sdk/sdk-v1-service.js +1 -1
- package/dist/sdk/sdk-v1-service.js.map +1 -1
- package/dist/server.d.ts +7 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1482 -1487
- package/dist/server.js.map +1 -1
- package/dist/session/chat-prompt.d.ts.map +1 -1
- package/dist/session/chat-prompt.js +6 -0
- package/dist/session/chat-prompt.js.map +1 -1
- package/dist/session/chat-turn.d.ts +10 -0
- package/dist/session/chat-turn.d.ts.map +1 -1
- package/dist/session/chat-turn.js +103 -20
- package/dist/session/chat-turn.js.map +1 -1
- package/dist/session/client-tool-gate.d.ts +23 -0
- package/dist/session/client-tool-gate.d.ts.map +1 -0
- package/dist/session/client-tool-gate.js +59 -0
- package/dist/session/client-tool-gate.js.map +1 -0
- package/dist/session/commands.d.ts +14 -0
- package/dist/session/commands.d.ts.map +1 -1
- package/dist/session/commands.js +113 -14
- package/dist/session/commands.js.map +1 -1
- package/dist/session/inference.d.ts +25 -2
- package/dist/session/inference.d.ts.map +1 -1
- package/dist/session/inference.js +105 -21
- package/dist/session/inference.js.map +1 -1
- package/dist/session/job-execution.d.ts +0 -1
- package/dist/session/job-execution.d.ts.map +1 -1
- package/dist/session/job-execution.js +43 -39
- package/dist/session/job-execution.js.map +1 -1
- package/dist/storage-api.d.ts +0 -4
- package/dist/storage-api.d.ts.map +1 -1
- package/dist/storage-api.js +3 -26
- package/dist/storage-api.js.map +1 -1
- package/dist/test-ui-server.d.ts +15 -3
- package/dist/test-ui-server.d.ts.map +1 -1
- package/dist/test-ui-server.js +74 -12
- package/dist/test-ui-server.js.map +1 -1
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +24 -4
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/triggers/file-watch.d.ts +2 -2
- package/dist/triggers/file-watch.d.ts.map +1 -1
- package/dist/triggers/file-watch.js +44 -21
- package/dist/triggers/file-watch.js.map +1 -1
- package/dist/triggers/scheduler.d.ts.map +1 -1
- package/dist/triggers/scheduler.js +7 -5
- package/dist/triggers/scheduler.js.map +1 -1
- package/dist/trpc/error-formatter.d.ts.map +1 -1
- package/dist/trpc/error-formatter.js +2 -1
- package/dist/trpc/error-formatter.js.map +1 -1
- package/dist/trpc/routers/app-instances.d.ts +63 -0
- package/dist/trpc/routers/app-instances.d.ts.map +1 -1
- package/dist/trpc/routers/app-runs.d.ts +28 -0
- package/dist/trpc/routers/app-runs.d.ts.map +1 -1
- package/dist/trpc/routers/applications.d.ts +7 -0
- package/dist/trpc/routers/applications.d.ts.map +1 -1
- package/dist/trpc/routers/assets.d.ts +8 -0
- package/dist/trpc/routers/assets.d.ts.map +1 -1
- package/dist/trpc/routers/assets.js +16 -5
- package/dist/trpc/routers/assets.js.map +1 -1
- package/dist/trpc/routers/collections.d.ts.map +1 -1
- package/dist/trpc/routers/collections.js +16 -10
- package/dist/trpc/routers/collections.js.map +1 -1
- package/dist/trpc/routers/credits.d.ts.map +1 -1
- package/dist/trpc/routers/credits.js +11 -1
- package/dist/trpc/routers/credits.js.map +1 -1
- package/dist/trpc/routers/extension.d.ts +17 -3
- package/dist/trpc/routers/extension.d.ts.map +1 -1
- package/dist/trpc/routers/extension.js +40 -7
- package/dist/trpc/routers/extension.js.map +1 -1
- package/dist/trpc/routers/gameDraftHistory.d.ts +1 -2
- package/dist/trpc/routers/gameDraftHistory.d.ts.map +1 -1
- package/dist/trpc/routers/gameDraftHistory.js +1 -1
- package/dist/trpc/routers/gameDraftHistory.js.map +1 -1
- package/dist/trpc/routers/games.d.ts +20478 -24667
- package/dist/trpc/routers/games.d.ts.map +1 -1
- package/dist/trpc/routers/games.js +325 -143
- package/dist/trpc/routers/games.js.map +1 -1
- package/dist/trpc/routers/jobs.d.ts +7 -0
- package/dist/trpc/routers/jobs.d.ts.map +1 -1
- package/dist/trpc/routers/jobs.js +10 -3
- package/dist/trpc/routers/jobs.js.map +1 -1
- package/dist/trpc/routers/js-scripts.d.ts.map +1 -1
- package/dist/trpc/routers/js-scripts.js +18 -2
- package/dist/trpc/routers/js-scripts.js.map +1 -1
- package/dist/trpc/routers/messages.d.ts +10 -0
- package/dist/trpc/routers/messages.d.ts.map +1 -1
- package/dist/trpc/routers/messages.js +16 -2
- package/dist/trpc/routers/messages.js.map +1 -1
- package/dist/trpc/routers/models.d.ts.map +1 -1
- package/dist/trpc/routers/models.js +58 -37
- package/dist/trpc/routers/models.js.map +1 -1
- package/dist/trpc/routers/packs.d.ts.map +1 -1
- package/dist/trpc/routers/packs.js +19 -5
- package/dist/trpc/routers/packs.js.map +1 -1
- package/dist/trpc/routers/projects.d.ts +66 -2
- package/dist/trpc/routers/projects.d.ts.map +1 -1
- package/dist/trpc/routers/projects.js +19 -2
- package/dist/trpc/routers/projects.js.map +1 -1
- package/dist/trpc/routers/settings.d.ts.map +1 -1
- package/dist/trpc/routers/settings.js +30 -5
- package/dist/trpc/routers/settings.js.map +1 -1
- package/dist/trpc/routers/sketch.d.ts +30 -0
- package/dist/trpc/routers/sketch.d.ts.map +1 -1
- package/dist/trpc/routers/sketch.js +2 -2
- package/dist/trpc/routers/sketch.js.map +1 -1
- package/dist/trpc/routers/storyboards.d.ts +171 -1
- package/dist/trpc/routers/storyboards.d.ts.map +1 -1
- package/dist/trpc/routers/storyboards.js +8 -5
- package/dist/trpc/routers/storyboards.js.map +1 -1
- package/dist/trpc/routers/threads.d.ts.map +1 -1
- package/dist/trpc/routers/threads.js +11 -2
- package/dist/trpc/routers/threads.js.map +1 -1
- package/dist/trpc/routers/timeline.d.ts +379 -0
- package/dist/trpc/routers/timeline.d.ts.map +1 -1
- package/dist/trpc/routers/timeline.js +15 -2
- package/dist/trpc/routers/timeline.js.map +1 -1
- package/dist/trpc/routers/triggers.d.ts.map +1 -1
- package/dist/trpc/routers/triggers.js +18 -3
- package/dist/trpc/routers/triggers.js.map +1 -1
- package/dist/trpc/routers/users.d.ts +3 -2
- package/dist/trpc/routers/users.d.ts.map +1 -1
- package/dist/trpc/routers/users.js +25 -27
- package/dist/trpc/routers/users.js.map +1 -1
- package/dist/trpc/routers/worker.d.ts.map +1 -1
- package/dist/trpc/routers/worker.js +37 -14
- package/dist/trpc/routers/worker.js.map +1 -1
- package/dist/trpc/routers/workflows.d.ts +190 -0
- package/dist/trpc/routers/workflows.d.ts.map +1 -1
- package/dist/trpc/routers/workflows.js +56 -15
- package/dist/trpc/routers/workflows.js.map +1 -1
- package/dist/trpc/sandbox-coverage.d.ts.map +1 -1
- package/dist/trpc/sandbox-coverage.js +34 -0
- package/dist/trpc/sandbox-coverage.js.map +1 -1
- package/dist/websocket-client-session.d.ts +2 -2
- package/dist/websocket-client-session.d.ts.map +1 -1
- package/dist/websocket-client-session.js +9 -3
- package/dist/websocket-client-session.js.map +1 -1
- package/dist/worker-settings-env.d.ts +23 -0
- package/dist/worker-settings-env.d.ts.map +1 -0
- package/dist/worker-settings-env.js +47 -0
- package/dist/worker-settings-env.js.map +1 -0
- package/dist/workflow-interface-service.d.ts +7 -0
- package/dist/workflow-interface-service.d.ts.map +1 -1
- package/package.json +51 -46
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { registerChatRunTrace, registerWorkflowRunTrace, withRegisteredRunTrace, settleRegisteredRunTrace } from "@nodetool-ai/execution";
|
|
2
2
|
import { getRunTraceScope, suppressRunTraceContent } from "@nodetool-ai/runtime";
|
|
3
|
-
import { TRACE_RESTRICTED_CAPABILITY_MODULES } from "@nodetool-ai/protocol";
|
|
3
|
+
import { TRACE_RESTRICTED_CAPABILITY_MODULES, missingPackDetailsOf, isFullResourceId } from "@nodetool-ai/protocol";
|
|
4
4
|
import { trace, SpanStatusCode } from "@opentelemetry/api";
|
|
5
5
|
import { settleRunTrace, registerRunTraceParent, registerRunTraceParents, threadHasTraceContentTools } from "@nodetool-ai/models";
|
|
6
6
|
import { capabilityModuleOf, listCapabilitySpecs } from "@nodetool-ai/agents";
|
|
@@ -8,6 +8,8 @@ import { createLogger } from "@nodetool-ai/config";
|
|
|
8
8
|
import { randomUUID } from "node:crypto";
|
|
9
9
|
import { SUPERSEDED_TOOL_RESULT, repairOrphanedToolCalls } from "../chat-tool-call-repair.js";
|
|
10
10
|
import { attachChatPredictionForwarder } from "../chat-prediction-forwarder.js";
|
|
11
|
+
import { dispatchClientTool } from "./client-tool-gate.js";
|
|
12
|
+
import { admitSpend } from "../credit-gate.js";
|
|
11
13
|
import { isGoogleWorkspaceEnabled } from "@nodetool-ai/config";
|
|
12
14
|
import { isFunctionValue, isNonEmptyString, isNumber, isObjectLike, isRecord, isString } from "../lib/wire-values.js";
|
|
13
15
|
import { storeAssetWithThumbnail } from "../lib/thumbnail.js";
|
|
@@ -16,7 +18,7 @@ import { attachRunCostLedger, linkGenerationAssets, ExecutionSession, isExecutio
|
|
|
16
18
|
import { Asset, COMPACTION_EVENT_TYPE, compactionMessageContent, isCompactionMessage, Job, Message, Prediction, Project, Skill, Thread, Memory, Workflow } from "@nodetool-ai/models";
|
|
17
19
|
import { WORKFLOW_DOCUMENT_TOOL_NAMES } from "@nodetool-ai/node-sdk";
|
|
18
20
|
import { ACTIVE_MODEL_CONTEXT_KEY, DIRECT_TOOL_NAMES, RUN_BUDGET_CONTEXT_KEY, createRunBudget, detectImageMime, IMAGE_MIME_TO_EXT, expandEntitiesForGeneration, getProcessSandboxModuleCatalog, estimatePromptTokens, isToolCall, isProviderSessionUpdate, isProviderMessageEvent, isProviderStop, httpStatusFromError, groqRequestFailureMessage, mediaResolverFor, providerFailureDetail, resolveContextWindow } from "@nodetool-ai/runtime";
|
|
19
|
-
import { isModelSelection, PROVIDER_IDS, NO_MODEL_SELECTED_MESSAGE, noMediaModelSelectedMessage } from "@nodetool-ai/protocol";
|
|
21
|
+
import { isModelSelection, isReasoningEffort, supportsReasoningEffort, PROVIDER_IDS, NO_MODEL_SELECTED_MESSAGE, noMediaModelSelectedMessage } from "@nodetool-ai/protocol";
|
|
20
22
|
import { Tool, compactAssetUris, compactResourceIds } from "@nodetool-ai/agents";
|
|
21
23
|
import { createChatCodeActSession, createSandboxClock, sandboxPackagesForChat, CODEACT_RESIDENT_TOOL_NAMES, EXECUTE_CODE_TOOL_NAME } from "@nodetool-ai/agents";
|
|
22
24
|
import { availableBuiltinToolNames, GOOGLE_WORKSPACE_TOOL_NAMES, APIFY_TOOL_NAMES, SERPAPI_TOOL_NAMES, capabilityForName, capabilityProviderTool, getAllMcpCapabilitySpecs, toolFromCapability, capabilityFromTool, createCapabilityRun, contextSecretAvailability, BackgroundSubtaskRegistry, PERMISSION_GATE_CONTEXT_KEY, GAME_ASSET_NODE_RUNNER_CONTEXT_KEY, extractInjectableImages, registerTemporaryImageHandle } from "@nodetool-ai/agents";
|
|
@@ -248,6 +250,27 @@ const MEMORY_BLOCK_LIMIT = 100;
|
|
|
248
250
|
* full thread load.
|
|
249
251
|
*/
|
|
250
252
|
const SESSION_PROBE_WINDOW = 50;
|
|
253
|
+
/** The most rows of a thread a turn loads as its history. */
|
|
254
|
+
const THREAD_HISTORY_LIMIT = 1000;
|
|
255
|
+
/**
|
|
256
|
+
* The thread's newest rows, oldest first. An ascending page would return the
|
|
257
|
+
* oldest rows instead, and a thread past the limit would then lose its latest
|
|
258
|
+
* turns, the user message just sent among them.
|
|
259
|
+
*
|
|
260
|
+
* A window cut by the limit starts at its first user row, so it never opens on
|
|
261
|
+
* a tool result whose call fell outside it.
|
|
262
|
+
*/
|
|
263
|
+
export async function loadRecentThreadRows(threadId, limit = THREAD_HISTORY_LIMIT) {
|
|
264
|
+
const [newestFirst] = await Message.paginate(threadId, {
|
|
265
|
+
reverse: true,
|
|
266
|
+
limit
|
|
267
|
+
});
|
|
268
|
+
const rows = newestFirst.reverse();
|
|
269
|
+
if (rows.length < limit)
|
|
270
|
+
return rows;
|
|
271
|
+
const firstUser = rows.findIndex((row) => row.role === "user");
|
|
272
|
+
return firstUser > 0 ? rows.slice(firstUser) : rows;
|
|
273
|
+
}
|
|
251
274
|
/**
|
|
252
275
|
* Output-token worst case assumed when reserving a chat turn. The chat loop
|
|
253
276
|
* sends no `maxTokens`, so nothing bounds the answer from this side; the
|
|
@@ -505,6 +528,12 @@ export class ChatTurnHandler {
|
|
|
505
528
|
const existing = await Thread.find(userId, threadId);
|
|
506
529
|
if (existing)
|
|
507
530
|
return existing.id;
|
|
531
|
+
// `create` upserts on the primary key, so creating under an id another
|
|
532
|
+
// user's thread already holds would reassign that thread (and its
|
|
533
|
+
// history) to this caller.
|
|
534
|
+
if (await Thread.get(threadId)) {
|
|
535
|
+
throw new Error("Thread not found");
|
|
536
|
+
}
|
|
508
537
|
const thread = await Thread.create({
|
|
509
538
|
id: threadId,
|
|
510
539
|
user_id: userId,
|
|
@@ -518,14 +547,24 @@ export class ChatTurnHandler {
|
|
|
518
547
|
* Save a message dict to the database.
|
|
519
548
|
* Mirrors Python's _save_message_to_db_async: pops id, type, user_id before create.
|
|
520
549
|
*/
|
|
521
|
-
async saveMessageToDb(messageData) {
|
|
550
|
+
async saveMessageToDb(messageData, options = {}) {
|
|
522
551
|
const data = { ...messageData };
|
|
552
|
+
const clientId = data.id;
|
|
523
553
|
delete data.id;
|
|
524
554
|
delete data.type;
|
|
525
555
|
const threadId = isString(data.thread_id) ? data.thread_id : "";
|
|
526
556
|
delete data.thread_id;
|
|
527
557
|
const userId = this.session.requireUserId();
|
|
528
558
|
delete data.user_id;
|
|
559
|
+
// The user's own turn keeps the id the client minted for it, so the client
|
|
560
|
+
// can name that turn later (Regenerate, edit a sent message) without a
|
|
561
|
+
// round-trip. Anything that is not a fresh 32-hex id is replaced.
|
|
562
|
+
if (options.keepClientId &&
|
|
563
|
+
isString(clientId) &&
|
|
564
|
+
isFullResourceId(clientId) &&
|
|
565
|
+
!(await Message.find(clientId))) {
|
|
566
|
+
data.id = clientId;
|
|
567
|
+
}
|
|
529
568
|
const message = await Message.create({ thread_id: threadId, user_id: userId, ...data });
|
|
530
569
|
const scope = getRunTraceScope();
|
|
531
570
|
if (scope) {
|
|
@@ -939,6 +978,10 @@ export class ChatTurnHandler {
|
|
|
939
978
|
graph = await this.deps.hydrateGraph(rawGraph);
|
|
940
979
|
}
|
|
941
980
|
catch (err) {
|
|
981
|
+
const missing = missingPackDetailsOf(err);
|
|
982
|
+
if (missing) {
|
|
983
|
+
return missing;
|
|
984
|
+
}
|
|
942
985
|
return {
|
|
943
986
|
error: `Failed to prepare node '${nodeType}': ${err instanceof Error ? err.message : String(err)}`
|
|
944
987
|
};
|
|
@@ -948,6 +991,10 @@ export class ChatTurnHandler {
|
|
|
948
991
|
await this.deps.beforeRunJob(graph);
|
|
949
992
|
}
|
|
950
993
|
catch (err) {
|
|
994
|
+
const missing = missingPackDetailsOf(err);
|
|
995
|
+
if (missing) {
|
|
996
|
+
return missing;
|
|
997
|
+
}
|
|
951
998
|
return {
|
|
952
999
|
error: `Node prerequisites failed: ${err instanceof Error ? err.message : String(err)}`
|
|
953
1000
|
};
|
|
@@ -997,6 +1044,10 @@ export class ChatTurnHandler {
|
|
|
997
1044
|
});
|
|
998
1045
|
}
|
|
999
1046
|
catch (err) {
|
|
1047
|
+
const missing = missingPackDetailsOf(err);
|
|
1048
|
+
if (missing) {
|
|
1049
|
+
return missing;
|
|
1050
|
+
}
|
|
1000
1051
|
if (!isExecutionPreflightError(err))
|
|
1001
1052
|
throw err;
|
|
1002
1053
|
return { error: err.message };
|
|
@@ -1015,6 +1066,9 @@ export class ChatTurnHandler {
|
|
|
1015
1066
|
}
|
|
1016
1067
|
}
|
|
1017
1068
|
if (result.status === "failed") {
|
|
1069
|
+
if (result.missingPack) {
|
|
1070
|
+
return result.missingPack;
|
|
1071
|
+
}
|
|
1018
1072
|
return { error: result.error ?? `Node '${nodeType}' failed` };
|
|
1019
1073
|
}
|
|
1020
1074
|
if (nodeResult === undefined) {
|
|
@@ -1083,7 +1137,7 @@ export class ChatTurnHandler {
|
|
|
1083
1137
|
const userId = this.session.requireUserId();
|
|
1084
1138
|
log.debug("Chat message", { threadId, model, provider: providerId });
|
|
1085
1139
|
// Save user message to DB — matches Python's _save_message_to_db_async(data)
|
|
1086
|
-
const turnMessage = await this.saveMessageToDb(data);
|
|
1140
|
+
const turnMessage = await this.saveMessageToDb(data, { keepClientId: true });
|
|
1087
1141
|
const rootContext = createRuntimeContext({ jobId: turnMessage.id, threadId, workflowId, userId, workspace: null });
|
|
1088
1142
|
await registerChatRunTrace(rootContext, { messageId: turnMessage.id, threadId });
|
|
1089
1143
|
return withRegisteredRunTrace(rootContext, "chat.turn", async () => {
|
|
@@ -1117,6 +1171,21 @@ export class ChatTurnHandler {
|
|
|
1117
1171
|
});
|
|
1118
1172
|
return;
|
|
1119
1173
|
}
|
|
1174
|
+
// The managed provider spends NodeTool's own keys against the user's
|
|
1175
|
+
// credits. Every other managed entry point admits against the balance and
|
|
1176
|
+
// the operator's model whitelist first, and so does a chat turn.
|
|
1177
|
+
if (providerId === "nodetool") {
|
|
1178
|
+
const decision = await admitSpend(userId, 0, [model]);
|
|
1179
|
+
if (!decision.allowed) {
|
|
1180
|
+
await settleRegisteredRunTrace(rootContext, "failed", decision.reason);
|
|
1181
|
+
await this.session.send({
|
|
1182
|
+
type: "error",
|
|
1183
|
+
message: decision.reason,
|
|
1184
|
+
thread_id: threadId
|
|
1185
|
+
});
|
|
1186
|
+
return;
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1120
1189
|
// Route to the workflow processor ONLY when the client explicitly opts in
|
|
1121
1190
|
// via `workflow_target: "workflow"`. A bare `workflow_id` is context, not a
|
|
1122
1191
|
// routing signal: the editor binds the open workflow so `ui_*` tools target
|
|
@@ -1127,7 +1196,7 @@ export class ChatTurnHandler {
|
|
|
1127
1196
|
? data.workflow_target
|
|
1128
1197
|
: null;
|
|
1129
1198
|
if (workflowTarget === "workflow") {
|
|
1130
|
-
await this.handleWorkflowMessage(data, requestSeq, signal);
|
|
1199
|
+
await this.handleWorkflowMessage(data, turnMessage.id, requestSeq, signal);
|
|
1131
1200
|
return;
|
|
1132
1201
|
}
|
|
1133
1202
|
// Route to media generation when the client requests a text-to-image or
|
|
@@ -1152,6 +1221,12 @@ export class ChatTurnHandler {
|
|
|
1152
1221
|
data.permission_mode === "default"
|
|
1153
1222
|
? data.permission_mode
|
|
1154
1223
|
: "default";
|
|
1224
|
+
// The composer's reasoning level. Only models that accept it receive it,
|
|
1225
|
+
// so a stale pick from another model is dropped rather than sent.
|
|
1226
|
+
const reasoningEffort = isReasoningEffort(data.reasoning_effort) &&
|
|
1227
|
+
supportsReasoningEffort(providerId, model)
|
|
1228
|
+
? data.reasoning_effort
|
|
1229
|
+
: undefined;
|
|
1155
1230
|
// A surface can send a context-specific system-prompt addendum (e.g. the
|
|
1156
1231
|
// App Builder's build-an-app-UI guidance), layered after the base prompt.
|
|
1157
1232
|
const extraSystemPrompt = isString(data.system_prompt)
|
|
@@ -1285,7 +1360,7 @@ export class ChatTurnHandler {
|
|
|
1285
1360
|
sessionCheckpointOverride =
|
|
1286
1361
|
probeSession.checkpoint + 1 + newTurns.length;
|
|
1287
1362
|
loadFullHistory = async () => {
|
|
1288
|
-
const
|
|
1363
|
+
const rows = await loadRecentThreadRows(threadId);
|
|
1289
1364
|
const full = convertDbMessages(historySinceCompaction(rows));
|
|
1290
1365
|
full.unshift(systemChatMessage());
|
|
1291
1366
|
const scope = getRunTraceScope();
|
|
@@ -1306,7 +1381,7 @@ export class ChatTurnHandler {
|
|
|
1306
1381
|
// all (a far-back session still resumes via the slice path). A session
|
|
1307
1382
|
// older than the compaction cut is not one of them: searching only the
|
|
1308
1383
|
// compacted slice is what keeps the newest marker winning here too.
|
|
1309
|
-
const
|
|
1384
|
+
const rows = await loadRecentThreadRows(threadId);
|
|
1310
1385
|
const kept = historySinceCompaction(rows);
|
|
1311
1386
|
chatHistory = convertDbMessages(kept);
|
|
1312
1387
|
priorSession = lastMatchingProviderSession(kept, providerId, model);
|
|
@@ -1820,16 +1895,18 @@ export class ChatTurnHandler {
|
|
|
1820
1895
|
}
|
|
1821
1896
|
else if (this.deps.clientTools()[toolCall.name]) {
|
|
1822
1897
|
// Client-side tool — round-trip through the UI via the ToolBridge.
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1898
|
+
// A tool that spends money passes the turn's permission gate first.
|
|
1899
|
+
toolResult = await dispatchClientTool(this.chatCapabilityRun, toolCall.name, toolCall.args ?? {}, async () => {
|
|
1900
|
+
await this.session.send({
|
|
1901
|
+
type: "tool_call",
|
|
1902
|
+
thread_id: threadId,
|
|
1903
|
+
tool_call_id: toolCall.id,
|
|
1904
|
+
name: toolCall.name,
|
|
1905
|
+
args: toolCall.args
|
|
1906
|
+
});
|
|
1907
|
+
const clientResult = await this.deps.toolBridge.createWaiter(toolCall.id, 300_000, threadId);
|
|
1908
|
+
return clientResult.result ?? clientResult.content ?? clientResult;
|
|
1829
1909
|
});
|
|
1830
|
-
const clientResult = await this.deps.toolBridge.createWaiter(toolCall.id, 300_000, threadId);
|
|
1831
|
-
toolResult =
|
|
1832
|
-
clientResult.result ?? clientResult.content ?? clientResult;
|
|
1833
1910
|
}
|
|
1834
1911
|
else {
|
|
1835
1912
|
toolResult = { error: `Tool "${toolCall.name}" not available` };
|
|
@@ -2063,7 +2140,7 @@ export class ChatTurnHandler {
|
|
|
2063
2140
|
* turn that cannot run at all.
|
|
2064
2141
|
*/
|
|
2065
2142
|
const compactThread = async (reason) => {
|
|
2066
|
-
const
|
|
2143
|
+
const rows = await loadRecentThreadRows(threadId);
|
|
2067
2144
|
const cut = chooseCompactionCut(historySinceCompaction(rows), compaction.keepUserTurns, {
|
|
2068
2145
|
// Leave room for the summary, turn context and subsequent replies.
|
|
2069
2146
|
maxTokens: compactionThresholdTokens * 0.75 -
|
|
@@ -2177,6 +2254,7 @@ export class ChatTurnHandler {
|
|
|
2177
2254
|
executeTool: useTools ? effectiveExecuteTool : undefined,
|
|
2178
2255
|
maxIterations: MAX_TOOL_ROUNDS,
|
|
2179
2256
|
turnBudget,
|
|
2257
|
+
effort: reasoningEffort,
|
|
2180
2258
|
sequentialTools: session ? true : undefined,
|
|
2181
2259
|
workspaceDir: chatWorkspace?.localDir ?? undefined,
|
|
2182
2260
|
skills: skillsForProvider,
|
|
@@ -3214,7 +3292,7 @@ export class ChatTurnHandler {
|
|
|
3214
3292
|
* 6. Collect output_update results
|
|
3215
3293
|
* 7. Send response message with typed content, then the terminal chunk
|
|
3216
3294
|
*/
|
|
3217
|
-
async handleWorkflowMessage(data, requestSeq, signal) {
|
|
3295
|
+
async handleWorkflowMessage(data, turnMessageId, requestSeq, signal) {
|
|
3218
3296
|
const threadId = isString(data.thread_id) ? data.thread_id : "";
|
|
3219
3297
|
const workflowId = isString(data.workflow_id) ? data.workflow_id : null;
|
|
3220
3298
|
const providerId = isString(data.provider)
|
|
@@ -3256,7 +3334,7 @@ export class ChatTurnHandler {
|
|
|
3256
3334
|
messagesName ??
|
|
3257
3335
|
"messages";
|
|
3258
3336
|
// Build chat history for params — matches Python
|
|
3259
|
-
const
|
|
3337
|
+
const dbMessages = await loadRecentThreadRows(threadId);
|
|
3260
3338
|
const inheritedTrace = getRunTraceScope();
|
|
3261
3339
|
seedStoredToolProvenance(dbMessages);
|
|
3262
3340
|
if (inheritedTrace) {
|
|
@@ -3280,7 +3358,12 @@ export class ChatTurnHandler {
|
|
|
3280
3358
|
// Prepare params — matches Python's WorkflowMessageProcessor
|
|
3281
3359
|
const params = {
|
|
3282
3360
|
[messageInputName]: currentMessage,
|
|
3283
|
-
|
|
3361
|
+
// The stored history already holds this turn's message; it is appended
|
|
3362
|
+
// once, as `currentMessage`.
|
|
3363
|
+
[messagesInputName]: [
|
|
3364
|
+
...chatHistorySerialized.filter((_, i) => dbMessages[i].id !== turnMessageId),
|
|
3365
|
+
currentMessage
|
|
3366
|
+
]
|
|
3284
3367
|
};
|
|
3285
3368
|
if (isObjectLike(data.params)) {
|
|
3286
3369
|
Object.assign(params, data.params);
|