@probelabs/visor 0.1.176 → 0.1.177-ee

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 (75) hide show
  1. package/dist/frontends/slack-frontend.d.ts.map +1 -1
  2. package/dist/index.js +1964 -44
  3. package/dist/sdk/{a2a-frontend-W54ZZ32L.mjs → a2a-frontend-BPWLYLCG.mjs} +2 -2
  4. package/dist/sdk/{check-provider-registry-MJYNLB37.mjs → check-provider-registry-G64PWDCZ.mjs} +5 -5
  5. package/dist/sdk/{check-provider-registry-7HSDAKHQ.mjs → check-provider-registry-HW4QPPSA.mjs} +2 -2
  6. package/dist/sdk/{chunk-Y2DYDGGY.mjs → chunk-GVTWESYN.mjs} +3 -3
  7. package/dist/sdk/chunk-GVTWESYN.mjs.map +1 -0
  8. package/dist/sdk/{chunk-4E34HRCW.mjs → chunk-IYXOLUDJ.mjs} +74 -29
  9. package/dist/sdk/chunk-IYXOLUDJ.mjs.map +1 -0
  10. package/dist/sdk/{chunk-66PTDQAO.mjs → chunk-OHOBWVPP.mjs} +3 -3
  11. package/dist/sdk/{chunk-SEA2FWEC.mjs → chunk-OPI632LK.mjs} +2 -2
  12. package/dist/sdk/{chunk-OK4MLC3R.mjs → chunk-Y6PVSFCS.mjs} +49 -9
  13. package/dist/sdk/chunk-Y6PVSFCS.mjs.map +1 -0
  14. package/dist/sdk/{failure-condition-evaluator-RTT5SLVL.mjs → failure-condition-evaluator-HL33X7MH.mjs} +3 -3
  15. package/dist/sdk/{github-frontend-C4GG62PI.mjs → github-frontend-U2U42CKV.mjs} +3 -3
  16. package/dist/sdk/{host-6GGO2BQE.mjs → host-HFOJQIOF.mjs} +4 -4
  17. package/dist/sdk/knex-store-QCEW4I4R.mjs +527 -0
  18. package/dist/sdk/knex-store-QCEW4I4R.mjs.map +1 -0
  19. package/dist/sdk/loader-Q7K76ZIY.mjs +89 -0
  20. package/dist/sdk/loader-Q7K76ZIY.mjs.map +1 -0
  21. package/dist/sdk/opa-policy-engine-QCSSIMUF.mjs +655 -0
  22. package/dist/sdk/opa-policy-engine-QCSSIMUF.mjs.map +1 -0
  23. package/dist/sdk/{routing-DXVYOXAS.mjs → routing-SFP4D6O3.mjs} +4 -4
  24. package/dist/sdk/{schedule-tool-R7NSHTPJ.mjs → schedule-tool-45NAALKS.mjs} +2 -2
  25. package/dist/sdk/{schedule-tool-LL7XDILD.mjs → schedule-tool-7O7SWSJ4.mjs} +5 -5
  26. package/dist/sdk/{schedule-tool-handler-5GTQ6SFI.mjs → schedule-tool-handler-6MPP5DXK.mjs} +2 -2
  27. package/dist/sdk/{schedule-tool-handler-O3L2R5OJ.mjs → schedule-tool-handler-KYDXJ2ZL.mjs} +5 -5
  28. package/dist/sdk/sdk.js +1729 -295
  29. package/dist/sdk/sdk.js.map +1 -1
  30. package/dist/sdk/sdk.mjs +4 -4
  31. package/dist/sdk/slack-frontend-XKSIOUXB.mjs +910 -0
  32. package/dist/sdk/slack-frontend-XKSIOUXB.mjs.map +1 -0
  33. package/dist/sdk/{trace-helpers-CECHXDLI.mjs → trace-helpers-L3EOYW5P.mjs} +2 -2
  34. package/dist/sdk/validator-XTZJZZJH.mjs +134 -0
  35. package/dist/sdk/validator-XTZJZZJH.mjs.map +1 -0
  36. package/dist/sdk/{workflow-check-provider-EY6VSMNG.mjs → workflow-check-provider-JIXZJNV5.mjs} +5 -5
  37. package/dist/sdk/{workflow-check-provider-AX7IRQEZ.mjs → workflow-check-provider-OA33MESM.mjs} +2 -2
  38. package/dist/utils/workspace-manager.d.ts +5 -1
  39. package/dist/utils/workspace-manager.d.ts.map +1 -1
  40. package/dist/utils/worktree-manager.d.ts +5 -1
  41. package/dist/utils/worktree-manager.d.ts.map +1 -1
  42. package/package.json +2 -2
  43. package/dist/output/traces/run-2026-03-10T15-37-04-236Z.ndjson +0 -138
  44. package/dist/output/traces/run-2026-03-10T15-37-44-748Z.ndjson +0 -2296
  45. package/dist/sdk/check-provider-registry-VE6LQPLY.mjs +0 -30
  46. package/dist/sdk/chunk-4E34HRCW.mjs.map +0 -1
  47. package/dist/sdk/chunk-OK4MLC3R.mjs.map +0 -1
  48. package/dist/sdk/chunk-R3FNZRE4.mjs +0 -45194
  49. package/dist/sdk/chunk-R3FNZRE4.mjs.map +0 -1
  50. package/dist/sdk/chunk-Y2DYDGGY.mjs.map +0 -1
  51. package/dist/sdk/schedule-tool-GKKVOQB7.mjs +0 -36
  52. package/dist/sdk/schedule-tool-handler-ZZGJ3UFR.mjs +0 -40
  53. package/dist/sdk/trace-helpers-CECHXDLI.mjs.map +0 -1
  54. package/dist/sdk/workflow-check-provider-AX7IRQEZ.mjs.map +0 -1
  55. package/dist/sdk/workflow-check-provider-EY6VSMNG.mjs.map +0 -1
  56. package/dist/sdk/workflow-check-provider-HZQGJFOU.mjs +0 -30
  57. package/dist/sdk/workflow-check-provider-HZQGJFOU.mjs.map +0 -1
  58. package/dist/traces/run-2026-03-10T15-37-04-236Z.ndjson +0 -138
  59. package/dist/traces/run-2026-03-10T15-37-44-748Z.ndjson +0 -2296
  60. /package/dist/sdk/{a2a-frontend-W54ZZ32L.mjs.map → a2a-frontend-BPWLYLCG.mjs.map} +0 -0
  61. /package/dist/sdk/{check-provider-registry-7HSDAKHQ.mjs.map → check-provider-registry-G64PWDCZ.mjs.map} +0 -0
  62. /package/dist/sdk/{check-provider-registry-MJYNLB37.mjs.map → check-provider-registry-HW4QPPSA.mjs.map} +0 -0
  63. /package/dist/sdk/{chunk-66PTDQAO.mjs.map → chunk-OHOBWVPP.mjs.map} +0 -0
  64. /package/dist/sdk/{chunk-SEA2FWEC.mjs.map → chunk-OPI632LK.mjs.map} +0 -0
  65. /package/dist/sdk/{check-provider-registry-VE6LQPLY.mjs.map → failure-condition-evaluator-HL33X7MH.mjs.map} +0 -0
  66. /package/dist/sdk/{github-frontend-C4GG62PI.mjs.map → github-frontend-U2U42CKV.mjs.map} +0 -0
  67. /package/dist/sdk/{host-6GGO2BQE.mjs.map → host-HFOJQIOF.mjs.map} +0 -0
  68. /package/dist/sdk/{failure-condition-evaluator-RTT5SLVL.mjs.map → routing-SFP4D6O3.mjs.map} +0 -0
  69. /package/dist/sdk/{routing-DXVYOXAS.mjs.map → schedule-tool-45NAALKS.mjs.map} +0 -0
  70. /package/dist/sdk/{schedule-tool-GKKVOQB7.mjs.map → schedule-tool-7O7SWSJ4.mjs.map} +0 -0
  71. /package/dist/sdk/{schedule-tool-LL7XDILD.mjs.map → schedule-tool-handler-6MPP5DXK.mjs.map} +0 -0
  72. /package/dist/sdk/{schedule-tool-R7NSHTPJ.mjs.map → schedule-tool-handler-KYDXJ2ZL.mjs.map} +0 -0
  73. /package/dist/sdk/{schedule-tool-handler-5GTQ6SFI.mjs.map → trace-helpers-L3EOYW5P.mjs.map} +0 -0
  74. /package/dist/sdk/{schedule-tool-handler-O3L2R5OJ.mjs.map → workflow-check-provider-JIXZJNV5.mjs.map} +0 -0
  75. /package/dist/sdk/{schedule-tool-handler-ZZGJ3UFR.mjs.map → workflow-check-provider-OA33MESM.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/enterprise/scheduler/knex-store.ts"],"sourcesContent":["/**\n * Copyright (c) ProbeLabs. All rights reserved.\n * Licensed under the Elastic License 2.0; you may not use this file except\n * in compliance with the Elastic License 2.0.\n */\n\n/**\n * Knex-backed schedule store for PostgreSQL, MySQL, and MSSQL (Enterprise)\n *\n * Uses Knex query builder for database-agnostic SQL. Same schema as SQLite backend\n * but with real distributed locking via row-level claims (claimed_by/claimed_at/lock_token).\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../../logger';\nimport type { Schedule, ScheduleLimits } from '../../scheduler/schedule-store';\nimport type {\n ScheduleStoreBackend,\n ScheduleStoreStats,\n StorageConfig,\n HAConfig,\n ServerConnectionConfig,\n MessageTrigger,\n} from '../../scheduler/store/types';\n\n// Knex types — loaded dynamically to avoid ncc bundling\ntype Knex = import('knex').Knex;\n\n/**\n * Database row shape (snake_case)\n */\ninterface ScheduleRow {\n id: string;\n creator_id: string;\n creator_context: string | null;\n creator_name: string | null;\n timezone: string;\n schedule_expr: string;\n run_at: number | string | null;\n is_recurring: boolean | number;\n original_expression: string;\n workflow: string | null;\n workflow_inputs: string | null;\n output_context: string | null;\n status: string;\n created_at: number | string;\n last_run_at: number | string | null;\n next_run_at: number | string | null;\n run_count: number;\n failure_count: number;\n last_error: string | null;\n previous_response: string | null;\n}\n\nfunction toNum(val: number | string | null | undefined): number | undefined {\n if (val === null || val === undefined) return undefined;\n return typeof val === 'string' ? parseInt(val, 10) : val;\n}\n\nfunction safeJsonParse<T = unknown>(value: string | null): T | undefined {\n if (!value) return undefined;\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Database row shape for message_triggers (snake_case)\n */\ninterface MessageTriggerRow {\n id: string;\n creator_id: string;\n creator_context: string | null;\n creator_name: string | null;\n description: string | null;\n channels: string | null; // JSON array\n from_users: string | null; // JSON array\n from_bots: boolean | number;\n contains: string | null; // JSON array\n match_pattern: string | null;\n threads: string;\n workflow: string;\n inputs: string | null; // JSON\n output_context: string | null; // JSON\n status: string;\n enabled: boolean | number;\n created_at: number | string;\n}\n\nfunction fromTriggerRow(row: MessageTriggerRow): MessageTrigger {\n return {\n id: row.id,\n creatorId: row.creator_id,\n creatorContext: row.creator_context ?? undefined,\n creatorName: row.creator_name ?? undefined,\n description: row.description ?? undefined,\n channels: safeJsonParse<string[]>(row.channels),\n fromUsers: safeJsonParse<string[]>(row.from_users),\n fromBots: row.from_bots === true || row.from_bots === 1,\n contains: safeJsonParse<string[]>(row.contains),\n matchPattern: row.match_pattern ?? undefined,\n threads: row.threads as MessageTrigger['threads'],\n workflow: row.workflow,\n inputs: safeJsonParse<Record<string, unknown>>(row.inputs),\n outputContext: safeJsonParse<MessageTrigger['outputContext']>(row.output_context),\n status: row.status as MessageTrigger['status'],\n enabled: row.enabled === true || row.enabled === 1,\n createdAt: toNum(row.created_at)!,\n };\n}\n\nfunction toTriggerInsertRow(trigger: MessageTrigger): Record<string, unknown> {\n return {\n id: trigger.id,\n creator_id: trigger.creatorId,\n creator_context: trigger.creatorContext ?? null,\n creator_name: trigger.creatorName ?? null,\n description: trigger.description ?? null,\n channels: trigger.channels ? JSON.stringify(trigger.channels) : null,\n from_users: trigger.fromUsers ? JSON.stringify(trigger.fromUsers) : null,\n from_bots: trigger.fromBots,\n contains: trigger.contains ? JSON.stringify(trigger.contains) : null,\n match_pattern: trigger.matchPattern ?? null,\n threads: trigger.threads,\n workflow: trigger.workflow,\n inputs: trigger.inputs ? JSON.stringify(trigger.inputs) : null,\n output_context: trigger.outputContext ? JSON.stringify(trigger.outputContext) : null,\n status: trigger.status,\n enabled: trigger.enabled,\n created_at: trigger.createdAt,\n };\n}\n\nfunction fromDbRow(row: ScheduleRow): Schedule {\n return {\n id: row.id,\n creatorId: row.creator_id,\n creatorContext: row.creator_context ?? undefined,\n creatorName: row.creator_name ?? undefined,\n timezone: row.timezone,\n schedule: row.schedule_expr,\n runAt: toNum(row.run_at),\n isRecurring: row.is_recurring === true || row.is_recurring === 1,\n originalExpression: row.original_expression,\n workflow: row.workflow ?? undefined,\n workflowInputs: safeJsonParse(row.workflow_inputs),\n outputContext: safeJsonParse(row.output_context),\n status: row.status as Schedule['status'],\n createdAt: toNum(row.created_at)!,\n lastRunAt: toNum(row.last_run_at),\n nextRunAt: toNum(row.next_run_at),\n runCount: row.run_count,\n failureCount: row.failure_count,\n lastError: row.last_error ?? undefined,\n previousResponse: row.previous_response ?? undefined,\n };\n}\n\nfunction toInsertRow(schedule: Schedule): Record<string, unknown> {\n return {\n id: schedule.id,\n creator_id: schedule.creatorId,\n creator_context: schedule.creatorContext ?? null,\n creator_name: schedule.creatorName ?? null,\n timezone: schedule.timezone,\n schedule_expr: schedule.schedule,\n run_at: schedule.runAt ?? null,\n is_recurring: schedule.isRecurring,\n original_expression: schedule.originalExpression,\n workflow: schedule.workflow ?? null,\n workflow_inputs: schedule.workflowInputs ? JSON.stringify(schedule.workflowInputs) : null,\n output_context: schedule.outputContext ? JSON.stringify(schedule.outputContext) : null,\n status: schedule.status,\n created_at: schedule.createdAt,\n last_run_at: schedule.lastRunAt ?? null,\n next_run_at: schedule.nextRunAt ?? null,\n run_count: schedule.runCount,\n failure_count: schedule.failureCount,\n last_error: schedule.lastError ?? null,\n previous_response: schedule.previousResponse ?? null,\n };\n}\n\n/**\n * Enterprise Knex-backed store for PostgreSQL, MySQL, and MSSQL\n */\nexport class KnexStoreBackend implements ScheduleStoreBackend {\n private knex: Knex | null = null;\n private driver: 'postgresql' | 'mysql' | 'mssql';\n private connection: ServerConnectionConfig;\n\n constructor(\n driver: 'postgresql' | 'mysql' | 'mssql',\n storageConfig: StorageConfig,\n _haConfig?: HAConfig\n ) {\n this.driver = driver;\n this.connection = (storageConfig.connection || {}) as ServerConnectionConfig;\n }\n\n async initialize(): Promise<void> {\n // Load knex dynamically\n const { createRequire } = require('module') as typeof import('module');\n const runtimeRequire = createRequire(__filename);\n let knexFactory: typeof import('knex').default;\n try {\n knexFactory = runtimeRequire('knex');\n } catch (err: unknown) {\n const code = (err as { code?: string })?.code;\n if (code === 'MODULE_NOT_FOUND' || code === 'ERR_MODULE_NOT_FOUND') {\n throw new Error(\n 'knex is required for PostgreSQL/MySQL/MSSQL schedule storage. ' +\n 'Install it with: npm install knex'\n );\n }\n throw err;\n }\n\n const clientMap: Record<string, string> = {\n postgresql: 'pg',\n mysql: 'mysql2',\n mssql: 'tedious',\n };\n const client = clientMap[this.driver];\n\n // Build connection config\n let connection: string | Record<string, unknown>;\n if (this.connection.connection_string) {\n connection = this.connection.connection_string;\n } else if (this.driver === 'mssql') {\n connection = this.buildMssqlConnection();\n } else {\n connection = this.buildStandardConnection();\n }\n\n this.knex = knexFactory({\n client,\n connection,\n pool: {\n min: this.connection.pool?.min ?? 0,\n max: this.connection.pool?.max ?? 10,\n },\n });\n\n // Run schema migration\n await this.migrateSchema();\n\n logger.info(`[KnexStore] Initialized (${this.driver})`);\n }\n\n private buildStandardConnection(): Record<string, unknown> {\n return {\n host: this.connection.host || 'localhost',\n port: this.connection.port,\n database: this.connection.database || 'visor',\n user: this.connection.user,\n password: this.connection.password,\n ssl: this.resolveSslConfig(),\n };\n }\n\n private buildMssqlConnection(): Record<string, unknown> {\n const ssl = this.connection.ssl;\n const sslEnabled = ssl === true || (typeof ssl === 'object' && ssl.enabled !== false);\n\n return {\n server: this.connection.host || 'localhost',\n port: this.connection.port,\n database: this.connection.database || 'visor',\n user: this.connection.user,\n password: this.connection.password,\n options: {\n encrypt: sslEnabled,\n trustServerCertificate:\n typeof ssl === 'object' ? ssl.reject_unauthorized === false : !sslEnabled,\n },\n };\n }\n\n private resolveSslConfig(): boolean | Record<string, unknown> {\n const ssl = this.connection.ssl;\n if (ssl === false || ssl === undefined) return false;\n if (ssl === true) return { rejectUnauthorized: true };\n\n // Object config\n if (ssl.enabled === false) return false;\n\n const result: Record<string, unknown> = {\n rejectUnauthorized: ssl.reject_unauthorized !== false,\n };\n\n if (ssl.ca) {\n const caPath = this.validateSslPath(ssl.ca, 'CA certificate');\n result.ca = fs.readFileSync(caPath, 'utf8');\n }\n if (ssl.cert) {\n const certPath = this.validateSslPath(ssl.cert, 'client certificate');\n result.cert = fs.readFileSync(certPath, 'utf8');\n }\n if (ssl.key) {\n const keyPath = this.validateSslPath(ssl.key, 'client key');\n result.key = fs.readFileSync(keyPath, 'utf8');\n }\n\n return result;\n }\n\n private validateSslPath(filePath: string, label: string): string {\n const resolved = path.resolve(filePath);\n if (resolved !== path.normalize(resolved)) {\n throw new Error(`SSL ${label} path contains invalid sequences: ${filePath}`);\n }\n if (!fs.existsSync(resolved)) {\n throw new Error(`SSL ${label} not found: ${filePath}`);\n }\n return resolved;\n }\n\n async shutdown(): Promise<void> {\n if (this.knex) {\n await this.knex.destroy();\n this.knex = null;\n }\n }\n\n private async migrateSchema(): Promise<void> {\n const knex = this.getKnex();\n\n const exists = await knex.schema.hasTable('schedules');\n if (!exists) {\n await knex.schema.createTable('schedules', table => {\n table.string('id', 36).primary();\n table.string('creator_id', 255).notNullable().index();\n table.string('creator_context', 255);\n table.string('creator_name', 255);\n table.string('timezone', 64).notNullable().defaultTo('UTC');\n table.string('schedule_expr', 255);\n table.bigInteger('run_at');\n table.boolean('is_recurring').notNullable();\n table.text('original_expression');\n table.string('workflow', 255);\n table.text('workflow_inputs');\n table.text('output_context');\n table.string('status', 20).notNullable().index();\n table.bigInteger('created_at').notNullable();\n table.bigInteger('last_run_at');\n table.bigInteger('next_run_at');\n table.integer('run_count').notNullable().defaultTo(0);\n table.integer('failure_count').notNullable().defaultTo(0);\n table.text('last_error');\n table.text('previous_response');\n\n table.index(['status', 'next_run_at']);\n });\n }\n\n // Create message_triggers table\n const triggersExist = await knex.schema.hasTable('message_triggers');\n if (!triggersExist) {\n await knex.schema.createTable('message_triggers', table => {\n table.string('id', 36).primary();\n table.string('creator_id', 255).notNullable().index();\n table.string('creator_context', 255);\n table.string('creator_name', 255);\n table.text('description');\n table.text('channels'); // JSON array\n table.text('from_users'); // JSON array\n table.boolean('from_bots').notNullable().defaultTo(false);\n table.text('contains'); // JSON array\n table.text('match_pattern');\n table.string('threads', 20).notNullable().defaultTo('any');\n table.string('workflow', 255).notNullable();\n table.text('inputs'); // JSON\n table.text('output_context'); // JSON\n table.string('status', 20).notNullable().defaultTo('active').index();\n table.boolean('enabled').notNullable().defaultTo(true);\n table.bigInteger('created_at').notNullable();\n });\n }\n\n // Create scheduler_locks table for distributed locking\n const locksExist = await knex.schema.hasTable('scheduler_locks');\n if (!locksExist) {\n await knex.schema.createTable('scheduler_locks', table => {\n table.string('lock_id', 255).primary();\n table.string('node_id', 255).notNullable();\n table.string('lock_token', 36).notNullable();\n table.bigInteger('acquired_at').notNullable();\n table.bigInteger('expires_at').notNullable();\n });\n }\n }\n\n private getKnex(): Knex {\n if (!this.knex) {\n throw new Error('[KnexStore] Not initialized. Call initialize() first.');\n }\n return this.knex;\n }\n\n // --- CRUD ---\n\n async create(\n schedule: Omit<Schedule, 'id' | 'createdAt' | 'runCount' | 'failureCount' | 'status'>\n ): Promise<Schedule> {\n const knex = this.getKnex();\n\n const newSchedule: Schedule = {\n ...schedule,\n id: uuidv4(),\n createdAt: Date.now(),\n runCount: 0,\n failureCount: 0,\n status: 'active',\n };\n\n await knex('schedules').insert(toInsertRow(newSchedule));\n\n logger.info(`[KnexStore] Created schedule ${newSchedule.id} for user ${newSchedule.creatorId}`);\n return newSchedule;\n }\n\n async importSchedule(schedule: Schedule): Promise<void> {\n const knex = this.getKnex();\n const existing = await knex('schedules').where('id', schedule.id).first();\n if (existing) return; // Already imported (idempotent)\n await knex('schedules').insert(toInsertRow(schedule));\n }\n\n async get(id: string): Promise<Schedule | undefined> {\n const knex = this.getKnex();\n const row = await knex('schedules').where('id', id).first();\n return row ? fromDbRow(row as ScheduleRow) : undefined;\n }\n\n async update(id: string, patch: Partial<Schedule>): Promise<Schedule | undefined> {\n const knex = this.getKnex();\n\n const existing = await knex('schedules').where('id', id).first();\n if (!existing) return undefined;\n\n const current = fromDbRow(existing as ScheduleRow);\n const updated: Schedule = { ...current, ...patch, id: current.id };\n const row = toInsertRow(updated);\n // Remove id from update (PK cannot change)\n delete (row as Record<string, unknown>).id;\n\n await knex('schedules').where('id', id).update(row);\n return updated;\n }\n\n async delete(id: string): Promise<boolean> {\n const knex = this.getKnex();\n const deleted = await knex('schedules').where('id', id).del();\n if (deleted > 0) {\n logger.info(`[KnexStore] Deleted schedule ${id}`);\n return true;\n }\n return false;\n }\n\n // --- Queries ---\n\n async getByCreator(creatorId: string): Promise<Schedule[]> {\n const knex = this.getKnex();\n const rows = await knex('schedules').where('creator_id', creatorId);\n return rows.map((r: ScheduleRow) => fromDbRow(r));\n }\n\n async getActiveSchedules(): Promise<Schedule[]> {\n const knex = this.getKnex();\n const rows = await knex('schedules').where('status', 'active');\n return rows.map((r: ScheduleRow) => fromDbRow(r));\n }\n\n async getDueSchedules(now?: number): Promise<Schedule[]> {\n const ts = now ?? Date.now();\n const knex = this.getKnex();\n // MSSQL uses 1/0 for booleans\n const bFalse = this.driver === 'mssql' ? 0 : false;\n const bTrue = this.driver === 'mssql' ? 1 : true;\n const rows = await knex('schedules')\n .where('status', 'active')\n .andWhere(function () {\n this.where(function () {\n this.where('is_recurring', bFalse as unknown as boolean)\n .whereNotNull('run_at')\n .where('run_at', '<=', ts);\n }).orWhere(function () {\n this.where('is_recurring', bTrue as unknown as boolean)\n .whereNotNull('next_run_at')\n .where('next_run_at', '<=', ts);\n });\n });\n return rows.map((r: ScheduleRow) => fromDbRow(r));\n }\n\n async findByWorkflow(creatorId: string, workflowName: string): Promise<Schedule[]> {\n const knex = this.getKnex();\n const escaped = workflowName.toLowerCase().replace(/[%_\\\\]/g, '\\\\$&');\n const pattern = `%${escaped}%`;\n const rows = await knex('schedules')\n .where('creator_id', creatorId)\n .where('status', 'active')\n .whereRaw(\"LOWER(workflow) LIKE ? ESCAPE '\\\\'\", [pattern]);\n return rows.map((r: ScheduleRow) => fromDbRow(r));\n }\n\n async getAll(): Promise<Schedule[]> {\n const knex = this.getKnex();\n const rows = await knex('schedules');\n return rows.map((r: ScheduleRow) => fromDbRow(r));\n }\n\n async getStats(): Promise<ScheduleStoreStats> {\n const knex = this.getKnex();\n // MSSQL uses 1/0 for booleans; PostgreSQL/MySQL accept both true/1\n const boolTrue = this.driver === 'mssql' ? '1' : 'true';\n const boolFalse = this.driver === 'mssql' ? '0' : 'false';\n const result = await knex('schedules')\n .select(\n knex.raw('COUNT(*) as total'),\n knex.raw(\"SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active\"),\n knex.raw(\"SUM(CASE WHEN status = 'paused' THEN 1 ELSE 0 END) as paused\"),\n knex.raw(\"SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed\"),\n knex.raw(\"SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed\"),\n knex.raw(`SUM(CASE WHEN is_recurring = ${boolTrue} THEN 1 ELSE 0 END) as recurring`),\n knex.raw(`SUM(CASE WHEN is_recurring = ${boolFalse} THEN 1 ELSE 0 END) as one_time`)\n )\n .first();\n\n return {\n total: Number(result.total) || 0,\n active: Number(result.active) || 0,\n paused: Number(result.paused) || 0,\n completed: Number(result.completed) || 0,\n failed: Number(result.failed) || 0,\n recurring: Number(result.recurring) || 0,\n oneTime: Number(result.one_time) || 0,\n };\n }\n\n async validateLimits(\n creatorId: string,\n isRecurring: boolean,\n limits: ScheduleLimits\n ): Promise<void> {\n const knex = this.getKnex();\n\n if (limits.maxGlobal) {\n const result = await knex('schedules').count('* as cnt').first();\n if (Number(result?.cnt) >= limits.maxGlobal) {\n throw new Error(`Global schedule limit reached (${limits.maxGlobal})`);\n }\n }\n\n if (limits.maxPerUser) {\n const result = await knex('schedules')\n .where('creator_id', creatorId)\n .count('* as cnt')\n .first();\n if (Number(result?.cnt) >= limits.maxPerUser) {\n throw new Error(`You have reached the maximum number of schedules (${limits.maxPerUser})`);\n }\n }\n\n if (isRecurring && limits.maxRecurringPerUser) {\n const bTrue = this.driver === 'mssql' ? 1 : true;\n const result = await knex('schedules')\n .where('creator_id', creatorId)\n .where('is_recurring', bTrue as unknown as boolean)\n .count('* as cnt')\n .first();\n if (Number(result?.cnt) >= limits.maxRecurringPerUser) {\n throw new Error(\n `You have reached the maximum number of recurring schedules (${limits.maxRecurringPerUser})`\n );\n }\n }\n }\n\n // --- HA Distributed Locking (via scheduler_locks table) ---\n\n async tryAcquireLock(lockId: string, nodeId: string, ttlSeconds: number): Promise<string | null> {\n const knex = this.getKnex();\n const now = Date.now();\n const expiresAt = now + ttlSeconds * 1000;\n const token = uuidv4();\n\n // Step 1: Try to claim an existing expired lock\n const updated = await knex('scheduler_locks')\n .where('lock_id', lockId)\n .where('expires_at', '<', now)\n .update({\n node_id: nodeId,\n lock_token: token,\n acquired_at: now,\n expires_at: expiresAt,\n });\n\n if (updated > 0) return token;\n\n // Step 2: Try to INSERT a new lock row\n try {\n await knex('scheduler_locks').insert({\n lock_id: lockId,\n node_id: nodeId,\n lock_token: token,\n acquired_at: now,\n expires_at: expiresAt,\n });\n return token;\n } catch {\n // Unique constraint violation — another node holds the lock\n return null;\n }\n }\n\n async releaseLock(lockId: string, lockToken: string): Promise<void> {\n const knex = this.getKnex();\n await knex('scheduler_locks').where('lock_id', lockId).where('lock_token', lockToken).del();\n }\n\n async renewLock(lockId: string, lockToken: string, ttlSeconds: number): Promise<boolean> {\n const knex = this.getKnex();\n const now = Date.now();\n const expiresAt = now + ttlSeconds * 1000;\n\n const updated = await knex('scheduler_locks')\n .where('lock_id', lockId)\n .where('lock_token', lockToken)\n .update({ acquired_at: now, expires_at: expiresAt });\n\n return updated > 0;\n }\n\n async flush(): Promise<void> {\n // No-op for server-based backends\n }\n\n // --- Message Trigger CRUD ---\n\n async createTrigger(trigger: Omit<MessageTrigger, 'id' | 'createdAt'>): Promise<MessageTrigger> {\n const knex = this.getKnex();\n const newTrigger: MessageTrigger = {\n ...trigger,\n id: uuidv4(),\n createdAt: Date.now(),\n };\n await knex('message_triggers').insert(toTriggerInsertRow(newTrigger));\n logger.info(`[KnexStore] Created trigger ${newTrigger.id} for user ${newTrigger.creatorId}`);\n return newTrigger;\n }\n\n async getTrigger(id: string): Promise<MessageTrigger | undefined> {\n const knex = this.getKnex();\n const row = await knex('message_triggers').where('id', id).first();\n return row ? fromTriggerRow(row as MessageTriggerRow) : undefined;\n }\n\n async updateTrigger(\n id: string,\n patch: Partial<MessageTrigger>\n ): Promise<MessageTrigger | undefined> {\n const knex = this.getKnex();\n const existing = await knex('message_triggers').where('id', id).first();\n if (!existing) return undefined;\n\n const current = fromTriggerRow(existing as MessageTriggerRow);\n const updated: MessageTrigger = {\n ...current,\n ...patch,\n id: current.id,\n createdAt: current.createdAt,\n };\n const row = toTriggerInsertRow(updated);\n delete (row as Record<string, unknown>).id;\n\n await knex('message_triggers').where('id', id).update(row);\n return updated;\n }\n\n async deleteTrigger(id: string): Promise<boolean> {\n const knex = this.getKnex();\n const deleted = await knex('message_triggers').where('id', id).del();\n if (deleted > 0) {\n logger.info(`[KnexStore] Deleted trigger ${id}`);\n return true;\n }\n return false;\n }\n\n async getTriggersByCreator(creatorId: string): Promise<MessageTrigger[]> {\n const knex = this.getKnex();\n const rows = await knex('message_triggers').where('creator_id', creatorId);\n return rows.map((r: MessageTriggerRow) => fromTriggerRow(r));\n }\n\n async getActiveTriggers(): Promise<MessageTrigger[]> {\n const knex = this.getKnex();\n const rows = await knex('message_triggers')\n .where('status', 'active')\n .where('enabled', this.driver === 'mssql' ? 1 : true);\n return rows.map((r: MessageTriggerRow) => fromTriggerRow(r));\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,89 @@
1
+ import {
2
+ init_logger,
3
+ logger_exports
4
+ } from "./chunk-FT3I25QV.mjs";
5
+ import "./chunk-UCMJJ3IM.mjs";
6
+ import {
7
+ __esm,
8
+ __toCommonJS
9
+ } from "./chunk-J7LXIPZS.mjs";
10
+
11
+ // src/policy/default-engine.ts
12
+ var DefaultPolicyEngine;
13
+ var init_default_engine = __esm({
14
+ "src/policy/default-engine.ts"() {
15
+ "use strict";
16
+ DefaultPolicyEngine = class {
17
+ async initialize(_config) {
18
+ }
19
+ async evaluateCheckExecution(_checkId, _checkConfig) {
20
+ return { allowed: true };
21
+ }
22
+ async evaluateToolInvocation(_serverName, _methodName, _transport) {
23
+ return { allowed: true };
24
+ }
25
+ async evaluateCapabilities(_checkId, _capabilities) {
26
+ return { allowed: true };
27
+ }
28
+ async shutdown() {
29
+ }
30
+ };
31
+ }
32
+ });
33
+
34
+ // src/enterprise/loader.ts
35
+ async function loadEnterprisePolicyEngine(config) {
36
+ try {
37
+ const { LicenseValidator } = await import("./validator-XTZJZZJH.mjs");
38
+ const validator = new LicenseValidator();
39
+ const license = await validator.loadAndValidate();
40
+ if (!license || !validator.hasFeature("policy")) {
41
+ return new DefaultPolicyEngine();
42
+ }
43
+ if (validator.isInGracePeriod()) {
44
+ console.warn(
45
+ "[visor:enterprise] License has expired but is within the 72-hour grace period. Please renew your license."
46
+ );
47
+ }
48
+ const { OpaPolicyEngine } = await import("./opa-policy-engine-QCSSIMUF.mjs");
49
+ const engine = new OpaPolicyEngine(config);
50
+ await engine.initialize(config);
51
+ return engine;
52
+ } catch (err) {
53
+ const msg = err instanceof Error ? err.message : String(err);
54
+ try {
55
+ const { logger } = (init_logger(), __toCommonJS(logger_exports));
56
+ logger.warn(`[PolicyEngine] Enterprise policy init failed, falling back to default: ${msg}`);
57
+ } catch {
58
+ }
59
+ return new DefaultPolicyEngine();
60
+ }
61
+ }
62
+ async function loadEnterpriseStoreBackend(driver, storageConfig, haConfig) {
63
+ const { LicenseValidator } = await import("./validator-XTZJZZJH.mjs");
64
+ const validator = new LicenseValidator();
65
+ const license = await validator.loadAndValidate();
66
+ if (!license || !validator.hasFeature("scheduler-sql")) {
67
+ throw new Error(
68
+ `The ${driver} schedule storage driver requires a Visor Enterprise license with the 'scheduler-sql' feature. Please upgrade or use driver: 'sqlite' (default).`
69
+ );
70
+ }
71
+ if (validator.isInGracePeriod()) {
72
+ console.warn(
73
+ "[visor:enterprise] License has expired but is within the 72-hour grace period. Please renew your license."
74
+ );
75
+ }
76
+ const { KnexStoreBackend } = await import("./knex-store-QCEW4I4R.mjs");
77
+ return new KnexStoreBackend(driver, storageConfig, haConfig);
78
+ }
79
+ var init_loader = __esm({
80
+ "src/enterprise/loader.ts"() {
81
+ init_default_engine();
82
+ }
83
+ });
84
+ init_loader();
85
+ export {
86
+ loadEnterprisePolicyEngine,
87
+ loadEnterpriseStoreBackend
88
+ };
89
+ //# sourceMappingURL=loader-Q7K76ZIY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/policy/default-engine.ts","../../src/enterprise/loader.ts"],"sourcesContent":["import { PolicyEngine, PolicyConfig, PolicyDecision } from './types';\n\n/**\n * Default (no-op) policy engine — always allows everything.\n * Used when no enterprise license is present or policy is disabled.\n */\nexport class DefaultPolicyEngine implements PolicyEngine {\n async initialize(_config: PolicyConfig): Promise<void> {}\n\n async evaluateCheckExecution(_checkId: string, _checkConfig: unknown): Promise<PolicyDecision> {\n return { allowed: true };\n }\n\n async evaluateToolInvocation(\n _serverName: string,\n _methodName: string,\n _transport?: string\n ): Promise<PolicyDecision> {\n return { allowed: true };\n }\n\n async evaluateCapabilities(\n _checkId: string,\n _capabilities: {\n allowEdit?: boolean;\n allowBash?: boolean;\n allowedTools?: string[];\n }\n ): Promise<PolicyDecision> {\n return { allowed: true };\n }\n\n async shutdown(): Promise<void> {}\n}\n","/**\n * Copyright (c) ProbeLabs. All rights reserved.\n * Licensed under the Elastic License 2.0; you may not use this file except\n * in compliance with the Elastic License 2.0.\n */\n\nimport type { PolicyEngine, PolicyConfig } from '../policy/types';\nimport { DefaultPolicyEngine } from '../policy/default-engine';\nimport type { ScheduleStoreBackend, StorageConfig, HAConfig } from '../scheduler/store/types';\n\n/**\n * Load the enterprise policy engine if licensed, otherwise return the default no-op engine.\n *\n * This is the sole import boundary between OSS and enterprise code. Core code\n * must only import from this module (via dynamic `await import()`), never from\n * individual enterprise submodules.\n */\nexport async function loadEnterprisePolicyEngine(config: PolicyConfig): Promise<PolicyEngine> {\n try {\n const { LicenseValidator } = await import('./license/validator');\n const validator = new LicenseValidator();\n const license = await validator.loadAndValidate();\n\n if (!license || !validator.hasFeature('policy')) {\n return new DefaultPolicyEngine();\n }\n\n if (validator.isInGracePeriod()) {\n // eslint-disable-next-line no-console\n console.warn(\n '[visor:enterprise] License has expired but is within the 72-hour grace period. ' +\n 'Please renew your license.'\n );\n }\n\n const { OpaPolicyEngine } = await import('./policy/opa-policy-engine');\n const engine = new OpaPolicyEngine(config);\n await engine.initialize(config);\n return engine;\n } catch (err) {\n // Enterprise code not available or initialization failed\n const msg = err instanceof Error ? err.message : String(err);\n try {\n const { logger } = require('../logger');\n logger.warn(`[PolicyEngine] Enterprise policy init failed, falling back to default: ${msg}`);\n } catch {\n // silent\n }\n return new DefaultPolicyEngine();\n }\n}\n\n/**\n * Load the enterprise schedule store backend if licensed.\n *\n * @param driver Database driver ('postgresql', 'mysql', or 'mssql')\n * @param storageConfig Storage configuration with connection details\n * @param haConfig Optional HA configuration\n * @throws Error if enterprise license is not available or missing 'scheduler-sql' feature\n */\nexport async function loadEnterpriseStoreBackend(\n driver: 'postgresql' | 'mysql' | 'mssql',\n storageConfig: StorageConfig,\n haConfig?: HAConfig\n): Promise<ScheduleStoreBackend> {\n const { LicenseValidator } = await import('./license/validator');\n const validator = new LicenseValidator();\n const license = await validator.loadAndValidate();\n\n if (!license || !validator.hasFeature('scheduler-sql')) {\n throw new Error(\n `The ${driver} schedule storage driver requires a Visor Enterprise license ` +\n `with the 'scheduler-sql' feature. Please upgrade or use driver: 'sqlite' (default).`\n );\n }\n\n if (validator.isInGracePeriod()) {\n // eslint-disable-next-line no-console\n console.warn(\n '[visor:enterprise] License has expired but is within the 72-hour grace period. ' +\n 'Please renew your license.'\n );\n }\n\n const { KnexStoreBackend } = await import('./scheduler/knex-store');\n return new KnexStoreBackend(driver, storageConfig, haConfig);\n}\n"],"mappings":";;;;;;;;;;;AAAA,IAMa;AANb;AAAA;AAAA;AAMO,IAAM,sBAAN,MAAkD;AAAA,MACvD,MAAM,WAAW,SAAsC;AAAA,MAAC;AAAA,MAExD,MAAM,uBAAuB,UAAkB,cAAgD;AAC7F,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB;AAAA,MAEA,MAAM,uBACJ,aACA,aACA,YACyB;AACzB,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB;AAAA,MAEA,MAAM,qBACJ,UACA,eAKyB;AACzB,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB;AAAA,MAEA,MAAM,WAA0B;AAAA,MAAC;AAAA,IACnC;AAAA;AAAA;;;AChBA,eAAsB,2BAA2B,QAA6C;AAC5F,MAAI;AACF,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,0BAAqB;AAC/D,UAAM,YAAY,IAAI,iBAAiB;AACvC,UAAM,UAAU,MAAM,UAAU,gBAAgB;AAEhD,QAAI,CAAC,WAAW,CAAC,UAAU,WAAW,QAAQ,GAAG;AAC/C,aAAO,IAAI,oBAAoB;AAAA,IACjC;AAEA,QAAI,UAAU,gBAAgB,GAAG;AAE/B,cAAQ;AAAA,QACN;AAAA,MAEF;AAAA,IACF;AAEA,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,kCAA4B;AACrE,UAAM,SAAS,IAAI,gBAAgB,MAAM;AACzC,UAAM,OAAO,WAAW,MAAM;AAC9B,WAAO;AAAA,EACT,SAAS,KAAK;AAEZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,QAAI;AACF,YAAM,EAAE,OAAO,IAAI;AACnB,aAAO,KAAK,0EAA0E,GAAG,EAAE;AAAA,IAC7F,QAAQ;AAAA,IAER;AACA,WAAO,IAAI,oBAAoB;AAAA,EACjC;AACF;AAUA,eAAsB,2BACpB,QACA,eACA,UAC+B;AAC/B,QAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,0BAAqB;AAC/D,QAAM,YAAY,IAAI,iBAAiB;AACvC,QAAM,UAAU,MAAM,UAAU,gBAAgB;AAEhD,MAAI,CAAC,WAAW,CAAC,UAAU,WAAW,eAAe,GAAG;AACtD,UAAM,IAAI;AAAA,MACR,OAAO,MAAM;AAAA,IAEf;AAAA,EACF;AAEA,MAAI,UAAU,gBAAgB,GAAG;AAE/B,YAAQ;AAAA,MACN;AAAA,IAEF;AAAA,EACF;AAEA,QAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,2BAAwB;AAClE,SAAO,IAAI,iBAAiB,QAAQ,eAAe,QAAQ;AAC7D;AAtFA;AAAA;AAOA;AAAA;AAAA;","names":[]}