@kortix/sdk 0.10.15 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -2
- package/dist/browser/session-sync/session-sync-registry.d.ts +3 -0
- package/dist/browser/session-sync/session-sync-registry.d.ts.map +1 -1
- package/dist/browser/session-sync/session-sync-registry.js +31 -2
- package/dist/browser/session-sync/session-sync-registry.js.map +1 -1
- package/dist/core/acp/client.d.ts +45 -0
- package/dist/core/acp/client.d.ts.map +1 -0
- package/dist/core/acp/client.js +277 -0
- package/dist/core/acp/client.js.map +1 -0
- package/dist/core/acp/index.d.ts +5 -0
- package/dist/core/acp/index.d.ts.map +1 -0
- package/dist/core/acp/index.js +5 -0
- package/dist/core/acp/index.js.map +1 -0
- package/dist/core/acp/projection.d.ts +23 -0
- package/dist/core/acp/projection.d.ts.map +1 -0
- package/dist/core/acp/projection.js +603 -0
- package/dist/core/acp/projection.js.map +1 -0
- package/dist/core/acp/session-controller.d.ts +90 -0
- package/dist/core/acp/session-controller.d.ts.map +1 -0
- package/dist/core/acp/session-controller.js +530 -0
- package/dist/core/acp/session-controller.js.map +1 -0
- package/dist/core/acp/types.d.ts +66 -0
- package/dist/core/acp/types.d.ts.map +1 -0
- package/dist/core/acp/types.js +21 -0
- package/dist/core/acp/types.js.map +1 -0
- package/dist/core/client/kortix.d.ts +141 -14
- package/dist/core/client/kortix.d.ts.map +1 -1
- package/dist/core/client/kortix.js +40 -7
- package/dist/core/client/kortix.js.map +1 -1
- package/dist/core/http/api-client.d.ts.map +1 -1
- package/dist/core/http/api-client.js +48 -68
- package/dist/core/http/api-client.js.map +1 -1
- package/dist/core/rest/platform-client/host-boundary.d.ts +114 -0
- package/dist/core/rest/platform-client/host-boundary.d.ts.map +1 -0
- package/dist/core/rest/platform-client/host-boundary.js +229 -0
- package/dist/core/rest/platform-client/host-boundary.js.map +1 -0
- package/dist/core/rest/platform-client/index.d.ts +1 -0
- package/dist/core/rest/platform-client/index.d.ts.map +1 -1
- package/dist/core/rest/platform-client/index.js +1 -0
- package/dist/core/rest/platform-client/index.js.map +1 -1
- package/dist/core/rest/projects-client/account-lifecycle.d.ts +22 -0
- package/dist/core/rest/projects-client/account-lifecycle.d.ts.map +1 -0
- package/dist/core/rest/projects-client/account-lifecycle.js +26 -0
- package/dist/core/rest/projects-client/account-lifecycle.js.map +1 -0
- package/dist/core/rest/projects-client/admin-providers.d.ts +10 -0
- package/dist/core/rest/projects-client/admin-providers.d.ts.map +1 -0
- package/dist/core/rest/projects-client/admin-providers.js +34 -0
- package/dist/core/rest/projects-client/admin-providers.js.map +1 -0
- package/dist/core/rest/projects-client/agent-config.d.ts +7 -0
- package/dist/core/rest/projects-client/agent-config.d.ts.map +1 -1
- package/dist/core/rest/projects-client/agent-config.js.map +1 -1
- package/dist/core/rest/projects-client/billing.d.ts +89 -0
- package/dist/core/rest/projects-client/billing.d.ts.map +1 -1
- package/dist/core/rest/projects-client/billing.js +43 -0
- package/dist/core/rest/projects-client/billing.js.map +1 -1
- package/dist/core/rest/projects-client/channels.d.ts +8 -27
- package/dist/core/rest/projects-client/channels.d.ts.map +1 -1
- package/dist/core/rest/projects-client/channels.js +12 -23
- package/dist/core/rest/projects-client/channels.js.map +1 -1
- package/dist/core/rest/projects-client/connectors.d.ts +162 -13
- package/dist/core/rest/projects-client/connectors.d.ts.map +1 -1
- package/dist/core/rest/projects-client/connectors.js +64 -2
- package/dist/core/rest/projects-client/connectors.js.map +1 -1
- package/dist/core/rest/projects-client/gateway.d.ts +1 -0
- package/dist/core/rest/projects-client/gateway.d.ts.map +1 -1
- package/dist/core/rest/projects-client/gateway.js.map +1 -1
- package/dist/core/rest/projects-client/iam.d.ts +492 -0
- package/dist/core/rest/projects-client/iam.d.ts.map +1 -0
- package/dist/core/rest/projects-client/iam.js +287 -0
- package/dist/core/rest/projects-client/iam.js.map +1 -0
- package/dist/core/rest/projects-client/index.d.ts +6 -0
- package/dist/core/rest/projects-client/index.d.ts.map +1 -1
- package/dist/core/rest/projects-client/index.js +6 -0
- package/dist/core/rest/projects-client/index.js.map +1 -1
- package/dist/core/rest/projects-client/marketplace-catalog.d.ts +9 -2
- package/dist/core/rest/projects-client/marketplace-catalog.d.ts.map +1 -1
- package/dist/core/rest/projects-client/marketplace-catalog.js +7 -0
- package/dist/core/rest/projects-client/marketplace-catalog.js.map +1 -1
- package/dist/core/rest/projects-client/presentations.d.ts +12 -0
- package/dist/core/rest/projects-client/presentations.d.ts.map +1 -0
- package/dist/core/rest/projects-client/presentations.js +9 -0
- package/dist/core/rest/projects-client/presentations.js.map +1 -0
- package/dist/core/rest/projects-client/projects.d.ts +55 -10
- package/dist/core/rest/projects-client/projects.d.ts.map +1 -1
- package/dist/core/rest/projects-client/projects.js +14 -7
- package/dist/core/rest/projects-client/projects.js.map +1 -1
- package/dist/core/rest/projects-client/public-voice-join.d.ts +59 -0
- package/dist/core/rest/projects-client/public-voice-join.d.ts.map +1 -0
- package/dist/core/rest/projects-client/public-voice-join.js +64 -0
- package/dist/core/rest/projects-client/public-voice-join.js.map +1 -0
- package/dist/core/rest/projects-client/referrals.d.ts +53 -0
- package/dist/core/rest/projects-client/referrals.d.ts.map +1 -0
- package/dist/core/rest/projects-client/referrals.js +27 -0
- package/dist/core/rest/projects-client/referrals.js.map +1 -0
- package/dist/core/rest/projects-client/session-sandbox.d.ts +2 -0
- package/dist/core/rest/projects-client/session-sandbox.d.ts.map +1 -1
- package/dist/core/rest/projects-client/session-sandbox.js +10 -0
- package/dist/core/rest/projects-client/session-sandbox.js.map +1 -1
- package/dist/core/rest/projects-client/sessions.d.ts +89 -0
- package/dist/core/rest/projects-client/sessions.d.ts.map +1 -1
- package/dist/core/rest/projects-client/sessions.js +49 -1
- package/dist/core/rest/projects-client/sessions.js.map +1 -1
- package/dist/core/session/index.d.ts +2 -0
- package/dist/core/session/index.d.ts.map +1 -1
- package/dist/core/session/index.js +2 -0
- package/dist/core/session/index.js.map +1 -1
- package/dist/core/session/presentation.d.ts +12 -0
- package/dist/core/session/presentation.d.ts.map +1 -0
- package/dist/core/session/presentation.js +70 -0
- package/dist/core/session/presentation.js.map +1 -0
- package/dist/core/session/rewind.d.ts +18 -0
- package/dist/core/session/rewind.d.ts.map +1 -0
- package/dist/core/session/rewind.js +17 -0
- package/dist/core/session/rewind.js.map +1 -0
- package/dist/core/session/runtime-transport.d.ts +16 -0
- package/dist/core/session/runtime-transport.d.ts.map +1 -0
- package/dist/core/session/runtime-transport.js +30 -0
- package/dist/core/session/runtime-transport.js.map +1 -0
- package/dist/core/session/url.d.ts +43 -0
- package/dist/core/session/url.d.ts.map +1 -1
- package/dist/core/session/url.js +81 -0
- package/dist/core/session/url.js.map +1 -1
- package/dist/core/session-sync/session-sync-controller.d.ts +28 -0
- package/dist/core/session-sync/session-sync-controller.d.ts.map +1 -1
- package/dist/core/session-sync/session-sync-controller.js +127 -4
- package/dist/core/session-sync/session-sync-controller.js.map +1 -1
- package/dist/core/stream/fetch-sse.d.ts +23 -0
- package/dist/core/stream/fetch-sse.d.ts.map +1 -0
- package/dist/core/stream/fetch-sse.js +119 -0
- package/dist/core/stream/fetch-sse.js.map +1 -0
- package/dist/core/turns/state.d.ts.map +1 -1
- package/dist/core/turns/state.js +11 -4
- package/dist/core/turns/state.js.map +1 -1
- package/dist/core/turns/types.d.ts +6 -0
- package/dist/core/turns/types.d.ts.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/kortix.esm.min.js +24 -16
- package/dist/kortix.global.js +24 -16
- package/dist/node/server.d.ts +14 -0
- package/dist/node/server.d.ts.map +1 -1
- package/dist/node/server.js +42 -0
- package/dist/node/server.js.map +1 -1
- package/dist/platform/auth-core.d.ts +3 -5
- package/dist/platform/auth-core.d.ts.map +1 -1
- package/dist/platform/auth-core.js +4 -6
- package/dist/platform/auth-core.js.map +1 -1
- package/dist/react/agent-selection-scope.d.ts +8 -0
- package/dist/react/agent-selection-scope.d.ts.map +1 -0
- package/dist/react/agent-selection-scope.js +4 -0
- package/dist/react/agent-selection-scope.js.map +1 -0
- package/dist/react/index.d.ts +13 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +13 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/initial-session-pin.d.ts +8 -0
- package/dist/react/initial-session-pin.d.ts.map +1 -0
- package/dist/react/initial-session-pin.js +4 -0
- package/dist/react/initial-session-pin.js.map +1 -0
- package/dist/react/opencode.d.ts +25 -2
- package/dist/react/opencode.d.ts.map +1 -1
- package/dist/react/opencode.js +24 -1
- package/dist/react/opencode.js.map +1 -1
- package/dist/react/provider-selection.d.ts +1 -0
- package/dist/react/provider-selection.d.ts.map +1 -1
- package/dist/react/provider-selection.js +22 -0
- package/dist/react/provider-selection.js.map +1 -1
- package/dist/react/run-pty-command.d.ts +5 -0
- package/dist/react/run-pty-command.d.ts.map +1 -0
- package/dist/react/run-pty-command.js +42 -0
- package/dist/react/run-pty-command.js.map +1 -0
- package/dist/react/runtime-actions.d.ts +51 -0
- package/dist/react/runtime-actions.d.ts.map +1 -0
- package/dist/react/runtime-actions.js +105 -0
- package/dist/react/runtime-actions.js.map +1 -0
- package/dist/react/session-agent-name-guard.d.ts +16 -0
- package/dist/react/session-agent-name-guard.d.ts.map +1 -0
- package/dist/react/session-agent-name-guard.js +22 -0
- package/dist/react/session-agent-name-guard.js.map +1 -0
- package/dist/react/session-busy.d.ts +8 -0
- package/dist/react/session-busy.d.ts.map +1 -0
- package/dist/react/session-busy.js +4 -0
- package/dist/react/session-busy.js.map +1 -0
- package/dist/react/session-title-sync.d.ts +19 -0
- package/dist/react/session-title-sync.d.ts.map +1 -0
- package/dist/react/session-title-sync.js +81 -0
- package/dist/react/session-title-sync.js.map +1 -0
- package/dist/react/use-acp-session-runtime.d.ts +34 -0
- package/dist/react/use-acp-session-runtime.d.ts.map +1 -0
- package/dist/react/use-acp-session-runtime.js +84 -0
- package/dist/react/use-acp-session-runtime.js.map +1 -0
- package/dist/react/use-admin-accounts.d.ts +122 -0
- package/dist/react/use-admin-accounts.d.ts.map +1 -0
- package/dist/react/use-admin-accounts.js +146 -0
- package/dist/react/use-admin-accounts.js.map +1 -0
- package/dist/react/use-admin-analytics.d.ts +332 -0
- package/dist/react/use-admin-analytics.d.ts.map +1 -0
- package/dist/react/use-admin-analytics.js +518 -0
- package/dist/react/use-admin-analytics.js.map +1 -0
- package/dist/react/use-admin-billing.d.ts +27 -0
- package/dist/react/use-admin-billing.d.ts.map +1 -0
- package/dist/react/use-admin-billing.js +61 -0
- package/dist/react/use-admin-billing.js.map +1 -0
- package/dist/react/use-admin-feedback.d.ts +119 -0
- package/dist/react/use-admin-feedback.d.ts.map +1 -0
- package/dist/react/use-admin-feedback.js +148 -0
- package/dist/react/use-admin-feedback.js.map +1 -0
- package/dist/react/use-admin-sandboxes.d.ts +157 -0
- package/dist/react/use-admin-sandboxes.d.ts.map +1 -0
- package/dist/react/use-admin-sandboxes.js +145 -0
- package/dist/react/use-admin-sandboxes.js.map +1 -0
- package/dist/react/use-admin-users.d.ts +98 -0
- package/dist/react/use-admin-users.d.ts.map +1 -0
- package/dist/react/use-admin-users.js +121 -0
- package/dist/react/use-admin-users.js.map +1 -0
- package/dist/react/use-authenticated-preview-url.d.ts +24 -0
- package/dist/react/use-authenticated-preview-url.d.ts.map +1 -0
- package/dist/react/use-authenticated-preview-url.js +137 -0
- package/dist/react/use-authenticated-preview-url.js.map +1 -0
- package/dist/react/use-canonical-opencode-session.d.ts +4 -0
- package/dist/react/use-canonical-opencode-session.d.ts.map +1 -1
- package/dist/react/use-canonical-opencode-session.js +9 -4
- package/dist/react/use-canonical-opencode-session.js.map +1 -1
- package/dist/react/use-model-defaults.d.ts +22 -0
- package/dist/react/use-model-defaults.d.ts.map +1 -0
- package/dist/react/use-model-defaults.js +104 -0
- package/dist/react/use-model-defaults.js.map +1 -0
- package/dist/react/use-model-store.d.ts.map +1 -1
- package/dist/react/use-model-store.js +11 -0
- package/dist/react/use-model-store.js.map +1 -1
- package/dist/react/use-opencode-events/index.d.ts +3 -1
- package/dist/react/use-opencode-events/index.d.ts.map +1 -1
- package/dist/react/use-opencode-events/index.js +6 -2
- package/dist/react/use-opencode-events/index.js.map +1 -1
- package/dist/react/use-opencode-local.d.ts.map +1 -1
- package/dist/react/use-opencode-local.js +10 -1
- package/dist/react/use-opencode-local.js.map +1 -1
- package/dist/react/use-opencode-sessions/agents.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/agents.js +5 -3
- package/dist/react/use-opencode-sessions/agents.js.map +1 -1
- package/dist/react/use-opencode-sessions/commands.d.ts +7 -2
- package/dist/react/use-opencode-sessions/commands.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/commands.js +13 -9
- package/dist/react/use-opencode-sessions/commands.js.map +1 -1
- package/dist/react/use-opencode-sessions/provider-load-plan.d.ts +6 -0
- package/dist/react/use-opencode-sessions/provider-load-plan.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/provider-load-plan.js +4 -0
- package/dist/react/use-opencode-sessions/provider-load-plan.js.map +1 -0
- package/dist/react/use-opencode-sessions/providers.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/providers.js +39 -27
- package/dist/react/use-opencode-sessions/providers.js.map +1 -1
- package/dist/react/use-opencode-sessions/sessions.d.ts +1 -1
- package/dist/react/use-opencode-sessions/sessions.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/sessions.js +2 -2
- package/dist/react/use-opencode-sessions/sessions.js.map +1 -1
- package/dist/react/use-ops-overview.d.ts +64 -0
- package/dist/react/use-ops-overview.d.ts.map +1 -0
- package/dist/react/use-ops-overview.js +16 -0
- package/dist/react/use-ops-overview.js.map +1 -0
- package/dist/react/use-session-model-selection.d.ts +15 -0
- package/dist/react/use-session-model-selection.d.ts.map +1 -0
- package/dist/react/use-session-model-selection.js +27 -0
- package/dist/react/use-session-model-selection.js.map +1 -0
- package/dist/react/use-session-sync.d.ts.map +1 -1
- package/dist/react/use-session-sync.js +3 -1
- package/dist/react/use-session-sync.js.map +1 -1
- package/dist/react/use-session.d.ts +78 -4
- package/dist/react/use-session.d.ts.map +1 -1
- package/dist/react/use-session.js +329 -34
- package/dist/react/use-session.js.map +1 -1
- package/dist/react/use-system-status.d.ts +39 -0
- package/dist/react/use-system-status.d.ts.map +1 -0
- package/dist/react/use-system-status.js +68 -0
- package/dist/react/use-system-status.js.map +1 -0
- package/dist/react/use-teams-installations.d.ts +36 -0
- package/dist/react/use-teams-installations.d.ts.map +1 -0
- package/dist/react/use-teams-installations.js +94 -0
- package/dist/react/use-teams-installations.js.map +1 -0
- package/dist/react/use-tunnel.d.ts +120 -0
- package/dist/react/use-tunnel.d.ts.map +1 -0
- package/dist/react/use-tunnel.js +268 -0
- package/dist/react/use-tunnel.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface MaintenanceNotice {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
start_time?: string | null;
|
|
4
|
+
end_time?: string | null;
|
|
5
|
+
}
|
|
6
|
+
export interface TechnicalIssue {
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
message?: string | null;
|
|
9
|
+
status_url?: string | null;
|
|
10
|
+
affected_services?: string[] | null;
|
|
11
|
+
description?: string | null;
|
|
12
|
+
estimated_resolution?: string | null;
|
|
13
|
+
severity?: 'degraded' | 'outage' | 'maintenance' | null;
|
|
14
|
+
}
|
|
15
|
+
export interface SystemStatus {
|
|
16
|
+
maintenance_notice: MaintenanceNotice;
|
|
17
|
+
technical_issue: TechnicalIssue;
|
|
18
|
+
updated_at?: string | null;
|
|
19
|
+
updated_by?: string | null;
|
|
20
|
+
}
|
|
21
|
+
export interface UpdateMaintenanceRequest {
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
start_time?: string | null;
|
|
24
|
+
end_time?: string | null;
|
|
25
|
+
}
|
|
26
|
+
export interface UpdateTechnicalIssueRequest {
|
|
27
|
+
enabled: boolean;
|
|
28
|
+
message?: string | null;
|
|
29
|
+
status_url?: string | null;
|
|
30
|
+
affected_services?: string[] | null;
|
|
31
|
+
description?: string | null;
|
|
32
|
+
estimated_resolution?: string | null;
|
|
33
|
+
severity?: 'degraded' | 'outage' | 'maintenance' | null;
|
|
34
|
+
}
|
|
35
|
+
export declare const useSystemStatus: () => import("@tanstack/react-query").UseQueryResult<NoInfer<SystemStatus>, Error>;
|
|
36
|
+
export declare const useUpdateMaintenanceNotice: () => import("@tanstack/react-query").UseMutationResult<SystemStatus | undefined, Error, UpdateMaintenanceRequest, unknown>;
|
|
37
|
+
export declare const useUpdateTechnicalIssue: () => import("@tanstack/react-query").UseMutationResult<SystemStatus | undefined, Error, UpdateTechnicalIssueRequest, unknown>;
|
|
38
|
+
export declare const useClearSystemStatus: () => import("@tanstack/react-query").UseMutationResult<SystemStatus | undefined, Error, void, unknown>;
|
|
39
|
+
//# sourceMappingURL=use-system-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-system-status.d.ts","sourceRoot":"","sources":["../../src/react/use-system-status.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,GAAG,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,YAAY;IAC3B,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,eAAe,EAAE,cAAc,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,GAAG,IAAI,CAAC;CACzD;AAED,eAAO,MAAM,eAAe,oFAgB3B,CAAC;AAEF,eAAO,MAAM,0BAA0B,6HAgBtC,CAAC;AAEF,eAAO,MAAM,uBAAuB,gIAgBnC,CAAC;AAEF,eAAO,MAAM,oBAAoB,yGAgBhC,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
2
|
+
import { backendApi } from '../core/http/api-client.js';
|
|
3
|
+
export const useSystemStatus = () => {
|
|
4
|
+
return useQuery({
|
|
5
|
+
queryKey: ['admin-system-status'],
|
|
6
|
+
queryFn: async () => {
|
|
7
|
+
const response = await backendApi.get('/admin/system-status');
|
|
8
|
+
if (response.error) {
|
|
9
|
+
throw response.error;
|
|
10
|
+
}
|
|
11
|
+
return response.data || {
|
|
12
|
+
maintenance_notice: { enabled: false },
|
|
13
|
+
technical_issue: { enabled: false },
|
|
14
|
+
};
|
|
15
|
+
},
|
|
16
|
+
staleTime: 30 * 1000,
|
|
17
|
+
refetchInterval: 60 * 1000,
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
export const useUpdateMaintenanceNotice = () => {
|
|
21
|
+
const queryClient = useQueryClient();
|
|
22
|
+
return useMutation({
|
|
23
|
+
mutationFn: async (data) => {
|
|
24
|
+
const response = await backendApi.put('/admin/system-status/maintenance', data);
|
|
25
|
+
if (response.error) {
|
|
26
|
+
throw response.error;
|
|
27
|
+
}
|
|
28
|
+
return response.data;
|
|
29
|
+
},
|
|
30
|
+
onSuccess: () => {
|
|
31
|
+
queryClient.invalidateQueries({ queryKey: ['admin-system-status'] });
|
|
32
|
+
queryClient.invalidateQueries({ queryKey: ['system-status'] });
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
export const useUpdateTechnicalIssue = () => {
|
|
37
|
+
const queryClient = useQueryClient();
|
|
38
|
+
return useMutation({
|
|
39
|
+
mutationFn: async (data) => {
|
|
40
|
+
const response = await backendApi.put('/admin/system-status/technical-issue', data);
|
|
41
|
+
if (response.error) {
|
|
42
|
+
throw response.error;
|
|
43
|
+
}
|
|
44
|
+
return response.data;
|
|
45
|
+
},
|
|
46
|
+
onSuccess: () => {
|
|
47
|
+
queryClient.invalidateQueries({ queryKey: ['admin-system-status'] });
|
|
48
|
+
queryClient.invalidateQueries({ queryKey: ['system-status'] });
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
export const useClearSystemStatus = () => {
|
|
53
|
+
const queryClient = useQueryClient();
|
|
54
|
+
return useMutation({
|
|
55
|
+
mutationFn: async () => {
|
|
56
|
+
const response = await backendApi.delete('/admin/system-status');
|
|
57
|
+
if (response.error) {
|
|
58
|
+
throw response.error;
|
|
59
|
+
}
|
|
60
|
+
return response.data;
|
|
61
|
+
},
|
|
62
|
+
onSuccess: () => {
|
|
63
|
+
queryClient.invalidateQueries({ queryKey: ['admin-system-status'] });
|
|
64
|
+
queryClient.invalidateQueries({ queryKey: ['system-status'] });
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=use-system-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-system-status.js","sourceRoot":"","sources":["../../src/react/use-system-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface TeamsInstallation {
|
|
2
|
+
tenantId: string;
|
|
3
|
+
teamId: string | null;
|
|
4
|
+
teamName: string | null;
|
|
5
|
+
botId: string | null;
|
|
6
|
+
serviceUrl: string | null;
|
|
7
|
+
byo: boolean;
|
|
8
|
+
orgInstalled: boolean;
|
|
9
|
+
catalogAppId: string | null;
|
|
10
|
+
installedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export interface TeamsMode {
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
available: boolean;
|
|
15
|
+
appId: string | null;
|
|
16
|
+
messagingEndpoint: string | null;
|
|
17
|
+
adminConsentUrl: string | null;
|
|
18
|
+
deepLinkUrl: string | null;
|
|
19
|
+
orgConsentUrl: string | null;
|
|
20
|
+
orgInstalled: boolean;
|
|
21
|
+
byo: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare function useTeamsInstall(projectId: string | null): import("@tanstack/react-query").UseQueryResult<NoInfer<TeamsInstallation | null>, Error>;
|
|
24
|
+
export declare function useTeamsMode(projectId: string | null): import("@tanstack/react-query").UseQueryResult<NoInfer<TeamsMode>, Error>;
|
|
25
|
+
export declare function useTeamsManifest(projectId: string | null): import("@tanstack/react-query").UseQueryResult<string | null, Error>;
|
|
26
|
+
interface ConnectInput {
|
|
27
|
+
projectId: string;
|
|
28
|
+
tenant_id: string;
|
|
29
|
+
team_name?: string;
|
|
30
|
+
app_id?: string;
|
|
31
|
+
app_password?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function useConnectTeams(): import("@tanstack/react-query").UseMutationResult<TeamsInstallation, Error, ConnectInput, unknown>;
|
|
34
|
+
export declare function useDisconnectTeams(): import("@tanstack/react-query").UseMutationResult<void, Error, string, unknown>;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=use-teams-installations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-teams-installations.d.ts","sourceRoot":"","sources":["../../src/react/use-teams-installations.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,EAAE,OAAO,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,GAAG,EAAE,OAAO,CAAC;CACd;AASD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,4FAevD;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,6EA0BpD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,wEAiBxD;AAED,UAAU,YAAY;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,eAAe,uGAoB9B;AAED,wBAAgB,kBAAkB,oFAcjC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
3
|
+
import { backendApi } from '../core/http/api-client.js';
|
|
4
|
+
const key = (projectId) => ['channels', 'teams-install', projectId ?? 'none'];
|
|
5
|
+
const modeKey = (projectId) => ['channels', 'teams-mode', projectId ?? 'none'];
|
|
6
|
+
const manifestKey = (projectId) => ['channels', 'teams-manifest', projectId ?? 'none'];
|
|
7
|
+
export function useTeamsInstall(projectId) {
|
|
8
|
+
return useQuery({
|
|
9
|
+
queryKey: key(projectId),
|
|
10
|
+
enabled: !!projectId,
|
|
11
|
+
staleTime: 30_000,
|
|
12
|
+
queryFn: async () => {
|
|
13
|
+
if (!projectId)
|
|
14
|
+
return null;
|
|
15
|
+
const res = await backendApi.get(`/projects/${encodeURIComponent(projectId)}/channels/teams/installation`, { showErrors: false });
|
|
16
|
+
if (!res.success)
|
|
17
|
+
return null;
|
|
18
|
+
return res.data ?? null;
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function useTeamsMode(projectId) {
|
|
23
|
+
return useQuery({
|
|
24
|
+
queryKey: modeKey(projectId),
|
|
25
|
+
enabled: !!projectId,
|
|
26
|
+
staleTime: 60_000,
|
|
27
|
+
queryFn: async () => {
|
|
28
|
+
const fallback = {
|
|
29
|
+
enabled: false,
|
|
30
|
+
available: false,
|
|
31
|
+
appId: null,
|
|
32
|
+
messagingEndpoint: null,
|
|
33
|
+
adminConsentUrl: null,
|
|
34
|
+
deepLinkUrl: null,
|
|
35
|
+
orgConsentUrl: null,
|
|
36
|
+
orgInstalled: false,
|
|
37
|
+
byo: false,
|
|
38
|
+
};
|
|
39
|
+
if (!projectId)
|
|
40
|
+
return fallback;
|
|
41
|
+
const res = await backendApi.get(`/projects/${encodeURIComponent(projectId)}/channels/teams/mode`, { showErrors: false });
|
|
42
|
+
if (!res.success || !res.data)
|
|
43
|
+
return fallback;
|
|
44
|
+
return res.data;
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export function useTeamsManifest(projectId) {
|
|
49
|
+
return useQuery({
|
|
50
|
+
queryKey: manifestKey(projectId),
|
|
51
|
+
enabled: !!projectId,
|
|
52
|
+
staleTime: 60_000,
|
|
53
|
+
queryFn: async () => {
|
|
54
|
+
if (!projectId)
|
|
55
|
+
return null;
|
|
56
|
+
const res = await backendApi.get(`/projects/${encodeURIComponent(projectId)}/channels/teams/manifest`, { showErrors: false });
|
|
57
|
+
if (!res.success || !res.data) {
|
|
58
|
+
throw new Error(res.error?.message ?? 'Failed to load Teams manifest');
|
|
59
|
+
}
|
|
60
|
+
return JSON.stringify(res.data, null, 2);
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export function useConnectTeams() {
|
|
65
|
+
const qc = useQueryClient();
|
|
66
|
+
return useMutation({
|
|
67
|
+
mutationFn: async ({ projectId, ...body }) => {
|
|
68
|
+
const res = await backendApi.post(`/projects/${encodeURIComponent(projectId)}/channels/teams/connect`, body, { showErrors: false });
|
|
69
|
+
if (!res.success || !res.data) {
|
|
70
|
+
throw new Error(res.error?.message ?? 'Failed to connect');
|
|
71
|
+
}
|
|
72
|
+
return res.data;
|
|
73
|
+
},
|
|
74
|
+
onSuccess: (_data, { projectId }) => {
|
|
75
|
+
qc.invalidateQueries({ queryKey: key(projectId) });
|
|
76
|
+
qc.invalidateQueries({ queryKey: modeKey(projectId) });
|
|
77
|
+
qc.invalidateQueries({ queryKey: manifestKey(projectId) });
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
export function useDisconnectTeams() {
|
|
82
|
+
const qc = useQueryClient();
|
|
83
|
+
return useMutation({
|
|
84
|
+
mutationFn: async (projectId) => {
|
|
85
|
+
const res = await backendApi.delete(`/projects/${encodeURIComponent(projectId)}/channels/teams/installation`, { showErrors: false });
|
|
86
|
+
if (!res.success)
|
|
87
|
+
throw new Error(res.error?.message ?? 'Failed to disconnect');
|
|
88
|
+
},
|
|
89
|
+
onSuccess: (_data, projectId) => {
|
|
90
|
+
qc.invalidateQueries({ queryKey: key(projectId) });
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=use-teams-installations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-teams-installations.js","sourceRoot":"","sources":["../../src/react/use-teams-installations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export interface TunnelConnection {
|
|
2
|
+
tunnelId: string;
|
|
3
|
+
accountId: string;
|
|
4
|
+
sandboxId: string | null;
|
|
5
|
+
name: string;
|
|
6
|
+
status: 'online' | 'offline' | 'connecting';
|
|
7
|
+
capabilities: string[];
|
|
8
|
+
machineInfo: Record<string, unknown>;
|
|
9
|
+
lastHeartbeatAt: string | null;
|
|
10
|
+
isLive: boolean;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
updatedAt: string;
|
|
13
|
+
}
|
|
14
|
+
export interface TunnelPermission {
|
|
15
|
+
permissionId: string;
|
|
16
|
+
tunnelId: string;
|
|
17
|
+
accountId: string;
|
|
18
|
+
capability: string;
|
|
19
|
+
scope: Record<string, unknown>;
|
|
20
|
+
status: 'active' | 'revoked' | 'expired';
|
|
21
|
+
expiresAt: string | null;
|
|
22
|
+
createdAt: string;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
}
|
|
25
|
+
export interface TunnelPermissionRequest {
|
|
26
|
+
requestId: string;
|
|
27
|
+
tunnelId: string;
|
|
28
|
+
accountId: string;
|
|
29
|
+
capability: string;
|
|
30
|
+
requestedScope: Record<string, unknown>;
|
|
31
|
+
reason: string | null;
|
|
32
|
+
status: 'pending' | 'approved' | 'denied' | 'expired';
|
|
33
|
+
createdAt: string;
|
|
34
|
+
updatedAt: string;
|
|
35
|
+
}
|
|
36
|
+
export interface TunnelAuditLog {
|
|
37
|
+
logId: string;
|
|
38
|
+
tunnelId: string;
|
|
39
|
+
accountId: string;
|
|
40
|
+
capability: string;
|
|
41
|
+
operation: string;
|
|
42
|
+
requestSummary: Record<string, unknown>;
|
|
43
|
+
success: boolean;
|
|
44
|
+
durationMs: number | null;
|
|
45
|
+
bytesTransferred: number | null;
|
|
46
|
+
errorMessage: string | null;
|
|
47
|
+
createdAt: string;
|
|
48
|
+
}
|
|
49
|
+
export interface AuditLogPage {
|
|
50
|
+
data: TunnelAuditLog[];
|
|
51
|
+
pagination: {
|
|
52
|
+
page: number;
|
|
53
|
+
limit: number;
|
|
54
|
+
total: number;
|
|
55
|
+
totalPages: number;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export declare const tunnelKeys: {
|
|
59
|
+
all: readonly ["tunnel"];
|
|
60
|
+
connections: () => readonly ["tunnel", "connections"];
|
|
61
|
+
connection: (id: string) => readonly ["tunnel", "connection", string];
|
|
62
|
+
permissions: (tunnelId: string) => readonly ["tunnel", "permissions", string];
|
|
63
|
+
permissionRequests: () => readonly ["tunnel", "permission-requests"];
|
|
64
|
+
auditLogs: (tunnelId: string, page: number) => readonly ["tunnel", "audit", string, number];
|
|
65
|
+
deviceAuth: (code: string) => readonly ["tunnel", "device-auth", string];
|
|
66
|
+
};
|
|
67
|
+
export declare function useTunnelConnections(): import("@tanstack/react-query").UseQueryResult<NoInfer<TunnelConnection[]>, Error>;
|
|
68
|
+
export declare function useTunnelConnection(tunnelId: string): import("@tanstack/react-query").UseQueryResult<NoInfer<TunnelConnection>, Error>;
|
|
69
|
+
export interface TunnelConnectionCreateResponse extends TunnelConnection {
|
|
70
|
+
/** One-time setup token — only returned on creation, never retrievable again. */
|
|
71
|
+
setupToken: string;
|
|
72
|
+
}
|
|
73
|
+
export declare function useCreateTunnelConnection(): import("@tanstack/react-query").UseMutationResult<TunnelConnectionCreateResponse, Error, {
|
|
74
|
+
name: string;
|
|
75
|
+
sandboxId?: string;
|
|
76
|
+
capabilities?: string[];
|
|
77
|
+
}, unknown>;
|
|
78
|
+
export declare function useUpdateTunnelConnection(): import("@tanstack/react-query").UseMutationResult<TunnelConnection, Error, {
|
|
79
|
+
tunnelId: string;
|
|
80
|
+
name?: string;
|
|
81
|
+
capabilities?: string[];
|
|
82
|
+
}, unknown>;
|
|
83
|
+
export declare function useDeleteTunnelConnection(): import("@tanstack/react-query").UseMutationResult<void, Error, string, unknown>;
|
|
84
|
+
export declare function useTunnelPermissions(tunnelId: string): import("@tanstack/react-query").UseQueryResult<NoInfer<TunnelPermission[]>, Error>;
|
|
85
|
+
export declare function useGrantTunnelPermission(): import("@tanstack/react-query").UseMutationResult<TunnelPermission, Error, {
|
|
86
|
+
tunnelId: string;
|
|
87
|
+
capability: string;
|
|
88
|
+
scope?: Record<string, unknown>;
|
|
89
|
+
expiresAt?: string;
|
|
90
|
+
}, unknown>;
|
|
91
|
+
export declare function useRevokeTunnelPermission(): import("@tanstack/react-query").UseMutationResult<void, Error, {
|
|
92
|
+
tunnelId: string;
|
|
93
|
+
permissionId: string;
|
|
94
|
+
}, unknown>;
|
|
95
|
+
export declare function useTunnelPermissionRequests(): import("@tanstack/react-query").UseQueryResult<NoInfer<TunnelPermissionRequest[]>, Error>;
|
|
96
|
+
export declare function useApprovePermissionRequest(): import("@tanstack/react-query").UseMutationResult<any, Error, {
|
|
97
|
+
requestId: string;
|
|
98
|
+
scope?: Record<string, unknown>;
|
|
99
|
+
expiresAt?: string;
|
|
100
|
+
}, unknown>;
|
|
101
|
+
export declare function useDenyPermissionRequest(): import("@tanstack/react-query").UseMutationResult<void, Error, string, unknown>;
|
|
102
|
+
export interface DeviceAuthInfo {
|
|
103
|
+
deviceCode: string;
|
|
104
|
+
machineHostname: string | null;
|
|
105
|
+
status: 'pending' | 'approved' | 'denied' | 'expired';
|
|
106
|
+
expiresAt: string;
|
|
107
|
+
createdAt: string;
|
|
108
|
+
}
|
|
109
|
+
export declare function useDeviceAuthInfo(code: string): import("@tanstack/react-query").UseQueryResult<NoInfer<DeviceAuthInfo>, Error>;
|
|
110
|
+
export declare function useApproveDeviceAuth(): import("@tanstack/react-query").UseMutationResult<{
|
|
111
|
+
success: boolean;
|
|
112
|
+
tunnelId: string;
|
|
113
|
+
}, Error, {
|
|
114
|
+
code: string;
|
|
115
|
+
name?: string;
|
|
116
|
+
capabilities?: string[];
|
|
117
|
+
}, unknown>;
|
|
118
|
+
export declare function useDenyDeviceAuth(): import("@tanstack/react-query").UseMutationResult<void, Error, string, unknown>;
|
|
119
|
+
export declare function useTunnelAuditLogs(tunnelId: string, page?: number, limit?: number): import("@tanstack/react-query").UseQueryResult<NoInfer<AuditLogPage>, Error>;
|
|
120
|
+
//# sourceMappingURL=use-tunnel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tunnel.d.ts","sourceRoot":"","sources":["../../src/react/use-tunnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
/**
|
|
3
|
+
* Tunnel hooks — TanStack React Query hooks for the tunnel API.
|
|
4
|
+
*
|
|
5
|
+
* Provides:
|
|
6
|
+
* - useTunnelConnections() — list tunnel connections
|
|
7
|
+
* - useTunnelConnection(tunnelId) — single connection detail
|
|
8
|
+
* - useCreateTunnelConnection() — create a new connection
|
|
9
|
+
* - useUpdateTunnelConnection() — update connection
|
|
10
|
+
* - useDeleteTunnelConnection() — delete connection
|
|
11
|
+
* - useTunnelPermissions(tunnelId) — list permissions
|
|
12
|
+
* - useGrantTunnelPermission() — grant permission
|
|
13
|
+
* - useRevokeTunnelPermission() — revoke permission
|
|
14
|
+
* - useTunnelPermissionRequests() — list pending requests
|
|
15
|
+
* - useApprovePermissionRequest() — approve request
|
|
16
|
+
* - useDenyPermissionRequest() — deny request
|
|
17
|
+
* - useTunnelAuditLogs(tunnelId) — paginated audit logs
|
|
18
|
+
*/
|
|
19
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
20
|
+
import { backendApi } from '../core/http/api-client.js';
|
|
21
|
+
// ─── Query Keys ──────────────────────────────────────────────────────────────
|
|
22
|
+
export const tunnelKeys = {
|
|
23
|
+
all: ['tunnel'],
|
|
24
|
+
connections: () => [...tunnelKeys.all, 'connections'],
|
|
25
|
+
connection: (id) => [...tunnelKeys.all, 'connection', id],
|
|
26
|
+
permissions: (tunnelId) => [...tunnelKeys.all, 'permissions', tunnelId],
|
|
27
|
+
permissionRequests: () => [...tunnelKeys.all, 'permission-requests'],
|
|
28
|
+
auditLogs: (tunnelId, page) => [...tunnelKeys.all, 'audit', tunnelId, page],
|
|
29
|
+
deviceAuth: (code) => [...tunnelKeys.all, 'device-auth', code],
|
|
30
|
+
};
|
|
31
|
+
// ─── Connection Hooks ────────────────────────────────────────────────────────
|
|
32
|
+
export function useTunnelConnections() {
|
|
33
|
+
return useQuery({
|
|
34
|
+
queryKey: tunnelKeys.connections(),
|
|
35
|
+
queryFn: async () => {
|
|
36
|
+
const res = await backendApi.get('/tunnel/connections', {
|
|
37
|
+
showErrors: false,
|
|
38
|
+
timeout: 10_000,
|
|
39
|
+
});
|
|
40
|
+
if (!res.success)
|
|
41
|
+
throw new Error(res.error?.message || 'Failed to fetch connections');
|
|
42
|
+
return res.data;
|
|
43
|
+
},
|
|
44
|
+
staleTime: 2_000,
|
|
45
|
+
refetchInterval: 5_000,
|
|
46
|
+
refetchIntervalInBackground: false,
|
|
47
|
+
refetchOnMount: 'always',
|
|
48
|
+
refetchOnWindowFocus: 'always',
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export function useTunnelConnection(tunnelId) {
|
|
52
|
+
return useQuery({
|
|
53
|
+
queryKey: tunnelKeys.connection(tunnelId),
|
|
54
|
+
queryFn: async () => {
|
|
55
|
+
const res = await backendApi.get(`/tunnel/connections/${tunnelId}`, {
|
|
56
|
+
showErrors: false,
|
|
57
|
+
timeout: 10_000,
|
|
58
|
+
});
|
|
59
|
+
if (!res.success)
|
|
60
|
+
throw new Error(res.error?.message || 'Failed to fetch connection');
|
|
61
|
+
return res.data;
|
|
62
|
+
},
|
|
63
|
+
enabled: !!tunnelId,
|
|
64
|
+
staleTime: 2_000,
|
|
65
|
+
refetchInterval: 5_000,
|
|
66
|
+
refetchIntervalInBackground: false,
|
|
67
|
+
refetchOnMount: 'always',
|
|
68
|
+
refetchOnWindowFocus: 'always',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
export function useCreateTunnelConnection() {
|
|
72
|
+
const queryClient = useQueryClient();
|
|
73
|
+
return useMutation({
|
|
74
|
+
mutationFn: async (data) => {
|
|
75
|
+
const res = await backendApi.post('/tunnel/connections', data);
|
|
76
|
+
if (!res.success)
|
|
77
|
+
throw new Error(res.error?.message || 'Failed to create connection');
|
|
78
|
+
return res.data;
|
|
79
|
+
},
|
|
80
|
+
onSuccess: () => {
|
|
81
|
+
queryClient.invalidateQueries({ queryKey: tunnelKeys.connections() });
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
export function useUpdateTunnelConnection() {
|
|
86
|
+
const queryClient = useQueryClient();
|
|
87
|
+
return useMutation({
|
|
88
|
+
mutationFn: async ({ tunnelId, ...data }) => {
|
|
89
|
+
const res = await backendApi.patch(`/tunnel/connections/${tunnelId}`, data);
|
|
90
|
+
if (!res.success)
|
|
91
|
+
throw new Error(res.error?.message || 'Failed to update connection');
|
|
92
|
+
return res.data;
|
|
93
|
+
},
|
|
94
|
+
onSuccess: (_, vars) => {
|
|
95
|
+
queryClient.invalidateQueries({ queryKey: tunnelKeys.connections() });
|
|
96
|
+
queryClient.invalidateQueries({ queryKey: tunnelKeys.connection(vars.tunnelId) });
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
export function useDeleteTunnelConnection() {
|
|
101
|
+
const queryClient = useQueryClient();
|
|
102
|
+
return useMutation({
|
|
103
|
+
mutationFn: async (tunnelId) => {
|
|
104
|
+
const res = await backendApi.delete(`/tunnel/connections/${tunnelId}`);
|
|
105
|
+
if (!res.success)
|
|
106
|
+
throw new Error(res.error?.message || 'Failed to delete connection');
|
|
107
|
+
},
|
|
108
|
+
onSuccess: () => {
|
|
109
|
+
queryClient.invalidateQueries({ queryKey: tunnelKeys.connections() });
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// ─── Permission Hooks ────────────────────────────────────────────────────────
|
|
114
|
+
export function useTunnelPermissions(tunnelId) {
|
|
115
|
+
return useQuery({
|
|
116
|
+
queryKey: tunnelKeys.permissions(tunnelId),
|
|
117
|
+
queryFn: async () => {
|
|
118
|
+
const res = await backendApi.get(`/tunnel/permissions/${tunnelId}`, {
|
|
119
|
+
showErrors: false,
|
|
120
|
+
timeout: 10_000,
|
|
121
|
+
});
|
|
122
|
+
if (!res.success)
|
|
123
|
+
throw new Error(res.error?.message || 'Failed to fetch permissions');
|
|
124
|
+
return res.data;
|
|
125
|
+
},
|
|
126
|
+
enabled: !!tunnelId,
|
|
127
|
+
staleTime: 10_000,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
export function useGrantTunnelPermission() {
|
|
131
|
+
const queryClient = useQueryClient();
|
|
132
|
+
return useMutation({
|
|
133
|
+
mutationFn: async ({ tunnelId, ...data }) => {
|
|
134
|
+
const res = await backendApi.post(`/tunnel/permissions/${tunnelId}`, data);
|
|
135
|
+
if (!res.success)
|
|
136
|
+
throw new Error(res.error?.message || 'Failed to grant permission');
|
|
137
|
+
return res.data;
|
|
138
|
+
},
|
|
139
|
+
onSuccess: (_, vars) => {
|
|
140
|
+
queryClient.invalidateQueries({ queryKey: tunnelKeys.permissions(vars.tunnelId) });
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
export function useRevokeTunnelPermission() {
|
|
145
|
+
const queryClient = useQueryClient();
|
|
146
|
+
return useMutation({
|
|
147
|
+
mutationFn: async ({ tunnelId, permissionId }) => {
|
|
148
|
+
const res = await backendApi.delete(`/tunnel/permissions/${tunnelId}/${permissionId}`);
|
|
149
|
+
if (!res.success)
|
|
150
|
+
throw new Error(res.error?.message || 'Failed to revoke permission');
|
|
151
|
+
},
|
|
152
|
+
onSuccess: (_, vars) => {
|
|
153
|
+
queryClient.invalidateQueries({ queryKey: tunnelKeys.permissions(vars.tunnelId) });
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// ─── Permission Request Hooks ────────────────────────────────────────────────
|
|
158
|
+
export function useTunnelPermissionRequests() {
|
|
159
|
+
return useQuery({
|
|
160
|
+
queryKey: tunnelKeys.permissionRequests(),
|
|
161
|
+
queryFn: async () => {
|
|
162
|
+
const res = await backendApi.get('/tunnel/permission-requests', {
|
|
163
|
+
showErrors: false,
|
|
164
|
+
timeout: 10_000,
|
|
165
|
+
});
|
|
166
|
+
if (!res.success)
|
|
167
|
+
throw new Error(res.error?.message || 'Failed to fetch requests');
|
|
168
|
+
return res.data;
|
|
169
|
+
},
|
|
170
|
+
staleTime: 5_000,
|
|
171
|
+
refetchInterval: 10_000,
|
|
172
|
+
refetchIntervalInBackground: false,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
export function useApprovePermissionRequest() {
|
|
176
|
+
const queryClient = useQueryClient();
|
|
177
|
+
return useMutation({
|
|
178
|
+
mutationFn: async ({ requestId, scope, expiresAt }) => {
|
|
179
|
+
const res = await backendApi.post(`/tunnel/permission-requests/${requestId}/approve`, {
|
|
180
|
+
scope,
|
|
181
|
+
expiresAt,
|
|
182
|
+
});
|
|
183
|
+
if (!res.success)
|
|
184
|
+
throw new Error(res.error?.message || 'Failed to approve request');
|
|
185
|
+
return res.data;
|
|
186
|
+
},
|
|
187
|
+
onSuccess: () => {
|
|
188
|
+
queryClient.invalidateQueries({ queryKey: tunnelKeys.permissionRequests() });
|
|
189
|
+
queryClient.invalidateQueries({ queryKey: tunnelKeys.all });
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
export function useDenyPermissionRequest() {
|
|
194
|
+
const queryClient = useQueryClient();
|
|
195
|
+
return useMutation({
|
|
196
|
+
mutationFn: async (requestId) => {
|
|
197
|
+
const res = await backendApi.post(`/tunnel/permission-requests/${requestId}/deny`);
|
|
198
|
+
if (!res.success)
|
|
199
|
+
throw new Error(res.error?.message || 'Failed to deny request');
|
|
200
|
+
},
|
|
201
|
+
onSuccess: () => {
|
|
202
|
+
queryClient.invalidateQueries({ queryKey: tunnelKeys.permissionRequests() });
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
export function useDeviceAuthInfo(code) {
|
|
207
|
+
return useQuery({
|
|
208
|
+
queryKey: tunnelKeys.deviceAuth(code),
|
|
209
|
+
queryFn: async () => {
|
|
210
|
+
const res = await backendApi.get(`/tunnel/device-auth/${code}/info`, {
|
|
211
|
+
showErrors: false,
|
|
212
|
+
timeout: 10_000,
|
|
213
|
+
});
|
|
214
|
+
if (!res.success)
|
|
215
|
+
throw new Error(res.error?.message || 'Failed to fetch device auth info');
|
|
216
|
+
return res.data;
|
|
217
|
+
},
|
|
218
|
+
enabled: !!code,
|
|
219
|
+
staleTime: 2_000,
|
|
220
|
+
refetchInterval: 5_000,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
export function useApproveDeviceAuth() {
|
|
224
|
+
const queryClient = useQueryClient();
|
|
225
|
+
return useMutation({
|
|
226
|
+
mutationFn: async ({ code, ...data }) => {
|
|
227
|
+
const res = await backendApi.post(`/tunnel/device-auth/${code}/approve`, data);
|
|
228
|
+
if (!res.success)
|
|
229
|
+
throw new Error(res.error?.message || 'Failed to approve device');
|
|
230
|
+
return res.data;
|
|
231
|
+
},
|
|
232
|
+
onSuccess: (_, vars) => {
|
|
233
|
+
queryClient.invalidateQueries({ queryKey: tunnelKeys.deviceAuth(vars.code) });
|
|
234
|
+
queryClient.invalidateQueries({ queryKey: tunnelKeys.connections() });
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
export function useDenyDeviceAuth() {
|
|
239
|
+
const queryClient = useQueryClient();
|
|
240
|
+
return useMutation({
|
|
241
|
+
mutationFn: async (code) => {
|
|
242
|
+
const res = await backendApi.post(`/tunnel/device-auth/${code}/deny`);
|
|
243
|
+
if (!res.success)
|
|
244
|
+
throw new Error(res.error?.message || 'Failed to deny device');
|
|
245
|
+
},
|
|
246
|
+
onSuccess: (_, code) => {
|
|
247
|
+
queryClient.invalidateQueries({ queryKey: tunnelKeys.deviceAuth(code) });
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
// ─── Audit Log Hooks ─────────────────────────────────────────────────────────
|
|
252
|
+
export function useTunnelAuditLogs(tunnelId, page = 1, limit = 50) {
|
|
253
|
+
return useQuery({
|
|
254
|
+
queryKey: tunnelKeys.auditLogs(tunnelId, page),
|
|
255
|
+
queryFn: async () => {
|
|
256
|
+
const res = await backendApi.get(`/tunnel/audit/${tunnelId}?page=${page}&limit=${limit}`, {
|
|
257
|
+
showErrors: false,
|
|
258
|
+
timeout: 10_000,
|
|
259
|
+
});
|
|
260
|
+
if (!res.success)
|
|
261
|
+
throw new Error(res.error?.message || 'Failed to fetch audit logs');
|
|
262
|
+
return res.data;
|
|
263
|
+
},
|
|
264
|
+
enabled: !!tunnelId,
|
|
265
|
+
staleTime: 15_000,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=use-tunnel.js.map
|