@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,95 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useEffect, useMemo, useRef } from 'react';
|
|
3
|
+
import { getClient } from '../opencode/client.js';
|
|
4
|
+
import { useOpenCodePendingStore } from '../state/opencode-pending-store.js';
|
|
5
|
+
/**
|
|
6
|
+
* True when any assistant message has a `question` tool part still
|
|
7
|
+
* running/pending — the signal `useQuestionSelfHeal` reacts to. Pure so it's
|
|
8
|
+
* independently testable without rendering the hook.
|
|
9
|
+
*/
|
|
10
|
+
export function hasRunningQuestionTool(messages) {
|
|
11
|
+
if (!messages)
|
|
12
|
+
return false;
|
|
13
|
+
return messages.some((m) => {
|
|
14
|
+
if (m.info.role !== 'assistant')
|
|
15
|
+
return false;
|
|
16
|
+
return m.parts.some((p) => {
|
|
17
|
+
if (p.type !== 'tool')
|
|
18
|
+
return false;
|
|
19
|
+
const tool = p;
|
|
20
|
+
if (tool.tool !== 'question')
|
|
21
|
+
return false;
|
|
22
|
+
return tool.state.status === 'running' || tool.state.status === 'pending';
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Self-heals a missed `question.asked` SSE event: when a `question` tool part
|
|
28
|
+
* is rendering as running/pending but the pending-request store has nothing
|
|
29
|
+
* for this session, re-hydrate from `question.list()`.
|
|
30
|
+
*
|
|
31
|
+
* This is a LIVE-CONNECTION safety net, distinct from `useOpenCodeEventStream`'s
|
|
32
|
+
* reconnect-gap hydration (which only re-hydrates questions/permissions after
|
|
33
|
+
* an SSE gap >5s): it covers a `question.asked` event being dropped, or racing
|
|
34
|
+
* the `message.part.updated` event that renders the tool as running, while the
|
|
35
|
+
* stream stays connected the whole time — the first `question.list()` call can
|
|
36
|
+
* itself race the backend's request creation and return an empty list, so this
|
|
37
|
+
* keeps polling (every 2s, rate-limited to one in-flight call every 1.5s) for
|
|
38
|
+
* as long as the tool shows running with nothing pending, and stops the moment
|
|
39
|
+
* a pending question shows up (from either this poll or the SSE event finally
|
|
40
|
+
* arriving).
|
|
41
|
+
*/
|
|
42
|
+
export function useQuestionSelfHeal(sessionId, messages, options = {}) {
|
|
43
|
+
const { enabled = true, isSuppressed } = options;
|
|
44
|
+
const addQuestion = useOpenCodePendingStore((s) => s.addQuestion);
|
|
45
|
+
const pendingCount = useOpenCodePendingStore((s) => Object.values(s.questions).filter((q) => q.sessionID === sessionId && !isSuppressed?.(q.id))
|
|
46
|
+
.length);
|
|
47
|
+
const running = useMemo(() => hasRunningQuestionTool(messages), [messages]);
|
|
48
|
+
const inFlightRef = useRef(false);
|
|
49
|
+
const lastAtRef = useRef(0);
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (!enabled || !running || pendingCount > 0)
|
|
52
|
+
return;
|
|
53
|
+
let cancelled = false;
|
|
54
|
+
const hydrate = () => {
|
|
55
|
+
if (inFlightRef.current || cancelled)
|
|
56
|
+
return;
|
|
57
|
+
const now = Date.now();
|
|
58
|
+
if (now - lastAtRef.current < 1500)
|
|
59
|
+
return;
|
|
60
|
+
// Acquire the client lazily: during the sandbox-loading window
|
|
61
|
+
// getClient() throws "Server URL not ready". Skip this tick and let the
|
|
62
|
+
// interval retry once the runtime URL is pinned — never throw here.
|
|
63
|
+
let client;
|
|
64
|
+
try {
|
|
65
|
+
client = getClient();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
inFlightRef.current = true;
|
|
71
|
+
lastAtRef.current = now;
|
|
72
|
+
void client.question
|
|
73
|
+
.list()
|
|
74
|
+
.then((res) => {
|
|
75
|
+
if (!res.data || cancelled)
|
|
76
|
+
return;
|
|
77
|
+
res.data.forEach((q) => {
|
|
78
|
+
if (!q?.id || isSuppressed?.(q.id))
|
|
79
|
+
return;
|
|
80
|
+
addQuestion(q);
|
|
81
|
+
});
|
|
82
|
+
})
|
|
83
|
+
.finally(() => {
|
|
84
|
+
inFlightRef.current = false;
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
hydrate();
|
|
88
|
+
const timer = setInterval(hydrate, 2000);
|
|
89
|
+
return () => {
|
|
90
|
+
cancelled = true;
|
|
91
|
+
clearInterval(timer);
|
|
92
|
+
};
|
|
93
|
+
}, [enabled, running, pendingCount, addQuestion, isSuppressed]);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=use-question-self-heal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-question-self-heal.js","sourceRoot":"","sources":["../../src/react/use-question-self-heal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type RuntimePhase = 'connecting' | 'booting' | 'ready' | 'unreachable';
|
|
2
|
+
/**
|
|
3
|
+
* Coarse, render-friendly runtime connection phase for boot/reconnect UI. Reads
|
|
4
|
+
* the SDK's connection store — the host never touches it directly. `useSession`
|
|
5
|
+
* also returns this as `runtimePhase`; use this standalone hook when you want the
|
|
6
|
+
* phase without a full session (e.g. a lightweight status pill).
|
|
7
|
+
*/
|
|
8
|
+
export declare function useRuntimePhase(): RuntimePhase;
|
|
9
|
+
//# sourceMappingURL=use-runtime-phase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-runtime-phase.d.ts","sourceRoot":"","sources":["../../src/react/use-runtime-phase.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;AAE9E;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAO9C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useSandboxConnectionStore } from '../state/sandbox-connection-store.js';
|
|
3
|
+
/**
|
|
4
|
+
* Coarse, render-friendly runtime connection phase for boot/reconnect UI. Reads
|
|
5
|
+
* the SDK's connection store — the host never touches it directly. `useSession`
|
|
6
|
+
* also returns this as `runtimePhase`; use this standalone hook when you want the
|
|
7
|
+
* phase without a full session (e.g. a lightweight status pill).
|
|
8
|
+
*/
|
|
9
|
+
export function useRuntimePhase() {
|
|
10
|
+
const status = useSandboxConnectionStore((s) => s.status);
|
|
11
|
+
const healthy = useSandboxConnectionStore((s) => s.healthy);
|
|
12
|
+
if (status === 'unreachable')
|
|
13
|
+
return 'unreachable';
|
|
14
|
+
if (healthy === true)
|
|
15
|
+
return 'ready';
|
|
16
|
+
if (status === 'connected')
|
|
17
|
+
return 'booting'; // reachable, OpenCode still warming
|
|
18
|
+
return 'connecting';
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=use-runtime-phase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-runtime-phase.js","sourceRoot":"","sources":["../../src/react/use-runtime-phase.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAI9E;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,yBAAyB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,yBAAyB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,MAAM,KAAK,aAAa;QAAE,OAAO,aAAa,CAAC;IACnD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IACrC,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC,CAAC,oCAAoC;IAClF,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { type SessionHealthResponse } from '../session/index.js';
|
|
2
|
+
import { type SandboxConnectionStatus } from '../state/sandbox-connection-store.js';
|
|
3
|
+
/**
|
|
4
|
+
* Number of consecutive failures before marking as unreachable
|
|
5
|
+
* when this is the FIRST connection (never been connected).
|
|
6
|
+
* Set high enough to ride through transient proxy startup delays.
|
|
7
|
+
*/
|
|
8
|
+
export declare const FAIL_THRESHOLD_FIRST = 5;
|
|
9
|
+
/**
|
|
10
|
+
* For reconnection (was connected, then failed) — require two consecutive
|
|
11
|
+
* failures before declaring the instance unreachable. The first miss drops
|
|
12
|
+
* into a lightweight reconnecting state so transient timeouts don't kick the
|
|
13
|
+
* user to an offline/error UI.
|
|
14
|
+
*/
|
|
15
|
+
export declare const FAIL_THRESHOLD_RECONNECT = 2;
|
|
16
|
+
/** Interval between health checks (ms) */
|
|
17
|
+
export declare const POLL_CONNECTED = 30000;
|
|
18
|
+
export declare const POLL_FAILING = 150;
|
|
19
|
+
export declare const POLL_UNREACHABLE = 5000;
|
|
20
|
+
export declare const CHECK_TIMEOUT = 20000;
|
|
21
|
+
/** Statuses whose HTTP response itself signals "nothing is home" — no threshold needed. */
|
|
22
|
+
export declare function isImmediateOfflineStatus(status: number): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Whether a resolved-but-failed probe response should be treated as an
|
|
25
|
+
* immediate "unreachable" signal rather than counted against the normal
|
|
26
|
+
* failure threshold — either a proxy-dead HTTP status, or a body that
|
|
27
|
+
* explicitly says no service answered.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isImmediateOfflineSignal(status: number, body: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* The result of interpreting one resolved `getSessionHealth` response. Pure —
|
|
32
|
+
* given the same `SessionHealthResult` shape it always classifies the same
|
|
33
|
+
* way, independent of the store or the network. A thrown/aborted probe
|
|
34
|
+
* (network error, `CHECK_TIMEOUT` abort) never reaches this function — the
|
|
35
|
+
* hook folds those into `{ kind: 'failure', immediateOffline: false }` itself,
|
|
36
|
+
* since there is no HTTP status/body to classify.
|
|
37
|
+
*/
|
|
38
|
+
export type ProbeOutcome = {
|
|
39
|
+
kind: 'auth-error';
|
|
40
|
+
} | {
|
|
41
|
+
kind: 'booting';
|
|
42
|
+
health: SessionHealthResponse | null;
|
|
43
|
+
} | {
|
|
44
|
+
kind: 'failure';
|
|
45
|
+
immediateOffline: boolean;
|
|
46
|
+
} | {
|
|
47
|
+
kind: 'healthy';
|
|
48
|
+
health: SessionHealthResponse | null;
|
|
49
|
+
};
|
|
50
|
+
export interface ProbeResultLike {
|
|
51
|
+
status: number;
|
|
52
|
+
ok: boolean;
|
|
53
|
+
health: SessionHealthResponse | null;
|
|
54
|
+
body: string;
|
|
55
|
+
}
|
|
56
|
+
export declare function classifyProbeResult(result: ProbeResultLike): ProbeOutcome;
|
|
57
|
+
/**
|
|
58
|
+
* Threshold counting — the one piece of state this machine actually needs to
|
|
59
|
+
* decide a transition. `failCount` is the count AFTER the current failure has
|
|
60
|
+
* been recorded (matches `incrementSandboxFail()` semantics: increment, then
|
|
61
|
+
* read). Returns the next status, or `null` for "no status change" (still
|
|
62
|
+
* below threshold on a first-ever connection, which stays in whatever status
|
|
63
|
+
* it already had — normally "connecting").
|
|
64
|
+
*/
|
|
65
|
+
export declare function computeFailureStatus(failCount: number, wasConnected: boolean, immediateOffline: boolean): SandboxConnectionStatus | null;
|
|
66
|
+
/**
|
|
67
|
+
* Next poll interval, purely a function of the current store status/healthy
|
|
68
|
+
* pair — fast while anything is unresolved or unhealthy, slow once truly
|
|
69
|
+
* settled into "connected and healthy".
|
|
70
|
+
*/
|
|
71
|
+
export declare function nextPollDelay(status: SandboxConnectionStatus, healthy: boolean | null): number;
|
|
72
|
+
/**
|
|
73
|
+
* useRuntimeReconnect — monitors the active session's runtime reachability
|
|
74
|
+
* mid-session (see `react/opencode.ts` for how this fits alongside the
|
|
75
|
+
* server-truth boot readiness and the SSE heartbeat).
|
|
76
|
+
*
|
|
77
|
+
* Probes `getSessionHealth` (the SDK's `/kortix/health`) and maps the result
|
|
78
|
+
* into the shared `sandbox-connection-store`. Behaviour:
|
|
79
|
+
* - On first failure, immediately switches to fast polling.
|
|
80
|
+
* - If the user was previously connected, the first failure moves to
|
|
81
|
+
* "connecting" and the second consecutive failure marks unreachable.
|
|
82
|
+
* - If it's the first connection, requires FAIL_THRESHOLD_FIRST failures.
|
|
83
|
+
*
|
|
84
|
+
* The transition logic itself (`classifyProbeResult`, `computeFailureStatus`,
|
|
85
|
+
* `nextPollDelay`) is pure and exported above — this hook is thin glue that
|
|
86
|
+
* wires those decisions to a `setTimeout` loop and the store's action
|
|
87
|
+
* functions, since the repo has no harness to render-test a hook directly.
|
|
88
|
+
*/
|
|
89
|
+
export declare function useRuntimeReconnect(): void;
|
|
90
|
+
//# sourceMappingURL=use-runtime-reconnect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-runtime-reconnect.d.ts","sourceRoot":"","sources":["../../src/react/use-runtime-reconnect.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoC,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EASL,KAAK,uBAAuB,EAC7B,MAAM,mCAAmC,CAAC;AAG3C;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,0CAA0C;AAC1C,eAAO,MAAM,cAAc,QAAS,CAAC;AAMrC,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,eAAO,MAAM,gBAAgB,OAAQ,CAAC;AAEtC,eAAO,MAAM,aAAa,QAAS,CAAC;AAEpC,2FAA2F;AAC3F,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9E;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,gBAAgB,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAA;CAAE,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,CAqBzE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,OAAO,EACrB,gBAAgB,EAAE,OAAO,GACxB,uBAAuB,GAAG,IAAI,CAOhC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,uBAAuB,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAQ9F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,SAoIlC"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useEffect, useRef } from 'react';
|
|
3
|
+
import { getSupabaseAccessToken } from '../platform/auth.js';
|
|
4
|
+
import { getSessionHealth, isRuntimeReady } from '../session/index.js';
|
|
5
|
+
import { incrementSandboxFail, markInitialCheckDone, resetForServerSwitch, resetSandboxFail, setOpenCodeHealth, setSandboxStatus, setSandboxVersion, useSandboxConnectionStore, } from '../state/sandbox-connection-store.js';
|
|
6
|
+
import { useServerStore } from '../state/server-store.js';
|
|
7
|
+
/**
|
|
8
|
+
* Number of consecutive failures before marking as unreachable
|
|
9
|
+
* when this is the FIRST connection (never been connected).
|
|
10
|
+
* Set high enough to ride through transient proxy startup delays.
|
|
11
|
+
*/
|
|
12
|
+
export const FAIL_THRESHOLD_FIRST = 5;
|
|
13
|
+
/**
|
|
14
|
+
* For reconnection (was connected, then failed) — require two consecutive
|
|
15
|
+
* failures before declaring the instance unreachable. The first miss drops
|
|
16
|
+
* into a lightweight reconnecting state so transient timeouts don't kick the
|
|
17
|
+
* user to an offline/error UI.
|
|
18
|
+
*/
|
|
19
|
+
export const FAIL_THRESHOLD_RECONNECT = 2;
|
|
20
|
+
/** Interval between health checks (ms) */
|
|
21
|
+
export const POLL_CONNECTED = 30_000; // 30s when healthy
|
|
22
|
+
// Tight cadence while a sandbox is booting/unhealthy. This is the gate between
|
|
23
|
+
// "sandbox active" and "OpenCode healthy" AND the enable-gate for the opencode
|
|
24
|
+
// session list — so every extra interval is visible dead time after the backend
|
|
25
|
+
// is already ready. 150ms keeps the healthy flip (and the session-list start)
|
|
26
|
+
// tracking actual daemon readiness tightly; the health probe is a cheap GET.
|
|
27
|
+
export const POLL_FAILING = 150;
|
|
28
|
+
export const POLL_UNREACHABLE = 5_000; // 5s when confirmed unreachable
|
|
29
|
+
export const CHECK_TIMEOUT = 20_000;
|
|
30
|
+
/** Statuses whose HTTP response itself signals "nothing is home" — no threshold needed. */
|
|
31
|
+
export function isImmediateOfflineStatus(status) {
|
|
32
|
+
return status === 502 || status === 503 || status === 504;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Whether a resolved-but-failed probe response should be treated as an
|
|
36
|
+
* immediate "unreachable" signal rather than counted against the normal
|
|
37
|
+
* failure threshold — either a proxy-dead HTTP status, or a body that
|
|
38
|
+
* explicitly says no service answered.
|
|
39
|
+
*/
|
|
40
|
+
export function isImmediateOfflineSignal(status, body) {
|
|
41
|
+
return isImmediateOfflineStatus(status) || /no service is responding|not reachable/i.test(body);
|
|
42
|
+
}
|
|
43
|
+
export function classifyProbeResult(result) {
|
|
44
|
+
if (result.status === 401 || result.status === 403) {
|
|
45
|
+
// Treat auth errors like any other failure — respect the threshold
|
|
46
|
+
// instead of immediately marking unreachable. During transitions (e.g.
|
|
47
|
+
// provisioning → dashboard), the proxy may briefly return 401 before auth
|
|
48
|
+
// propagates.
|
|
49
|
+
return { kind: 'auth-error' };
|
|
50
|
+
}
|
|
51
|
+
if (result.status === 503) {
|
|
52
|
+
// OpenCode still booting behind an already-live sandbox proxy — this is
|
|
53
|
+
// progress, not failure: reset the fail counter and report "connected"
|
|
54
|
+
// (sandbox is up) with `healthy: false` (OpenCode isn't yet).
|
|
55
|
+
return { kind: 'booting', health: result.health };
|
|
56
|
+
}
|
|
57
|
+
if (!result.ok) {
|
|
58
|
+
return { kind: 'failure', immediateOffline: isImmediateOfflineSignal(result.status, result.body) };
|
|
59
|
+
}
|
|
60
|
+
return { kind: 'healthy', health: result.health };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Threshold counting — the one piece of state this machine actually needs to
|
|
64
|
+
* decide a transition. `failCount` is the count AFTER the current failure has
|
|
65
|
+
* been recorded (matches `incrementSandboxFail()` semantics: increment, then
|
|
66
|
+
* read). Returns the next status, or `null` for "no status change" (still
|
|
67
|
+
* below threshold on a first-ever connection, which stays in whatever status
|
|
68
|
+
* it already had — normally "connecting").
|
|
69
|
+
*/
|
|
70
|
+
export function computeFailureStatus(failCount, wasConnected, immediateOffline) {
|
|
71
|
+
if (immediateOffline)
|
|
72
|
+
return 'unreachable';
|
|
73
|
+
const threshold = wasConnected ? FAIL_THRESHOLD_RECONNECT : FAIL_THRESHOLD_FIRST;
|
|
74
|
+
if (failCount >= threshold)
|
|
75
|
+
return 'unreachable';
|
|
76
|
+
if (wasConnected)
|
|
77
|
+
return 'connecting';
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Next poll interval, purely a function of the current store status/healthy
|
|
82
|
+
* pair — fast while anything is unresolved or unhealthy, slow once truly
|
|
83
|
+
* settled into "connected and healthy".
|
|
84
|
+
*/
|
|
85
|
+
export function nextPollDelay(status, healthy) {
|
|
86
|
+
if (status === 'connected' && healthy === false)
|
|
87
|
+
return POLL_FAILING;
|
|
88
|
+
if (status === 'connected')
|
|
89
|
+
return POLL_CONNECTED;
|
|
90
|
+
if (status === 'unreachable')
|
|
91
|
+
return POLL_UNREACHABLE;
|
|
92
|
+
// Initial "connecting" phase (sandbox just went active, opencode still
|
|
93
|
+
// booting) — poll fast so the runtime appears the moment it's healthy
|
|
94
|
+
// instead of waiting out a long interval.
|
|
95
|
+
return POLL_FAILING;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* useRuntimeReconnect — monitors the active session's runtime reachability
|
|
99
|
+
* mid-session (see `react/opencode.ts` for how this fits alongside the
|
|
100
|
+
* server-truth boot readiness and the SSE heartbeat).
|
|
101
|
+
*
|
|
102
|
+
* Probes `getSessionHealth` (the SDK's `/kortix/health`) and maps the result
|
|
103
|
+
* into the shared `sandbox-connection-store`. Behaviour:
|
|
104
|
+
* - On first failure, immediately switches to fast polling.
|
|
105
|
+
* - If the user was previously connected, the first failure moves to
|
|
106
|
+
* "connecting" and the second consecutive failure marks unreachable.
|
|
107
|
+
* - If it's the first connection, requires FAIL_THRESHOLD_FIRST failures.
|
|
108
|
+
*
|
|
109
|
+
* The transition logic itself (`classifyProbeResult`, `computeFailureStatus`,
|
|
110
|
+
* `nextPollDelay`) is pure and exported above — this hook is thin glue that
|
|
111
|
+
* wires those decisions to a `setTimeout` loop and the store's action
|
|
112
|
+
* functions, since the repo has no harness to render-test a hook directly.
|
|
113
|
+
*/
|
|
114
|
+
export function useRuntimeReconnect() {
|
|
115
|
+
const timerRef = useRef(null);
|
|
116
|
+
const abortRef = useRef(null);
|
|
117
|
+
const isMountRef = useRef(true);
|
|
118
|
+
useEffect(() => {
|
|
119
|
+
const isFirstMount = isMountRef.current;
|
|
120
|
+
isMountRef.current = false;
|
|
121
|
+
if (isFirstMount) {
|
|
122
|
+
// Full reset — clears wasConnected, failCount, status, everything.
|
|
123
|
+
resetForServerSwitch();
|
|
124
|
+
}
|
|
125
|
+
let alive = true;
|
|
126
|
+
async function check() {
|
|
127
|
+
if (!alive)
|
|
128
|
+
return;
|
|
129
|
+
const url = useServerStore.getState().getActiveServerUrl();
|
|
130
|
+
if (!url) {
|
|
131
|
+
scheduleNext();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
// Don't fire health checks until auth is ready — avoids naked requests
|
|
135
|
+
// that return synthetic 401s and cause false "unreachable" status.
|
|
136
|
+
const token = await getSupabaseAccessToken();
|
|
137
|
+
if (!token) {
|
|
138
|
+
scheduleNext();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
abortRef.current?.abort();
|
|
142
|
+
const controller = new AbortController();
|
|
143
|
+
abortRef.current = controller;
|
|
144
|
+
let immediateOffline = false;
|
|
145
|
+
let failed = false;
|
|
146
|
+
try {
|
|
147
|
+
const timer = setTimeout(() => controller.abort(), CHECK_TIMEOUT);
|
|
148
|
+
const result = await getSessionHealth(url, { signal: controller.signal });
|
|
149
|
+
clearTimeout(timer);
|
|
150
|
+
if (!alive)
|
|
151
|
+
return;
|
|
152
|
+
const outcome = classifyProbeResult(result);
|
|
153
|
+
switch (outcome.kind) {
|
|
154
|
+
case 'auth-error': {
|
|
155
|
+
failed = true;
|
|
156
|
+
immediateOffline = false;
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
case 'booting': {
|
|
160
|
+
resetSandboxFail();
|
|
161
|
+
setSandboxStatus('connected');
|
|
162
|
+
setOpenCodeHealth(false, outcome.health?.version, outcome.health?.boot_error ?? outcome.health?.message ?? outcome.health?.reason ?? null);
|
|
163
|
+
if (outcome.health?.version) {
|
|
164
|
+
setSandboxVersion(outcome.health.version);
|
|
165
|
+
}
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
case 'failure': {
|
|
169
|
+
failed = true;
|
|
170
|
+
immediateOffline = outcome.immediateOffline;
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
case 'healthy': {
|
|
174
|
+
resetSandboxFail();
|
|
175
|
+
setSandboxStatus('connected');
|
|
176
|
+
setOpenCodeHealth(isRuntimeReady(outcome.health), outcome.health?.version, outcome.health?.boot_error ?? outcome.health?.message ?? outcome.health?.reason ?? null);
|
|
177
|
+
if (outcome.health?.version) {
|
|
178
|
+
setSandboxVersion(outcome.health.version);
|
|
179
|
+
}
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Network error or `CHECK_TIMEOUT` abort — no HTTP status/body to
|
|
186
|
+
// classify, so this always counts as a plain (non-immediate) failure;
|
|
187
|
+
// the threshold decides whether it flips the status.
|
|
188
|
+
if (!alive)
|
|
189
|
+
return;
|
|
190
|
+
failed = true;
|
|
191
|
+
immediateOffline = false;
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
if (failed) {
|
|
195
|
+
incrementSandboxFail();
|
|
196
|
+
if (immediateOffline) {
|
|
197
|
+
setSandboxStatus('unreachable');
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
const { failCount, wasConnected } = useSandboxConnectionStore.getState();
|
|
201
|
+
const nextStatus = computeFailureStatus(failCount, wasConnected, immediateOffline);
|
|
202
|
+
if (nextStatus)
|
|
203
|
+
setSandboxStatus(nextStatus);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Reschedule from finally so EVERY path re-arms the poll loop —
|
|
207
|
+
// notably the "booting" branch returns early; without this it stops
|
|
208
|
+
// polling and `healthy` never flips, so useSessionSync and the SSE
|
|
209
|
+
// (both gated on healthy) never subscribe and a fresh session's first
|
|
210
|
+
// turn stays invisible until a manual reload.
|
|
211
|
+
if (alive) {
|
|
212
|
+
markInitialCheckDone();
|
|
213
|
+
scheduleNext();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
function scheduleNext() {
|
|
218
|
+
if (!alive)
|
|
219
|
+
return;
|
|
220
|
+
if (timerRef.current)
|
|
221
|
+
clearTimeout(timerRef.current);
|
|
222
|
+
const { status, healthy } = useSandboxConnectionStore.getState();
|
|
223
|
+
timerRef.current = setTimeout(check, nextPollDelay(status, healthy));
|
|
224
|
+
}
|
|
225
|
+
check();
|
|
226
|
+
return () => {
|
|
227
|
+
alive = false;
|
|
228
|
+
abortRef.current?.abort();
|
|
229
|
+
if (timerRef.current)
|
|
230
|
+
clearTimeout(timerRef.current);
|
|
231
|
+
};
|
|
232
|
+
}, []);
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=use-runtime-reconnect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-runtime-reconnect.js","sourceRoot":"","sources":["../../src/react/use-runtime-reconnect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ModelKey } from './use-model-store.js';
|
|
2
|
+
/**
|
|
3
|
+
* Per-session model + agent selection, persisted locally. The lists come from the
|
|
4
|
+
* server-side hooks (`useProjectModels`, `useVisibleAgents`); this just remembers
|
|
5
|
+
* which one is chosen for a session and feeds it to send. `null` means "use the
|
|
6
|
+
* project/agent default" — the field is omitted and the runtime decides. Owned by
|
|
7
|
+
* the SDK so every host shares one implementation (and `useSession` can apply the
|
|
8
|
+
* picks to send without the host wiring it).
|
|
9
|
+
*/
|
|
10
|
+
export interface SessionPicks {
|
|
11
|
+
model: ModelKey | null;
|
|
12
|
+
agent: string | null;
|
|
13
|
+
setModel: (model: ModelKey | null) => void;
|
|
14
|
+
setAgent: (agent: string | null) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function useSessionPicks(sessionId: string): SessionPicks;
|
|
17
|
+
//# sourceMappingURL=use-session-picks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-session-picks.d.ts","sourceRoot":"","sources":["../../src/react/use-session-picks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC1C;AAID,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAiC/D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
const storageKey = (sessionId) => `kortix:picks:${sessionId}`;
|
|
4
|
+
export function useSessionPicks(sessionId) {
|
|
5
|
+
const [picks, setPicks] = useState({
|
|
6
|
+
model: null,
|
|
7
|
+
agent: null,
|
|
8
|
+
});
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
// Always reset on session change — a host page instance is reused across
|
|
11
|
+
// session navigation, so without resetting a new session would inherit the
|
|
12
|
+
// previous one's picks (and persist them under the wrong key).
|
|
13
|
+
try {
|
|
14
|
+
const raw = localStorage.getItem(storageKey(sessionId));
|
|
15
|
+
setPicks(raw ? JSON.parse(raw) : { model: null, agent: null });
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
setPicks({ model: null, agent: null });
|
|
19
|
+
}
|
|
20
|
+
}, [sessionId]);
|
|
21
|
+
const update = (patch) => setPicks((prev) => {
|
|
22
|
+
const next = { ...prev, ...patch };
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem(storageKey(sessionId), JSON.stringify(next));
|
|
25
|
+
}
|
|
26
|
+
catch { }
|
|
27
|
+
return next;
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
model: picks.model,
|
|
31
|
+
agent: picks.agent,
|
|
32
|
+
setModel: (model) => update({ model }),
|
|
33
|
+
setAgent: (agent) => update({ agent }),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=use-session-picks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-session-picks.js","sourceRoot":"","sources":["../../src/react/use-session-picks.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAkB5C,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,gBAAgB,SAAS,EAAE,CAAC;AAEtE,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmD;QACnF,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,yEAAyE;QACzE,2EAA2E;QAC3E,+DAA+D;QAC/D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;YACxD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,CAAC,KAAgE,EAAE,EAAE,CAClF,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE;QAChB,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEL,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;QACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;KACvC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type Session } from "./use-opencode-sessions/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Prefetch a single session's messages into the sync store + IDB cache.
|
|
4
|
+
* Skips if the session is already in the sync store.
|
|
5
|
+
*/
|
|
6
|
+
export declare function prefetchSession(sessionId: string): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Reset prefetch tracking (e.g., on server switch).
|
|
9
|
+
*/
|
|
10
|
+
export declare function resetPrefetchState(): void;
|
|
11
|
+
/**
|
|
12
|
+
* Hook: background-prefetch top N sessions after session list loads.
|
|
13
|
+
* Uses requestIdleCallback to avoid blocking UI.
|
|
14
|
+
*/
|
|
15
|
+
export declare function useBackgroundSessionPrefetch(sessions: Session[] | undefined): {
|
|
16
|
+
prefetchOnHover: (sessionId: string) => void;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=use-session-prefetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-session-prefetch.d.ts","sourceRoot":"","sources":["../../src/react/use-session-prefetch.ts"],"names":[],"mappings":"AAWA,OAAO,EAA2B,KAAK,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAKhF;;;GAGG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDtE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS;iCAM1B,MAAM;EAKvD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect } from "react";
|
|
3
|
+
import { getClient } from "../opencode/client.js";
|
|
4
|
+
import { useSyncStore } from "../state/sync-store.js";
|
|
5
|
+
import { useSandboxConnectionStore } from "../state/sandbox-connection-store.js";
|
|
6
|
+
import { saveSessionToIDB, loadSessionFromIDB, pruneIDBCache, } from "../state/idb-sync-cache.js";
|
|
7
|
+
import { canQueryOpenCodeSession } from "./use-opencode-sessions/index.js";
|
|
8
|
+
const prefetchedSessions = new Set();
|
|
9
|
+
const inFlightPrefetches = new Map();
|
|
10
|
+
/**
|
|
11
|
+
* Prefetch a single session's messages into the sync store + IDB cache.
|
|
12
|
+
* Skips if the session is already in the sync store.
|
|
13
|
+
*/
|
|
14
|
+
export async function prefetchSession(sessionId) {
|
|
15
|
+
if (!canQueryOpenCodeSession(sessionId))
|
|
16
|
+
return;
|
|
17
|
+
if (useSandboxConnectionStore.getState().healthy !== true)
|
|
18
|
+
return;
|
|
19
|
+
if (prefetchedSessions.has(sessionId))
|
|
20
|
+
return;
|
|
21
|
+
const existingPrefetch = inFlightPrefetches.get(sessionId);
|
|
22
|
+
if (existingPrefetch)
|
|
23
|
+
return existingPrefetch;
|
|
24
|
+
const run = (async () => {
|
|
25
|
+
const state = useSyncStore.getState();
|
|
26
|
+
if (sessionId in state.messages && (state.messages[sessionId]?.length ?? 0) > 0) {
|
|
27
|
+
prefetchedSessions.add(sessionId);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Try IDB cache first
|
|
31
|
+
const cached = await loadSessionFromIDB(sessionId);
|
|
32
|
+
if (cached && cached.messages.length > 0) {
|
|
33
|
+
const currentState = useSyncStore.getState();
|
|
34
|
+
if (!(sessionId in currentState.messages) || (currentState.messages[sessionId]?.length ?? 0) === 0) {
|
|
35
|
+
currentState.hydrate(sessionId, cached.messages.map((info) => ({
|
|
36
|
+
info,
|
|
37
|
+
parts: cached.parts[info.id] ?? [],
|
|
38
|
+
})));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Fetch fresh data from server in background
|
|
42
|
+
try {
|
|
43
|
+
const res = await getClient().session.messages({ sessionID: sessionId });
|
|
44
|
+
const data = res.data ?? [];
|
|
45
|
+
if (data.length > 0) {
|
|
46
|
+
useSyncStore.getState().hydrate(sessionId, data);
|
|
47
|
+
const parts = useSyncStore.getState().parts;
|
|
48
|
+
const msgs = useSyncStore.getState().messages[sessionId] ?? [];
|
|
49
|
+
saveSessionToIDB(sessionId, msgs, parts);
|
|
50
|
+
}
|
|
51
|
+
prefetchedSessions.add(sessionId);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Non-critical — cache is still warm from IDB
|
|
55
|
+
}
|
|
56
|
+
})().finally(() => {
|
|
57
|
+
inFlightPrefetches.delete(sessionId);
|
|
58
|
+
});
|
|
59
|
+
inFlightPrefetches.set(sessionId, run);
|
|
60
|
+
return run;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Reset prefetch tracking (e.g., on server switch).
|
|
64
|
+
*/
|
|
65
|
+
export function resetPrefetchState() {
|
|
66
|
+
prefetchedSessions.clear();
|
|
67
|
+
inFlightPrefetches.clear();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Hook: background-prefetch top N sessions after session list loads.
|
|
71
|
+
* Uses requestIdleCallback to avoid blocking UI.
|
|
72
|
+
*/
|
|
73
|
+
export function useBackgroundSessionPrefetch(sessions) {
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
if (!sessions || sessions.length === 0)
|
|
76
|
+
return;
|
|
77
|
+
void pruneIDBCache();
|
|
78
|
+
}, [sessions]);
|
|
79
|
+
const prefetchOnHover = useCallback((sessionId) => {
|
|
80
|
+
prefetchSession(sessionId);
|
|
81
|
+
}, []);
|
|
82
|
+
return { prefetchOnHover };
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=use-session-prefetch.js.map
|