syncorejs 0.2.2 → 0.2.4

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 (142) hide show
  1. package/dist/_vendor/cli/app.d.mts.map +1 -1
  2. package/dist/_vendor/cli/app.mjs +8 -5
  3. package/dist/_vendor/cli/app.mjs.map +1 -1
  4. package/dist/_vendor/cli/context.mjs.map +1 -1
  5. package/dist/_vendor/cli/dev-session.mjs.map +1 -1
  6. package/dist/_vendor/cli/doctor.mjs.map +1 -1
  7. package/dist/_vendor/cli/errors.mjs.map +1 -1
  8. package/dist/_vendor/cli/help.mjs.map +1 -1
  9. package/dist/_vendor/cli/index.mjs +9 -2
  10. package/dist/_vendor/cli/index.mjs.map +1 -1
  11. package/dist/_vendor/cli/messages.mjs.map +1 -1
  12. package/dist/_vendor/cli/preflight.mjs.map +1 -1
  13. package/dist/_vendor/cli/project.mjs +20 -20
  14. package/dist/_vendor/cli/project.mjs.map +1 -1
  15. package/dist/_vendor/cli/render.mjs.map +1 -1
  16. package/dist/_vendor/cli/targets.mjs.map +1 -1
  17. package/dist/_vendor/core/cli.d.mts +8 -2
  18. package/dist/_vendor/core/cli.d.mts.map +1 -1
  19. package/dist/_vendor/core/cli.mjs +510 -71
  20. package/dist/_vendor/core/cli.mjs.map +1 -1
  21. package/dist/_vendor/core/devtools-auth.mjs.map +1 -1
  22. package/dist/_vendor/core/index.d.mts +3 -3
  23. package/dist/_vendor/core/runtime/components.d.mts.map +1 -1
  24. package/dist/_vendor/core/runtime/components.mjs.map +1 -1
  25. package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
  26. package/dist/_vendor/core/runtime/devtools.mjs +261 -23
  27. package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
  28. package/dist/_vendor/core/runtime/functions.d.mts +388 -6
  29. package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
  30. package/dist/_vendor/core/runtime/functions.mjs +72 -1
  31. package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
  32. package/dist/_vendor/core/runtime/id.d.mts.map +1 -1
  33. package/dist/_vendor/core/runtime/id.mjs.map +1 -1
  34. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +12 -6
  35. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -1
  36. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +123 -20
  37. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -1
  38. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +56 -8
  39. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -1
  40. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +49 -14
  41. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -1
  42. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +4 -7
  43. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -1
  44. package/dist/_vendor/core/runtime/internal/engines/shared.mjs +81 -2
  45. package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -1
  46. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +100 -13
  47. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -1
  48. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +42 -7
  49. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -1
  50. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -1
  51. package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -1
  52. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +4 -0
  53. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -1
  54. package/dist/_vendor/core/runtime/runtime.d.mts +1100 -12
  55. package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
  56. package/dist/_vendor/core/runtime/runtime.mjs +63 -0
  57. package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
  58. package/dist/_vendor/core/transport.d.mts +2 -0
  59. package/dist/_vendor/core/transport.d.mts.map +1 -1
  60. package/dist/_vendor/core/transport.mjs +61 -27
  61. package/dist/_vendor/core/transport.mjs.map +1 -1
  62. package/dist/_vendor/devtools-protocol/index.d.ts +223 -4
  63. package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
  64. package/dist/_vendor/devtools-protocol/index.js.map +1 -1
  65. package/dist/_vendor/next/config.d.ts +3 -4
  66. package/dist/_vendor/next/config.d.ts.map +1 -1
  67. package/dist/_vendor/next/config.js +37 -19
  68. package/dist/_vendor/next/config.js.map +1 -1
  69. package/dist/_vendor/next/index.d.ts +109 -29
  70. package/dist/_vendor/next/index.d.ts.map +1 -1
  71. package/dist/_vendor/next/index.js +86 -18
  72. package/dist/_vendor/next/index.js.map +1 -1
  73. package/dist/_vendor/platform-expo/index.d.ts +146 -27
  74. package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
  75. package/dist/_vendor/platform-expo/index.js +81 -10
  76. package/dist/_vendor/platform-expo/index.js.map +1 -1
  77. package/dist/_vendor/platform-expo/react.js.map +1 -1
  78. package/dist/_vendor/platform-expo/web-sqljs-wasm.js +16 -0
  79. package/dist/_vendor/platform-expo/web-sqljs-wasm.js.map +1 -0
  80. package/dist/_vendor/platform-node/index.d.mts +174 -9
  81. package/dist/_vendor/platform-node/index.d.mts.map +1 -1
  82. package/dist/_vendor/platform-node/index.mjs +251 -95
  83. package/dist/_vendor/platform-node/index.mjs.map +1 -1
  84. package/dist/_vendor/platform-node/ipc-react.mjs +4 -0
  85. package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
  86. package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
  87. package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
  88. package/dist/_vendor/platform-web/external-change.d.ts +41 -0
  89. package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
  90. package/dist/_vendor/platform-web/external-change.js +30 -0
  91. package/dist/_vendor/platform-web/external-change.js.map +1 -1
  92. package/dist/_vendor/platform-web/index.d.ts +312 -37
  93. package/dist/_vendor/platform-web/index.d.ts.map +1 -1
  94. package/dist/_vendor/platform-web/index.js +247 -25
  95. package/dist/_vendor/platform-web/index.js.map +1 -1
  96. package/dist/_vendor/platform-web/indexeddb.d.ts +12 -0
  97. package/dist/_vendor/platform-web/indexeddb.d.ts.map +1 -1
  98. package/dist/_vendor/platform-web/indexeddb.js +10 -0
  99. package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
  100. package/dist/_vendor/platform-web/opfs.d.ts +16 -1
  101. package/dist/_vendor/platform-web/opfs.d.ts.map +1 -1
  102. package/dist/_vendor/platform-web/opfs.js +41 -3
  103. package/dist/_vendor/platform-web/opfs.js.map +1 -1
  104. package/dist/_vendor/platform-web/persistence.d.ts +85 -1
  105. package/dist/_vendor/platform-web/persistence.d.ts.map +1 -1
  106. package/dist/_vendor/platform-web/persistence.js +15 -0
  107. package/dist/_vendor/platform-web/persistence.js.map +1 -1
  108. package/dist/_vendor/platform-web/react.d.ts +1 -2
  109. package/dist/_vendor/platform-web/react.d.ts.map +1 -1
  110. package/dist/_vendor/platform-web/react.js +11 -5
  111. package/dist/_vendor/platform-web/react.js.map +1 -1
  112. package/dist/_vendor/platform-web/sqljs.js +10 -1
  113. package/dist/_vendor/platform-web/sqljs.js.map +1 -1
  114. package/dist/_vendor/platform-web/web-sqljs-wasm.js +8 -0
  115. package/dist/_vendor/platform-web/web-sqljs-wasm.js.map +1 -0
  116. package/dist/_vendor/platform-web/worker.d.ts +60 -9
  117. package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
  118. package/dist/_vendor/platform-web/worker.js +37 -4
  119. package/dist/_vendor/platform-web/worker.js.map +1 -1
  120. package/dist/_vendor/react/index.d.ts +197 -13
  121. package/dist/_vendor/react/index.d.ts.map +1 -1
  122. package/dist/_vendor/react/index.js +209 -17
  123. package/dist/_vendor/react/index.js.map +1 -1
  124. package/dist/_vendor/schema/definition.d.ts +129 -0
  125. package/dist/_vendor/schema/definition.d.ts.map +1 -1
  126. package/dist/_vendor/schema/definition.js +99 -0
  127. package/dist/_vendor/schema/definition.js.map +1 -1
  128. package/dist/_vendor/schema/planner.d.ts.map +1 -1
  129. package/dist/_vendor/schema/planner.js.map +1 -1
  130. package/dist/_vendor/schema/validators.d.ts +180 -4
  131. package/dist/_vendor/schema/validators.d.ts.map +1 -1
  132. package/dist/_vendor/schema/validators.js +35 -1
  133. package/dist/_vendor/schema/validators.js.map +1 -1
  134. package/dist/_vendor/svelte/index.d.ts +207 -7
  135. package/dist/_vendor/svelte/index.d.ts.map +1 -1
  136. package/dist/_vendor/svelte/index.js +201 -6
  137. package/dist/_vendor/svelte/index.js.map +1 -1
  138. package/dist/browser.d.ts.map +1 -1
  139. package/dist/cli.js +3 -1
  140. package/dist/cli.js.map +1 -1
  141. package/dist/index.d.ts +1 -1
  142. package/package.json +24 -21
@@ -1 +1 @@
1
- {"version":3,"file":"devtools.mjs","names":[],"sources":["../../src/runtime/devtools.ts"],"sourcesContent":["import type {\n SchedulerMisfirePolicy,\n SchedulerJob,\n SchedulerRecurringSchedule,\n SyncoreDevtoolsCommandPayload,\n SyncoreDevtoolsCommandResultPayload,\n SyncoreDevtoolsSubscriptionPayload,\n SyncoreDevtoolsSubscriptionResultPayload,\n TableSchema\n} from \"@syncore/devtools-protocol\";\nimport { describeValidator } from \"@syncore/schema\";\nimport type {\n TableDefinition,\n Validator\n} from \"@syncore/schema\";\nimport type {\n DevtoolsLiveQueryScope,\n ImpactScope,\n SyncoreDataModel,\n SyncoreRuntimeAdmin,\n SyncoreRuntimeOptions,\n SyncoreSqlDriver\n} from \"./runtime.js\";\nimport { createFunctionReference } from \"./runtime.js\";\nimport {\n parseCanonicalComponentFunctionName,\n parseComponentScopedIdentifier,\n safeReadRecurringSchedule\n} from \"./internal/engines/shared.js\";\n\nexport interface DevtoolsCommandHandlerDeps {\n driver: SyncoreSqlDriver;\n schema: SyncoreDataModel;\n functions: SyncoreRuntimeOptions<SyncoreDataModel>[\"functions\"];\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>;\n sql?: DevtoolsSqlSupport;\n}\n\nexport type DevtoolsSqlMode = \"read\" | \"write\" | \"ddl\";\n\nexport interface DevtoolsSqlAnalysis {\n mode: DevtoolsSqlMode;\n readTables: string[];\n writeTables: string[];\n schemaChanged: boolean;\n observedScopes: DevtoolsLiveQueryScope[];\n}\n\nexport interface DevtoolsSqlReadResult {\n columns: string[];\n rows: unknown[][];\n observedTables: string[];\n}\n\nexport interface DevtoolsSqlSupport {\n analyzeSqlStatement(query: string): DevtoolsSqlAnalysis;\n ensureSqlMode(\n analysis: DevtoolsSqlAnalysis,\n expected: DevtoolsSqlMode | \"watch\"\n ): void;\n runReadonlyQuery(databasePath: string, query: string): DevtoolsSqlReadResult;\n}\n\nexport type DevtoolsCommandHandler = (\n payload: SyncoreDevtoolsCommandPayload\n) => Promise<SyncoreDevtoolsCommandResultPayload>;\n\nexport type DevtoolsSubscriptionListener = (\n payload: SyncoreDevtoolsSubscriptionResultPayload\n) => void;\n\nexport interface DevtoolsSubscriptionHost {\n subscribe(\n subscriptionId: string,\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: DevtoolsSubscriptionListener\n ): Promise<void>;\n unsubscribe(subscriptionId: string): void;\n dispose(): void;\n}\n\ntype DevtoolsInvalidationScope = DevtoolsLiveQueryScope;\n\ninterface SubscriptionRecord {\n payload: SyncoreDevtoolsSubscriptionPayload;\n listener: DevtoolsSubscriptionListener;\n unsubscribeRuntime: () => void;\n scopes: Set<DevtoolsInvalidationScope>;\n}\n\nexport function createDevtoolsCommandHandler(\n deps: DevtoolsCommandHandlerDeps\n): DevtoolsCommandHandler {\n const { driver, admin, sql } = deps;\n\n return async (payload): Promise<SyncoreDevtoolsCommandResultPayload> => {\n await admin.prepareForDirectAccess();\n switch (payload.kind) {\n case \"fn.run\": {\n const start = performance.now();\n try {\n let result: unknown;\n switch (payload.functionType) {\n case \"query\":\n result = await admin.runQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"mutation\":\n result = await admin.runMutation(\n createFunctionReference(\"mutation\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"action\":\n result = await admin.runAction(\n createFunctionReference(\"action\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n }\n return {\n kind: \"fn.run.result\",\n result,\n durationMs: performance.now() - start\n };\n } catch (error) {\n return {\n kind: \"fn.run.result\",\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - start\n };\n }\n }\n\n case \"data.insert\": {\n try {\n const id = await runDevtoolsMutation(admin, async (ctx) =>\n ctx.db.insert(payload.table as never, payload.document as never)\n , { origin: \"dashboard\" });\n return { kind: \"data.mutate.result\", success: true, id };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.patch\": {\n try {\n await runDevtoolsMutation(admin, async (ctx) => {\n await ctx.db.patch(\n payload.table as never,\n payload.id,\n payload.fields as never\n );\n return null;\n }, { origin: \"dashboard\" });\n return {\n kind: \"data.mutate.result\",\n success: true,\n id: payload.id\n };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.delete\": {\n try {\n await runDevtoolsMutation(admin, async (ctx) => {\n await ctx.db.delete(payload.table as never, payload.id);\n return null;\n }, { origin: \"dashboard\" });\n return { kind: \"data.mutate.result\", success: true };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"sql.read\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const databasePath = admin.getDriverDatabasePath();\n if (!databasePath) {\n throw new Error(\"SQL Read requires a file-backed database path.\");\n }\n const { columns, rows } = sqlSupport.runReadonlyQuery(\n databasePath,\n payload.query\n );\n return {\n kind: \"sql.read.result\",\n columns,\n rows\n };\n } catch (error) {\n return {\n kind: \"sql.read.result\",\n columns: [],\n rows: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"sql.write\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const analysis = sqlSupport.analyzeSqlStatement(payload.query);\n if (analysis.mode === \"read\") {\n throw new Error(\n \"Use SQL Read or SQL Live for read-only statements.\"\n );\n }\n const result = await driver.run(payload.query);\n admin.notifyDevtoolsScopes(analysis.observedScopes);\n await admin.forceRefreshDevtools(\n \"SQL write executed from devtools dashboard.\",\n analysis.observedScopes.flatMap((scope) =>\n scope === \"all\" ? [] : ([scope] as ImpactScope[])\n ),\n { origin: \"dashboard\" }\n );\n return {\n kind: \"sql.write.result\",\n rowsAffected: result.changes,\n invalidationScopes: [...analysis.observedScopes]\n };\n } catch (error) {\n return {\n kind: \"sql.write.result\",\n rowsAffected: 0,\n invalidationScopes: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"scheduler.cancel\": {\n try {\n const cancelled = await admin.cancelScheduledJob(payload.jobId);\n return {\n kind: \"scheduler.cancel.result\",\n success: true,\n cancelled\n };\n } catch (error) {\n return {\n kind: \"scheduler.cancel.result\",\n success: false,\n cancelled: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"scheduler.update\": {\n try {\n const updated = await admin.updateScheduledJob({\n id: payload.jobId,\n schedule: payload.schedule,\n args: payload.args,\n misfirePolicy: payload.misfirePolicy,\n ...(payload.runAt !== undefined ? { runAt: payload.runAt } : {})\n });\n const jobs = updated ? await listSchedulerJobs(driver) : [];\n const updatedJob = jobs.find((job) => job.id === payload.jobId);\n return {\n kind: \"scheduler.update.result\",\n success: true,\n updated,\n ...(updated && updatedJob ? { job: updatedJob } : {})\n };\n } catch (error) {\n return {\n kind: \"scheduler.update.result\",\n success: false,\n updated: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n default:\n return {\n kind: \"error\",\n message: `Unknown devtools command: ${(payload as { kind: string }).kind}`\n };\n }\n };\n}\n\nexport function createDevtoolsSubscriptionHost(\n deps: DevtoolsCommandHandlerDeps\n): DevtoolsSubscriptionHost {\n const { driver, schema, functions, admin } = deps;\n const subscriptions = new Map<string, SubscriptionRecord>();\n\n const emit = async (\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: DevtoolsSubscriptionListener\n ) => {\n listener(\n await resolveSubscriptionPayload(payload, {\n driver,\n schema,\n functions,\n admin,\n ...(deps.sql ? { sql: deps.sql } : {})\n })\n );\n };\n\n const handleInvalidation = async (scopes: Set<DevtoolsInvalidationScope>) => {\n for (const record of subscriptions.values()) {\n if (!intersects(scopes, record.scopes)) {\n continue;\n }\n await emit(record.payload, record.listener);\n }\n };\n\n return {\n async subscribe(subscriptionId, payload, listener) {\n if (payload.kind === \"fn.watch\") {\n const definition = functions[payload.functionName];\n if (!definition || definition.kind !== \"query\") {\n listener({\n kind: \"fn.watch.result\",\n error: `Unknown query function: ${payload.functionName}`\n });\n return;\n }\n const client = admin.createClient();\n const watch = client.watchQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args\n );\n const emitWatchResult = () => {\n const error = watch.localQueryError();\n listener({\n kind: \"fn.watch.result\",\n ...(error\n ? {\n error: error.message\n }\n : {\n result: watch.localQueryResult()\n })\n });\n };\n const unsubscribeUpdates = watch.onUpdate(emitWatchResult);\n subscriptions.set(subscriptionId, {\n payload,\n listener,\n unsubscribeRuntime: () => {\n unsubscribeUpdates();\n watch.dispose?.();\n },\n scopes: new Set<DevtoolsInvalidationScope>([\"all\"])\n });\n emitWatchResult();\n return;\n }\n\n const unsubscribeRuntime = admin.subscribeToDevtoolsInvalidations(\n (scopes) => {\n void handleInvalidation(scopes);\n }\n );\n const unsubscribeEvents = admin.subscribeToDevtoolsEvents((event) => {\n if (event.type === \"runtime.disconnected\") {\n void emit(payload, listener);\n }\n });\n subscriptions.set(subscriptionId, {\n payload,\n listener,\n unsubscribeRuntime: () => {\n unsubscribeRuntime();\n unsubscribeEvents();\n },\n scopes: scopesForSubscription(payload, deps.sql)\n });\n await emit(payload, listener);\n },\n unsubscribe(subscriptionId) {\n const record = subscriptions.get(subscriptionId);\n if (!record) {\n return;\n }\n record.unsubscribeRuntime();\n subscriptions.delete(subscriptionId);\n },\n dispose() {\n for (const [subscriptionId, record] of subscriptions) {\n record.unsubscribeRuntime();\n subscriptions.delete(subscriptionId);\n }\n }\n };\n}\n\nasync function resolveSubscriptionPayload(\n payload: SyncoreDevtoolsSubscriptionPayload,\n deps: DevtoolsCommandHandlerDeps\n): Promise<SyncoreDevtoolsSubscriptionResultPayload> {\n const { driver, schema, functions, admin } = deps;\n await admin.prepareForDirectAccess();\n\n switch (payload.kind) {\n case \"runtime.summary\":\n return {\n kind: \"runtime.summary.result\",\n summary: admin.getRuntimeSummary()\n };\n case \"runtime.activeQueries\":\n return {\n kind: \"runtime.activeQueries.result\",\n activeQueries: admin.getActiveQueryInfos()\n };\n case \"fn.watch\":\n throw new Error(\"Function watches are pushed incrementally and have no snapshot payload.\");\n case \"schema.tables\": {\n const tables = await getSchemaTables(driver, schema);\n console.debug(\"[devtools] schema.tables\", {\n runtimeId: admin.getRuntimeId(),\n tables: tables.map((table) => ({\n name: table.name,\n documentCount: table.documentCount\n }))\n });\n return {\n kind: \"schema.tables.result\",\n tables\n };\n }\n case \"data.table\": {\n const result = await queryTable(\n driver,\n payload.table,\n payload.filters,\n payload.limit\n );\n console.debug(\"[devtools] data.table\", {\n runtimeId: admin.getRuntimeId(),\n table: payload.table,\n filters: payload.filters ?? [],\n limit: payload.limit,\n totalCount: result.totalCount,\n rowCount: result.rows.length,\n firstRow: result.rows[0] ?? null\n });\n return {\n kind: \"data.table.result\",\n rows: result.rows,\n totalCount: result.totalCount,\n ...(result.cursor ? { cursor: result.cursor } : {})\n };\n }\n case \"scheduler.jobs\":\n return {\n kind: \"scheduler.jobs.result\",\n jobs: await listSchedulerJobs(driver)\n };\n case \"functions.catalog\":\n return {\n kind: \"functions.catalog.result\",\n functions: listFunctions(functions)\n };\n case \"sql.watch\": {\n const sqlSupport = requireDevtoolsSqlSupport(deps.sql);\n const databasePath = admin.getDriverDatabasePath();\n if (!databasePath) {\n throw new Error(\"SQL Live requires a file-backed database path.\");\n }\n const { columns, rows, observedTables } = sqlSupport.runReadonlyQuery(\n databasePath,\n payload.query\n );\n return {\n kind: \"sql.watch.result\",\n columns,\n rows,\n observedTables\n };\n }\n }\n}\n\nasync function queryTable(\n driver: SyncoreSqlDriver,\n table: string,\n filters?: Array<{\n field: string;\n operator: string;\n value: unknown;\n }>,\n limit?: number\n): Promise<{\n rows: Record<string, unknown>[];\n totalCount: number;\n cursor?: string;\n}> {\n let sql = `SELECT _id, _creationTime, _json FROM \"${table}\"`;\n const params: unknown[] = [];\n\n if (filters && filters.length > 0) {\n sql += ` WHERE ${filters\n .map((filter) => {\n params.push(normalizeFilterValue(filter));\n return `json_extract(_json, '$.${filter.field}') ${filterOperatorToSql(filter.operator)} ?`;\n })\n .join(\" AND \")}`;\n }\n\n sql += \" ORDER BY _creationTime DESC\";\n if (limit) {\n sql += ` LIMIT ${limit}`;\n }\n\n const rawRows = await driver.all<{\n _id: string;\n _creationTime: number;\n _json: string;\n }>(sql, params);\n const rows = rawRows.map((row) => ({\n _id: row._id,\n _creationTime: row._creationTime,\n ...(JSON.parse(row._json) as Record<string, unknown>)\n }));\n const countRow = await driver.get<{ count: number }>(\n `SELECT COUNT(*) as count FROM \"${table}\"`\n );\n\n return {\n rows,\n totalCount: countRow?.count ?? 0\n };\n}\n\nasync function getSchemaTables(\n driver: SyncoreSqlDriver,\n schema: SyncoreDataModel\n): Promise<TableSchema[]> {\n return Promise.all(\n schema.tableNames().map(async (name) => {\n const table = schema.getTable(name) as TableDefinition<\n Validator<Record<string, unknown>, Record<string, unknown>, string>\n >;\n const validatorDesc = describeValidator(table.validator);\n const fields =\n validatorDesc.kind === \"object\"\n ? Object.entries(validatorDesc.shape).map(\n ([fieldName, fieldDesc]) => {\n const field = fieldDesc as {\n validator: { kind: string };\n optional: boolean;\n };\n return {\n name: fieldName,\n type: field.validator.kind,\n optional: field.optional\n };\n }\n )\n : [];\n\n fields.unshift(\n { name: \"_id\", type: \"string\", optional: false },\n { name: \"_creationTime\", type: \"number\", optional: false }\n );\n\n let documentCount = 0;\n try {\n const countRow = await driver.get<{ count: number }>(\n `SELECT COUNT(*) as count FROM \"${name}\"`\n );\n documentCount = countRow?.count ?? 0;\n } catch {\n documentCount = 0;\n }\n\n return {\n name,\n ...(table.options.tableName ? { displayName: table.options.tableName } : {}),\n owner: table.options.componentPath ? (\"component\" as const) : (\"root\" as const),\n ...(table.options.componentPath\n ? { componentPath: table.options.componentPath }\n : {}),\n ...(table.options.componentName\n ? { componentName: table.options.componentName }\n : {}),\n fields,\n indexes: table.indexes.map((index) => ({\n name: index.name,\n fields: index.fields,\n unique: false\n })),\n documentCount\n };\n })\n );\n}\n\nasync function listSchedulerJobs(\n driver: SyncoreSqlDriver\n): Promise<SchedulerJob[]> {\n try {\n const rows = await driver.all<{\n id: string;\n function_name: string;\n args_json: string;\n status: string;\n run_at: number;\n created_at: number;\n updated_at: number;\n recurring_name: string | null;\n schedule_json: string | null;\n timezone: string | null;\n misfire_policy: string;\n last_run_at: number | null;\n window_ms: number | null;\n }>(`SELECT * FROM \"_scheduled_functions\" ORDER BY run_at DESC LIMIT 200`);\n\n return rows.map((row) => {\n const schedule = safeReadRecurringSchedule(row.schedule_json);\n const scheduleLabel = schedule ? formatScheduleLabel(schedule) : undefined;\n const functionComponent = parseCanonicalComponentFunctionName(\n row.function_name\n );\n const idComponent = parseComponentScopedIdentifier(row.id);\n return {\n id: row.id,\n functionName: row.function_name,\n owner:\n functionComponent || idComponent ? (\"component\" as const) : (\"root\" as const),\n ...(functionComponent\n ? {\n componentPath: functionComponent.componentPath\n }\n : idComponent\n ? {\n componentPath: idComponent.componentPath\n }\n : {}),\n args: JSON.parse(row.args_json) as Record<string, unknown>,\n scheduledAt: row.created_at,\n runAt: row.run_at,\n status: mapJobStatus(row.status),\n ...(row.status === \"completed\" || row.status === \"failed\"\n ? { completedAt: row.updated_at }\n : {}),\n ...(row.recurring_name ? { recurringName: row.recurring_name } : {}),\n ...(schedule ? { schedule } : {}),\n ...(scheduleLabel ? { scheduleLabel, cronSchedule: scheduleLabel } : {}),\n ...(row.timezone ? { timezone: row.timezone } : {}),\n ...(row.last_run_at !== null ? { lastRunAt: row.last_run_at } : {}),\n ...(row.updated_at ? { updatedAt: row.updated_at } : {}),\n misfirePolicy: readMisfirePolicy(row.misfire_policy, row.window_ms)\n };\n });\n } catch {\n return [];\n }\n}\n\nfunction listFunctions(\n functions: SyncoreRuntimeOptions<SyncoreDataModel>[\"functions\"]\n) {\n return Object.entries(functions)\n .filter(\n (entry): entry is [string, NonNullable<(typeof entry)[1]>] =>\n entry[1] !== undefined\n )\n .map(([name, fn]) => {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n const descriptor: {\n name: string;\n type: \"query\" | \"mutation\" | \"action\";\n file: string;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n visibility?: \"public\" | \"internal\";\n localName?: string;\n args?: Record<string, unknown>;\n } = {\n name,\n type: fn.kind,\n file: inferFileFromFunctionName(name),\n owner: componentFunction ? \"component\" : \"root\",\n ...(componentFunction\n ? {\n componentPath: componentFunction.componentPath,\n visibility: componentFunction.visibility,\n localName: componentFunction.localName\n }\n : {})\n };\n const argsDesc = describeValidator(fn.argsValidator);\n if (argsDesc.kind === \"object\") {\n descriptor.args = argsDesc.shape as Record<string, unknown>;\n }\n return descriptor;\n });\n}\n\nfunction inferFileFromFunctionName(name: string): string {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n if (componentFunction) {\n return `components/${componentFunction.componentPath}`;\n }\n const parts = name.split(\":\");\n if (parts.length > 1) {\n return `${parts[0]}.ts`;\n }\n return \"unknown\";\n}\n\nfunction normalizeFilterValue(filter: {\n operator: string;\n value: unknown;\n}): unknown {\n switch (filter.operator) {\n case \"contains\":\n return `%${String(filter.value)}%`;\n case \"startsWith\":\n return `${String(filter.value)}%`;\n default:\n return filter.value;\n }\n}\n\nfunction filterOperatorToSql(operator: string): string {\n switch (operator) {\n case \"eq\":\n return \"=\";\n case \"neq\":\n return \"!=\";\n case \"gt\":\n return \">\";\n case \"gte\":\n return \">=\";\n case \"lt\":\n return \"<\";\n case \"lte\":\n return \"<=\";\n case \"contains\":\n case \"startsWith\":\n return \"LIKE\";\n default:\n return \"=\";\n }\n}\n\nfunction mapJobStatus(\n status: string\n): \"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\" {\n switch (status) {\n case \"scheduled\":\n return \"pending\";\n case \"completed\":\n return \"completed\";\n case \"failed\":\n return \"failed\";\n case \"cancelled\":\n case \"skipped\":\n return \"cancelled\";\n default:\n return \"pending\";\n }\n}\n\nfunction formatScheduleLabel(schedule: SchedulerRecurringSchedule): string {\n switch (schedule.type) {\n case \"interval\": {\n const parts: string[] = [];\n if (schedule.hours) {\n parts.push(`${schedule.hours}h`);\n }\n if (schedule.minutes) {\n parts.push(`${schedule.minutes}m`);\n }\n if (schedule.seconds) {\n parts.push(`${schedule.seconds}s`);\n }\n return parts.length > 0 ? `Every ${parts.join(\" \")}` : \"Recurring\";\n }\n case \"daily\":\n return `Daily ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : \"\"}`;\n case \"weekly\":\n return `Weekly ${capitalize(schedule.dayOfWeek)} ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : \"\"}`;\n default:\n return \"Recurring\";\n }\n}\n\nfunction readMisfirePolicy(\n type: string,\n windowMs: number | null\n): SchedulerMisfirePolicy {\n if (type === \"windowed\") {\n return {\n type,\n windowMs: windowMs ?? 0\n };\n }\n if (type === \"skip\" || type === \"run_once_if_missed\") {\n return { type };\n }\n return { type: \"catch_up\" };\n}\n\nfunction padNumber(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nfunction capitalize(value: string): string {\n return value.slice(0, 1).toUpperCase() + value.slice(1);\n}\n\nasync function runDevtoolsMutation<TResult>(\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>,\n callback: (ctx: {\n db: {\n insert(\n tableName: string,\n value: Record<string, unknown>\n ): Promise<string>;\n patch(\n tableName: string,\n id: string,\n value: Record<string, unknown>\n ): Promise<void>;\n delete(tableName: string, id: string): Promise<void>;\n };\n }) => Promise<TResult>,\n meta?: { origin?: \"dashboard\" }\n ): Promise<TResult> {\n return admin.runDevtoolsMutation(callback as never, meta);\n }\n\nfunction scopesForSubscription(\n payload: SyncoreDevtoolsSubscriptionPayload,\n sql?: DevtoolsSqlSupport\n): Set<DevtoolsInvalidationScope> {\n switch (payload.kind) {\n case \"runtime.summary\":\n return new Set([\"runtime.summary\"]);\n case \"runtime.activeQueries\":\n return new Set([\"runtime.activeQueries\"]);\n case \"fn.watch\":\n return new Set([\"all\"]);\n case \"schema.tables\":\n return new Set([\"schema.tables\"]);\n case \"data.table\":\n return new Set<DevtoolsInvalidationScope>([`table:${payload.table}`]);\n case \"scheduler.jobs\":\n return new Set([\"scheduler.jobs\"]);\n case \"functions.catalog\":\n return new Set([\"all\"]);\n case \"sql.watch\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const analysis = sqlSupport.analyzeSqlStatement(payload.query);\n sqlSupport.ensureSqlMode(analysis, \"watch\");\n return new Set<DevtoolsInvalidationScope>(analysis.observedScopes);\n } catch {\n return new Set<DevtoolsInvalidationScope>([\"all\"]);\n }\n }\n default:\n return new Set<DevtoolsInvalidationScope>([\"all\"]);\n }\n}\n\nfunction intersects(\n a: Set<DevtoolsInvalidationScope>,\n b: Set<DevtoolsInvalidationScope>\n): boolean {\n if (a.has(\"all\") || b.has(\"all\")) {\n return true;\n }\n for (const value of a) {\n if (b.has(value)) {\n return true;\n }\n }\n return false;\n}\n\nfunction requireDevtoolsSqlSupport(\n sql?: DevtoolsSqlSupport\n): DevtoolsSqlSupport {\n if (!sql) {\n throw new Error(\"SQL devtools are only available in Node-hosted runtimes.\");\n }\n return sql;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"devtools.mjs","names":[],"sources":["../../src/runtime/devtools.ts"],"sourcesContent":["import type {\n SchedulerMisfirePolicy,\n SchedulerJob,\n SchedulerRecurringSchedule,\n SyncoreDevtoolsCommandPayload,\n SyncoreDevtoolsCommandResultPayload,\n SyncoreDevtoolsSubscriptionPayload,\n SyncoreDevtoolsSubscriptionResultPayload,\n TableSchema\n} from \"@syncore/devtools-protocol\";\nimport { describeValidator } from \"@syncore/schema\";\nimport type { TableDefinition, Validator } from \"@syncore/schema\";\nimport type {\n DevtoolsLiveQueryScope,\n ImpactScope,\n SyncoreDataModel,\n SyncoreRuntimeAdmin,\n SyncoreRuntimeOptions,\n SyncoreSqlDriver\n} from \"./runtime.js\";\nimport { createFunctionReference } from \"./runtime.js\";\nimport {\n parseCanonicalComponentFunctionName,\n parseComponentScopedIdentifier,\n quoteIdentifier,\n safeReadRecurringSchedule\n} from \"./internal/engines/shared.js\";\n\nexport interface DevtoolsCommandHandlerDeps {\n driver: SyncoreSqlDriver;\n schema: SyncoreDataModel;\n functions: SyncoreRuntimeOptions<SyncoreDataModel>[\"functions\"];\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>;\n sql?: DevtoolsSqlSupport;\n}\n\nexport type DevtoolsSqlMode = \"read\" | \"write\" | \"ddl\";\n\nexport interface DevtoolsSqlAnalysis {\n mode: DevtoolsSqlMode;\n readTables: string[];\n writeTables: string[];\n schemaChanged: boolean;\n observedScopes: DevtoolsLiveQueryScope[];\n}\n\nexport interface DevtoolsSqlReadResult {\n columns: string[];\n rows: unknown[][];\n observedTables: string[];\n}\n\nexport interface DevtoolsSqlSupport {\n analyzeSqlStatement(query: string): DevtoolsSqlAnalysis;\n ensureSqlMode(\n analysis: DevtoolsSqlAnalysis,\n expected: DevtoolsSqlMode | \"watch\"\n ): void;\n runReadonlyQuery(databasePath: string, query: string): DevtoolsSqlReadResult;\n}\n\nexport type DevtoolsCommandHandler = (\n payload: SyncoreDevtoolsCommandPayload\n) => Promise<SyncoreDevtoolsCommandResultPayload>;\n\nexport type DevtoolsSubscriptionListener = (\n payload: SyncoreDevtoolsSubscriptionResultPayload\n) => void;\n\nexport interface DevtoolsSubscriptionHost {\n subscribe(\n subscriptionId: string,\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: DevtoolsSubscriptionListener\n ): Promise<void>;\n unsubscribe(subscriptionId: string): void;\n dispose(): void;\n}\n\ntype DevtoolsInvalidationScope = DevtoolsLiveQueryScope;\n\ninterface SubscriptionRecord {\n payload: SyncoreDevtoolsSubscriptionPayload;\n listener: DevtoolsSubscriptionListener;\n unsubscribeRuntime: () => void;\n scopes: Set<DevtoolsInvalidationScope>;\n}\n\nexport function createDevtoolsCommandHandler(\n deps: DevtoolsCommandHandlerDeps\n): DevtoolsCommandHandler {\n const { driver, admin, sql } = deps;\n\n return async (payload): Promise<SyncoreDevtoolsCommandResultPayload> => {\n await admin.prepareForDirectAccess();\n switch (payload.kind) {\n case \"fn.run\": {\n const start = performance.now();\n try {\n let result: unknown;\n switch (payload.functionType) {\n case \"query\":\n result = await admin.runQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"mutation\":\n result = await admin.runMutation(\n createFunctionReference(\"mutation\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"action\":\n result = await admin.runAction(\n createFunctionReference(\"action\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n }\n return {\n kind: \"fn.run.result\",\n result,\n durationMs: performance.now() - start\n };\n } catch (error) {\n return {\n kind: \"fn.run.result\",\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - start\n };\n }\n }\n\n case \"data.insert\": {\n try {\n const id = await runDevtoolsMutation(\n admin,\n async (ctx) =>\n ctx.db.insert(payload.table as never, payload.document as never),\n { origin: \"dashboard\" }\n );\n notifyDataMutationScopes(admin, payload.table);\n return { kind: \"data.mutate.result\", success: true, id };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.patch\": {\n try {\n await runDevtoolsMutation(\n admin,\n async (ctx) => {\n await ctx.db.patch(\n payload.table as never,\n payload.id,\n payload.fields as never\n );\n return null;\n },\n { origin: \"dashboard\" }\n );\n notifyDataMutationScopes(admin, payload.table);\n return {\n kind: \"data.mutate.result\",\n success: true,\n id: payload.id\n };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.delete\": {\n try {\n await runDevtoolsMutation(\n admin,\n async (ctx) => {\n await ctx.db.delete(payload.table as never, payload.id);\n return null;\n },\n { origin: \"dashboard\" }\n );\n notifyDataMutationScopes(admin, payload.table);\n return { kind: \"data.mutate.result\", success: true };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.export\": {\n try {\n const requestedTables =\n payload.tables && payload.tables.length > 0\n ? payload.tables\n : deps.schema.tableNames();\n const tables = await Promise.all(\n requestedTables.map(async (name) => {\n const result = await queryTable(driver, name);\n return {\n name,\n rows: result.rows,\n totalCount: result.totalCount\n };\n })\n );\n return {\n kind: \"data.export.result\",\n tables\n };\n } catch (error) {\n return {\n kind: \"data.export.result\",\n tables: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.referenceOptions\": {\n const limit = Math.min(Math.max(payload.limit ?? 100, 1), 200);\n const offset = Math.max(payload.offset ?? 0, 0);\n try {\n const result = await queryReferenceOptions(\n driver,\n payload.table,\n payload.search,\n limit,\n offset\n );\n return {\n kind: \"data.referenceOptions.result\",\n table: payload.table,\n rows: result.rows,\n totalCount: result.totalCount,\n offset,\n hasMore: offset + result.rows.length < result.totalCount\n };\n } catch (error) {\n return {\n kind: \"data.referenceOptions.result\",\n table: payload.table,\n rows: [],\n totalCount: 0,\n offset,\n hasMore: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"sql.read\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const databasePath = admin.getDriverDatabasePath();\n if (!databasePath) {\n throw new Error(\"SQL Read requires a file-backed database path.\");\n }\n const { columns, rows } = sqlSupport.runReadonlyQuery(\n databasePath,\n payload.query\n );\n return {\n kind: \"sql.read.result\",\n columns,\n rows\n };\n } catch (error) {\n return {\n kind: \"sql.read.result\",\n columns: [],\n rows: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"sql.write\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const analysis = sqlSupport.analyzeSqlStatement(payload.query);\n if (analysis.mode === \"read\") {\n throw new Error(\n \"Use SQL Read or SQL Live for read-only statements.\"\n );\n }\n const result = await driver.run(payload.query);\n admin.notifyDevtoolsScopes(analysis.observedScopes);\n await admin.forceRefreshDevtools(\n \"SQL write executed from devtools dashboard.\",\n analysis.observedScopes.flatMap((scope) =>\n scope === \"all\" ? [] : ([scope] as ImpactScope[])\n ),\n { origin: \"dashboard\" }\n );\n return {\n kind: \"sql.write.result\",\n rowsAffected: result.changes,\n invalidationScopes: [...analysis.observedScopes]\n };\n } catch (error) {\n return {\n kind: \"sql.write.result\",\n rowsAffected: 0,\n invalidationScopes: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"storage.list\": {\n const limit = normalizeStorageLimit(payload.limit);\n const offset = Math.max(payload.offset ?? 0, 0);\n try {\n const result = await admin.listStorageObjects({\n limit,\n offset,\n ...(payload.search ? { search: payload.search } : {})\n });\n return {\n kind: \"storage.list.result\",\n entries: result.entries,\n totalCount: result.totalCount,\n offset,\n hasMore: offset + result.entries.length < result.totalCount\n };\n } catch (error) {\n return {\n kind: \"storage.list.result\",\n entries: [],\n totalCount: 0,\n offset,\n hasMore: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"storage.access.create\": {\n try {\n const object = await admin.getStorageObjectAccessInfo(payload.id);\n if (!object) {\n return {\n kind: \"storage.access.create.result\",\n error: `Storage object ${JSON.stringify(payload.id)} was not found.`\n };\n }\n return {\n kind: \"storage.access.create.result\",\n entry: object.entry,\n supportsRange: object.supportsRange,\n error:\n \"Storage access URLs must be created by the Syncore devtools hub.\"\n };\n } catch (error) {\n return {\n kind: \"storage.access.create.result\",\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"storage.readRange\": {\n try {\n const object = await admin.readStorageObjectRange(\n payload.id,\n payload.offset,\n payload.length\n );\n if (!object) {\n return {\n kind: \"storage.readRange.result\",\n offset: payload.offset,\n bytesRead: 0,\n done: true,\n supportsRange: false,\n error: `Storage object ${JSON.stringify(payload.id)} was not found.`\n };\n }\n return {\n kind: \"storage.readRange.result\",\n entry: object.entry,\n offset: object.offset,\n bytesRead: object.bytesRead,\n done: object.done,\n supportsRange: object.supportsRange,\n base64: bytesToBase64(object.bytes)\n };\n } catch (error) {\n return {\n kind: \"storage.readRange.result\",\n offset: payload.offset,\n bytesRead: 0,\n done: true,\n supportsRange: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"storage.delete\": {\n try {\n const deleted = await admin.deleteStorageObject(payload.id, {\n origin: \"dashboard\"\n });\n return {\n kind: \"storage.delete.result\",\n success: true,\n deleted\n };\n } catch (error) {\n return {\n kind: \"storage.delete.result\",\n success: false,\n deleted: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"scheduler.cancel\": {\n try {\n const cancelled = await admin.cancelScheduledJob(payload.jobId);\n return {\n kind: \"scheduler.cancel.result\",\n success: true,\n cancelled\n };\n } catch (error) {\n return {\n kind: \"scheduler.cancel.result\",\n success: false,\n cancelled: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"scheduler.update\": {\n try {\n const updated = await admin.updateScheduledJob({\n id: payload.jobId,\n args: payload.args,\n ...(payload.schedule ? { schedule: payload.schedule } : {}),\n ...(payload.misfirePolicy\n ? { misfirePolicy: payload.misfirePolicy }\n : {}),\n ...(payload.runAt !== undefined ? { runAt: payload.runAt } : {})\n });\n const jobs = updated ? await listSchedulerJobs(driver) : [];\n const updatedJob = jobs.find((job) => job.id === payload.jobId);\n return {\n kind: \"scheduler.update.result\",\n success: true,\n updated,\n ...(updated && updatedJob ? { job: updatedJob } : {})\n };\n } catch (error) {\n return {\n kind: \"scheduler.update.result\",\n success: false,\n updated: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n default:\n return {\n kind: \"error\",\n message: `Unknown devtools command: ${(payload as { kind: string }).kind}`\n };\n }\n };\n}\n\nexport function createDevtoolsSubscriptionHost(\n deps: DevtoolsCommandHandlerDeps\n): DevtoolsSubscriptionHost {\n const { driver, schema, functions, admin } = deps;\n const subscriptions = new Map<string, SubscriptionRecord>();\n\n const emit = async (\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: DevtoolsSubscriptionListener\n ) => {\n listener(\n await resolveSubscriptionPayload(payload, {\n driver,\n schema,\n functions,\n admin,\n ...(deps.sql ? { sql: deps.sql } : {})\n })\n );\n };\n\n const handleInvalidation = async (scopes: Set<DevtoolsInvalidationScope>) => {\n for (const record of subscriptions.values()) {\n if (!intersects(scopes, record.scopes)) {\n continue;\n }\n await emit(record.payload, record.listener);\n }\n };\n\n return {\n async subscribe(subscriptionId, payload, listener) {\n if (payload.kind === \"fn.watch\") {\n const definition = functions[payload.functionName];\n if (!definition || definition.kind !== \"query\") {\n listener({\n kind: \"fn.watch.result\",\n error: `Unknown query function: ${payload.functionName}`\n });\n return;\n }\n const client = admin.createClient();\n const watch = client.watchQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args\n );\n const emitWatchResult = () => {\n const error = watch.localQueryError();\n listener({\n kind: \"fn.watch.result\",\n ...(error\n ? {\n error: error.message\n }\n : {\n result: watch.localQueryResult()\n })\n });\n };\n const unsubscribeUpdates = watch.onUpdate(emitWatchResult);\n subscriptions.set(subscriptionId, {\n payload,\n listener,\n unsubscribeRuntime: () => {\n unsubscribeUpdates();\n watch.dispose?.();\n },\n scopes: new Set<DevtoolsInvalidationScope>([\"all\"])\n });\n emitWatchResult();\n return;\n }\n\n const unsubscribeRuntime = admin.subscribeToDevtoolsInvalidations(\n (scopes) => {\n void handleInvalidation(scopes);\n }\n );\n const unsubscribeEvents = admin.subscribeToDevtoolsEvents((event) => {\n if (event.type === \"runtime.disconnected\") {\n void emit(payload, listener);\n }\n });\n subscriptions.set(subscriptionId, {\n payload,\n listener,\n unsubscribeRuntime: () => {\n unsubscribeRuntime();\n unsubscribeEvents();\n },\n scopes: scopesForSubscription(payload, deps.sql)\n });\n await emit(payload, listener);\n },\n unsubscribe(subscriptionId) {\n const record = subscriptions.get(subscriptionId);\n if (!record) {\n return;\n }\n record.unsubscribeRuntime();\n subscriptions.delete(subscriptionId);\n },\n dispose() {\n for (const [subscriptionId, record] of subscriptions) {\n record.unsubscribeRuntime();\n subscriptions.delete(subscriptionId);\n }\n }\n };\n}\n\nasync function resolveSubscriptionPayload(\n payload: SyncoreDevtoolsSubscriptionPayload,\n deps: DevtoolsCommandHandlerDeps\n): Promise<SyncoreDevtoolsSubscriptionResultPayload> {\n const { driver, schema, functions, admin } = deps;\n await admin.prepareForDirectAccess();\n\n switch (payload.kind) {\n case \"runtime.summary\":\n return {\n kind: \"runtime.summary.result\",\n summary: admin.getRuntimeSummary()\n };\n case \"runtime.activeQueries\":\n return {\n kind: \"runtime.activeQueries.result\",\n activeQueries: admin.getActiveQueryInfos()\n };\n case \"fn.watch\":\n throw new Error(\n \"Function watches are pushed incrementally and have no snapshot payload.\"\n );\n case \"schema.tables\": {\n const tables = await getSchemaTables(driver, schema);\n console.debug(\"[devtools] schema.tables\", {\n runtimeId: admin.getRuntimeId(),\n tables: tables.map((table) => ({\n name: table.name,\n documentCount: table.documentCount\n }))\n });\n return {\n kind: \"schema.tables.result\",\n tables\n };\n }\n case \"data.table\": {\n const result = await queryTable(\n driver,\n payload.table,\n payload.filters,\n payload.limit\n );\n console.debug(\"[devtools] data.table\", {\n runtimeId: admin.getRuntimeId(),\n table: payload.table,\n filters: payload.filters ?? [],\n limit: payload.limit,\n totalCount: result.totalCount,\n rowCount: result.rows.length,\n firstRow: result.rows[0] ?? null\n });\n return {\n kind: \"data.table.result\",\n rows: result.rows,\n totalCount: result.totalCount,\n ...(result.cursor ? { cursor: result.cursor } : {})\n };\n }\n case \"scheduler.jobs\":\n return {\n kind: \"scheduler.jobs.result\",\n jobs: await listSchedulerJobs(driver)\n };\n case \"functions.catalog\":\n return {\n kind: \"functions.catalog.result\",\n functions: listFunctions(functions)\n };\n case \"storage.list\": {\n const limit = normalizeStorageLimit(payload.limit);\n const offset = Math.max(payload.offset ?? 0, 0);\n try {\n const result = await admin.listStorageObjects({\n limit,\n offset,\n ...(payload.search ? { search: payload.search } : {})\n });\n return {\n kind: \"storage.list.result\",\n entries: result.entries,\n totalCount: result.totalCount,\n offset,\n hasMore: offset + result.entries.length < result.totalCount\n };\n } catch (error) {\n return {\n kind: \"storage.list.result\",\n entries: [],\n totalCount: 0,\n offset,\n hasMore: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n case \"sql.watch\": {\n const sqlSupport = requireDevtoolsSqlSupport(deps.sql);\n const databasePath = admin.getDriverDatabasePath();\n if (!databasePath) {\n throw new Error(\"SQL Live requires a file-backed database path.\");\n }\n const { columns, rows, observedTables } = sqlSupport.runReadonlyQuery(\n databasePath,\n payload.query\n );\n return {\n kind: \"sql.watch.result\",\n columns,\n rows,\n observedTables\n };\n }\n }\n}\n\nasync function queryTable(\n driver: SyncoreSqlDriver,\n table: string,\n filters?: Array<{\n field: string;\n operator: string;\n value: unknown;\n }>,\n limit?: number\n): Promise<{\n rows: Record<string, unknown>[];\n totalCount: number;\n cursor?: string;\n}> {\n let sql = `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(table)}`;\n const params: unknown[] = [];\n const whereClauses: string[] = [];\n\n if (filters && filters.length > 0) {\n for (const filter of filters) {\n whereClauses.push(filterToSql(filter));\n params.push(normalizeFilterValue(filter));\n }\n sql += ` WHERE ${whereClauses.join(\" AND \")}`;\n }\n\n sql += \" ORDER BY _creationTime DESC\";\n if (limit) {\n sql += ` LIMIT ${limit}`;\n }\n\n const rawRows = await driver.all<{\n _id: string;\n _creationTime: number;\n _json: string;\n }>(sql, params);\n const rows = rawRows.map((row) => ({\n _id: row._id,\n _creationTime: row._creationTime,\n ...(JSON.parse(row._json) as Record<string, unknown>)\n }));\n const countRow = await driver.get<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${quoteIdentifier(table)}${\n whereClauses.length > 0 ? ` WHERE ${whereClauses.join(\" AND \")}` : \"\"\n }`,\n params\n );\n\n return {\n rows,\n totalCount: countRow?.count ?? 0\n };\n}\n\nasync function queryReferenceOptions(\n driver: SyncoreSqlDriver,\n table: string,\n search: string | undefined,\n limit: number,\n offset: number\n): Promise<{\n rows: Record<string, unknown>[];\n totalCount: number;\n}> {\n let sql = `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(table)}`;\n const params: unknown[] = [];\n const trimmedSearch = search?.trim();\n const whereClause = trimmedSearch ? \" WHERE _id LIKE ? OR _json LIKE ?\" : \"\";\n if (trimmedSearch) {\n const like = `%${trimmedSearch}%`;\n params.push(like, like);\n }\n\n sql += `${whereClause} ORDER BY _creationTime DESC LIMIT ? OFFSET ?`;\n const rawRows = await driver.all<{\n _id: string;\n _creationTime: number;\n _json: string;\n }>(sql, [...params, limit, offset]);\n const rows = rawRows.map((row) => ({\n _id: row._id,\n _creationTime: row._creationTime,\n ...(JSON.parse(row._json) as Record<string, unknown>)\n }));\n const countRow = await driver.get<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${quoteIdentifier(table)}${whereClause}`,\n params\n );\n return {\n rows,\n totalCount: countRow?.count ?? 0\n };\n}\n\nasync function getSchemaTables(\n driver: SyncoreSqlDriver,\n schema: SyncoreDataModel\n): Promise<TableSchema[]> {\n return Promise.all(\n schema.tableNames().map(async (name) => {\n const table = schema.getTable(name) as TableDefinition<\n Validator<Record<string, unknown>, Record<string, unknown>, string>\n >;\n const validatorDesc = describeValidator(table.validator);\n const fields =\n validatorDesc.kind === \"object\"\n ? Object.entries(validatorDesc.shape).map(\n ([fieldName, fieldDesc]) => {\n const field = fieldDesc as {\n validator: { kind: string; tableName?: string };\n optional: boolean;\n };\n return {\n name: fieldName,\n type: field.validator.kind,\n optional: field.optional,\n ...(field.validator.kind === \"id\" && field.validator.tableName\n ? { referenceTable: field.validator.tableName }\n : {})\n };\n }\n )\n : [];\n\n fields.unshift(\n { name: \"_id\", type: \"string\", optional: false },\n { name: \"_creationTime\", type: \"number\", optional: false }\n );\n\n const documentCount = await driver\n .get<{ count: number }>(`SELECT COUNT(*) as count FROM \"${name}\"`)\n .then((countRow) => countRow?.count ?? 0)\n .catch(() => 0);\n\n return {\n name,\n ...(table.options.tableName\n ? { displayName: table.options.tableName }\n : {}),\n owner: table.options.componentPath\n ? (\"component\" as const)\n : (\"root\" as const),\n ...(table.options.componentPath\n ? { componentPath: table.options.componentPath }\n : {}),\n ...(table.options.componentName\n ? { componentName: table.options.componentName }\n : {}),\n fields,\n indexes: table.indexes.map((index) => ({\n name: index.name,\n fields: index.fields,\n unique: false\n })),\n documentCount\n };\n })\n );\n}\n\nasync function listSchedulerJobs(\n driver: SyncoreSqlDriver\n): Promise<SchedulerJob[]> {\n try {\n const rows = await driver.all<{\n id: string;\n function_name: string;\n args_json: string;\n status: string;\n run_at: number;\n created_at: number;\n updated_at: number;\n recurring_name: string | null;\n schedule_json: string | null;\n timezone: string | null;\n misfire_policy: string;\n last_run_at: number | null;\n window_ms: number | null;\n }>(`SELECT * FROM \"_scheduled_functions\" ORDER BY run_at DESC LIMIT 200`);\n\n return rows.map((row) => {\n const schedule = safeReadRecurringSchedule(row.schedule_json);\n const scheduleLabel = schedule\n ? formatScheduleLabel(schedule)\n : undefined;\n const functionComponent = parseCanonicalComponentFunctionName(\n row.function_name\n );\n const idComponent = parseComponentScopedIdentifier(row.id);\n return {\n id: row.id,\n functionName: row.function_name,\n owner:\n functionComponent || idComponent\n ? (\"component\" as const)\n : (\"root\" as const),\n ...(functionComponent\n ? {\n componentPath: functionComponent.componentPath\n }\n : idComponent\n ? {\n componentPath: idComponent.componentPath\n }\n : {}),\n args: JSON.parse(row.args_json) as Record<string, unknown>,\n scheduledAt: row.created_at,\n runAt: row.run_at,\n status: mapJobStatus(row.status),\n ...(row.status === \"completed\" || row.status === \"failed\"\n ? { completedAt: row.updated_at }\n : {}),\n ...(row.recurring_name ? { recurringName: row.recurring_name } : {}),\n ...(schedule ? { schedule } : {}),\n ...(scheduleLabel\n ? { scheduleLabel, cronSchedule: scheduleLabel }\n : {}),\n ...(row.timezone ? { timezone: row.timezone } : {}),\n ...(row.last_run_at !== null ? { lastRunAt: row.last_run_at } : {}),\n ...(row.updated_at ? { updatedAt: row.updated_at } : {}),\n misfirePolicy: readMisfirePolicy(row.misfire_policy, row.window_ms)\n };\n });\n } catch {\n return [];\n }\n}\n\nfunction listFunctions(\n functions: SyncoreRuntimeOptions<SyncoreDataModel>[\"functions\"]\n) {\n return Object.entries(functions)\n .filter(\n (entry): entry is [string, NonNullable<(typeof entry)[1]>] =>\n entry[1] !== undefined\n )\n .map(([name, fn]) => {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n const descriptor: {\n name: string;\n type: \"query\" | \"mutation\" | \"action\";\n file?: string;\n modulePath?: string;\n namespace?: string;\n metadataAvailable?: boolean;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n visibility?: \"public\" | \"internal\";\n localName?: string;\n args?: Record<string, unknown>;\n } = {\n name,\n type: fn.kind,\n owner: componentFunction ? \"component\" : \"root\",\n namespace: inferFunctionNamespace(name),\n metadataAvailable: componentFunction !== null || name.includes(\":\"),\n ...(componentFunction\n ? {\n file: `components/${componentFunction.componentPath}`,\n modulePath: componentFunction.componentPath,\n componentPath: componentFunction.componentPath,\n visibility: componentFunction.visibility,\n localName: componentFunction.localName\n }\n : inferFileFromFunctionName(name)\n ? {\n file: inferFileFromFunctionName(name),\n modulePath: inferFunctionNamespace(name)\n }\n : {})\n };\n const argsDesc = describeValidator(fn.argsValidator);\n if (argsDesc.kind === \"object\") {\n descriptor.args = argsDesc.shape as Record<string, unknown>;\n }\n return descriptor;\n });\n}\n\nfunction inferFileFromFunctionName(name: string): string {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n if (componentFunction) {\n return `components/${componentFunction.componentPath}`;\n }\n const parts = name.split(\":\");\n if (parts.length > 1) {\n return `${parts[0]}.ts`;\n }\n return \"\";\n}\n\nfunction inferFunctionNamespace(name: string): string {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n if (componentFunction) {\n return componentFunction.componentPath;\n }\n if (name.includes(\":\")) {\n return name.split(\":\")[0] ?? \"root\";\n }\n if (name.includes(\"/\")) {\n return name.split(\"/\")[0] ?? \"root\";\n }\n return \"root\";\n}\n\nfunction normalizeFilterValue(filter: {\n operator: string;\n value: unknown;\n}): unknown {\n const value = coerceFilterValue(filter.value);\n switch (filter.operator) {\n case \"contains\":\n return `%${String(value)}%`;\n case \"startsWith\":\n return `${String(value)}%`;\n default:\n return value;\n }\n}\n\nfunction filterToSql(filter: { field: string; operator: string }): string {\n const operator = filterOperatorToSql(filter.operator);\n if (filter.field === \"_id\") {\n return `_id ${operator} ?`;\n }\n if (filter.field === \"_creationTime\") {\n return `_creationTime ${operator} ?`;\n }\n return `json_extract(_json, ${JSON.stringify(`$.${filter.field}`)}) ${operator} ?`;\n}\n\nfunction coerceFilterValue(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n const trimmed = value.trim();\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (trimmed === \"null\") return null;\n if (/^-?\\d+(?:\\.\\d+)?$/.test(trimmed)) {\n const numberValue = Number(trimmed);\n if (Number.isFinite(numberValue)) {\n return numberValue;\n }\n }\n return value;\n}\n\nfunction filterOperatorToSql(operator: string): string {\n switch (operator) {\n case \"eq\":\n return \"=\";\n case \"neq\":\n return \"!=\";\n case \"gt\":\n return \">\";\n case \"gte\":\n return \">=\";\n case \"lt\":\n return \"<\";\n case \"lte\":\n return \"<=\";\n case \"contains\":\n case \"startsWith\":\n return \"LIKE\";\n default:\n return \"=\";\n }\n}\n\nfunction mapJobStatus(\n status: string\n): \"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\" {\n switch (status) {\n case \"scheduled\":\n return \"pending\";\n case \"completed\":\n return \"completed\";\n case \"failed\":\n return \"failed\";\n case \"cancelled\":\n case \"skipped\":\n return \"cancelled\";\n default:\n return \"pending\";\n }\n}\n\nfunction formatScheduleLabel(schedule: SchedulerRecurringSchedule): string {\n switch (schedule.type) {\n case \"interval\": {\n const parts: string[] = [];\n if (schedule.hours) {\n parts.push(`${schedule.hours}h`);\n }\n if (schedule.minutes) {\n parts.push(`${schedule.minutes}m`);\n }\n if (schedule.seconds) {\n parts.push(`${schedule.seconds}s`);\n }\n return parts.length > 0 ? `Every ${parts.join(\" \")}` : \"Recurring\";\n }\n case \"daily\":\n return `Daily ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : \"\"}`;\n case \"weekly\":\n return `Weekly ${capitalize(schedule.dayOfWeek)} ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : \"\"}`;\n default:\n return \"Recurring\";\n }\n}\n\nfunction readMisfirePolicy(\n type: string,\n windowMs: number | null\n): SchedulerMisfirePolicy {\n if (type === \"windowed\") {\n return {\n type,\n windowMs: windowMs ?? 0\n };\n }\n if (type === \"skip\" || type === \"run_once_if_missed\") {\n return { type };\n }\n return { type: \"catch_up\" };\n}\n\nfunction padNumber(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nfunction capitalize(value: string): string {\n return value.slice(0, 1).toUpperCase() + value.slice(1);\n}\n\nasync function runDevtoolsMutation<TResult>(\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>,\n callback: (ctx: {\n db: {\n insert(\n tableName: string,\n value: Record<string, unknown>\n ): Promise<string>;\n patch(\n tableName: string,\n id: string,\n value: Record<string, unknown>\n ): Promise<void>;\n delete(tableName: string, id: string): Promise<void>;\n };\n }) => Promise<TResult>,\n meta?: { origin?: \"dashboard\" }\n): Promise<TResult> {\n return admin.runDevtoolsMutation(callback as never, meta);\n}\n\nfunction notifyDataMutationScopes(\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>,\n tableName: string\n): void {\n admin.notifyDevtoolsScopes([\"schema.tables\", `table:${tableName}`]);\n}\n\nfunction normalizeStorageLimit(limit: number | undefined): number {\n return Math.min(Math.max(limit ?? 100, 1), 500);\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n const binaryChunkSize = 0x8000;\n let binary = \"\";\n for (let offset = 0; offset < bytes.length; offset += binaryChunkSize) {\n const chunk = bytes.slice(offset, offset + binaryChunkSize);\n binary += String.fromCharCode(...chunk);\n }\n if (typeof btoa === \"function\") {\n return btoa(binary);\n }\n const buffer = globalThis as typeof globalThis & {\n Buffer?: {\n from(input: Uint8Array): { toString(encoding: \"base64\"): string };\n };\n };\n if (buffer.Buffer) {\n return buffer.Buffer.from(bytes).toString(\"base64\");\n }\n throw new Error(\"Base64 encoding is not available in this environment.\");\n}\n\nfunction scopesForSubscription(\n payload: SyncoreDevtoolsSubscriptionPayload,\n sql?: DevtoolsSqlSupport\n): Set<DevtoolsInvalidationScope> {\n switch (payload.kind) {\n case \"runtime.summary\":\n return new Set([\"runtime.summary\"]);\n case \"runtime.activeQueries\":\n return new Set([\"runtime.activeQueries\"]);\n case \"fn.watch\":\n return new Set([\"all\"]);\n case \"schema.tables\":\n return new Set([\"schema.tables\"]);\n case \"data.table\":\n return new Set<DevtoolsInvalidationScope>([`table:${payload.table}`]);\n case \"scheduler.jobs\":\n return new Set([\"scheduler.jobs\"]);\n case \"functions.catalog\":\n return new Set([\"all\"]);\n case \"storage.list\":\n return new Set([\"storage.objects\"]);\n case \"sql.watch\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const analysis = sqlSupport.analyzeSqlStatement(payload.query);\n sqlSupport.ensureSqlMode(analysis, \"watch\");\n return new Set<DevtoolsInvalidationScope>(analysis.observedScopes);\n } catch {\n return new Set<DevtoolsInvalidationScope>([\"all\"]);\n }\n }\n default:\n return new Set<DevtoolsInvalidationScope>([\"all\"]);\n }\n}\n\nfunction intersects(\n a: Set<DevtoolsInvalidationScope>,\n b: Set<DevtoolsInvalidationScope>\n): boolean {\n if (a.has(\"all\") || b.has(\"all\")) {\n return true;\n }\n for (const value of a) {\n if (b.has(value)) {\n return true;\n }\n }\n return false;\n}\n\nfunction requireDevtoolsSqlSupport(\n sql?: DevtoolsSqlSupport\n): DevtoolsSqlSupport {\n if (!sql) {\n throw new Error(\"SQL Console is not available for this runtime.\");\n }\n return sql;\n}\n"],"mappings":"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"}