@kortix/sdk 0.9.98
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 +313 -0
- package/dist/files/client.d.ts +96 -0
- package/dist/files/client.d.ts.map +1 -0
- package/dist/files/client.js +346 -0
- package/dist/files/client.js.map +1 -0
- package/dist/files/types.d.ts +82 -0
- package/dist/files/types.d.ts.map +1 -0
- package/dist/files/types.js +6 -0
- package/dist/files/types.js.map +1 -0
- package/dist/index.d.ts +119 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/kortix.d.ts +897 -0
- package/dist/kortix.d.ts.map +1 -0
- package/dist/kortix.js +772 -0
- package/dist/kortix.js.map +1 -0
- package/dist/opencode/client.d.ts +89 -0
- package/dist/opencode/client.d.ts.map +1 -0
- package/dist/opencode/client.js +191 -0
- package/dist/opencode/client.js.map +1 -0
- package/dist/opencode/env.d.ts +13 -0
- package/dist/opencode/env.d.ts.map +1 -0
- package/dist/opencode/env.js +63 -0
- package/dist/opencode/env.js.map +1 -0
- package/dist/opencode/kortix-master.d.ts +487 -0
- package/dist/opencode/kortix-master.d.ts.map +1 -0
- package/dist/opencode/kortix-master.js +313 -0
- package/dist/opencode/kortix-master.js.map +1 -0
- package/dist/opencode/triggers.d.ts +6 -0
- package/dist/opencode/triggers.d.ts.map +1 -0
- package/dist/opencode/triggers.js +34 -0
- package/dist/opencode/triggers.js.map +1 -0
- package/dist/platform/api/errors.d.ts +106 -0
- package/dist/platform/api/errors.d.ts.map +1 -0
- package/dist/platform/api/errors.js +137 -0
- package/dist/platform/api/errors.js.map +1 -0
- package/dist/platform/api-client.d.ts +35 -0
- package/dist/platform/api-client.d.ts.map +1 -0
- package/dist/platform/api-client.js +279 -0
- package/dist/platform/api-client.js.map +1 -0
- package/dist/platform/auth-core.d.ts +60 -0
- package/dist/platform/auth-core.d.ts.map +1 -0
- package/dist/platform/auth-core.js +104 -0
- package/dist/platform/auth-core.js.map +1 -0
- package/dist/platform/auth.d.ts +88 -0
- package/dist/platform/auth.d.ts.map +1 -0
- package/dist/platform/auth.js +161 -0
- package/dist/platform/auth.js.map +1 -0
- package/dist/platform/config-node.d.ts +33 -0
- package/dist/platform/config-node.d.ts.map +1 -0
- package/dist/platform/config-node.js +63 -0
- package/dist/platform/config-node.js.map +1 -0
- package/dist/platform/config.d.ts +77 -0
- package/dist/platform/config.d.ts.map +1 -0
- package/dist/platform/config.js +62 -0
- package/dist/platform/config.js.map +1 -0
- package/dist/platform/feature-flags.d.ts +25 -0
- package/dist/platform/feature-flags.d.ts.map +1 -0
- package/dist/platform/feature-flags.js +114 -0
- package/dist/platform/feature-flags.js.map +1 -0
- package/dist/platform/fresh-sessions.d.ts +4 -0
- package/dist/platform/fresh-sessions.d.ts.map +1 -0
- package/dist/platform/fresh-sessions.js +22 -0
- package/dist/platform/fresh-sessions.js.map +1 -0
- package/dist/platform/instance-routes.d.ts +17 -0
- package/dist/platform/instance-routes.d.ts.map +1 -0
- package/dist/platform/instance-routes.js +105 -0
- package/dist/platform/instance-routes.js.map +1 -0
- package/dist/platform/logger.d.ts +20 -0
- package/dist/platform/logger.d.ts.map +1 -0
- package/dist/platform/logger.js +44 -0
- package/dist/platform/logger.js.map +1 -0
- package/dist/platform/opencode-errors.d.ts +20 -0
- package/dist/platform/opencode-errors.d.ts.map +1 -0
- package/dist/platform/opencode-errors.js +71 -0
- package/dist/platform/opencode-errors.js.map +1 -0
- package/dist/platform/platform-client/backups.d.ts +22 -0
- package/dist/platform/platform-client/backups.d.ts.map +1 -0
- package/dist/platform/platform-client/backups.js +16 -0
- package/dist/platform/platform-client/backups.js.map +1 -0
- package/dist/platform/platform-client/index.d.ts +21 -0
- package/dist/platform/platform-client/index.d.ts.map +1 -0
- package/dist/platform/platform-client/index.js +21 -0
- package/dist/platform/platform-client/index.js.map +1 -0
- package/dist/platform/platform-client/instance-admin.d.ts +67 -0
- package/dist/platform/platform-client/instance-admin.d.ts.map +1 -0
- package/dist/platform/platform-client/instance-admin.js +59 -0
- package/dist/platform/platform-client/instance-admin.js.map +1 -0
- package/dist/platform/platform-client/invites.d.ts +35 -0
- package/dist/platform/platform-client/invites.d.ts.map +1 -0
- package/dist/platform/platform-client/invites.js +25 -0
- package/dist/platform/platform-client/invites.js.map +1 -0
- package/dist/platform/platform-client/lifecycle.d.ts +78 -0
- package/dist/platform/platform-client/lifecycle.d.ts.map +1 -0
- package/dist/platform/platform-client/lifecycle.js +151 -0
- package/dist/platform/platform-client/lifecycle.js.map +1 -0
- package/dist/platform/platform-client/members.d.ts +81 -0
- package/dist/platform/platform-client/members.d.ts.map +1 -0
- package/dist/platform/platform-client/members.js +59 -0
- package/dist/platform/platform-client/members.js.map +1 -0
- package/dist/platform/platform-client/shared.d.ts +44 -0
- package/dist/platform/platform-client/shared.d.ts.map +1 -0
- package/dist/platform/platform-client/shared.js +177 -0
- package/dist/platform/platform-client/shared.js.map +1 -0
- package/dist/platform/platform-client/ssh.d.ts +29 -0
- package/dist/platform/platform-client/ssh.d.ts.map +1 -0
- package/dist/platform/platform-client/ssh.js +14 -0
- package/dist/platform/platform-client/ssh.js.map +1 -0
- package/dist/platform/platform-client/types.d.ts +56 -0
- package/dist/platform/platform-client/types.d.ts.map +1 -0
- package/dist/platform/platform-client/types.js +19 -0
- package/dist/platform/platform-client/types.js.map +1 -0
- package/dist/platform/platform-client/updates.d.ts +117 -0
- package/dist/platform/platform-client/updates.d.ts.map +1 -0
- package/dist/platform/platform-client/updates.js +97 -0
- package/dist/platform/platform-client/updates.js.map +1 -0
- package/dist/platform/platform-client/urls.d.ts +18 -0
- package/dist/platform/platform-client/urls.d.ts.map +1 -0
- package/dist/platform/platform-client/urls.js +31 -0
- package/dist/platform/platform-client/urls.js.map +1 -0
- package/dist/platform/projects-client/access.d.ts +273 -0
- package/dist/platform/projects-client/access.d.ts.map +1 -0
- package/dist/platform/projects-client/access.js +89 -0
- package/dist/platform/projects-client/access.js.map +1 -0
- package/dist/platform/projects-client/accounts.d.ts +184 -0
- package/dist/platform/projects-client/accounts.d.ts.map +1 -0
- package/dist/platform/projects-client/accounts.js +78 -0
- package/dist/platform/projects-client/accounts.js.map +1 -0
- package/dist/platform/projects-client/agent-config.d.ts +58 -0
- package/dist/platform/projects-client/agent-config.d.ts.map +1 -0
- package/dist/platform/projects-client/agent-config.js +9 -0
- package/dist/platform/projects-client/agent-config.js.map +1 -0
- package/dist/platform/projects-client/agent-scope.d.ts +12 -0
- package/dist/platform/projects-client/agent-scope.d.ts.map +1 -0
- package/dist/platform/projects-client/agent-scope.js +6 -0
- package/dist/platform/projects-client/agent-scope.js.map +1 -0
- package/dist/platform/projects-client/apps.d.ts +98 -0
- package/dist/platform/projects-client/apps.d.ts.map +1 -0
- package/dist/platform/projects-client/apps.js +29 -0
- package/dist/platform/projects-client/apps.js.map +1 -0
- package/dist/platform/projects-client/audit.d.ts +85 -0
- package/dist/platform/projects-client/audit.d.ts.map +1 -0
- package/dist/platform/projects-client/audit.js +51 -0
- package/dist/platform/projects-client/audit.js.map +1 -0
- package/dist/platform/projects-client/billing.d.ts +336 -0
- package/dist/platform/projects-client/billing.d.ts.map +1 -0
- package/dist/platform/projects-client/billing.js +260 -0
- package/dist/platform/projects-client/billing.js.map +1 -0
- package/dist/platform/projects-client/change-requests.d.ts +119 -0
- package/dist/platform/projects-client/change-requests.d.ts.map +1 -0
- package/dist/platform/projects-client/change-requests.js +56 -0
- package/dist/platform/projects-client/change-requests.js.map +1 -0
- package/dist/platform/projects-client/channels.d.ts +135 -0
- package/dist/platform/projects-client/channels.d.ts.map +1 -0
- package/dist/platform/projects-client/channels.js +103 -0
- package/dist/platform/projects-client/channels.js.map +1 -0
- package/dist/platform/projects-client/connectors.d.ts +148 -0
- package/dist/platform/projects-client/connectors.d.ts.map +1 -0
- package/dist/platform/projects-client/connectors.js +66 -0
- package/dist/platform/projects-client/connectors.js.map +1 -0
- package/dist/platform/projects-client/files.d.ts +37 -0
- package/dist/platform/projects-client/files.d.ts.map +1 -0
- package/dist/platform/projects-client/files.js +58 -0
- package/dist/platform/projects-client/files.js.map +1 -0
- package/dist/platform/projects-client/gateway.d.ts +177 -0
- package/dist/platform/projects-client/gateway.d.ts.map +1 -0
- package/dist/platform/projects-client/gateway.js +59 -0
- package/dist/platform/projects-client/gateway.js.map +1 -0
- package/dist/platform/projects-client/git-history.d.ts +74 -0
- package/dist/platform/projects-client/git-history.d.ts.map +1 -0
- package/dist/platform/projects-client/git-history.js +40 -0
- package/dist/platform/projects-client/git-history.js.map +1 -0
- package/dist/platform/projects-client/github.d.ts +62 -0
- package/dist/platform/projects-client/github.d.ts.map +1 -0
- package/dist/platform/projects-client/github.js +30 -0
- package/dist/platform/projects-client/github.js.map +1 -0
- package/dist/platform/projects-client/index.d.ts +32 -0
- package/dist/platform/projects-client/index.d.ts.map +1 -0
- package/dist/platform/projects-client/index.js +34 -0
- package/dist/platform/projects-client/index.js.map +1 -0
- package/dist/platform/projects-client/marketplace-catalog.d.ts +76 -0
- package/dist/platform/projects-client/marketplace-catalog.d.ts.map +1 -0
- package/dist/platform/projects-client/marketplace-catalog.js +48 -0
- package/dist/platform/projects-client/marketplace-catalog.js.map +1 -0
- package/dist/platform/projects-client/marketplace.d.ts +80 -0
- package/dist/platform/projects-client/marketplace.d.ts.map +1 -0
- package/dist/platform/projects-client/marketplace.js +52 -0
- package/dist/platform/projects-client/marketplace.js.map +1 -0
- package/dist/platform/projects-client/model-defaults.d.ts +36 -0
- package/dist/platform/projects-client/model-defaults.d.ts.map +1 -0
- package/dist/platform/projects-client/model-defaults.js +16 -0
- package/dist/platform/projects-client/model-defaults.js.map +1 -0
- package/dist/platform/projects-client/policies.d.ts +21 -0
- package/dist/platform/projects-client/policies.d.ts.map +1 -0
- package/dist/platform/projects-client/policies.js +10 -0
- package/dist/platform/projects-client/policies.js.map +1 -0
- package/dist/platform/projects-client/projects.d.ts +235 -0
- package/dist/platform/projects-client/projects.d.ts.map +1 -0
- package/dist/platform/projects-client/projects.js +161 -0
- package/dist/platform/projects-client/projects.js.map +1 -0
- package/dist/platform/projects-client/public-session-shares.d.ts +52 -0
- package/dist/platform/projects-client/public-session-shares.d.ts.map +1 -0
- package/dist/platform/projects-client/public-session-shares.js +54 -0
- package/dist/platform/projects-client/public-session-shares.js.map +1 -0
- package/dist/platform/projects-client/review.d.ts +57 -0
- package/dist/platform/projects-client/review.d.ts.map +1 -0
- package/dist/platform/projects-client/review.js +28 -0
- package/dist/platform/projects-client/review.js.map +1 -0
- package/dist/platform/projects-client/sandbox-shares.d.ts +25 -0
- package/dist/platform/projects-client/sandbox-shares.d.ts.map +1 -0
- package/dist/platform/projects-client/sandbox-shares.js +29 -0
- package/dist/platform/projects-client/sandbox-shares.js.map +1 -0
- package/dist/platform/projects-client/sandbox.d.ts +123 -0
- package/dist/platform/projects-client/sandbox.d.ts.map +1 -0
- package/dist/platform/projects-client/sandbox.js +45 -0
- package/dist/platform/projects-client/sandbox.js.map +1 -0
- package/dist/platform/projects-client/secrets.d.ts +122 -0
- package/dist/platform/projects-client/secrets.d.ts.map +1 -0
- package/dist/platform/projects-client/secrets.js +34 -0
- package/dist/platform/projects-client/secrets.js.map +1 -0
- package/dist/platform/projects-client/session-sandbox.d.ts +61 -0
- package/dist/platform/projects-client/session-sandbox.d.ts.map +1 -0
- package/dist/platform/projects-client/session-sandbox.js +82 -0
- package/dist/platform/projects-client/session-sandbox.js.map +1 -0
- package/dist/platform/projects-client/sessions.d.ts +216 -0
- package/dist/platform/projects-client/sessions.d.ts.map +1 -0
- package/dist/platform/projects-client/sessions.js +74 -0
- package/dist/platform/projects-client/sessions.js.map +1 -0
- package/dist/platform/projects-client/setup-links.d.ts +35 -0
- package/dist/platform/projects-client/setup-links.d.ts.map +1 -0
- package/dist/platform/projects-client/setup-links.js +24 -0
- package/dist/platform/projects-client/setup-links.js.map +1 -0
- package/dist/platform/projects-client/shared.d.ts +66 -0
- package/dist/platform/projects-client/shared.d.ts.map +1 -0
- package/dist/platform/projects-client/shared.js +44 -0
- package/dist/platform/projects-client/shared.js.map +1 -0
- package/dist/platform/projects-client/tokens.d.ts +77 -0
- package/dist/platform/projects-client/tokens.d.ts.map +1 -0
- package/dist/platform/projects-client/tokens.js +43 -0
- package/dist/platform/projects-client/tokens.js.map +1 -0
- package/dist/platform/projects-client/transcription.d.ts +5 -0
- package/dist/platform/projects-client/transcription.d.ts.map +1 -0
- package/dist/platform/projects-client/transcription.js +14 -0
- package/dist/platform/projects-client/transcription.js.map +1 -0
- package/dist/platform/projects-client/triggers.d.ts +102 -0
- package/dist/platform/projects-client/triggers.d.ts.map +1 -0
- package/dist/platform/projects-client/triggers.js +27 -0
- package/dist/platform/projects-client/triggers.js.map +1 -0
- package/dist/platform/session-id.d.ts +9 -0
- package/dist/platform/session-id.d.ts.map +1 -0
- package/dist/platform/session-id.js +23 -0
- package/dist/platform/session-id.js.map +1 -0
- package/dist/platform/storage/managed-storage.d.ts +97 -0
- package/dist/platform/storage/managed-storage.d.ts.map +1 -0
- package/dist/platform/storage/managed-storage.js +271 -0
- package/dist/platform/storage/managed-storage.js.map +1 -0
- package/dist/platform/strings.d.ts +12 -0
- package/dist/platform/strings.d.ts.map +1 -0
- package/dist/platform/strings.js +17 -0
- package/dist/platform/strings.js.map +1 -0
- package/dist/platform/ui.d.ts +11 -0
- package/dist/platform/ui.d.ts.map +1 -0
- package/dist/platform/ui.js +22 -0
- package/dist/platform/ui.js.map +1 -0
- package/dist/react/chat/index.d.ts +3 -0
- package/dist/react/chat/index.d.ts.map +1 -0
- package/dist/react/chat/index.js +7 -0
- package/dist/react/chat/index.js.map +1 -0
- package/dist/react/chat/render-parts.d.ts +39 -0
- package/dist/react/chat/render-parts.d.ts.map +1 -0
- package/dist/react/chat/render-parts.js +34 -0
- package/dist/react/chat/render-parts.js.map +1 -0
- package/dist/react/chat/use-chat-turns.d.ts +19 -0
- package/dist/react/chat/use-chat-turns.d.ts.map +1 -0
- package/dist/react/chat/use-chat-turns.js +27 -0
- package/dist/react/chat/use-chat-turns.js.map +1 -0
- package/dist/react/file-keys.d.ts +18 -0
- package/dist/react/file-keys.d.ts.map +1 -0
- package/dist/react/file-keys.js +18 -0
- package/dist/react/file-keys.js.map +1 -0
- package/dist/react/index.d.ts +12 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +49 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/model-flatten.d.ts +33 -0
- package/dist/react/model-flatten.d.ts.map +1 -0
- package/dist/react/model-flatten.js +59 -0
- package/dist/react/model-flatten.js.map +1 -0
- package/dist/react/opencode.d.ts +43 -0
- package/dist/react/opencode.d.ts.map +1 -0
- package/dist/react/opencode.js +100 -0
- package/dist/react/opencode.js.map +1 -0
- package/dist/react/prefetch-session-start.d.ts +10 -0
- package/dist/react/prefetch-session-start.d.ts.map +1 -0
- package/dist/react/prefetch-session-start.js +17 -0
- package/dist/react/prefetch-session-start.js.map +1 -0
- package/dist/react/provider-refresh.d.ts +7 -0
- package/dist/react/provider-refresh.d.ts.map +1 -0
- package/dist/react/provider-refresh.js +28 -0
- package/dist/react/provider-refresh.js.map +1 -0
- package/dist/react/provider-selection.d.ts +31 -0
- package/dist/react/provider-selection.d.ts.map +1 -0
- package/dist/react/provider-selection.js +135 -0
- package/dist/react/provider-selection.js.map +1 -0
- package/dist/react/route-project.d.ts +7 -0
- package/dist/react/route-project.d.ts.map +1 -0
- package/dist/react/route-project.js +19 -0
- package/dist/react/route-project.js.map +1 -0
- package/dist/react/session-start-stash.d.ts +56 -0
- package/dist/react/session-start-stash.d.ts.map +1 -0
- package/dist/react/session-start-stash.js +202 -0
- package/dist/react/session-start-stash.js.map +1 -0
- package/dist/react/use-canonical-opencode-session.d.ts +35 -0
- package/dist/react/use-canonical-opencode-session.d.ts.map +1 -0
- package/dist/react/use-canonical-opencode-session.js +52 -0
- package/dist/react/use-canonical-opencode-session.js.map +1 -0
- package/dist/react/use-change-requests.d.ts +321 -0
- package/dist/react/use-change-requests.d.ts.map +1 -0
- package/dist/react/use-change-requests.js +43 -0
- package/dist/react/use-change-requests.js.map +1 -0
- package/dist/react/use-current-runtime.d.ts +8 -0
- package/dist/react/use-current-runtime.d.ts.map +1 -0
- package/dist/react/use-current-runtime.js +12 -0
- package/dist/react/use-current-runtime.js.map +1 -0
- package/dist/react/use-gateway-catalog-sync.d.ts +2 -0
- package/dist/react/use-gateway-catalog-sync.d.ts.map +1 -0
- package/dist/react/use-gateway-catalog-sync.js +39 -0
- package/dist/react/use-gateway-catalog-sync.js.map +1 -0
- package/dist/react/use-kortix-master.d.ts +384 -0
- package/dist/react/use-kortix-master.d.ts.map +1 -0
- package/dist/react/use-kortix-master.js +958 -0
- package/dist/react/use-kortix-master.js.map +1 -0
- package/dist/react/use-model-store.d.ts +71 -0
- package/dist/react/use-model-store.d.ts.map +1 -0
- package/dist/react/use-model-store.js +411 -0
- package/dist/react/use-model-store.js.map +1 -0
- package/dist/react/use-opencode-config.d.ts +15 -0
- package/dist/react/use-opencode-config.d.ts.map +1 -0
- package/dist/react/use-opencode-config.js +79 -0
- package/dist/react/use-opencode-config.js.map +1 -0
- package/dist/react/use-opencode-events/diagnostics.d.ts +11 -0
- package/dist/react/use-opencode-events/diagnostics.d.ts.map +1 -0
- package/dist/react/use-opencode-events/diagnostics.js +58 -0
- package/dist/react/use-opencode-events/diagnostics.js.map +1 -0
- package/dist/react/use-opencode-events/handle-event.d.ts +20 -0
- package/dist/react/use-opencode-events/handle-event.d.ts.map +1 -0
- package/dist/react/use-opencode-events/handle-event.js +450 -0
- package/dist/react/use-opencode-events/handle-event.js.map +1 -0
- package/dist/react/use-opencode-events/helpers.d.ts +30 -0
- package/dist/react/use-opencode-events/helpers.d.ts.map +1 -0
- package/dist/react/use-opencode-events/helpers.js +93 -0
- package/dist/react/use-opencode-events/helpers.js.map +1 -0
- package/dist/react/use-opencode-events/index.d.ts +25 -0
- package/dist/react/use-opencode-events/index.d.ts.map +1 -0
- package/dist/react/use-opencode-events/index.js +242 -0
- package/dist/react/use-opencode-events/index.js.map +1 -0
- package/dist/react/use-opencode-events/types.d.ts +10 -0
- package/dist/react/use-opencode-events/types.d.ts.map +1 -0
- package/dist/react/use-opencode-events/types.js +2 -0
- package/dist/react/use-opencode-events/types.js.map +1 -0
- package/dist/react/use-opencode-events/use-event-stream-refs.d.ts +22 -0
- package/dist/react/use-opencode-events/use-event-stream-refs.d.ts.map +1 -0
- package/dist/react/use-opencode-events/use-event-stream-refs.js +158 -0
- package/dist/react/use-opencode-events/use-event-stream-refs.js.map +1 -0
- package/dist/react/use-opencode-local.d.ts +139 -0
- package/dist/react/use-opencode-local.d.ts.map +1 -0
- package/dist/react/use-opencode-local.js +484 -0
- package/dist/react/use-opencode-local.js.map +1 -0
- package/dist/react/use-opencode-mcp.d.ts +34 -0
- package/dist/react/use-opencode-mcp.d.ts.map +1 -0
- package/dist/react/use-opencode-mcp.js +190 -0
- package/dist/react/use-opencode-mcp.js.map +1 -0
- package/dist/react/use-opencode-pty.d.ts +30 -0
- package/dist/react/use-opencode-pty.d.ts.map +1 -0
- package/dist/react/use-opencode-pty.js +126 -0
- package/dist/react/use-opencode-pty.js.map +1 -0
- package/dist/react/use-opencode-sessions/agents.d.ts +14 -0
- package/dist/react/use-opencode-sessions/agents.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/agents.js +82 -0
- package/dist/react/use-opencode-sessions/agents.js.map +1 -0
- package/dist/react/use-opencode-sessions/commands.d.ts +8 -0
- package/dist/react/use-opencode-sessions/commands.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/commands.js +46 -0
- package/dist/react/use-opencode-sessions/commands.js.map +1 -0
- package/dist/react/use-opencode-sessions/files.d.ts +2 -0
- package/dist/react/use-opencode-sessions/files.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/files.js +181 -0
- package/dist/react/use-opencode-sessions/files.js.map +1 -0
- package/dist/react/use-opencode-sessions/index.d.ts +15 -0
- package/dist/react/use-opencode-sessions/index.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/index.js +21 -0
- package/dist/react/use-opencode-sessions/index.js.map +1 -0
- package/dist/react/use-opencode-sessions/keys.d.ts +94 -0
- package/dist/react/use-opencode-sessions/keys.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/keys.js +39 -0
- package/dist/react/use-opencode-sessions/keys.js.map +1 -0
- package/dist/react/use-opencode-sessions/mcp.d.ts +3 -0
- package/dist/react/use-opencode-sessions/mcp.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/mcp.js +23 -0
- package/dist/react/use-opencode-sessions/mcp.js.map +1 -0
- package/dist/react/use-opencode-sessions/messages.d.ts +75 -0
- package/dist/react/use-opencode-sessions/messages.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/messages.js +319 -0
- package/dist/react/use-opencode-sessions/messages.js.map +1 -0
- package/dist/react/use-opencode-sessions/parts.d.ts +23 -0
- package/dist/react/use-opencode-sessions/parts.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/parts.js +49 -0
- package/dist/react/use-opencode-sessions/parts.js.map +1 -0
- package/dist/react/use-opencode-sessions/permissions.d.ts +17 -0
- package/dist/react/use-opencode-sessions/permissions.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/permissions.js +66 -0
- package/dist/react/use-opencode-sessions/permissions.js.map +1 -0
- package/dist/react/use-opencode-sessions/projects.d.ts +5 -0
- package/dist/react/use-opencode-sessions/projects.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/projects.js +54 -0
- package/dist/react/use-opencode-sessions/projects.js.map +1 -0
- package/dist/react/use-opencode-sessions/providers.d.ts +10 -0
- package/dist/react/use-opencode-sessions/providers.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/providers.js +98 -0
- package/dist/react/use-opencode-sessions/providers.js.map +1 -0
- package/dist/react/use-opencode-sessions/sessions.d.ts +35 -0
- package/dist/react/use-opencode-sessions/sessions.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/sessions.js +380 -0
- package/dist/react/use-opencode-sessions/sessions.js.map +1 -0
- package/dist/react/use-opencode-sessions/shared.d.ts +43 -0
- package/dist/react/use-opencode-sessions/shared.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/shared.js +109 -0
- package/dist/react/use-opencode-sessions/shared.js.map +1 -0
- package/dist/react/use-opencode-sessions/sharing.d.ts +4 -0
- package/dist/react/use-opencode-sessions/sharing.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/sharing.js +57 -0
- package/dist/react/use-opencode-sessions/sharing.js.map +1 -0
- package/dist/react/use-opencode-sessions/tools.d.ts +5 -0
- package/dist/react/use-opencode-sessions/tools.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/tools.js +54 -0
- package/dist/react/use-opencode-sessions/tools.js.map +1 -0
- package/dist/react/use-permission-self-heal.d.ts +45 -0
- package/dist/react/use-permission-self-heal.d.ts.map +1 -0
- package/dist/react/use-permission-self-heal.js +144 -0
- package/dist/react/use-permission-self-heal.js.map +1 -0
- package/dist/react/use-project-config.d.ts +11 -0
- package/dist/react/use-project-config.d.ts.map +1 -0
- package/dist/react/use-project-config.js +22 -0
- package/dist/react/use-project-config.js.map +1 -0
- package/dist/react/use-project-models.d.ts +11 -0
- package/dist/react/use-project-models.d.ts.map +1 -0
- package/dist/react/use-project-models.js +25 -0
- package/dist/react/use-project-models.js.map +1 -0
- package/dist/react/use-project-secrets.d.ts +265 -0
- package/dist/react/use-project-secrets.d.ts.map +1 -0
- package/dist/react/use-project-secrets.js +41 -0
- package/dist/react/use-project-secrets.js.map +1 -0
- package/dist/react/use-project-triggers.d.ts +228 -0
- package/dist/react/use-project-triggers.d.ts.map +1 -0
- package/dist/react/use-project-triggers.js +42 -0
- package/dist/react/use-project-triggers.js.map +1 -0
- package/dist/react/use-question-self-heal.d.ts +36 -0
- package/dist/react/use-question-self-heal.d.ts.map +1 -0
- package/dist/react/use-question-self-heal.js +95 -0
- package/dist/react/use-question-self-heal.js.map +1 -0
- package/dist/react/use-runtime-phase.d.ts +9 -0
- package/dist/react/use-runtime-phase.d.ts.map +1 -0
- package/dist/react/use-runtime-phase.js +20 -0
- package/dist/react/use-runtime-phase.js.map +1 -0
- package/dist/react/use-runtime-reconnect.d.ts +90 -0
- package/dist/react/use-runtime-reconnect.d.ts.map +1 -0
- package/dist/react/use-runtime-reconnect.js +234 -0
- package/dist/react/use-runtime-reconnect.js.map +1 -0
- package/dist/react/use-session-picks.d.ts +17 -0
- package/dist/react/use-session-picks.d.ts.map +1 -0
- package/dist/react/use-session-picks.js +36 -0
- package/dist/react/use-session-picks.js.map +1 -0
- package/dist/react/use-session-prefetch.d.ts +18 -0
- package/dist/react/use-session-prefetch.d.ts.map +1 -0
- package/dist/react/use-session-prefetch.js +84 -0
- package/dist/react/use-session-prefetch.js.map +1 -0
- package/dist/react/use-session-send.d.ts +183 -0
- package/dist/react/use-session-send.d.ts.map +1 -0
- package/dist/react/use-session-send.js +287 -0
- package/dist/react/use-session-send.js.map +1 -0
- package/dist/react/use-session-sync.d.ts +24 -0
- package/dist/react/use-session-sync.d.ts.map +1 -0
- package/dist/react/use-session-sync.js +375 -0
- package/dist/react/use-session-sync.js.map +1 -0
- package/dist/react/use-session.d.ts +171 -0
- package/dist/react/use-session.d.ts.map +1 -0
- package/dist/react/use-session.js +396 -0
- package/dist/react/use-session.js.map +1 -0
- package/dist/react/use-visible-agents.d.ts +22 -0
- package/dist/react/use-visible-agents.d.ts.map +1 -0
- package/dist/react/use-visible-agents.js +45 -0
- package/dist/react/use-visible-agents.js.map +1 -0
- package/dist/server.d.ts +55 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +122 -0
- package/dist/server.js.map +1 -0
- package/dist/session/health.d.ts +49 -0
- package/dist/session/health.d.ts.map +1 -0
- package/dist/session/health.js +57 -0
- package/dist/session/health.js.map +1 -0
- package/dist/session/index.d.ts +19 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +19 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/preview.d.ts +24 -0
- package/dist/session/preview.d.ts.map +1 -0
- package/dist/session/preview.js +85 -0
- package/dist/session/preview.js.map +1 -0
- package/dist/session/url.d.ts +160 -0
- package/dist/session/url.d.ts.map +1 -0
- package/dist/session/url.js +522 -0
- package/dist/session/url.js.map +1 -0
- package/dist/state/chat-events.d.ts +141 -0
- package/dist/state/chat-events.d.ts.map +1 -0
- package/dist/state/chat-events.js +135 -0
- package/dist/state/chat-events.js.map +1 -0
- package/dist/state/current-runtime.d.ts +44 -0
- package/dist/state/current-runtime.d.ts.map +1 -0
- package/dist/state/current-runtime.js +44 -0
- package/dist/state/current-runtime.js.map +1 -0
- package/dist/state/diagnostics-store.d.ts +114 -0
- package/dist/state/diagnostics-store.d.ts.map +1 -0
- package/dist/state/diagnostics-store.js +319 -0
- package/dist/state/diagnostics-store.js.map +1 -0
- package/dist/state/event-stream.d.ts +134 -0
- package/dist/state/event-stream.d.ts.map +1 -0
- package/dist/state/event-stream.js +424 -0
- package/dist/state/event-stream.js.map +1 -0
- package/dist/state/idb-sync-cache.d.ts +18 -0
- package/dist/state/idb-sync-cache.d.ts.map +1 -0
- package/dist/state/idb-sync-cache.js +209 -0
- package/dist/state/idb-sync-cache.js.map +1 -0
- package/dist/state/opencode-compaction-store.d.ts +10 -0
- package/dist/state/opencode-compaction-store.d.ts.map +1 -0
- package/dist/state/opencode-compaction-store.js +32 -0
- package/dist/state/opencode-compaction-store.js.map +1 -0
- package/dist/state/opencode-pending-store.d.ts +19 -0
- package/dist/state/opencode-pending-store.d.ts.map +1 -0
- package/dist/state/opencode-pending-store.js +76 -0
- package/dist/state/opencode-pending-store.js.map +1 -0
- package/dist/state/sandbox-connection-store.d.ts +62 -0
- package/dist/state/sandbox-connection-store.d.ts.map +1 -0
- package/dist/state/sandbox-connection-store.js +290 -0
- package/dist/state/sandbox-connection-store.js.map +1 -0
- package/dist/state/server-store/active.d.ts +49 -0
- package/dist/state/server-store/active.d.ts.map +1 -0
- package/dist/state/server-store/active.js +76 -0
- package/dist/state/server-store/active.js.map +1 -0
- package/dist/state/server-store/types.d.ts +12 -0
- package/dist/state/server-store/types.d.ts.map +1 -0
- package/dist/state/server-store/types.js +2 -0
- package/dist/state/server-store/types.js.map +1 -0
- package/dist/state/server-store/url-helpers.d.ts +33 -0
- package/dist/state/server-store/url-helpers.d.ts.map +1 -0
- package/dist/state/server-store/url-helpers.js +55 -0
- package/dist/state/server-store/url-helpers.js.map +1 -0
- package/dist/state/server-store.d.ts +18 -0
- package/dist/state/server-store.d.ts.map +1 -0
- package/dist/state/server-store.js +23 -0
- package/dist/state/server-store.js.map +1 -0
- package/dist/state/session-runtime-registry.d.ts +49 -0
- package/dist/state/session-runtime-registry.d.ts.map +1 -0
- package/dist/state/session-runtime-registry.js +85 -0
- package/dist/state/session-runtime-registry.js.map +1 -0
- package/dist/state/sync-store/ascending-id.d.ts +2 -0
- package/dist/state/sync-store/ascending-id.d.ts.map +1 -0
- package/dist/state/sync-store/ascending-id.js +21 -0
- package/dist/state/sync-store/ascending-id.js.map +1 -0
- package/dist/state/sync-store/binary.d.ts +7 -0
- package/dist/state/sync-store/binary.d.ts.map +1 -0
- package/dist/state/sync-store/binary.js +21 -0
- package/dist/state/sync-store/binary.js.map +1 -0
- package/dist/state/sync-store/stream-cache.d.ts +2 -0
- package/dist/state/sync-store/stream-cache.d.ts.map +1 -0
- package/dist/state/sync-store/stream-cache.js +29 -0
- package/dist/state/sync-store/stream-cache.js.map +1 -0
- package/dist/state/sync-store/types.d.ts +29 -0
- package/dist/state/sync-store/types.d.ts.map +1 -0
- package/dist/state/sync-store/types.js +2 -0
- package/dist/state/sync-store/types.js.map +1 -0
- package/dist/state/sync-store.d.ts +39 -0
- package/dist/state/sync-store.d.ts.map +1 -0
- package/dist/state/sync-store.js +692 -0
- package/dist/state/sync-store.js.map +1 -0
- package/dist/state/tab-store.d.ts +91 -0
- package/dist/state/tab-store.d.ts.map +1 -0
- package/dist/state/tab-store.js +369 -0
- package/dist/state/tab-store.js.map +1 -0
- package/dist/transcript.d.ts +40 -0
- package/dist/transcript.d.ts.map +1 -0
- package/dist/transcript.js +126 -0
- package/dist/transcript.js.map +1 -0
- package/dist/turns/classify.d.ts +166 -0
- package/dist/turns/classify.d.ts.map +1 -0
- package/dist/turns/classify.js +259 -0
- package/dist/turns/classify.js.map +1 -0
- package/dist/turns/errors.d.ts +11 -0
- package/dist/turns/errors.d.ts.map +1 -0
- package/dist/turns/errors.js +85 -0
- package/dist/turns/errors.js.map +1 -0
- package/dist/turns/index.d.ts +264 -0
- package/dist/turns/index.d.ts.map +1 -0
- package/dist/turns/index.js +1243 -0
- package/dist/turns/index.js.map +1 -0
- package/dist/turns/tool-registry.d.ts +33 -0
- package/dist/turns/tool-registry.d.ts.map +1 -0
- package/dist/turns/tool-registry.js +108 -0
- package/dist/turns/tool-registry.js.map +1 -0
- package/dist/turns/types.d.ts +125 -0
- package/dist/turns/types.d.ts.map +1 -0
- package/dist/turns/types.js +12 -0
- package/dist/turns/types.js.map +1 -0
- package/dist/turns/view-model.d.ts +127 -0
- package/dist/turns/view-model.d.ts.map +1 -0
- package/dist/turns/view-model.js +401 -0
- package/dist/turns/view-model.js.map +1 -0
- package/package.json +155 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
3
|
+
import { getClient } from '../opencode/client.js';
|
|
4
|
+
import { useOpenCodeRuntimeReady } from './use-opencode-sessions/keys.js';
|
|
5
|
+
export const configKeys = {
|
|
6
|
+
all: ['opencode', 'config'],
|
|
7
|
+
};
|
|
8
|
+
function unwrap(result) {
|
|
9
|
+
if (result.error) {
|
|
10
|
+
// `error`'s shape varies per endpoint's typed error union — duck-type
|
|
11
|
+
// defensively via `unknown` rather than assume a shape.
|
|
12
|
+
const err = result.error;
|
|
13
|
+
const errRec = err && typeof err === 'object' ? err : undefined;
|
|
14
|
+
const dataRec = errRec?.data && typeof errRec.data === 'object' ? errRec.data : undefined;
|
|
15
|
+
const message = dataRec?.message ?? errRec?.message;
|
|
16
|
+
throw new Error(typeof message === 'string' ? message : 'Request failed');
|
|
17
|
+
}
|
|
18
|
+
return result.data;
|
|
19
|
+
}
|
|
20
|
+
export function useOpenCodeConfig() {
|
|
21
|
+
const runtimeReady = useOpenCodeRuntimeReady();
|
|
22
|
+
return useQuery({
|
|
23
|
+
queryKey: configKeys.all,
|
|
24
|
+
queryFn: async () => {
|
|
25
|
+
const client = getClient();
|
|
26
|
+
const result = await client.global.config.get();
|
|
27
|
+
return unwrap(result);
|
|
28
|
+
},
|
|
29
|
+
enabled: runtimeReady,
|
|
30
|
+
staleTime: Infinity,
|
|
31
|
+
gcTime: 10 * 60 * 1000,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export function useUpdateOpenCodeConfig() {
|
|
35
|
+
const queryClient = useQueryClient();
|
|
36
|
+
return useMutation({
|
|
37
|
+
mutationFn: async (config) => {
|
|
38
|
+
const client = getClient();
|
|
39
|
+
// The SDK's `update` param type wants a full `Config`, but the server
|
|
40
|
+
// accepts (and this hook always sends) a partial merge patch.
|
|
41
|
+
const result = await client.global.config.update({ config: config });
|
|
42
|
+
return unwrap(result);
|
|
43
|
+
},
|
|
44
|
+
onMutate: async (config) => {
|
|
45
|
+
// Cancel in-flight refetches so they don't overwrite optimistic update
|
|
46
|
+
await queryClient.cancelQueries({ queryKey: configKeys.all });
|
|
47
|
+
const previous = queryClient.getQueryData(configKeys.all);
|
|
48
|
+
if (previous) {
|
|
49
|
+
// Optimistically merge the draft into the cached config
|
|
50
|
+
queryClient.setQueryData(configKeys.all, {
|
|
51
|
+
...previous,
|
|
52
|
+
...config,
|
|
53
|
+
permission: typeof config.permission !== 'undefined'
|
|
54
|
+
? config.permission
|
|
55
|
+
: previous.permission,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return { previous };
|
|
59
|
+
},
|
|
60
|
+
onError: (_err, _config, context) => {
|
|
61
|
+
// Roll back to previous cache on failure
|
|
62
|
+
if (context?.previous) {
|
|
63
|
+
queryClient.setQueryData(configKeys.all, context.previous);
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
onSettled: () => {
|
|
67
|
+
// Refetch to get the authoritative server state — only if mounted
|
|
68
|
+
queryClient.refetchQueries({ queryKey: configKeys.all, type: 'active' });
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* @deprecated No longer needed — server persists config correctly.
|
|
74
|
+
* Kept as no-op for existing call sites.
|
|
75
|
+
*/
|
|
76
|
+
export function clearConfigOverrides() {
|
|
77
|
+
// no-op — localStorage overrides removed
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=use-opencode-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-opencode-config.js","sourceRoot":"","sources":["../../src/react/use-opencode-config.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAIvE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,GAAG,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAU;CACrC,CAAC;AAEF,SAAS,MAAM,CAAI,MAAqC;IACtD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,sEAAsE;QACtE,wDAAwD;QACxD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;QACzB,MAAM,MAAM,GAAG,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAE,GAA+B,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7F,MAAM,OAAO,GACX,MAAM,EAAE,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAM,CAAC,IAAgC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzG,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,OAAO,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,MAAM,CAAC,IAAS,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,YAAY,GAAG,uBAAuB,EAAE,CAAC;IAC/C,OAAO,QAAQ,CAAS;QACtB,QAAQ,EAAE,UAAU,CAAC,GAAG;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;KACvB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,KAAK,EAAE,MAAuB,EAAE,EAAE;YAC5C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,sEAAsE;YACtE,8DAA8D;YAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAgB,EAAE,CAAC,CAAC;YAC/E,OAAO,MAAM,CAAC,MAAM,CAAW,CAAC;QAClC,CAAC;QACD,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACzB,uEAAuE;YACvE,MAAM,WAAW,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAS,UAAU,CAAC,GAAG,CAAC,CAAC;YAClE,IAAI,QAAQ,EAAE,CAAC;gBACb,wDAAwD;gBACxD,WAAW,CAAC,YAAY,CAAS,UAAU,CAAC,GAAG,EAAE;oBAC/C,GAAG,QAAQ;oBACX,GAAG,MAAM;oBACT,UAAU,EAAE,OAAO,MAAM,CAAC,UAAU,KAAK,WAAW;wBAClD,CAAC,CAAC,MAAM,CAAC,UAAU;wBACnB,CAAC,CAAC,QAAQ,CAAC,UAAU;iBACd,CAAC,CAAC;YACf,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtB,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;YAClC,yCAAyC;YACzC,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;gBACtB,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,SAAS,EAAE,GAAG,EAAE;YACd,kEAAkE;YAClE,WAAW,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3E,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,yCAAyC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Part } from '@opencode-ai/sdk/v2/client';
|
|
2
|
+
import type { RefObject } from 'react';
|
|
3
|
+
import type { NormalizeDiagnosticPaths } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Extract diagnostics carried by a `message.part.updated` part — both the
|
|
6
|
+
* primary tool-output text path and the legacy `metadata.diagnostics` fallback —
|
|
7
|
+
* and push them into the diagnostics store. Paths are normalized from absolute
|
|
8
|
+
* sandbox paths to project-relative via the supplied ref.
|
|
9
|
+
*/
|
|
10
|
+
export declare function applyPartDiagnostics(part: Part, normalizeDiagnosticPaths: RefObject<NormalizeDiagnosticPaths>): void;
|
|
11
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/react/use-opencode-events/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAExD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,EACV,wBAAwB,EAAE,SAAS,CAAC,wBAAwB,CAAC,GAC5D,IAAI,CAmDN"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { parseDiagnosticsFromToolOutput, useDiagnosticsStore, } from '../../state/diagnostics-store.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extract diagnostics carried by a `message.part.updated` part — both the
|
|
4
|
+
* primary tool-output text path and the legacy `metadata.diagnostics` fallback —
|
|
5
|
+
* and push them into the diagnostics store. Paths are normalized from absolute
|
|
6
|
+
* sandbox paths to project-relative via the supplied ref.
|
|
7
|
+
*/
|
|
8
|
+
export function applyPartDiagnostics(part, normalizeDiagnosticPaths) {
|
|
9
|
+
// Only `ToolPart` carries `.state` — every other `Part` variant doesn't.
|
|
10
|
+
const partState = part.type === 'tool' ? part.state : undefined;
|
|
11
|
+
// --- Primary path: parse diagnostics from tool output text ---
|
|
12
|
+
// The OpenCode backend embeds diagnostics as plain text inside
|
|
13
|
+
// <file_diagnostics> / <project_diagnostics> XML tags in the
|
|
14
|
+
// tool's text output (e.g. after write, edit, diagnostics tools).
|
|
15
|
+
if (partState?.status === 'completed' && partState.output) {
|
|
16
|
+
const output = partState.output;
|
|
17
|
+
if (output.includes('<file_diagnostics>') || output.includes('<project_diagnostics>')) {
|
|
18
|
+
const parsed = parseDiagnosticsFromToolOutput(output);
|
|
19
|
+
const fileCount = Object.keys(parsed).length;
|
|
20
|
+
if (fileCount > 0) {
|
|
21
|
+
// Normalize absolute sandbox paths to project-relative
|
|
22
|
+
const normalized = normalizeDiagnosticPaths.current(parsed);
|
|
23
|
+
// Convert LspDiagnostic[] to RawDiagnostic[] format for the store
|
|
24
|
+
const asRaw = {};
|
|
25
|
+
for (const [file, diags] of Object.entries(normalized)) {
|
|
26
|
+
asRaw[file] = diags.map((d) => ({
|
|
27
|
+
range: {
|
|
28
|
+
start: { line: d.line, character: d.column },
|
|
29
|
+
},
|
|
30
|
+
severity: d.severity,
|
|
31
|
+
message: d.message,
|
|
32
|
+
source: d.source,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
useDiagnosticsStore.getState().setFromLspEvent(asRaw);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// --- Fallback: check metadata.diagnostics (legacy / fork path) ---
|
|
40
|
+
// `metadata` isn't on `ToolStatePending` — narrow it away first.
|
|
41
|
+
const partMeta = partState && partState.status !== 'pending' ? partState.metadata : undefined;
|
|
42
|
+
if (partMeta?.diagnostics && typeof partMeta.diagnostics === 'object') {
|
|
43
|
+
const diagsByFile = partMeta.diagnostics;
|
|
44
|
+
const validEntries = {};
|
|
45
|
+
let hasValid = false;
|
|
46
|
+
for (const [file, diags] of Object.entries(diagsByFile)) {
|
|
47
|
+
if (Array.isArray(diags) && diags.length > 0) {
|
|
48
|
+
validEntries[file] = diags;
|
|
49
|
+
hasValid = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (hasValid) {
|
|
53
|
+
const normalized = normalizeDiagnosticPaths.current(validEntries);
|
|
54
|
+
useDiagnosticsStore.getState().setFromLspEvent(normalized);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/react/use-opencode-events/diagnostics.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,8BAA8B,EAC9B,mBAAmB,GAEpB,MAAM,+BAA+B,CAAC;AAGvC;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAU,EACV,wBAA6D;IAE7D,yEAAyE;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhE,gEAAgE;IAChE,+DAA+D;IAC/D,6DAA6D;IAC7D,kEAAkE;IAClE,IAAI,SAAS,EAAE,MAAM,KAAK,WAAW,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,IAAI,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACtF,MAAM,MAAM,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YAC7C,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,uDAAuD;gBACvD,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC5D,kEAAkE;gBAClE,MAAM,KAAK,GAAoC,EAAE,CAAC;gBAClD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;oBACvD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC9B,KAAK,EAAE;4BACL,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;yBAC7C;wBACD,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,OAAO,EAAE,CAAC,CAAC,OAAO;wBAClB,MAAM,EAAE,CAAC,CAAC,MAAM;qBACjB,CAAC,CAAC,CAAC;gBACN,CAAC;gBACD,mBAAmB,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,iEAAiE;IACjE,MAAM,QAAQ,GAAG,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,IAAI,QAAQ,EAAE,WAAW,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QACtE,MAAM,WAAW,GAAG,QAAQ,CAAC,WAA8C,CAAC;QAC5E,MAAM,YAAY,GAAoC,EAAE,CAAC;QACzD,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACxD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7C,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBAC3B,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAClE,mBAAmB,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type QueryClient } from '@tanstack/react-query';
|
|
2
|
+
import type { Event as OpenCodeSdkEvent, PermissionRequest, QuestionRequest } from '@opencode-ai/sdk/v2/client';
|
|
3
|
+
import type { RefObject } from 'react';
|
|
4
|
+
import { getClient } from '../../opencode/client.js';
|
|
5
|
+
import type { NormalizeDiagnosticPaths, OpenCodeEvent } from './types.js';
|
|
6
|
+
/** Builds the SSE event handler; all closure dependencies are injected. */
|
|
7
|
+
export declare function createEventHandler(deps: {
|
|
8
|
+
queryClient: QueryClient;
|
|
9
|
+
client: ReturnType<typeof getClient>;
|
|
10
|
+
applySyncEvent: (event: OpenCodeSdkEvent) => void;
|
|
11
|
+
stopCompaction: (sessionID: string) => void;
|
|
12
|
+
addPermission: (req: PermissionRequest) => void;
|
|
13
|
+
removePermission: (requestId: string) => void;
|
|
14
|
+
addQuestion: (req: QuestionRequest) => void;
|
|
15
|
+
removeQuestion: (requestId: string) => void;
|
|
16
|
+
normalizeDiagnosticPaths: RefObject<NormalizeDiagnosticPaths>;
|
|
17
|
+
markSessionAbortedLocally: RefObject<(sessionID: string, message?: string) => void>;
|
|
18
|
+
fetchLspDiagnosticsDebounced: RefObject<() => void>;
|
|
19
|
+
}): (event: OpenCodeEvent) => void;
|
|
20
|
+
//# sourceMappingURL=handle-event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle-event.d.ts","sourceRoot":"","sources":["../../../src/react/use-opencode-events/handle-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EACV,KAAK,IAAI,gBAAgB,EACzB,iBAAiB,EACjB,eAAe,EAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUvC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAYlD,OAAO,KAAK,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEvE,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;IACrC,cAAc,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,aAAa,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAChD,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,WAAW,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5C,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,wBAAwB,EAAE,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAC9D,yBAAyB,EAAE,SAAS,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;IACpF,4BAA4B,EAAE,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;CACrD,WA0B6B,aAAa,UA8b1C"}
|
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
import { infoToast, notifyPermissionRequest, notifyQuestion, notifySessionError, notifyTaskComplete, } from '../../platform/ui.js';
|
|
2
|
+
import { deleteSessionFromIDB, saveSessionToIDB } from '../../state/idb-sync-cache.js';
|
|
3
|
+
import { useSyncStore } from '../../state/sync-store.js';
|
|
4
|
+
import { getClient } from '../../opencode/client.js';
|
|
5
|
+
import { fileContentKeys, fileListKeys, gitStatusKeys } from '../file-keys.js';
|
|
6
|
+
import { ptyKeys } from '../use-opencode-pty.js';
|
|
7
|
+
import { opencodeKeys } from '../use-opencode-sessions/index.js';
|
|
8
|
+
import { applyPartDiagnostics } from './diagnostics.js';
|
|
9
|
+
import { asStringOrUndefined, looksLikeAbortError, readSessionInfo, refetchKortixSessionMirrors, scheduleProjectMetadataRefetch, } from './helpers.js';
|
|
10
|
+
/** Builds the SSE event handler; all closure dependencies are injected. */
|
|
11
|
+
export function createEventHandler(deps) {
|
|
12
|
+
const { queryClient, client, applySyncEvent, stopCompaction, addPermission, removePermission, addQuestion, removeQuestion, normalizeDiagnosticPaths, markSessionAbortedLocally, fetchLspDiagnosticsDebounced, } = deps;
|
|
13
|
+
// Helper: look up a session title from the React Query cache for notifications
|
|
14
|
+
function getSessionTitle(sessionID) {
|
|
15
|
+
const sessions = queryClient.getQueryData(opencodeKeys.sessions());
|
|
16
|
+
if (sessions) {
|
|
17
|
+
const s = sessions.find((s) => s.id === sessionID);
|
|
18
|
+
if (s?.title)
|
|
19
|
+
return s.title;
|
|
20
|
+
}
|
|
21
|
+
const session = queryClient.getQueryData(opencodeKeys.session(sessionID));
|
|
22
|
+
return session?.title || undefined;
|
|
23
|
+
}
|
|
24
|
+
function handleEvent(event) {
|
|
25
|
+
// Sync store is the SINGLE source of truth for messages & parts.
|
|
26
|
+
// This matches OpenCode's architecture where the SolidJS store is
|
|
27
|
+
// the only place message/part data lives.
|
|
28
|
+
//
|
|
29
|
+
// `event` also carries the frontend-synthesized `lsp.client.diagnostics`
|
|
30
|
+
// member (see `OpenCodeEvent`), which isn't a real wire event and doesn't
|
|
31
|
+
// match any `applyEvent` case (falls through to its `default`) — the
|
|
32
|
+
// assertion below just widens past that one extra union member.
|
|
33
|
+
applySyncEvent(event);
|
|
34
|
+
switch (event.type) {
|
|
35
|
+
// ---- Message events — handled by sync store only ----
|
|
36
|
+
case 'message.updated':
|
|
37
|
+
case 'message.removed':
|
|
38
|
+
break;
|
|
39
|
+
case 'message.part.updated': {
|
|
40
|
+
// Extract diagnostics from tool output and/or metadata
|
|
41
|
+
applyPartDiagnostics(event.properties.part, normalizeDiagnosticPaths);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
case 'message.part.removed':
|
|
45
|
+
break;
|
|
46
|
+
// ---- Session lifecycle — surgical cache mutations (zero HTTP) ----
|
|
47
|
+
//
|
|
48
|
+
// IMPORTANT: Return the old array reference when nothing changed.
|
|
49
|
+
// Creating new arrays on every SSE event causes cascading re-renders
|
|
50
|
+
// in all session list consumers, which triggers a Radix UI compose-refs
|
|
51
|
+
// infinite loop (Maximum update depth exceeded).
|
|
52
|
+
case 'session.created': {
|
|
53
|
+
const info = readSessionInfo(event);
|
|
54
|
+
if (info) {
|
|
55
|
+
queryClient.setQueryData(opencodeKeys.sessions(), (old) => {
|
|
56
|
+
if (!old)
|
|
57
|
+
return [info];
|
|
58
|
+
const exists = old.findIndex((s) => s.id === info.id);
|
|
59
|
+
if (exists >= 0) {
|
|
60
|
+
// Already exists — check if actually changed
|
|
61
|
+
if (old[exists].time.updated === info.time.updated)
|
|
62
|
+
return old;
|
|
63
|
+
const next = [...old];
|
|
64
|
+
next[exists] = info;
|
|
65
|
+
return next.sort((a, b) => b.time.updated - a.time.updated);
|
|
66
|
+
}
|
|
67
|
+
return [info, ...old].sort((a, b) => b.time.updated - a.time.updated);
|
|
68
|
+
});
|
|
69
|
+
queryClient.setQueryData(opencodeKeys.session(info.id), info);
|
|
70
|
+
refetchKortixSessionMirrors(queryClient);
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case 'session.updated': {
|
|
75
|
+
const info = readSessionInfo(event);
|
|
76
|
+
if (info) {
|
|
77
|
+
// OpenCode auto-titles after the first message via session.updated.
|
|
78
|
+
// Capture the previous title before local cache mutation so we only
|
|
79
|
+
// force the server-owned mirror read when the title actually changed.
|
|
80
|
+
const prevTitle = queryClient
|
|
81
|
+
.getQueryData(opencodeKeys.sessions())
|
|
82
|
+
?.find((s) => s.id === info.id)?.title ??
|
|
83
|
+
queryClient.getQueryData(opencodeKeys.session(info.id))?.title ??
|
|
84
|
+
null;
|
|
85
|
+
const titleChanged = !!info.title && info.title !== prevTitle;
|
|
86
|
+
// Only update individual session cache (cheap, targeted)
|
|
87
|
+
queryClient.setQueryData(opencodeKeys.session(info.id), info);
|
|
88
|
+
// Update session list only if the session actually changed
|
|
89
|
+
queryClient.setQueryData(opencodeKeys.sessions(), (old) => {
|
|
90
|
+
if (!old)
|
|
91
|
+
return old;
|
|
92
|
+
const idx = old.findIndex((s) => s.id === info.id);
|
|
93
|
+
if (idx < 0)
|
|
94
|
+
return old;
|
|
95
|
+
// Shallow check: skip only if BOTH the timestamp and the title are
|
|
96
|
+
// unchanged. Title alone can flip (opencode auto-titles) without a
|
|
97
|
+
// perceptible time bump, and dropping that would keep the tab stale.
|
|
98
|
+
if (old[idx].time.updated === info.time.updated &&
|
|
99
|
+
old[idx].title === info.title)
|
|
100
|
+
return old;
|
|
101
|
+
const next = [...old];
|
|
102
|
+
next[idx] = info;
|
|
103
|
+
return next.sort((a, b) => b.time.updated - a.time.updated);
|
|
104
|
+
});
|
|
105
|
+
if (titleChanged)
|
|
106
|
+
refetchKortixSessionMirrors(queryClient);
|
|
107
|
+
}
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case 'session.deleted': {
|
|
111
|
+
const info = readSessionInfo(event);
|
|
112
|
+
if (info) {
|
|
113
|
+
queryClient.setQueryData(opencodeKeys.sessions(), (old) => {
|
|
114
|
+
if (!old)
|
|
115
|
+
return old;
|
|
116
|
+
const found = old.some((s) => s.id === info.id);
|
|
117
|
+
if (!found)
|
|
118
|
+
return old;
|
|
119
|
+
return old.filter((s) => s.id !== info.id);
|
|
120
|
+
});
|
|
121
|
+
queryClient.removeQueries({ queryKey: opencodeKeys.session(info.id) });
|
|
122
|
+
queryClient.removeQueries({ queryKey: opencodeKeys.messages(info.id) });
|
|
123
|
+
deleteSessionFromIDB(info.id);
|
|
124
|
+
}
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
case 'session.compacted': {
|
|
128
|
+
const sessionID = event.properties.sessionID;
|
|
129
|
+
if (sessionID) {
|
|
130
|
+
stopCompaction(sessionID);
|
|
131
|
+
const client = getClient();
|
|
132
|
+
client.session
|
|
133
|
+
.messages({ sessionID })
|
|
134
|
+
.then((res) => {
|
|
135
|
+
if (res.data) {
|
|
136
|
+
useSyncStore.getState().hydrate(sessionID, res.data);
|
|
137
|
+
const s = useSyncStore.getState();
|
|
138
|
+
const msgs = s.messages[sessionID] ?? [];
|
|
139
|
+
if (msgs.length > 0)
|
|
140
|
+
saveSessionToIDB(sessionID, msgs, s.parts);
|
|
141
|
+
}
|
|
142
|
+
})
|
|
143
|
+
.catch(() => { });
|
|
144
|
+
// Refetch the individual session to clear time.compacting
|
|
145
|
+
// (targeted refetch, not full session list invalidation)
|
|
146
|
+
client.session
|
|
147
|
+
.get({ sessionID })
|
|
148
|
+
.then((res) => {
|
|
149
|
+
if (res.data) {
|
|
150
|
+
const session = res.data;
|
|
151
|
+
queryClient.setQueryData(opencodeKeys.session(sessionID), session);
|
|
152
|
+
// Also update in session list
|
|
153
|
+
queryClient.setQueryData(opencodeKeys.sessions(), (old) => {
|
|
154
|
+
if (!old)
|
|
155
|
+
return old;
|
|
156
|
+
const idx = old.findIndex((s) => s.id === sessionID);
|
|
157
|
+
if (idx < 0)
|
|
158
|
+
return old;
|
|
159
|
+
const next = [...old];
|
|
160
|
+
next[idx] = session;
|
|
161
|
+
return next;
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
})
|
|
165
|
+
.catch(() => { });
|
|
166
|
+
}
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
// ---- Session status ----
|
|
170
|
+
case 'session.status': {
|
|
171
|
+
const { sessionID, status } = event.properties;
|
|
172
|
+
if (sessionID && status) {
|
|
173
|
+
// Detect busy/retry → idle transition BEFORE updating the store
|
|
174
|
+
// (coalescing can drop intermediate busy events, so we check here)
|
|
175
|
+
const prevStatus = useSyncStore.getState().sessionStatus[sessionID];
|
|
176
|
+
if (status.type === 'idle' && prevStatus && prevStatus.type !== 'idle') {
|
|
177
|
+
notifyTaskComplete(sessionID, getSessionTitle(sessionID));
|
|
178
|
+
// Agent finished editing files — refresh the Changes panel.
|
|
179
|
+
// Nothing else invalidates git status for agent-driven edits,
|
|
180
|
+
// so without this the panel shows stale diff state.
|
|
181
|
+
queryClient.invalidateQueries({ queryKey: gitStatusKeys.all, type: 'active' });
|
|
182
|
+
queryClient.invalidateQueries({ queryKey: fileListKeys.all, type: 'active' });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
case 'session.idle': {
|
|
188
|
+
const sessionID = event.properties.sessionID;
|
|
189
|
+
if (sessionID) {
|
|
190
|
+
const prevStatus = useSyncStore.getState().sessionStatus[sessionID];
|
|
191
|
+
if (prevStatus && prevStatus.type !== 'idle') {
|
|
192
|
+
notifyTaskComplete(sessionID, getSessionTitle(sessionID));
|
|
193
|
+
// Agent finished editing files — refresh the Changes panel.
|
|
194
|
+
// Nothing else invalidates git status for agent-driven edits,
|
|
195
|
+
// so without this the panel shows stale diff state.
|
|
196
|
+
queryClient.invalidateQueries({ queryKey: gitStatusKeys.all, type: 'active' });
|
|
197
|
+
queryClient.invalidateQueries({ queryKey: fileListKeys.all, type: 'active' });
|
|
198
|
+
// Persist final session state to IDB when streaming completes
|
|
199
|
+
const s = useSyncStore.getState();
|
|
200
|
+
const msgs = s.messages[sessionID] ?? [];
|
|
201
|
+
if (msgs.length > 0)
|
|
202
|
+
saveSessionToIDB(sessionID, msgs, s.parts);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
// ---- Session errors ----
|
|
208
|
+
case 'session.error': {
|
|
209
|
+
const props = event.properties;
|
|
210
|
+
if (props.sessionID && props.error) {
|
|
211
|
+
const sessionID = props.sessionID;
|
|
212
|
+
const error = props.error;
|
|
213
|
+
stopCompaction(sessionID);
|
|
214
|
+
// Fire browser notification
|
|
215
|
+
const rawMessage = error.data.message;
|
|
216
|
+
const errorTitle = error.name ||
|
|
217
|
+
(typeof rawMessage === 'string' ? rawMessage : undefined) ||
|
|
218
|
+
'An error occurred';
|
|
219
|
+
notifySessionError(sessionID, errorTitle, getSessionTitle(sessionID));
|
|
220
|
+
// Patch the error onto the last assistant message in cache.
|
|
221
|
+
// This is critical because:
|
|
222
|
+
// 1. session.error arrives BEFORE message.updated with .error
|
|
223
|
+
// 2. Some error paths (model-not-found, agent-not-found) never
|
|
224
|
+
// emit message.updated with .error at all
|
|
225
|
+
// 3. Polling can race and overwrite the error from message.updated
|
|
226
|
+
const key = opencodeKeys.messages(sessionID);
|
|
227
|
+
queryClient.cancelQueries({ queryKey: key });
|
|
228
|
+
queryClient.setQueryData(key, (old) => {
|
|
229
|
+
if (!old || old.length === 0)
|
|
230
|
+
return old;
|
|
231
|
+
// Find the last assistant message and patch error onto it
|
|
232
|
+
for (let i = old.length - 1; i >= 0; i--) {
|
|
233
|
+
const info = old[i].info;
|
|
234
|
+
if (info.role === 'assistant') {
|
|
235
|
+
if (info.error)
|
|
236
|
+
return old; // already has error
|
|
237
|
+
const updated = [...old];
|
|
238
|
+
updated[i] = {
|
|
239
|
+
...old[i],
|
|
240
|
+
info: { ...info, error },
|
|
241
|
+
};
|
|
242
|
+
return updated;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return old;
|
|
246
|
+
});
|
|
247
|
+
// Fetch real messages from the server to bring in
|
|
248
|
+
// authoritative data. In error paths the server may never
|
|
249
|
+
// send message.updated for the user message, leaving the
|
|
250
|
+
// optimistic duplicate. After hydrating server data,
|
|
251
|
+
// clear any optimistic messages (now superseded by real
|
|
252
|
+
// ones) to prevent double user bubbles.
|
|
253
|
+
//
|
|
254
|
+
// EXCEPTION: On abort, skip the fetch+hydrate — the server
|
|
255
|
+
// may not have persisted the partial assistant response yet,
|
|
256
|
+
// so hydrating would wipe the streamed content the user saw.
|
|
257
|
+
// The error is already patched onto the message above.
|
|
258
|
+
const isAbortError = looksLikeAbortError(error);
|
|
259
|
+
if (!isAbortError) {
|
|
260
|
+
client.session
|
|
261
|
+
.messages({ sessionID })
|
|
262
|
+
.then((res) => {
|
|
263
|
+
if (!res.data)
|
|
264
|
+
return;
|
|
265
|
+
useSyncStore.getState().hydrate(sessionID, res.data);
|
|
266
|
+
useSyncStore.getState().clearOptimisticMessages(sessionID);
|
|
267
|
+
const s = useSyncStore.getState();
|
|
268
|
+
const msgs = s.messages[sessionID] ?? [];
|
|
269
|
+
if (msgs.length > 0)
|
|
270
|
+
saveSessionToIDB(sessionID, msgs, s.parts);
|
|
271
|
+
})
|
|
272
|
+
.catch(() => { });
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
// Still clear optimistic messages on abort — the real
|
|
276
|
+
// user message should have arrived via SSE by now.
|
|
277
|
+
useSyncStore.getState().clearOptimisticMessages(sessionID);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
// ---- Permissions ----
|
|
283
|
+
case 'permission.asked': {
|
|
284
|
+
const props = event.properties;
|
|
285
|
+
if (props.id && props.sessionID) {
|
|
286
|
+
addPermission(props);
|
|
287
|
+
// Fire browser notification for permission requests. `tool` (when
|
|
288
|
+
// present) is `{messageID, callID}`, not a name — some historical
|
|
289
|
+
// wire shapes carried a bare string `type` field instead, which the
|
|
290
|
+
// current SDK types no longer declare. Duck-type both defensively
|
|
291
|
+
// rather than assume either is a string.
|
|
292
|
+
const rawProps = props;
|
|
293
|
+
const toolName = asStringOrUndefined(rawProps.tool) ?? asStringOrUndefined(rawProps.type) ?? 'a tool';
|
|
294
|
+
notifyPermissionRequest(props.sessionID, toolName, getSessionTitle(props.sessionID));
|
|
295
|
+
}
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
case 'permission.replied': {
|
|
299
|
+
const requestID = event.properties.requestID;
|
|
300
|
+
if (requestID)
|
|
301
|
+
removePermission(requestID);
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
// ---- Questions ----
|
|
305
|
+
case 'question.asked': {
|
|
306
|
+
const props = event.properties;
|
|
307
|
+
if (props.id && props.sessionID) {
|
|
308
|
+
addQuestion(props);
|
|
309
|
+
// Fire browser notification for questions needing user input
|
|
310
|
+
const questionText = props.questions[0]?.question ||
|
|
311
|
+
props.questions[0]?.header ||
|
|
312
|
+
'Kortix needs your input';
|
|
313
|
+
notifyQuestion(props.sessionID, questionText, getSessionTitle(props.sessionID));
|
|
314
|
+
}
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
case 'question.replied':
|
|
318
|
+
case 'question.rejected': {
|
|
319
|
+
const requestID = event.properties.requestID;
|
|
320
|
+
if (requestID)
|
|
321
|
+
removeQuestion(requestID);
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
// ---- Session diff ----
|
|
325
|
+
case 'session.diff': {
|
|
326
|
+
const props = event.properties;
|
|
327
|
+
if (props.sessionID) {
|
|
328
|
+
queryClient.setQueryData(['opencode', 'session-diff', props.sessionID], props.diff);
|
|
329
|
+
}
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
// ---- Todo updated ----
|
|
333
|
+
case 'todo.updated': {
|
|
334
|
+
const props = event.properties;
|
|
335
|
+
if (props.sessionID) {
|
|
336
|
+
queryClient.setQueryData(['opencode', 'session-todo', props.sessionID], props.todos);
|
|
337
|
+
}
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
// ---- VCS branch ----
|
|
341
|
+
case 'vcs.branch.updated': {
|
|
342
|
+
const props = event.properties;
|
|
343
|
+
queryClient.setQueryData(['opencode', 'vcs'], {
|
|
344
|
+
branch: props.branch,
|
|
345
|
+
});
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
// ---- Server disposed ----
|
|
349
|
+
case 'server.instance.disposed': {
|
|
350
|
+
for (const [sessionID, status] of Object.entries(useSyncStore.getState().sessionStatus)) {
|
|
351
|
+
if (status?.type !== 'idle') {
|
|
352
|
+
markSessionAbortedLocally.current(sessionID, 'The operation was aborted because the server instance was disposed.');
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
// Instance dispose means the server rescanned skills, agents,
|
|
356
|
+
// tools, and commands. Invalidate all cached app metadata so
|
|
357
|
+
// the UI picks up newly installed marketplace components or
|
|
358
|
+
// agent-created skills/agents immediately.
|
|
359
|
+
queryClient.invalidateQueries({ queryKey: opencodeKeys.sessions(), type: 'active' });
|
|
360
|
+
queryClient.invalidateQueries({ queryKey: opencodeKeys.mcpStatus(), type: 'active' });
|
|
361
|
+
queryClient.invalidateQueries({ queryKey: opencodeKeys.skills(), type: 'active' });
|
|
362
|
+
queryClient.invalidateQueries({ queryKey: opencodeKeys.agents(), type: 'active' });
|
|
363
|
+
queryClient.invalidateQueries({ queryKey: opencodeKeys.toolIds(), type: 'active' });
|
|
364
|
+
queryClient.invalidateQueries({ queryKey: opencodeKeys.commands(), type: 'active' });
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
// ---- LSP updated ----
|
|
368
|
+
case 'lsp.updated': {
|
|
369
|
+
queryClient.invalidateQueries({ queryKey: ['opencode', 'lsp'], type: 'active' });
|
|
370
|
+
// A new LSP client connected — fetch diagnostics after a short
|
|
371
|
+
// delay to give the language server time to produce initial results.
|
|
372
|
+
fetchLspDiagnosticsDebounced.current();
|
|
373
|
+
break;
|
|
374
|
+
}
|
|
375
|
+
// ---- LSP client diagnostics (per-file notification) ----
|
|
376
|
+
case 'lsp.client.diagnostics': {
|
|
377
|
+
// This event signals diagnostics changed for a specific file.
|
|
378
|
+
// The event only carries { serverID, path } — actual diagnostic
|
|
379
|
+
// data must be fetched from the /lsp/diagnostics endpoint.
|
|
380
|
+
fetchLspDiagnosticsDebounced.current();
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
// ---- MCP tools changed ----
|
|
384
|
+
case 'mcp.tools.changed': {
|
|
385
|
+
// MCP server tools were added/removed/changed — refresh status + tool lists.
|
|
386
|
+
// Only refetch if queries are actively mounted (type: 'active').
|
|
387
|
+
queryClient.refetchQueries({ queryKey: opencodeKeys.mcpStatus(), type: 'active' });
|
|
388
|
+
queryClient.refetchQueries({ queryKey: opencodeKeys.toolIds(), type: 'active' });
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
// ---- PTY events ----
|
|
392
|
+
case 'pty.created':
|
|
393
|
+
case 'pty.updated':
|
|
394
|
+
case 'pty.exited':
|
|
395
|
+
case 'pty.deleted': {
|
|
396
|
+
queryClient.invalidateQueries({ queryKey: ptyKeys.listPrefix(), type: 'active' });
|
|
397
|
+
break;
|
|
398
|
+
}
|
|
399
|
+
// ---- Worktree events — disabled for now ----
|
|
400
|
+
case 'worktree.ready': {
|
|
401
|
+
queryClient.invalidateQueries({ queryKey: opencodeKeys.worktrees(), type: 'active' });
|
|
402
|
+
queryClient.invalidateQueries({ queryKey: opencodeKeys.projects(), type: 'active' });
|
|
403
|
+
break;
|
|
404
|
+
}
|
|
405
|
+
case 'worktree.failed': {
|
|
406
|
+
queryClient.invalidateQueries({ queryKey: opencodeKeys.worktrees(), type: 'active' });
|
|
407
|
+
break;
|
|
408
|
+
}
|
|
409
|
+
// ---- Project updated ----
|
|
410
|
+
case 'project.updated': {
|
|
411
|
+
// Targeted refetch — project data is small and changes rarely,
|
|
412
|
+
// but OpenCode can emit bursts while tools are running. Coalesce
|
|
413
|
+
// these so a burst cannot spam /project/current.
|
|
414
|
+
scheduleProjectMetadataRefetch(queryClient);
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
// ---- File edited (outside agent, e.g. user edits in editor) ----
|
|
418
|
+
case 'file.edited': {
|
|
419
|
+
const fileProps = event.properties;
|
|
420
|
+
queryClient.invalidateQueries({ queryKey: fileListKeys.all, type: 'active' });
|
|
421
|
+
queryClient.invalidateQueries({ queryKey: gitStatusKeys.all, type: 'active' });
|
|
422
|
+
if (fileProps.file) {
|
|
423
|
+
queryClient.invalidateQueries({ queryKey: fileContentKeys.all, type: 'active' });
|
|
424
|
+
}
|
|
425
|
+
break;
|
|
426
|
+
}
|
|
427
|
+
// ---- Installation events ----
|
|
428
|
+
case 'installation.updated': {
|
|
429
|
+
const installProps = event.properties;
|
|
430
|
+
const versionStr = installProps.version ? ` (v${installProps.version})` : '';
|
|
431
|
+
infoToast(`Installation updated${versionStr}. Restart to apply changes.`, {
|
|
432
|
+
duration: 10_000,
|
|
433
|
+
});
|
|
434
|
+
break;
|
|
435
|
+
}
|
|
436
|
+
case 'installation.update-available': {
|
|
437
|
+
const updateProps = event.properties;
|
|
438
|
+
const versionLabel = updateProps.version ? `v${updateProps.version}` : 'A new version';
|
|
439
|
+
infoToast(`${versionLabel} is available. Update when you're ready.`, {
|
|
440
|
+
duration: 15_000,
|
|
441
|
+
});
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
default:
|
|
445
|
+
break;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
return handleEvent;
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=handle-event.js.map
|