@waiaas/daemon 2.10.0-rc.10 → 2.10.0-rc.12

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.
Files changed (43) hide show
  1. package/dist/api/routes/admin-actions.d.ts +46 -0
  2. package/dist/api/routes/admin-actions.d.ts.map +1 -0
  3. package/dist/api/routes/admin-actions.js +317 -0
  4. package/dist/api/routes/admin-actions.js.map +1 -0
  5. package/dist/api/routes/admin.js +1 -1
  6. package/dist/api/routes/admin.js.map +1 -1
  7. package/dist/api/routes/connect-info.js +1 -1
  8. package/dist/api/routes/connect-info.js.map +1 -1
  9. package/dist/api/server.d.ts.map +1 -1
  10. package/dist/api/server.js +24 -0
  11. package/dist/api/server.js.map +1 -1
  12. package/dist/infrastructure/database/migrate.d.ts +1 -1
  13. package/dist/infrastructure/database/migrate.d.ts.map +1 -1
  14. package/dist/infrastructure/database/migrate.js +27 -1
  15. package/dist/infrastructure/database/migrate.js.map +1 -1
  16. package/dist/infrastructure/settings/setting-keys.d.ts.map +1 -1
  17. package/dist/infrastructure/settings/setting-keys.js +6 -4
  18. package/dist/infrastructure/settings/setting-keys.js.map +1 -1
  19. package/dist/infrastructure/smart-account/index.d.ts +1 -1
  20. package/dist/infrastructure/smart-account/index.d.ts.map +1 -1
  21. package/dist/infrastructure/smart-account/index.js +1 -1
  22. package/dist/infrastructure/smart-account/index.js.map +1 -1
  23. package/dist/infrastructure/smart-account/smart-account-clients.d.ts +10 -2
  24. package/dist/infrastructure/smart-account/smart-account-clients.d.ts.map +1 -1
  25. package/dist/infrastructure/smart-account/smart-account-clients.js +36 -9
  26. package/dist/infrastructure/smart-account/smart-account-clients.js.map +1 -1
  27. package/dist/infrastructure/telegram/telegram-bot-service.js +1 -1
  28. package/dist/infrastructure/telegram/telegram-bot-service.js.map +1 -1
  29. package/dist/infrastructure/token-registry/builtin-tokens.d.ts.map +1 -1
  30. package/dist/infrastructure/token-registry/builtin-tokens.js +3 -0
  31. package/dist/infrastructure/token-registry/builtin-tokens.js.map +1 -1
  32. package/dist/lifecycle/daemon.d.ts.map +1 -1
  33. package/dist/lifecycle/daemon.js +4 -19
  34. package/dist/lifecycle/daemon.js.map +1 -1
  35. package/dist/pipeline/stages.d.ts.map +1 -1
  36. package/dist/pipeline/stages.js +1 -0
  37. package/dist/pipeline/stages.js.map +1 -1
  38. package/dist/services/admin-stats-service.js +1 -1
  39. package/dist/services/admin-stats-service.js.map +1 -1
  40. package/package.json +5 -5
  41. package/public/admin/assets/index-CH8-QTAw.js +3 -0
  42. package/public/admin/index.html +1 -1
  43. package/public/admin/assets/index-BSDfUSGo.js +0 -3
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Admin action routes: POST /v1/admin/actions/:provider/:action.
3
+ *
4
+ * Separate from `/v1/actions/*` (sessionAuth) to allow Admin UI (masterAuth)
5
+ * to execute actions directly. Admin context bypasses session_wallets access
6
+ * check since admin has full wallet access.
7
+ *
8
+ * @see #273 — Admin UI ERC-8004 에이전트 등록 시 sessionAuth 인증 실패
9
+ */
10
+ import { OpenAPIHono } from '@hono/zod-openapi';
11
+ import type { IPolicyEngine } from '@waiaas/core';
12
+ import type { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';
13
+ import type { Database as SQLiteDatabase } from 'better-sqlite3';
14
+ import type { ActionProviderRegistry } from '../../infrastructure/action/action-provider-registry.js';
15
+ import type { AdapterPool } from '../../infrastructure/adapter-pool.js';
16
+ import type { MasterPasswordRef } from '../middleware/master-auth.js';
17
+ import type { DaemonConfig } from '../../infrastructure/config/loader.js';
18
+ import type { LocalKeyStore } from '../../infrastructure/keystore/keystore.js';
19
+ import type * as schema from '../../infrastructure/database/schema.js';
20
+ import type { ApprovalWorkflow } from '../../workflow/approval-workflow.js';
21
+ import type { DelayQueue } from '../../workflow/delay-queue.js';
22
+ import type { NotificationService } from '../../notifications/notification-service.js';
23
+ import type { IPriceOracle } from '@waiaas/core';
24
+ import type { SettingsService } from '../../infrastructure/settings/settings-service.js';
25
+ export interface AdminActionRouteDeps {
26
+ registry: ActionProviderRegistry;
27
+ db: BetterSQLite3Database<typeof schema>;
28
+ adapterPool: AdapterPool;
29
+ config: DaemonConfig;
30
+ keyStore: LocalKeyStore;
31
+ policyEngine: IPolicyEngine;
32
+ masterPassword: string;
33
+ passwordRef?: MasterPasswordRef;
34
+ approvalWorkflow?: ApprovalWorkflow;
35
+ delayQueue?: DelayQueue;
36
+ sqlite?: SQLiteDatabase;
37
+ notificationService?: NotificationService;
38
+ priceOracle?: IPriceOracle;
39
+ settingsService: SettingsService;
40
+ wcSigningBridgeRef?: import('../../services/wc-signing-bridge.js').WcSigningBridgeRef;
41
+ approvalChannelRouter?: import('../../services/signing-sdk/approval-channel-router.js').ApprovalChannelRouter;
42
+ eventBus?: import('@waiaas/core').EventBus;
43
+ reputationCache?: import('../../services/erc8004/reputation-cache-service.js').ReputationCacheService;
44
+ }
45
+ export declare function adminActionRoutes(deps: AdminActionRouteDeps): OpenAPIHono;
46
+ //# sourceMappingURL=admin-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-actions.d.ts","sourceRoot":"","sources":["../../../src/api/routes/admin-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAGhE,OAAO,KAAK,EAA2C,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yDAAyD,CAAC;AACtG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,KAAK,KAAK,MAAM,MAAM,yCAAyC,CAAC;AAcvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAC;AAWzF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,EAAE,EAAE,qBAAqB,CAAC,OAAO,MAAM,CAAC,CAAC;IACzC,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,CAAC,EAAE,OAAO,qCAAqC,EAAE,kBAAkB,CAAC;IACtF,qBAAqB,CAAC,EAAE,OAAO,uDAAuD,EAAE,qBAAqB,CAAC;IAC9G,QAAQ,CAAC,EAAE,OAAO,cAAc,EAAE,QAAQ,CAAC;IAC3C,eAAe,CAAC,EAAE,OAAO,oDAAoD,EAAE,sBAAsB,CAAC;CACvG;AA6ED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,GAAG,WAAW,CA4RzE"}
@@ -0,0 +1,317 @@
1
+ /**
2
+ * Admin action routes: POST /v1/admin/actions/:provider/:action.
3
+ *
4
+ * Separate from `/v1/actions/*` (sessionAuth) to allow Admin UI (masterAuth)
5
+ * to execute actions directly. Admin context bypasses session_wallets access
6
+ * check since admin has full wallet access.
7
+ *
8
+ * @see #273 — Admin UI ERC-8004 에이전트 등록 시 sessionAuth 인증 실패
9
+ */
10
+ import { OpenAPIHono, createRoute, z } from '@hono/zod-openapi';
11
+ import { eq } from 'drizzle-orm';
12
+ import { WAIaaSError } from '@waiaas/core';
13
+ import { resolveRpcUrl } from '../../infrastructure/adapter-pool.js';
14
+ import { wallets, transactions } from '../../infrastructure/database/schema.js';
15
+ import { stage1Validate, stage2Auth, stage3Policy, stage3_5GasCondition, stage4Wait, stage5Execute, stage6Confirm, getRequestTo, } from '../../pipeline/stages.js';
16
+ import { resolveNetwork } from '../../pipeline/network-resolver.js';
17
+ import { TxSendResponseSchema, buildErrorResponses, openApiValidationHook, } from './openapi-schemas.js';
18
+ // ---------------------------------------------------------------------------
19
+ // Schemas
20
+ // ---------------------------------------------------------------------------
21
+ const AdminActionExecuteRequestSchema = z
22
+ .object({
23
+ params: z.record(z.unknown()).optional().default({}),
24
+ network: z.string().optional(),
25
+ walletId: z.string().uuid().describe('Target wallet ID (required for admin context)'),
26
+ })
27
+ .openapi('AdminActionExecuteRequest');
28
+ // ---------------------------------------------------------------------------
29
+ // Route definitions
30
+ // ---------------------------------------------------------------------------
31
+ const adminExecuteActionRoute = createRoute({
32
+ method: 'post',
33
+ path: '/admin/actions/{provider}/{action}',
34
+ tags: ['Admin', 'Actions'],
35
+ summary: 'Execute an action via provider (admin context)',
36
+ description: 'Admin-only action execution. Bypasses session-based wallet access check. Requires masterAuth.',
37
+ request: {
38
+ params: z.object({
39
+ provider: z.string(),
40
+ action: z.string(),
41
+ }),
42
+ body: {
43
+ content: {
44
+ 'application/json': { schema: AdminActionExecuteRequestSchema },
45
+ },
46
+ },
47
+ },
48
+ responses: {
49
+ 201: {
50
+ description: 'Action submitted to pipeline',
51
+ content: { 'application/json': { schema: TxSendResponseSchema } },
52
+ },
53
+ ...buildErrorResponses([
54
+ 'ACTION_NOT_FOUND',
55
+ 'API_KEY_REQUIRED',
56
+ 'ACTION_VALIDATION_FAILED',
57
+ 'ACTION_RESOLVE_FAILED',
58
+ 'ACTION_RETURN_INVALID',
59
+ 'WALLET_NOT_FOUND',
60
+ ]),
61
+ },
62
+ });
63
+ // ---------------------------------------------------------------------------
64
+ // Helper: resolve EVM chainId from network identifier
65
+ // ---------------------------------------------------------------------------
66
+ function resolveChainId(network) {
67
+ const CHAIN_IDS = {
68
+ 'ethereum-mainnet': 1,
69
+ 'ethereum-sepolia': 11155111,
70
+ 'ethereum-goerli': 5,
71
+ 'polygon-mainnet': 137,
72
+ 'polygon-mumbai': 80001,
73
+ 'arbitrum-mainnet': 42161,
74
+ 'arbitrum-sepolia': 421614,
75
+ 'optimism-mainnet': 10,
76
+ 'optimism-sepolia': 11155420,
77
+ 'base-mainnet': 8453,
78
+ 'base-sepolia': 84532,
79
+ };
80
+ return CHAIN_IDS[network] ?? 1;
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // Route factory
84
+ // ---------------------------------------------------------------------------
85
+ export function adminActionRoutes(deps) {
86
+ const router = new OpenAPIHono({ defaultHook: openApiValidationHook });
87
+ router.openapi(adminExecuteActionRoute, async (c) => {
88
+ const { provider, action } = c.req.valid('param');
89
+ const body = c.req.valid('json');
90
+ const actionKey = `${provider}/${action}`;
91
+ // 1. Look up action entry
92
+ const entry = deps.registry.getAction(actionKey);
93
+ if (!entry) {
94
+ throw new WAIaaSError('ACTION_NOT_FOUND', {
95
+ message: `Action '${actionKey}' not found`,
96
+ details: { provider, action },
97
+ });
98
+ }
99
+ // 2. Admin context: walletId is required from body (no session resolution)
100
+ const walletId = body.walletId;
101
+ // 3. Check API key requirement
102
+ if (entry.provider.metadata.requiresApiKey) {
103
+ if (!deps.settingsService.hasApiKey(entry.provider.metadata.name)) {
104
+ throw new WAIaaSError('API_KEY_REQUIRED', {
105
+ message: `Admin > Settings에서 ${entry.provider.metadata.name} API 키를 설정하세요`,
106
+ details: { provider: entry.provider.metadata.name },
107
+ });
108
+ }
109
+ }
110
+ // 4. Look up wallet
111
+ const wallet = await deps.db.select().from(wallets).where(eq(wallets.id, walletId)).get();
112
+ if (!wallet) {
113
+ throw new WAIaaSError('WALLET_NOT_FOUND', {
114
+ message: `Wallet '${walletId}' not found`,
115
+ });
116
+ }
117
+ if (wallet.status === 'TERMINATED') {
118
+ throw new WAIaaSError('WALLET_TERMINATED');
119
+ }
120
+ // 5. Build ActionContext (sessionId is null for admin context)
121
+ const actionContext = {
122
+ walletAddress: wallet.publicKey,
123
+ chain: wallet.chain,
124
+ walletId,
125
+ sessionId: undefined,
126
+ };
127
+ // 6. Execute resolve via registry
128
+ let contractCalls;
129
+ try {
130
+ contractCalls = await deps.registry.executeResolve(actionKey, body.params ?? {}, actionContext);
131
+ }
132
+ catch (err) {
133
+ if (err instanceof WAIaaSError)
134
+ throw err;
135
+ throw new WAIaaSError('ACTION_RESOLVE_FAILED', {
136
+ message: `Action resolve failed: ${err instanceof Error ? err.message : 'Unknown error'}`,
137
+ details: { actionKey },
138
+ cause: err instanceof Error ? err : undefined,
139
+ });
140
+ }
141
+ // 7. Resolve network
142
+ let resolvedNetwork;
143
+ try {
144
+ resolvedNetwork = resolveNetwork(body.network, wallet.environment, wallet.chain);
145
+ }
146
+ catch (err) {
147
+ if (err instanceof Error && err.message.includes('environment')) {
148
+ throw new WAIaaSError('ENVIRONMENT_NETWORK_MISMATCH', {
149
+ message: err.message,
150
+ });
151
+ }
152
+ throw new WAIaaSError('ACTION_VALIDATION_FAILED', {
153
+ message: err instanceof Error ? err.message : 'Network validation failed',
154
+ });
155
+ }
156
+ // 8. Resolve adapter from pool
157
+ const rpcUrl = resolveRpcUrl(deps.config.rpc, wallet.chain, resolvedNetwork);
158
+ const adapter = await deps.adapterPool.resolve(wallet.chain, resolvedNetwork, rpcUrl);
159
+ // 9. Pipeline execution
160
+ const walletData = {
161
+ publicKey: wallet.publicKey,
162
+ chain: wallet.chain,
163
+ environment: wallet.environment,
164
+ accountType: wallet.accountType,
165
+ aaProvider: wallet.aaProvider,
166
+ aaProviderApiKeyEncrypted: wallet.aaProviderApiKeyEncrypted,
167
+ aaBundlerUrl: wallet.aaBundlerUrl,
168
+ aaPaymasterUrl: wallet.aaPaymasterUrl,
169
+ aaPaymasterPolicyId: wallet.aaPaymasterPolicyId,
170
+ };
171
+ const pipelineConfig = {
172
+ policy_defaults_delay_seconds: deps.config.security.policy_defaults_delay_seconds,
173
+ policy_defaults_approval_timeout: deps.config.security.policy_defaults_approval_timeout,
174
+ };
175
+ const pipelineResults = [];
176
+ for (const contractCall of contractCalls) {
177
+ // Extract EIP-712 metadata from resolve result
178
+ const eip712 = contractCall.eip712;
179
+ let eip712Metadata;
180
+ if (eip712) {
181
+ const ownerAddress = wallet.ownerAddress || '0x0000000000000000000000000000000000000000';
182
+ const typedData = JSON.parse(eip712.typedDataJson);
183
+ typedData.message.owner = ownerAddress;
184
+ typedData.domain.chainId = resolveChainId(resolvedNetwork);
185
+ eip712Metadata = {
186
+ approvalType: 'EIP712',
187
+ typedDataJson: JSON.stringify(typedData),
188
+ agentId: eip712.agentId,
189
+ newWallet: eip712.newWallet,
190
+ deadline: eip712.deadline,
191
+ };
192
+ }
193
+ const ctx = {
194
+ db: deps.db,
195
+ adapter,
196
+ keyStore: deps.keyStore,
197
+ policyEngine: deps.policyEngine,
198
+ masterPassword: deps.passwordRef?.password ?? deps.masterPassword,
199
+ walletId,
200
+ wallet: walletData,
201
+ resolvedNetwork,
202
+ resolvedRpcUrl: rpcUrl,
203
+ request: contractCall,
204
+ txId: '',
205
+ sessionId: undefined, // Admin context -- no session
206
+ sqlite: deps.sqlite,
207
+ delayQueue: deps.delayQueue,
208
+ approvalWorkflow: deps.approvalWorkflow,
209
+ config: pipelineConfig,
210
+ notificationService: deps.notificationService,
211
+ priceOracle: deps.priceOracle,
212
+ settingsService: deps.settingsService,
213
+ eip712Metadata,
214
+ wcSigningBridge: deps.wcSigningBridgeRef?.current ?? undefined,
215
+ approvalChannelRouter: deps.approvalChannelRouter,
216
+ eventBus: deps.eventBus,
217
+ actionProviderKey: provider,
218
+ actionName: action,
219
+ actionDefaultTier: entry.action.defaultTier,
220
+ };
221
+ await stage1Validate(ctx);
222
+ // Persist action provider metadata
223
+ const existingTx = await deps.db
224
+ .select({ metadata: transactions.metadata })
225
+ .from(transactions)
226
+ .where(eq(transactions.id, ctx.txId))
227
+ .get();
228
+ const existingMeta = existingTx?.metadata ? JSON.parse(existingTx.metadata) : {};
229
+ await deps.db
230
+ .update(transactions)
231
+ .set({
232
+ metadata: JSON.stringify({ ...existingMeta, provider, action }),
233
+ })
234
+ .where(eq(transactions.id, ctx.txId));
235
+ pipelineResults.push({ id: ctx.txId, status: 'PENDING' });
236
+ // Stages 2-6 run asynchronously
237
+ void (async () => {
238
+ try {
239
+ await stage2Auth(ctx);
240
+ await stage3Policy(ctx);
241
+ await stage3_5GasCondition(ctx);
242
+ await stage4Wait(ctx);
243
+ await stage5Execute(ctx);
244
+ await stage6Confirm(ctx);
245
+ // ERC-8004 notification events
246
+ if (provider === 'erc8004_agent' && deps.notificationService) {
247
+ const params = body.params ?? {};
248
+ const registryAddress = getRequestTo(ctx.request);
249
+ const erc8004NotifMap = {
250
+ register_agent: {
251
+ event: 'AGENT_REGISTERED',
252
+ vars: {
253
+ chainAgentId: String(params.agentId ?? ctx.txId),
254
+ registryAddress,
255
+ },
256
+ },
257
+ set_agent_wallet: {
258
+ event: 'AGENT_WALLET_LINKED',
259
+ vars: { registryAddress },
260
+ },
261
+ unset_agent_wallet: {
262
+ event: 'AGENT_WALLET_UNLINKED',
263
+ vars: { registryAddress },
264
+ },
265
+ };
266
+ const notifEntry = erc8004NotifMap[action];
267
+ if (notifEntry) {
268
+ void deps.notificationService.notify(notifEntry.event, walletId, notifEntry.vars, { txId: ctx.txId });
269
+ }
270
+ }
271
+ // Invalidate reputation cache after feedback actions
272
+ if (provider === 'erc8004_agent' &&
273
+ (action === 'give_feedback' || action === 'revoke_feedback') &&
274
+ deps.reputationCache) {
275
+ const targetAgentId = String((body.params ?? {}).agentId ?? '');
276
+ if (targetAgentId) {
277
+ deps.reputationCache.invalidate(targetAgentId);
278
+ }
279
+ }
280
+ }
281
+ catch (error) {
282
+ if (error instanceof WAIaaSError && error.code === 'PIPELINE_HALTED') {
283
+ return;
284
+ }
285
+ try {
286
+ const tx = await deps.db
287
+ .select()
288
+ .from(transactions)
289
+ .where(eq(transactions.id, ctx.txId))
290
+ .get();
291
+ if (tx && tx.status !== 'CONFIRMED' && tx.status !== 'FAILED' && tx.status !== 'CANCELLED') {
292
+ const errorMessage = error instanceof Error ? error.message : 'Pipeline execution failed';
293
+ await deps.db
294
+ .update(transactions)
295
+ .set({ status: 'FAILED', error: errorMessage })
296
+ .where(eq(transactions.id, ctx.txId));
297
+ }
298
+ }
299
+ catch {
300
+ // Swallow DB update errors in background
301
+ }
302
+ }
303
+ })();
304
+ }
305
+ const lastResult = pipelineResults[pipelineResults.length - 1];
306
+ if (pipelineResults.length === 1) {
307
+ return c.json({ id: lastResult.id, status: lastResult.status }, 201);
308
+ }
309
+ return c.json({
310
+ id: lastResult.id,
311
+ status: lastResult.status,
312
+ pipeline: pipelineResults,
313
+ }, 201);
314
+ });
315
+ return router;
316
+ }
317
+ //# sourceMappingURL=admin-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-actions.js","sourceRoot":"","sources":["../../../src/api/routes/admin-actions.ts"],"names":[],"mappings":"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"}
@@ -805,7 +805,7 @@ export function adminRoutes(deps) {
805
805
  const activeSessionResult = deps.db
806
806
  .select({ count: sql `count(*)` })
807
807
  .from(sessions)
808
- .where(sql `${sessions.revokedAt} IS NULL AND ${sessions.expiresAt} > ${nowSec}`)
808
+ .where(sql `${sessions.revokedAt} IS NULL AND (${sessions.expiresAt} = 0 OR ${sessions.expiresAt} > ${nowSec})`)
809
809
  .get();
810
810
  const activeSessionCount = activeSessionResult?.count ?? 0;
811
811
  // Count policies