@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,958 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
/**
|
|
3
|
+
* kortix-master React Query layer — the generic (host-agnostic) hooks over
|
|
4
|
+
* the `./kortix-master` transport client: query keys, caching/polling config,
|
|
5
|
+
* optimistic-update/invalidation wiring, and the pure normalization/derivation
|
|
6
|
+
* helpers that used to live inline in six apps/web hook files
|
|
7
|
+
* (`use-credentials.ts`, `use-kortix-projects.ts`, `use-kortix-tasks.ts`,
|
|
8
|
+
* `use-kortix-tickets.ts`, `use-milestones.ts`, `use-sandbox-services.ts`).
|
|
9
|
+
*
|
|
10
|
+
* Everything here is transport + cache plumbing — it has zero knowledge of
|
|
11
|
+
* any host's auth stack. The one thing the original web hooks pulled from
|
|
12
|
+
* `useAuth()`/`getUserHandle()` (the current human's id + derived @handle,
|
|
13
|
+
* used to partition query-cache keys and to stamp audit/authorship fields on
|
|
14
|
+
* ticket mutations) is threaded through as an explicit `identity` parameter
|
|
15
|
+
* (`KortixMasterIdentity`) instead — see that type below. Any host (web,
|
|
16
|
+
* mobile, whitelabel-demo, …) supplies its own identity and gets the same
|
|
17
|
+
* hooks.
|
|
18
|
+
*
|
|
19
|
+
* The "active server" resolution (which sandbox these calls hit) does NOT
|
|
20
|
+
* need injecting: `useServerStore`/`getActiveOpenCodeUrl` (`../state/server-store`)
|
|
21
|
+
* is already a host-agnostic part of this SDK — apps/web's
|
|
22
|
+
* `@/stores/server-store` is already just a re-export of it. Hooks here use
|
|
23
|
+
* it directly, exactly like the existing `./use-runtime-reconnect` and
|
|
24
|
+
* `./use-opencode-events` SDK hooks do.
|
|
25
|
+
*
|
|
26
|
+
* Query keys below are copied VERBATIM from the pre-migration web hooks
|
|
27
|
+
* (array literal contents, ordering, and types unchanged) — this is a hard
|
|
28
|
+
* cache-compatibility requirement, not a style choice.
|
|
29
|
+
*/
|
|
30
|
+
import { useMutation, useQuery, useQueryClient, keepPreviousData, } from '@tanstack/react-query';
|
|
31
|
+
import { useServerStore } from '../state/server-store.js';
|
|
32
|
+
import {
|
|
33
|
+
// Credentials
|
|
34
|
+
listCredentials, listCredentialEvents, upsertCredential, revealCredential, deleteCredential,
|
|
35
|
+
// Projects
|
|
36
|
+
listKortixProjects, getKortixProject, getKortixProjectBySession, listKortixProjectSessions, deleteKortixProject, patchKortixProject,
|
|
37
|
+
// Tasks
|
|
38
|
+
listTasks, getTask, listTaskEvents, getTaskStatus, createTask, updateTask, startTask, approveTask, deleteTask,
|
|
39
|
+
// Tickets
|
|
40
|
+
listTickets, getTicket, listTicketEvents, createTicket, updateTicket, updateTicketStatus, assignTicket, unassignTicket, commentTicket, deleteTicket, listColumns, replaceColumns, listFields, replaceFields, listTemplates, replaceTemplates, ensurePmSession, listProjectAgents, createProjectAgent, updateProjectAgent, deleteProjectAgent, getAgentPersona, getProjectActivity,
|
|
41
|
+
// Milestones
|
|
42
|
+
listMilestones, getMilestone, listMilestoneEvents, createMilestone, updateMilestone, closeMilestone, reopenMilestone, deleteMilestone,
|
|
43
|
+
// Services
|
|
44
|
+
listServices, listServiceTemplates, getServiceLogs, serviceAction as sdkServiceAction, reconcileServices, registerService, systemReload, } from '../opencode/client.js';
|
|
45
|
+
// ═════════════════════════════════════════════════════════════════════════
|
|
46
|
+
// Credentials — /kortix/projects/:id/credentials
|
|
47
|
+
// ═════════════════════════════════════════════════════════════════════════
|
|
48
|
+
export const credentialKeys = {
|
|
49
|
+
list: (pid) => ['kortix', 'credentials', pid ?? ''],
|
|
50
|
+
events: (pid, name) => ['kortix', 'credentials', pid, name, 'events'],
|
|
51
|
+
};
|
|
52
|
+
export function useCredentials(projectId) {
|
|
53
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
54
|
+
return useQuery({
|
|
55
|
+
queryKey: credentialKeys.list(projectId),
|
|
56
|
+
queryFn: () => listCredentials(serverUrl, projectId),
|
|
57
|
+
enabled: !!projectId,
|
|
58
|
+
refetchInterval: 10_000,
|
|
59
|
+
refetchIntervalInBackground: false,
|
|
60
|
+
placeholderData: keepPreviousData,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
export function useCredentialEvents(projectId, name) {
|
|
64
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
65
|
+
return useQuery({
|
|
66
|
+
queryKey: credentialKeys.events(projectId ?? '', name ?? ''),
|
|
67
|
+
queryFn: () => listCredentialEvents(serverUrl, projectId, name),
|
|
68
|
+
enabled: !!projectId && !!name,
|
|
69
|
+
refetchInterval: 10_000,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
export function useUpsertCredential() {
|
|
73
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
74
|
+
const qc = useQueryClient();
|
|
75
|
+
return useMutation({
|
|
76
|
+
mutationFn: ({ projectId, ...body }) => upsertCredential(serverUrl, projectId, body),
|
|
77
|
+
onSuccess: (_res, vars) => {
|
|
78
|
+
qc.invalidateQueries({ queryKey: credentialKeys.list(vars.projectId) });
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/** Reveal returns the decrypted value. Each call is audit-logged as a read. */
|
|
83
|
+
export function useRevealCredential() {
|
|
84
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
85
|
+
const qc = useQueryClient();
|
|
86
|
+
return useMutation({
|
|
87
|
+
mutationFn: ({ projectId, name }) => revealCredential(serverUrl, projectId, name),
|
|
88
|
+
onSuccess: (_res, vars) => {
|
|
89
|
+
// Refresh list so last_read_at updates on the card
|
|
90
|
+
qc.invalidateQueries({ queryKey: credentialKeys.list(vars.projectId) });
|
|
91
|
+
qc.invalidateQueries({ queryKey: credentialKeys.events(vars.projectId, vars.name) });
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
export function useDeleteCredential() {
|
|
96
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
97
|
+
const qc = useQueryClient();
|
|
98
|
+
return useMutation({
|
|
99
|
+
mutationFn: ({ projectId, name }) => deleteCredential(serverUrl, projectId, name),
|
|
100
|
+
onSuccess: (_res, vars) => {
|
|
101
|
+
qc.invalidateQueries({ queryKey: credentialKeys.list(vars.projectId) });
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// ═════════════════════════════════════════════════════════════════════════
|
|
106
|
+
// Kortix projects — /kortix/projects
|
|
107
|
+
// ═════════════════════════════════════════════════════════════════════════
|
|
108
|
+
export const kortixKeys = {
|
|
109
|
+
projects: () => ['kortix', 'projects'],
|
|
110
|
+
project: (id) => ['kortix', 'projects', id],
|
|
111
|
+
};
|
|
112
|
+
export function useKortixProjects(identity, _args, options = {}) {
|
|
113
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
114
|
+
return useQuery({
|
|
115
|
+
queryKey: [...kortixKeys.projects(), identity.userId ?? 'anonymous', serverUrl],
|
|
116
|
+
queryFn: () => listKortixProjects(serverUrl),
|
|
117
|
+
enabled: !identity.isLoading && !!identity.userId && !!serverUrl && (options.enabled ?? true),
|
|
118
|
+
staleTime: 30_000,
|
|
119
|
+
gcTime: 5 * 60 * 1000,
|
|
120
|
+
refetchOnWindowFocus: true,
|
|
121
|
+
retry: 3,
|
|
122
|
+
retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 10000),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
export function useKortixProject(identity, id) {
|
|
126
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
127
|
+
return useQuery({
|
|
128
|
+
queryKey: [...kortixKeys.project(id), identity.userId ?? 'anonymous', serverUrl],
|
|
129
|
+
queryFn: () => getKortixProject(serverUrl, id),
|
|
130
|
+
enabled: !identity.isLoading && !!identity.userId && !!serverUrl && !!id,
|
|
131
|
+
staleTime: 15_000,
|
|
132
|
+
gcTime: 5 * 60 * 1000,
|
|
133
|
+
retry: 2,
|
|
134
|
+
// Keep previous data while a new query (e.g. from a runtime URL change)
|
|
135
|
+
// is loading. Prevents the skeleton flash.
|
|
136
|
+
placeholderData: keepPreviousData,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
export function useKortixProjectForSession(identity, sessionId, options = {}) {
|
|
140
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
141
|
+
return useQuery({
|
|
142
|
+
queryKey: ['kortix', 'projects', 'by-session', sessionId, identity.userId ?? 'anonymous', serverUrl],
|
|
143
|
+
queryFn: async () => {
|
|
144
|
+
try {
|
|
145
|
+
return await getKortixProjectBySession(serverUrl, sessionId);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
enabled: !identity.isLoading && !!identity.userId && !!serverUrl && !!sessionId && (options.enabled ?? true),
|
|
152
|
+
staleTime: 15_000,
|
|
153
|
+
gcTime: 5 * 60 * 1000,
|
|
154
|
+
placeholderData: keepPreviousData,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Fetch sessions linked to a specific project.
|
|
159
|
+
* Returns OpenCode session objects enriched with title, time, etc.
|
|
160
|
+
*/
|
|
161
|
+
export function useKortixProjectSessions(identity, projectId, options = {}) {
|
|
162
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
163
|
+
// `listKortixProjectSessions` itself returns `unknown[]` (its enriched
|
|
164
|
+
// OpenCode-session shape isn't schema-typed at the source) — mirror that
|
|
165
|
+
// here rather than lying about the element shape with `any`.
|
|
166
|
+
return useQuery({
|
|
167
|
+
queryKey: ['kortix', 'projects', projectId, 'sessions', identity.userId ?? 'anonymous', serverUrl],
|
|
168
|
+
queryFn: () => listKortixProjectSessions(serverUrl, projectId),
|
|
169
|
+
enabled: !identity.isLoading && !!identity.userId && !!serverUrl && !!projectId && (options.enabled ?? true),
|
|
170
|
+
staleTime: 15_000,
|
|
171
|
+
gcTime: 5 * 60 * 1000,
|
|
172
|
+
refetchOnWindowFocus: true,
|
|
173
|
+
retry: 2,
|
|
174
|
+
placeholderData: keepPreviousData,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
export function useDeleteProject() {
|
|
178
|
+
const qc = useQueryClient();
|
|
179
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
180
|
+
return useMutation({
|
|
181
|
+
mutationFn: (id) => deleteKortixProject(serverUrl, id),
|
|
182
|
+
onSuccess: () => {
|
|
183
|
+
qc.invalidateQueries({ queryKey: kortixKeys.projects() });
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
export function usePatchProject() {
|
|
188
|
+
const qc = useQueryClient();
|
|
189
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
190
|
+
return useMutation({
|
|
191
|
+
mutationFn: ({ id, ...body }) => patchKortixProject(serverUrl, id, body),
|
|
192
|
+
onSuccess: (_d, vars) => {
|
|
193
|
+
qc.invalidateQueries({ queryKey: kortixKeys.project(vars.id) });
|
|
194
|
+
qc.invalidateQueries({ queryKey: kortixKeys.projects() });
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
const taskKeys = {
|
|
199
|
+
all: ['kortix', 'tasks'],
|
|
200
|
+
byProject: (projectId) => ['kortix', 'tasks', projectId],
|
|
201
|
+
single: (id) => ['kortix', 'tasks', 'detail', id],
|
|
202
|
+
events: (id) => ['kortix', 'tasks', 'events', id],
|
|
203
|
+
status: (id) => ['kortix', 'tasks', 'status', id],
|
|
204
|
+
};
|
|
205
|
+
const VALID_STATUSES = [
|
|
206
|
+
'todo', 'in_progress', 'input_needed', 'awaiting_review',
|
|
207
|
+
'completed', 'cancelled',
|
|
208
|
+
];
|
|
209
|
+
/** Pure — the daemon's `status` isn't schema-validated, so this normalizes
|
|
210
|
+
* raw rows (defaulting an unrecognized status to `'todo'`) before trusting
|
|
211
|
+
* `KortixTask['status']`. `raw` is genuinely unvalidated wire data — duck-type
|
|
212
|
+
* via `unknown` rather than assume the shape. Exported for direct unit testing. */
|
|
213
|
+
export function normalizeTask(raw) {
|
|
214
|
+
const r = (raw && typeof raw === 'object' ? raw : {});
|
|
215
|
+
const status = VALID_STATUSES.includes(r.status)
|
|
216
|
+
? r.status
|
|
217
|
+
: 'todo';
|
|
218
|
+
return {
|
|
219
|
+
id: r.id,
|
|
220
|
+
project_id: r.project_id,
|
|
221
|
+
title: r.title || '',
|
|
222
|
+
description: r.description || '',
|
|
223
|
+
verification_condition: r.verification_condition || '',
|
|
224
|
+
status,
|
|
225
|
+
result: r.result ?? null,
|
|
226
|
+
verification_summary: r.verification_summary ?? null,
|
|
227
|
+
blocking_question: r.blocking_question ?? null,
|
|
228
|
+
owner_session_id: r.owner_session_id ?? null,
|
|
229
|
+
owner_agent: r.owner_agent ?? null,
|
|
230
|
+
requested_by_session_id: r.requested_by_session_id ?? null,
|
|
231
|
+
started_at: r.started_at ?? null,
|
|
232
|
+
completed_at: r.completed_at ?? null,
|
|
233
|
+
created_at: r.created_at,
|
|
234
|
+
updated_at: r.updated_at,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
export function useKortixTasks(projectId, status, options = {}) {
|
|
238
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
239
|
+
return useQuery({
|
|
240
|
+
queryKey: [...taskKeys.all, projectId, status],
|
|
241
|
+
queryFn: async () => {
|
|
242
|
+
const rows = await listTasks(serverUrl, { projectId, status });
|
|
243
|
+
return Array.isArray(rows) ? rows.map(normalizeTask) : [];
|
|
244
|
+
},
|
|
245
|
+
enabled: !!projectId && (options.enabled ?? true),
|
|
246
|
+
refetchInterval: options.pollingEnabled === false ? false : 3000,
|
|
247
|
+
refetchIntervalInBackground: false,
|
|
248
|
+
placeholderData: keepPreviousData,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
export function useKortixTask(id, options = {}) {
|
|
252
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
253
|
+
return useQuery({
|
|
254
|
+
queryKey: taskKeys.single(id),
|
|
255
|
+
queryFn: async () => {
|
|
256
|
+
const raw = await getTask(serverUrl, id);
|
|
257
|
+
return normalizeTask(raw);
|
|
258
|
+
},
|
|
259
|
+
enabled: !!id && (options.enabled ?? true),
|
|
260
|
+
refetchInterval: options.pollingEnabled === false ? false : 3000,
|
|
261
|
+
refetchIntervalInBackground: false,
|
|
262
|
+
placeholderData: keepPreviousData,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
export function useKortixTaskEvents(id, options = {}) {
|
|
266
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
267
|
+
return useQuery({
|
|
268
|
+
queryKey: taskKeys.events(id),
|
|
269
|
+
queryFn: async () => {
|
|
270
|
+
const rows = await listTaskEvents(serverUrl, id);
|
|
271
|
+
return Array.isArray(rows) ? rows : [];
|
|
272
|
+
},
|
|
273
|
+
enabled: !!id && (options.enabled ?? true),
|
|
274
|
+
refetchInterval: options.pollingEnabled === false ? false : 3000,
|
|
275
|
+
refetchIntervalInBackground: false,
|
|
276
|
+
placeholderData: keepPreviousData,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
export function useKortixTaskStatus(id, options = {}) {
|
|
280
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
281
|
+
return useQuery({
|
|
282
|
+
queryKey: taskKeys.status(id),
|
|
283
|
+
queryFn: async () => {
|
|
284
|
+
return getTaskStatus(serverUrl, id);
|
|
285
|
+
},
|
|
286
|
+
enabled: !!id && (options.enabled ?? true),
|
|
287
|
+
refetchInterval: options.pollingEnabled === false ? false : 3000,
|
|
288
|
+
refetchIntervalInBackground: false,
|
|
289
|
+
placeholderData: keepPreviousData,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
export function useCreateKortixTask() {
|
|
293
|
+
const qc = useQueryClient();
|
|
294
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
295
|
+
return useMutation({
|
|
296
|
+
mutationFn: (data) => createTask(serverUrl, data),
|
|
297
|
+
onSuccess: () => {
|
|
298
|
+
qc.invalidateQueries({ queryKey: taskKeys.all });
|
|
299
|
+
},
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
export function useUpdateKortixTask() {
|
|
303
|
+
const qc = useQueryClient();
|
|
304
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
305
|
+
return useMutation({
|
|
306
|
+
mutationFn: ({ id, ...data }) => updateTask(serverUrl, id, data),
|
|
307
|
+
onSuccess: () => {
|
|
308
|
+
qc.invalidateQueries({ queryKey: taskKeys.all });
|
|
309
|
+
},
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
export function useStartKortixTask() {
|
|
313
|
+
const qc = useQueryClient();
|
|
314
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
315
|
+
return useMutation({
|
|
316
|
+
mutationFn: ({ id }) => startTask(serverUrl, id),
|
|
317
|
+
onSuccess: (task) => {
|
|
318
|
+
qc.invalidateQueries({ queryKey: taskKeys.all });
|
|
319
|
+
qc.invalidateQueries({ queryKey: ['kortix', 'projects'] });
|
|
320
|
+
if (task?.project_id) {
|
|
321
|
+
qc.invalidateQueries({ queryKey: ['kortix', 'projects', task.project_id] });
|
|
322
|
+
qc.invalidateQueries({ queryKey: ['kortix', 'projects', task.project_id, 'sessions'] });
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
export function useApproveKortixTask() {
|
|
328
|
+
const qc = useQueryClient();
|
|
329
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
330
|
+
return useMutation({
|
|
331
|
+
mutationFn: (id) => approveTask(serverUrl, id),
|
|
332
|
+
onSuccess: () => {
|
|
333
|
+
qc.invalidateQueries({ queryKey: taskKeys.all });
|
|
334
|
+
},
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
export function useDeleteKortixTask() {
|
|
338
|
+
const qc = useQueryClient();
|
|
339
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
340
|
+
return useMutation({
|
|
341
|
+
mutationFn: (id) => deleteTask(serverUrl, id),
|
|
342
|
+
onSuccess: () => {
|
|
343
|
+
qc.invalidateQueries({ queryKey: taskKeys.all });
|
|
344
|
+
},
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
// ═════════════════════════════════════════════════════════════════════════
|
|
348
|
+
// Tickets — /kortix/tickets, plus columns/fields/templates/agents/pm-session
|
|
349
|
+
// /activity project sub-routes
|
|
350
|
+
// ═════════════════════════════════════════════════════════════════════════
|
|
351
|
+
export const ticketKeys = {
|
|
352
|
+
tickets: (pid) => ['kortix', 'tickets', pid ?? ''],
|
|
353
|
+
ticket: (id) => ['kortix', 'ticket', id],
|
|
354
|
+
events: (id) => ['kortix', 'ticket', id, 'events'],
|
|
355
|
+
columns: (pid) => ['kortix', 'columns', pid],
|
|
356
|
+
fields: (pid) => ['kortix', 'fields', pid],
|
|
357
|
+
templates: (pid) => ['kortix', 'templates', pid],
|
|
358
|
+
agents: (pid) => ['kortix', 'agents', pid],
|
|
359
|
+
};
|
|
360
|
+
export function useTickets(projectId, opts) {
|
|
361
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
362
|
+
return useQuery({
|
|
363
|
+
queryKey: ticketKeys.tickets(projectId),
|
|
364
|
+
queryFn: () => listTickets(serverUrl, projectId),
|
|
365
|
+
enabled: !!projectId && (opts?.enabled ?? true),
|
|
366
|
+
refetchInterval: opts?.pollingEnabled === false ? false : 3000,
|
|
367
|
+
refetchIntervalInBackground: false,
|
|
368
|
+
placeholderData: keepPreviousData,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
export function useTicket(id, opts) {
|
|
372
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
373
|
+
return useQuery({
|
|
374
|
+
queryKey: ticketKeys.ticket(id ?? ''),
|
|
375
|
+
queryFn: () => getTicket(serverUrl, id),
|
|
376
|
+
enabled: !!id && (opts?.enabled ?? true),
|
|
377
|
+
refetchInterval: opts?.pollingEnabled === false ? false : 3000,
|
|
378
|
+
refetchIntervalInBackground: false,
|
|
379
|
+
placeholderData: keepPreviousData,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
export function useTicketEvents(id, opts) {
|
|
383
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
384
|
+
return useQuery({
|
|
385
|
+
queryKey: ticketKeys.events(id ?? ''),
|
|
386
|
+
queryFn: () => listTicketEvents(serverUrl, id),
|
|
387
|
+
enabled: !!id && (opts?.enabled ?? true),
|
|
388
|
+
refetchInterval: opts?.pollingEnabled === false ? false : 3000,
|
|
389
|
+
refetchIntervalInBackground: false,
|
|
390
|
+
placeholderData: keepPreviousData,
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
export function useCreateTicket(identity) {
|
|
394
|
+
const qc = useQueryClient();
|
|
395
|
+
const handle = identity.handle;
|
|
396
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
397
|
+
return useMutation({
|
|
398
|
+
mutationFn: (body) => createTicket(serverUrl, {
|
|
399
|
+
...body,
|
|
400
|
+
actor_type: 'user',
|
|
401
|
+
actor_id: handle,
|
|
402
|
+
created_by_type: 'user',
|
|
403
|
+
created_by_id: handle,
|
|
404
|
+
}),
|
|
405
|
+
onSuccess: (_d, vars) => {
|
|
406
|
+
qc.invalidateQueries({ queryKey: ticketKeys.tickets(vars.project_id) });
|
|
407
|
+
},
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
export function useUpdateTicket(identity) {
|
|
411
|
+
const qc = useQueryClient();
|
|
412
|
+
const handle = identity.handle;
|
|
413
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
414
|
+
return useMutation({
|
|
415
|
+
mutationFn: ({ id, ...body }) => updateTicket(serverUrl, id, { ...body, actor_type: 'user', actor_id: handle }),
|
|
416
|
+
onSuccess: (t) => {
|
|
417
|
+
qc.invalidateQueries({ queryKey: ticketKeys.tickets(t.project_id) });
|
|
418
|
+
qc.invalidateQueries({ queryKey: ticketKeys.ticket(t.id) });
|
|
419
|
+
qc.invalidateQueries({ queryKey: ticketKeys.events(t.id) });
|
|
420
|
+
},
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
export function useUpdateTicketStatus(identity) {
|
|
424
|
+
const qc = useQueryClient();
|
|
425
|
+
const handle = identity.handle;
|
|
426
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
427
|
+
return useMutation({
|
|
428
|
+
mutationFn: ({ id, status }) => updateTicketStatus(serverUrl, id, { status, actor_type: 'user', actor_id: handle }),
|
|
429
|
+
onSuccess: (r) => {
|
|
430
|
+
qc.invalidateQueries({ queryKey: ticketKeys.tickets(r.ticket.project_id) });
|
|
431
|
+
qc.invalidateQueries({ queryKey: ticketKeys.ticket(r.ticket.id) });
|
|
432
|
+
qc.invalidateQueries({ queryKey: ticketKeys.events(r.ticket.id) });
|
|
433
|
+
},
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
export function useAssignTicket(identity) {
|
|
437
|
+
const qc = useQueryClient();
|
|
438
|
+
const handle = identity.handle;
|
|
439
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
440
|
+
return useMutation({
|
|
441
|
+
mutationFn: ({ id, assignee_type, assignee_id }) => assignTicket(serverUrl, id, { assignee_type, assignee_id, actor_type: 'user', actor_id: handle }),
|
|
442
|
+
onSuccess: (r) => {
|
|
443
|
+
qc.invalidateQueries({ queryKey: ticketKeys.tickets(r.ticket.project_id) });
|
|
444
|
+
qc.invalidateQueries({ queryKey: ticketKeys.ticket(r.ticket.id) });
|
|
445
|
+
qc.invalidateQueries({ queryKey: ticketKeys.events(r.ticket.id) });
|
|
446
|
+
},
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
export function useUnassignTicket(identity) {
|
|
450
|
+
const qc = useQueryClient();
|
|
451
|
+
const handle = identity.handle;
|
|
452
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
453
|
+
return useMutation({
|
|
454
|
+
mutationFn: ({ id, assignee_type, assignee_id }) => unassignTicket(serverUrl, id, { assignee_type, assignee_id, actor_type: 'user', actor_id: handle }),
|
|
455
|
+
onSuccess: (r) => {
|
|
456
|
+
qc.invalidateQueries({ queryKey: ticketKeys.tickets(r.ticket.project_id) });
|
|
457
|
+
qc.invalidateQueries({ queryKey: ticketKeys.ticket(r.ticket.id) });
|
|
458
|
+
qc.invalidateQueries({ queryKey: ticketKeys.events(r.ticket.id) });
|
|
459
|
+
},
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
export function useCommentTicket(identity) {
|
|
463
|
+
const qc = useQueryClient();
|
|
464
|
+
const handle = identity.handle;
|
|
465
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
466
|
+
return useMutation({
|
|
467
|
+
mutationFn: ({ id, body }) => commentTicket(serverUrl, id, { body, actor_type: 'user', actor_id: handle }),
|
|
468
|
+
onSuccess: (_d, vars) => {
|
|
469
|
+
qc.invalidateQueries({ queryKey: ticketKeys.events(vars.id) });
|
|
470
|
+
qc.invalidateQueries({ queryKey: ticketKeys.ticket(vars.id) });
|
|
471
|
+
},
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
export function useDeleteTicket() {
|
|
475
|
+
const qc = useQueryClient();
|
|
476
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
477
|
+
return useMutation({
|
|
478
|
+
mutationFn: (id) => deleteTicket(serverUrl, id),
|
|
479
|
+
onSuccess: () => { qc.invalidateQueries({ queryKey: ['kortix', 'tickets'] }); },
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
// ── Columns ──────────────────────────────────────────────────────────────────
|
|
483
|
+
export function useColumns(projectId) {
|
|
484
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
485
|
+
return useQuery({
|
|
486
|
+
queryKey: ticketKeys.columns(projectId ?? ''),
|
|
487
|
+
queryFn: () => listColumns(serverUrl, projectId),
|
|
488
|
+
enabled: !!projectId,
|
|
489
|
+
staleTime: 30_000,
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
export function useReplaceColumns() {
|
|
493
|
+
const qc = useQueryClient();
|
|
494
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
495
|
+
return useMutation({
|
|
496
|
+
mutationFn: ({ projectId, columns }) => replaceColumns(serverUrl, projectId, columns),
|
|
497
|
+
onSuccess: (_d, vars) => {
|
|
498
|
+
qc.invalidateQueries({ queryKey: ticketKeys.columns(vars.projectId) });
|
|
499
|
+
qc.invalidateQueries({ queryKey: ticketKeys.tickets(vars.projectId) });
|
|
500
|
+
},
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
// ── Fields ───────────────────────────────────────────────────────────────────
|
|
504
|
+
export function useFields(projectId) {
|
|
505
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
506
|
+
return useQuery({
|
|
507
|
+
queryKey: ticketKeys.fields(projectId ?? ''),
|
|
508
|
+
queryFn: () => listFields(serverUrl, projectId),
|
|
509
|
+
enabled: !!projectId,
|
|
510
|
+
staleTime: 30_000,
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
export function useReplaceFields() {
|
|
514
|
+
const qc = useQueryClient();
|
|
515
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
516
|
+
return useMutation({
|
|
517
|
+
mutationFn: ({ projectId, fields }) => replaceFields(serverUrl, projectId, fields),
|
|
518
|
+
onSuccess: (_d, vars) => { qc.invalidateQueries({ queryKey: ticketKeys.fields(vars.projectId) }); },
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
// ── Templates ────────────────────────────────────────────────────────────────
|
|
522
|
+
export function useTemplates(projectId) {
|
|
523
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
524
|
+
return useQuery({
|
|
525
|
+
queryKey: ticketKeys.templates(projectId ?? ''),
|
|
526
|
+
queryFn: () => listTemplates(serverUrl, projectId),
|
|
527
|
+
enabled: !!projectId,
|
|
528
|
+
staleTime: 30_000,
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
export function useReplaceTemplates() {
|
|
532
|
+
const qc = useQueryClient();
|
|
533
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
534
|
+
return useMutation({
|
|
535
|
+
mutationFn: ({ projectId, templates }) => replaceTemplates(serverUrl, projectId, templates),
|
|
536
|
+
onSuccess: (_d, vars) => { qc.invalidateQueries({ queryKey: ticketKeys.templates(vars.projectId) }); },
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
// ── PM chat session ──────────────────────────────────────────────────────────
|
|
540
|
+
/**
|
|
541
|
+
* Ensure (create-if-missing) a project-level session bound to the Project
|
|
542
|
+
* Manager agent. Idempotent on the backend — first call creates + binds,
|
|
543
|
+
* subsequent calls return the existing session id so the thread continues.
|
|
544
|
+
*/
|
|
545
|
+
export function useEnsurePmSession() {
|
|
546
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
547
|
+
return useMutation({
|
|
548
|
+
mutationFn: ({ projectId }) => ensurePmSession(serverUrl, projectId),
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
// ── Agents (team) ────────────────────────────────────────────────────────────
|
|
552
|
+
export function useProjectAgents(projectId) {
|
|
553
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
554
|
+
return useQuery({
|
|
555
|
+
queryKey: ticketKeys.agents(projectId ?? ''),
|
|
556
|
+
queryFn: () => listProjectAgents(serverUrl, projectId),
|
|
557
|
+
enabled: !!projectId,
|
|
558
|
+
staleTime: 30_000,
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
export function useCreateProjectAgent() {
|
|
562
|
+
const qc = useQueryClient();
|
|
563
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
564
|
+
return useMutation({
|
|
565
|
+
mutationFn: ({ projectId, slug, name, body_md, execution_mode, tool_groups, default_assignee_columns, default_model, color_hue, icon, }) => createProjectAgent(serverUrl, projectId, {
|
|
566
|
+
slug, name, body_md, execution_mode, tool_groups, default_assignee_columns, default_model, color_hue, icon,
|
|
567
|
+
}),
|
|
568
|
+
onSuccess: (_d, vars) => { qc.invalidateQueries({ queryKey: ticketKeys.agents(vars.projectId) }); },
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
export function useUpdateProjectAgent() {
|
|
572
|
+
const qc = useQueryClient();
|
|
573
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
574
|
+
return useMutation({
|
|
575
|
+
mutationFn: ({ projectId, slug, ...body }) => updateProjectAgent(serverUrl, projectId, slug, body),
|
|
576
|
+
onSuccess: (_d, vars) => { qc.invalidateQueries({ queryKey: ticketKeys.agents(vars.projectId) }); },
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
export function useDeleteProjectAgent() {
|
|
580
|
+
const qc = useQueryClient();
|
|
581
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
582
|
+
return useMutation({
|
|
583
|
+
mutationFn: ({ projectId, slug }) => deleteProjectAgent(serverUrl, projectId, slug),
|
|
584
|
+
onSuccess: (_d, vars) => { qc.invalidateQueries({ queryKey: ticketKeys.agents(vars.projectId) }); },
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
export function useAgentPersona(projectId, slug, opts) {
|
|
588
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
589
|
+
return useQuery({
|
|
590
|
+
queryKey: ['kortix', 'agent-persona', projectId ?? '', slug ?? ''],
|
|
591
|
+
queryFn: () => getAgentPersona(serverUrl, projectId, slug),
|
|
592
|
+
enabled: !!projectId && !!slug && (opts?.enabled ?? true),
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
// ── Project activity / notifications ─────────────────────────────────────────
|
|
596
|
+
export function useProjectActivity(projectId, opts) {
|
|
597
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
598
|
+
return useQuery({
|
|
599
|
+
queryKey: ['kortix', 'project-activity', projectId ?? ''],
|
|
600
|
+
queryFn: () => getProjectActivity(serverUrl, projectId, 200),
|
|
601
|
+
enabled: !!projectId && (opts?.enabled ?? true),
|
|
602
|
+
refetchInterval: opts?.pollingEnabled === false ? false : 10_000,
|
|
603
|
+
refetchIntervalInBackground: false,
|
|
604
|
+
placeholderData: keepPreviousData,
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* Count events that are meaningful for the current human:
|
|
609
|
+
* - they were assigned to this user (user.assignee_id === handle)
|
|
610
|
+
* - they were @-mentioned in a comment body (message contains `@handle`)
|
|
611
|
+
* - a teammate commented on a ticket the user is tracking (not implemented;
|
|
612
|
+
* for v1 the assignment/@-mention covers the critical surface).
|
|
613
|
+
*
|
|
614
|
+
* Filters out events the user themselves produced. Uses the client-side
|
|
615
|
+
* `sinceIso` (usually localStorage last-seen for the project) as the cutoff.
|
|
616
|
+
*
|
|
617
|
+
* Pure — takes `handle` as an explicit parameter rather than reading it from
|
|
618
|
+
* an auth hook. Exported for direct unit testing.
|
|
619
|
+
*/
|
|
620
|
+
export function computeUnread(events, handle, sinceIso) {
|
|
621
|
+
const byTicket = new Map();
|
|
622
|
+
let latest = null;
|
|
623
|
+
let total = 0;
|
|
624
|
+
if (!events)
|
|
625
|
+
return { total, byTicket, latestAt: null };
|
|
626
|
+
const h = handle.toLowerCase();
|
|
627
|
+
const mentionRe = new RegExp(`(^|\\s)@${h.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')}\\b`, 'i');
|
|
628
|
+
for (const ev of events) {
|
|
629
|
+
if (sinceIso && ev.created_at <= sinceIso)
|
|
630
|
+
continue;
|
|
631
|
+
if (!latest || ev.created_at > latest)
|
|
632
|
+
latest = ev.created_at;
|
|
633
|
+
// Skip events the user themselves initiated (actor_type=user,actor_id=handle).
|
|
634
|
+
if (ev.actor_type === 'user' && (ev.actor_id ?? '').toLowerCase() === h)
|
|
635
|
+
continue;
|
|
636
|
+
let hit = false;
|
|
637
|
+
if (ev.type === 'assigned') {
|
|
638
|
+
try {
|
|
639
|
+
const p = ev.payload_json ? JSON.parse(ev.payload_json) : null;
|
|
640
|
+
if (p?.assignee_type === 'user' && (p.assignee_id ?? '').toLowerCase() === h)
|
|
641
|
+
hit = true;
|
|
642
|
+
}
|
|
643
|
+
catch { }
|
|
644
|
+
}
|
|
645
|
+
else if (ev.type === 'comment' && ev.message && mentionRe.test(ev.message)) {
|
|
646
|
+
hit = true;
|
|
647
|
+
}
|
|
648
|
+
if (!hit)
|
|
649
|
+
continue;
|
|
650
|
+
total++;
|
|
651
|
+
byTicket.set(ev.ticket_id, (byTicket.get(ev.ticket_id) ?? 0) + 1);
|
|
652
|
+
}
|
|
653
|
+
return { total, byTicket, latestAt: latest };
|
|
654
|
+
}
|
|
655
|
+
/**
|
|
656
|
+
* Turn the raw activity stream into a list of user-facing notifications.
|
|
657
|
+
* Scoped to assignments + @mentions, same rule set as computeUnread — we
|
|
658
|
+
* just keep the event itself so the UI can render actor avatars, ticket
|
|
659
|
+
* titles, relative times, and the comment body that caused a mention.
|
|
660
|
+
*
|
|
661
|
+
* Pure — same `handle`-as-parameter shape as {@link computeUnread}.
|
|
662
|
+
*/
|
|
663
|
+
export function computeNotifications(events, handle, sinceIso) {
|
|
664
|
+
if (!events)
|
|
665
|
+
return [];
|
|
666
|
+
const h = handle.toLowerCase();
|
|
667
|
+
const mentionRe = new RegExp(`(^|\\s)@${h.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')}\\b`, 'i');
|
|
668
|
+
const out = [];
|
|
669
|
+
for (const ev of events) {
|
|
670
|
+
if (sinceIso && ev.created_at <= sinceIso)
|
|
671
|
+
continue;
|
|
672
|
+
if (ev.actor_type === 'user' && (ev.actor_id ?? '').toLowerCase() === h)
|
|
673
|
+
continue;
|
|
674
|
+
if (ev.type === 'assigned') {
|
|
675
|
+
try {
|
|
676
|
+
const p = ev.payload_json ? JSON.parse(ev.payload_json) : null;
|
|
677
|
+
if (p?.assignee_type === 'user' && (p.assignee_id ?? '').toLowerCase() === h) {
|
|
678
|
+
out.push({ event: ev, ticket_id: ev.ticket_id, kind: 'assigned' });
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
catch { }
|
|
682
|
+
}
|
|
683
|
+
else if (ev.type === 'comment' && ev.message && mentionRe.test(ev.message)) {
|
|
684
|
+
out.push({ event: ev, ticket_id: ev.ticket_id, kind: 'mention', relatedComment: ev });
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
return out;
|
|
688
|
+
}
|
|
689
|
+
const LAST_SEEN_KEY = (projectId, handle) => `kortix:activity-last-seen:${projectId}:${handle}`;
|
|
690
|
+
export const LAST_SEEN_EVENT = 'kortix:last-seen-changed';
|
|
691
|
+
export function readLastSeen(projectId, handle) {
|
|
692
|
+
if (typeof window === 'undefined')
|
|
693
|
+
return null;
|
|
694
|
+
try {
|
|
695
|
+
return window.localStorage.getItem(LAST_SEEN_KEY(projectId, handle));
|
|
696
|
+
}
|
|
697
|
+
catch {
|
|
698
|
+
return null;
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
export function writeLastSeen(projectId, handle, iso) {
|
|
702
|
+
if (typeof window === 'undefined')
|
|
703
|
+
return;
|
|
704
|
+
try {
|
|
705
|
+
window.localStorage.setItem(LAST_SEEN_KEY(projectId, handle), iso);
|
|
706
|
+
// Same-tab listeners (e.g. the sidebar project rows) don't receive the
|
|
707
|
+
// native 'storage' event — emit a custom one so they refresh instantly.
|
|
708
|
+
window.dispatchEvent(new CustomEvent(LAST_SEEN_EVENT, { detail: { projectId, handle, iso } }));
|
|
709
|
+
}
|
|
710
|
+
catch { }
|
|
711
|
+
}
|
|
712
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
713
|
+
export function safeParseJsonArray(s) {
|
|
714
|
+
if (!s)
|
|
715
|
+
return [];
|
|
716
|
+
try {
|
|
717
|
+
const v = JSON.parse(s);
|
|
718
|
+
return Array.isArray(v) ? v.map(String) : [];
|
|
719
|
+
}
|
|
720
|
+
catch {
|
|
721
|
+
return [];
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
export function parseCustomFields(json) {
|
|
725
|
+
if (!json)
|
|
726
|
+
return {};
|
|
727
|
+
try {
|
|
728
|
+
const v = JSON.parse(json);
|
|
729
|
+
return v && typeof v === 'object' ? v : {};
|
|
730
|
+
}
|
|
731
|
+
catch {
|
|
732
|
+
return {};
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
// ═════════════════════════════════════════════════════════════════════════
|
|
736
|
+
// Milestones — /kortix/projects/:id/milestones
|
|
737
|
+
// ═════════════════════════════════════════════════════════════════════════
|
|
738
|
+
export const milestoneKeys = {
|
|
739
|
+
list: (pid, status = 'all') => ['kortix', 'milestones', pid ?? '', status],
|
|
740
|
+
detail: (pid, ref) => ['kortix', 'milestone', pid, ref],
|
|
741
|
+
events: (pid, ref) => ['kortix', 'milestone', pid, ref, 'events'],
|
|
742
|
+
};
|
|
743
|
+
export function useMilestones(projectId, statusFilter = 'all') {
|
|
744
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
745
|
+
return useQuery({
|
|
746
|
+
queryKey: milestoneKeys.list(projectId, statusFilter),
|
|
747
|
+
queryFn: () => listMilestones(serverUrl, projectId, statusFilter),
|
|
748
|
+
enabled: !!projectId,
|
|
749
|
+
refetchInterval: 5000,
|
|
750
|
+
refetchIntervalInBackground: false,
|
|
751
|
+
placeholderData: keepPreviousData,
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
export function useMilestone(projectId, ref) {
|
|
755
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
756
|
+
return useQuery({
|
|
757
|
+
queryKey: milestoneKeys.detail(projectId ?? '', ref ?? ''),
|
|
758
|
+
queryFn: () => getMilestone(serverUrl, projectId, ref),
|
|
759
|
+
enabled: !!projectId && !!ref,
|
|
760
|
+
refetchInterval: 5000,
|
|
761
|
+
refetchIntervalInBackground: false,
|
|
762
|
+
placeholderData: keepPreviousData,
|
|
763
|
+
});
|
|
764
|
+
}
|
|
765
|
+
export function useMilestoneEvents(projectId, ref) {
|
|
766
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
767
|
+
return useQuery({
|
|
768
|
+
queryKey: milestoneKeys.events(projectId ?? '', ref ?? ''),
|
|
769
|
+
queryFn: () => listMilestoneEvents(serverUrl, projectId, ref),
|
|
770
|
+
enabled: !!projectId && !!ref,
|
|
771
|
+
refetchInterval: 5000,
|
|
772
|
+
placeholderData: keepPreviousData,
|
|
773
|
+
});
|
|
774
|
+
}
|
|
775
|
+
export function useCreateMilestone() {
|
|
776
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
777
|
+
const qc = useQueryClient();
|
|
778
|
+
return useMutation({
|
|
779
|
+
mutationFn: ({ projectId, ...body }) => createMilestone(serverUrl, projectId, body),
|
|
780
|
+
onSuccess: (_res, vars) => {
|
|
781
|
+
qc.invalidateQueries({ queryKey: ['kortix', 'milestones', vars.projectId] });
|
|
782
|
+
},
|
|
783
|
+
});
|
|
784
|
+
}
|
|
785
|
+
export function useUpdateMilestone() {
|
|
786
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
787
|
+
const qc = useQueryClient();
|
|
788
|
+
return useMutation({
|
|
789
|
+
mutationFn: ({ projectId, ref, patch }) => updateMilestone(serverUrl, projectId, ref, patch),
|
|
790
|
+
onSuccess: (_res, vars) => {
|
|
791
|
+
qc.invalidateQueries({ queryKey: ['kortix', 'milestones', vars.projectId] });
|
|
792
|
+
qc.invalidateQueries({ queryKey: milestoneKeys.detail(vars.projectId, vars.ref) });
|
|
793
|
+
},
|
|
794
|
+
});
|
|
795
|
+
}
|
|
796
|
+
export function useCloseMilestone() {
|
|
797
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
798
|
+
const qc = useQueryClient();
|
|
799
|
+
return useMutation({
|
|
800
|
+
mutationFn: ({ projectId, ref, summary_md, cancelled }) => closeMilestone(serverUrl, projectId, ref, { summary_md, cancelled }),
|
|
801
|
+
onSuccess: (_res, vars) => {
|
|
802
|
+
qc.invalidateQueries({ queryKey: ['kortix', 'milestones', vars.projectId] });
|
|
803
|
+
qc.invalidateQueries({ queryKey: milestoneKeys.detail(vars.projectId, vars.ref) });
|
|
804
|
+
},
|
|
805
|
+
});
|
|
806
|
+
}
|
|
807
|
+
export function useReopenMilestone() {
|
|
808
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
809
|
+
const qc = useQueryClient();
|
|
810
|
+
return useMutation({
|
|
811
|
+
mutationFn: ({ projectId, ref }) => reopenMilestone(serverUrl, projectId, ref),
|
|
812
|
+
onSuccess: (_res, vars) => {
|
|
813
|
+
qc.invalidateQueries({ queryKey: ['kortix', 'milestones', vars.projectId] });
|
|
814
|
+
qc.invalidateQueries({ queryKey: milestoneKeys.detail(vars.projectId, vars.ref) });
|
|
815
|
+
},
|
|
816
|
+
});
|
|
817
|
+
}
|
|
818
|
+
export function useDeleteMilestone() {
|
|
819
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
820
|
+
const qc = useQueryClient();
|
|
821
|
+
return useMutation({
|
|
822
|
+
mutationFn: ({ projectId, ref }) => deleteMilestone(serverUrl, projectId, ref),
|
|
823
|
+
onSuccess: (_res, vars) => {
|
|
824
|
+
qc.invalidateQueries({ queryKey: ['kortix', 'milestones', vars.projectId] });
|
|
825
|
+
},
|
|
826
|
+
});
|
|
827
|
+
}
|
|
828
|
+
/** Link or unlink a ticket's milestone. Goes through PATCH /kortix/tickets/:id. */
|
|
829
|
+
export function useSetTicketMilestone() {
|
|
830
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
831
|
+
const qc = useQueryClient();
|
|
832
|
+
return useMutation({
|
|
833
|
+
mutationFn: ({ ticketId, milestoneId }) => updateTicket(serverUrl, ticketId, { milestone_id: milestoneId }),
|
|
834
|
+
onSuccess: (_res, vars) => {
|
|
835
|
+
qc.invalidateQueries({ queryKey: ['kortix', 'milestones', vars.projectId] });
|
|
836
|
+
qc.invalidateQueries({ queryKey: ['kortix', 'tickets', vars.projectId] });
|
|
837
|
+
qc.invalidateQueries({ queryKey: ['kortix', 'ticket', vars.ticketId] });
|
|
838
|
+
},
|
|
839
|
+
});
|
|
840
|
+
}
|
|
841
|
+
// ═════════════════════════════════════════════════════════════════════════
|
|
842
|
+
// Sandbox services — /kortix/services
|
|
843
|
+
// ═════════════════════════════════════════════════════════════════════════
|
|
844
|
+
const getActiveServerUrl = () => {
|
|
845
|
+
return useServerStore.getState().getActiveServerUrl();
|
|
846
|
+
};
|
|
847
|
+
export const serviceKeys = {
|
|
848
|
+
all: ['sandbox-services'],
|
|
849
|
+
list: (serverUrl, includeAll) => ['sandbox-services', serverUrl, includeAll ? 'all' : 'visible'],
|
|
850
|
+
logs: (serverUrl, serviceId) => ['sandbox-services', serverUrl, 'logs', serviceId],
|
|
851
|
+
templates: (serverUrl) => ['sandbox-services', serverUrl, 'templates'],
|
|
852
|
+
};
|
|
853
|
+
export function useSandboxServices(identity, options) {
|
|
854
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
855
|
+
const includeAll = options?.includeAll ?? false;
|
|
856
|
+
return useQuery({
|
|
857
|
+
queryKey: [...serviceKeys.list(serverUrl, includeAll), identity.userId ?? 'anonymous'],
|
|
858
|
+
queryFn: async () => {
|
|
859
|
+
if (!serverUrl)
|
|
860
|
+
return [];
|
|
861
|
+
return listServices(serverUrl, includeAll);
|
|
862
|
+
},
|
|
863
|
+
enabled: (options?.enabled ?? true) && !identity.isLoading && !!identity.userId && !!serverUrl,
|
|
864
|
+
staleTime: 5_000,
|
|
865
|
+
gcTime: 60_000,
|
|
866
|
+
refetchInterval: 5_000,
|
|
867
|
+
refetchIntervalInBackground: false,
|
|
868
|
+
refetchOnWindowFocus: true,
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
export function useSandboxServiceTemplates(identity, options) {
|
|
872
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
873
|
+
return useQuery({
|
|
874
|
+
queryKey: [...serviceKeys.templates(serverUrl), identity.userId ?? 'anonymous'],
|
|
875
|
+
queryFn: async () => {
|
|
876
|
+
if (!serverUrl)
|
|
877
|
+
return [];
|
|
878
|
+
return listServiceTemplates(serverUrl);
|
|
879
|
+
},
|
|
880
|
+
enabled: (options?.enabled ?? true) && !identity.isLoading && !!identity.userId && !!serverUrl,
|
|
881
|
+
staleTime: 60_000,
|
|
882
|
+
gcTime: 5 * 60_000,
|
|
883
|
+
});
|
|
884
|
+
}
|
|
885
|
+
export function useSandboxServiceLogs(identity, serviceId, options) {
|
|
886
|
+
const serverUrl = useServerStore((s) => s.getActiveServerUrl());
|
|
887
|
+
return useQuery({
|
|
888
|
+
queryKey: serviceId
|
|
889
|
+
? [...serviceKeys.logs(serverUrl, serviceId), identity.userId ?? 'anonymous']
|
|
890
|
+
: ['sandbox-services', serverUrl, 'logs', 'none', identity.userId ?? 'anonymous'],
|
|
891
|
+
queryFn: async () => {
|
|
892
|
+
if (!serverUrl || !serviceId)
|
|
893
|
+
return [];
|
|
894
|
+
return getServiceLogs(serverUrl, serviceId);
|
|
895
|
+
},
|
|
896
|
+
enabled: (options?.enabled ?? true) && !identity.isLoading && !!identity.userId && !!serverUrl && !!serviceId,
|
|
897
|
+
staleTime: 3_000,
|
|
898
|
+
gcTime: 60_000,
|
|
899
|
+
refetchInterval: serviceId ? 3_000 : false,
|
|
900
|
+
refetchIntervalInBackground: false,
|
|
901
|
+
});
|
|
902
|
+
}
|
|
903
|
+
export function useSandboxServiceAction() {
|
|
904
|
+
const queryClient = useQueryClient();
|
|
905
|
+
return useMutation({
|
|
906
|
+
mutationFn: async ({ serviceId, action }) => {
|
|
907
|
+
const serverUrl = getActiveServerUrl();
|
|
908
|
+
if (!serverUrl)
|
|
909
|
+
throw new Error('No active instance selected');
|
|
910
|
+
return sdkServiceAction(serverUrl, serviceId, action);
|
|
911
|
+
},
|
|
912
|
+
onSuccess: () => {
|
|
913
|
+
const serverUrl = getActiveServerUrl();
|
|
914
|
+
queryClient.invalidateQueries({ queryKey: serviceKeys.all });
|
|
915
|
+
if (serverUrl) {
|
|
916
|
+
queryClient.invalidateQueries({ queryKey: serviceKeys.templates(serverUrl) });
|
|
917
|
+
}
|
|
918
|
+
},
|
|
919
|
+
});
|
|
920
|
+
}
|
|
921
|
+
export function useSandboxServiceReconcile() {
|
|
922
|
+
const queryClient = useQueryClient();
|
|
923
|
+
return useMutation({
|
|
924
|
+
mutationFn: async ({ reload } = {}) => {
|
|
925
|
+
const serverUrl = getActiveServerUrl();
|
|
926
|
+
if (!serverUrl)
|
|
927
|
+
throw new Error('No active instance selected');
|
|
928
|
+
return reconcileServices(serverUrl, reload);
|
|
929
|
+
},
|
|
930
|
+
onSuccess: () => {
|
|
931
|
+
queryClient.invalidateQueries({ queryKey: serviceKeys.all });
|
|
932
|
+
},
|
|
933
|
+
});
|
|
934
|
+
}
|
|
935
|
+
export function useRegisterSandboxService() {
|
|
936
|
+
const queryClient = useQueryClient();
|
|
937
|
+
return useMutation({
|
|
938
|
+
mutationFn: async (payload) => {
|
|
939
|
+
const serverUrl = getActiveServerUrl();
|
|
940
|
+
if (!serverUrl)
|
|
941
|
+
throw new Error('No active instance selected');
|
|
942
|
+
return registerService(serverUrl, payload);
|
|
943
|
+
},
|
|
944
|
+
onSuccess: () => {
|
|
945
|
+
queryClient.invalidateQueries({ queryKey: serviceKeys.all });
|
|
946
|
+
},
|
|
947
|
+
});
|
|
948
|
+
}
|
|
949
|
+
// Reload already has a home in the SDK (`systemReload` in `../opencode/client`,
|
|
950
|
+
// backing `POST /kortix/services/system/reload`) — reused directly rather
|
|
951
|
+
// than duplicated here. It resolves the active runtime URL itself (the same
|
|
952
|
+
// zustand state `getActiveServerUrl()` above reads).
|
|
953
|
+
export function useSandboxRuntimeReload() {
|
|
954
|
+
return useMutation({
|
|
955
|
+
mutationFn: ({ mode }) => systemReload(mode),
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
//# sourceMappingURL=use-kortix-master.js.map
|