@databricks/appkit 0.55.0 → 0.55.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md CHANGED
@@ -186,7 +186,6 @@ npx @databricks/appkit docs <query>
186
186
  - [Type Alias: FilePolicy()](./docs/api/appkit/TypeAlias.FilePolicy.md): A policy function that decides whether user may perform action on
187
187
  - [Type Alias: HostedTool](./docs/api/appkit/TypeAlias.HostedTool.md)
188
188
  - [Type Alias: IAppRouter](./docs/api/appkit/TypeAlias.IAppRouter.md): Express router type for plugin route registration
189
- - [Type Alias: JobHandle](./docs/api/appkit/TypeAlias.JobHandle.md): Job handle returned by appkit.jobs("etl").
190
189
  - [Type Alias: JobsExport()](./docs/api/appkit/TypeAlias.JobsExport.md): Public API shape of the jobs plugin.
191
190
  - [Type Alias: PluginData<T, U, N>](./docs/api/appkit/TypeAlias.PluginData.md): Tuple of plugin class, config, and name. Created by toPlugin() and passed to createApp().
192
191
  - [Type Alias: Plugins](./docs/api/appkit/TypeAlias.Plugins.md): Plugin map passed to the function form of AgentDefinition.tools.
@@ -1,6 +1,6 @@
1
1
  //#region package.json
2
2
  var name = "@databricks/appkit";
3
- var version = "0.55.0";
3
+ var version = "0.55.1";
4
4
 
5
5
  //#endregion
6
6
  export { name, version };
package/dist/index.d.ts CHANGED
@@ -43,7 +43,7 @@ import { FileAction, FilePolicy, FilePolicyUser, FileResource, PolicyDeniedError
43
43
  import { analytics } from "./plugins/analytics/analytics.js";
44
44
  import { files } from "./plugins/files/plugin.js";
45
45
  import { genie } from "./plugins/genie/genie.js";
46
- import { IJobsConfig, JobAPI, JobConfig, JobHandle, JobsExport } from "./plugins/jobs/types.js";
46
+ import { IJobsConfig, JobAPI, JobConfig, JobsExport } from "./plugins/jobs/types.js";
47
47
  import { jobs } from "./plugins/jobs/plugin.js";
48
48
  import "./plugins/jobs/index.js";
49
49
  import { lakebase } from "./plugins/lakebase/lakebase.js";
@@ -54,4 +54,4 @@ import "./plugins/ga-exports.generated.js";
54
54
  import { extractServingEndpoints, findServerFile } from "./type-generator/serving/server-file-extractor.js";
55
55
  import { appKitServingTypesPlugin } from "./type-generator/serving/vite-plugin.js";
56
56
  import { appKitTypesPlugin } from "./type-generator/vite-plugin.js";
57
- export { ApiError, AppKitError, AuthenticationError, type BasePluginConfig, type CacheConfig, CacheManager, type ConfigSchema, ConfigurationError, ConnectionError, type Counter, type DatabaseCredential, type EndpointConfig, ExecutionError, type ExecutionResult, type FileAction, type FilePolicy, type FilePolicyUser, type FileResource, type GenerateDatabaseCredentialRequest, type Histogram, type IAppRouter, type IJobsConfig, type ITelemetry, InitializationError, type JobAPI, type JobConfig, type JobHandle, type JobsConnectorConfig, type JobsExport, type LakebasePool, type LakebasePoolConfig, type LakebasePoolManager, Plugin, type PluginData, type PluginManifest, PolicyDeniedError, READ_ACTIONS, type RequestedClaims, RequestedClaimsPermissionSet, type RequestedResource, type ResourceEntry, type ResourceFieldEntry, type ResourcePermission, ResourceRegistry, type ResourceRequirement, ResourceType, ServerError, type ServingEndpointEntry, type ServingEndpointRegistry, type ServingFactory, SeverityNumber, type Span, SpanStatusCode, type StreamExecutionSettings, type TelemetryConfig, type ToPlugin, TunnelError, ValidationError, type ValidationResult, WRITE_ACTIONS, type WorkspaceClient, type WorkspaceClientOptions, analytics, appKitServingTypesPlugin, appKitTypesPlugin, createApp, createLakebasePool, createLakebasePoolManager, createWorkspaceClient, extractServingEndpoints, files, findServerFile, generateDatabaseCredential, genie, getExecutionContext, getLakebaseOrmConfig, getLakebasePgConfig, getPluginManifest, getResourceRequirements, getUsernameWithApiLookup, getWorkspaceClient, isSQLTypeMarker, jobs, lakebase, server, serving, sql, toPlugin };
57
+ export { ApiError, AppKitError, AuthenticationError, type BasePluginConfig, type CacheConfig, CacheManager, type ConfigSchema, ConfigurationError, ConnectionError, type Counter, type DatabaseCredential, type EndpointConfig, ExecutionError, type ExecutionResult, type FileAction, type FilePolicy, type FilePolicyUser, type FileResource, type GenerateDatabaseCredentialRequest, type Histogram, type IAppRouter, type IJobsConfig, type ITelemetry, InitializationError, type JobAPI, type JobConfig, type JobsConnectorConfig, type JobsExport, type LakebasePool, type LakebasePoolConfig, type LakebasePoolManager, Plugin, type PluginData, type PluginManifest, PolicyDeniedError, READ_ACTIONS, type RequestedClaims, RequestedClaimsPermissionSet, type RequestedResource, type ResourceEntry, type ResourceFieldEntry, type ResourcePermission, ResourceRegistry, type ResourceRequirement, ResourceType, ServerError, type ServingEndpointEntry, type ServingEndpointRegistry, type ServingFactory, SeverityNumber, type Span, SpanStatusCode, type StreamExecutionSettings, type TelemetryConfig, type ToPlugin, TunnelError, ValidationError, type ValidationResult, WRITE_ACTIONS, type WorkspaceClient, type WorkspaceClientOptions, analytics, appKitServingTypesPlugin, appKitTypesPlugin, createApp, createLakebasePool, createLakebasePoolManager, createWorkspaceClient, extractServingEndpoints, files, findServerFile, generateDatabaseCredential, genie, getExecutionContext, getLakebaseOrmConfig, getLakebasePgConfig, getPluginManifest, getResourceRequirements, getUsernameWithApiLookup, getWorkspaceClient, isSQLTypeMarker, jobs, lakebase, server, serving, sql, toPlugin };
@@ -1,2 +1,2 @@
1
- import { IJobsConfig, JobAPI, JobConfig, JobHandle, JobsExport } from "./types.js";
1
+ import { IJobsConfig, JobAPI, JobConfig, JobsExport } from "./types.js";
2
2
  import { jobs } from "./plugin.js";
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","names":[],"sources":["../../../src/plugins/jobs/plugin.ts"],"mappings":";;;;;;;;;cAsFM,UAAA,SAAmB,MAAA;EAAA,OAChB,QAAA,EAAuB,cAAA;EAAA,UAEZ,MAAA,EAAQ,WAAA;EAAA,QAClB,SAAA;EAAA,QACA,MAAA;EAAA,QACA,UAAA;EAAA,QACA,OAAA;;;;;SAMD,YAAA,CAAa,MAAA,EAAQ,WAAA,GAAc,MAAA,SAAe,SAAA;EAAf;;;;EAAA,OAgCnC,uBAAA,CAAwB,MAAA,EAAQ,WAAA,GAAc,mBAAA;cAqBzC,MAAA,EAAQ,WAAA;EA0Bd,KAAA,CAAA,GAAK,OAAA;EAAA,YAMC,MAAA,CAAA;EAAA,QAIJ,QAAA;EAAA,QAcA,aAAA;EAAA,QAYA,cAAA;EAhIqB;;;;EAAA,QA6IrB,eAAA;EA1IkB;;;;EAAA,UAoKhB,YAAA,CAAa,MAAA,WAAiB,MAAA;EA1JjC;;;;EAAA,QAgXC,WAAA;EAAA,QA0BA,gBAAA;EA1W+B;;;;;EAAA,QAsX/B,eAAA;EAAA,QAuCM,UAAA;EA4Cd,YAAA,CAAa,MAAA,EAAQ,UAAA;EA6IrB,OAAA,CAAA,GAAW,UAAA;EAsBX,YAAA,CAAA,GAAgB,MAAA;AAAA;;;;cAiBL,IAAA,EAAI,QAAA,QAAA,UAAA,EAAA,WAAA"}
1
+ {"version":3,"file":"plugin.d.ts","names":[],"sources":["../../../src/plugins/jobs/plugin.ts"],"mappings":";;;;;;;;;cAoFM,UAAA,SAAmB,MAAA;EAAA,OAChB,QAAA,EAAuB,cAAA;EAAA,UAEZ,MAAA,EAAQ,WAAA;EAAA,QAClB,SAAA;EAAA,QACA,MAAA;EAAA,QACA,UAAA;EAAA,QACA,OAAA;;;;;SAMD,YAAA,CAAa,MAAA,EAAQ,WAAA,GAAc,MAAA,SAAe,SAAA;EAAf;;;;EAAA,OAgCnC,uBAAA,CAAwB,MAAA,EAAQ,WAAA,GAAc,mBAAA;cAqBzC,MAAA,EAAQ,WAAA;EA0Bd,KAAA,CAAA,GAAK,OAAA;EAAA,YAMC,MAAA,CAAA;EAAA,QAIJ,QAAA;EAAA,QAcA,aAAA;EAAA,QAYA,cAAA;EAhIqB;;;;EAAA,QA6IrB,eAAA;EA1IkB;;;;EAAA,UAoKhB,YAAA,CAAa,MAAA,WAAiB,MAAA;EA1JjC;;;;EAAA,QA6WC,WAAA;EAAA,QA0BA,gBAAA;EAvW+B;;;;;EAAA,QAmX/B,eAAA;EAAA,QAuCM,UAAA;EA4Cd,YAAA,CAAa,MAAA,EAAQ,UAAA;EA6IrB,OAAA,CAAA,GAAW,UAAA;EAcX,YAAA,CAAA,GAAgB,MAAA;AAAA;;;;cAiBL,IAAA,EAAI,QAAA,QAAA,UAAA,EAAA,WAAA"}
@@ -498,12 +498,7 @@ var JobsPlugin = class JobsPlugin extends Plugin {
498
498
  exports() {
499
499
  const resolveJob = (jobKey) => {
500
500
  if (!this.jobKeys.includes(jobKey)) throw new Error(`Unknown job "${jobKey}". Available jobs: ${this.jobKeys.join(", ")}`);
501
- return {
502
- ...this.createJobAPI(jobKey),
503
- asUser: (req) => {
504
- return this.asUser(req).createJobAPI(jobKey);
505
- }
506
- };
501
+ return this.createJobAPI(jobKey);
507
502
  };
508
503
  return resolveJob;
509
504
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","names":["manifest"],"sources":["../../../src/plugins/jobs/plugin.ts"],"sourcesContent":["import { STATUS_CODES } from \"node:http\";\nimport type express from \"express\";\nimport type {\n IAppRequest,\n IAppRouter,\n PluginExecutionSettings,\n StreamExecutionSettings,\n} from \"shared\";\nimport { toJSONSchema } from \"zod\";\nimport { JobsConnector } from \"../../connectors/jobs\";\nimport { getCurrentUserId, getWorkspaceClient } from \"../../context\";\nimport { ExecutionError, ValidationError } from \"../../errors\";\nimport { createLogger } from \"../../logging/logger\";\nimport type { ExecutionResult } from \"../../plugin\";\nimport { Plugin, toPlugin } from \"../../plugin\";\nimport type { PluginManifest, ResourceRequirement } from \"../../registry\";\nimport { ResourceType } from \"../../registry\";\nimport type { jobs as jobsTypes } from \"../../workspace-client\";\nimport {\n JOBS_READ_DEFAULTS,\n JOBS_STREAM_DEFAULTS,\n JOBS_WRITE_DEFAULTS,\n} from \"./defaults\";\nimport manifest from \"./manifest.json\";\nimport { mapParams } from \"./params\";\nimport type {\n IJobsConfig,\n JobAPI,\n JobConfig,\n JobHandle,\n JobRunStatus,\n JobsExport,\n} from \"./types\";\n\nconst logger = createLogger(\"jobs\");\n\nconst DEFAULT_WAIT_TIMEOUT = 600_000;\nconst DEFAULT_POLL_INTERVAL = 5_000;\n/** Cap on param-key count when a job has no Zod schema. Jobs that need more keys must define a schema. */\nconst MAX_UNVALIDATED_PARAM_KEYS = 50;\n\n/** Replace upstream error messages with generic descriptions keyed by HTTP status. */\nfunction errorResult(status: number): ExecutionResult<never> {\n return {\n ok: false,\n status,\n message: STATUS_CODES[status] ?? \"Request failed\",\n };\n}\n\nfunction isTerminalRunState(state: string | undefined): boolean {\n return (\n state === \"TERMINATED\" || state === \"SKIPPED\" || state === \"INTERNAL_ERROR\"\n );\n}\n\n/** Exponential backoff (1.5x) with +/- 20% jitter, capped at `max`. */\nfunction nextPollDelay(\n current: number,\n max: number,\n): { delay: number; next: number } {\n const jitter = 1 + (Math.random() * 0.4 - 0.2);\n return {\n delay: Math.min(current * jitter, max),\n next: Math.min(current * 1.5, max),\n };\n}\n\nfunction abortableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve) => {\n if (signal?.aborted) {\n resolve();\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n resolve();\n },\n { once: true },\n );\n });\n}\n\nclass JobsPlugin extends Plugin {\n static manifest = manifest as PluginManifest;\n\n protected declare config: IJobsConfig;\n private connector: JobsConnector;\n private jobIds: Record<string, number> = {};\n private jobConfigs: Record<string, JobConfig> = {};\n private jobKeys: string[] = [];\n\n /**\n * Scans process.env for DATABRICKS_JOB_* keys and merges with explicit config.\n * Explicit config wins for per-job overrides; auto-discovered jobs get default `{}` config.\n */\n static discoverJobs(config: IJobsConfig): Record<string, JobConfig> {\n const explicit = config.jobs ?? {};\n const discovered: Record<string, JobConfig> = {};\n\n const prefix = \"DATABRICKS_JOB_\";\n for (const key of Object.keys(process.env)) {\n if (!key.startsWith(prefix)) continue;\n if (key === \"DATABRICKS_JOB_ID\") continue;\n const suffix = key.slice(prefix.length);\n if (!suffix || !process.env[key]) continue;\n const jobKey = suffix.toLowerCase();\n if (!(jobKey in explicit)) {\n discovered[jobKey] = {};\n }\n }\n\n // Single-job shorthand: DATABRICKS_JOB_ID maps to \"default\" key\n if (\n process.env.DATABRICKS_JOB_ID &&\n Object.keys(explicit).length === 0 &&\n Object.keys(discovered).length === 0\n ) {\n discovered.default = {};\n }\n\n return { ...discovered, ...explicit };\n }\n\n /**\n * Generates resource requirements dynamically from discovered + configured jobs.\n * Each job key maps to a `DATABRICKS_JOB_{KEY_UPPERCASE}` env var (or `DATABRICKS_JOB_ID` for \"default\").\n */\n static getResourceRequirements(config: IJobsConfig): ResourceRequirement[] {\n const jobs = JobsPlugin.discoverJobs(config);\n return Object.keys(jobs).map((key) => ({\n type: ResourceType.JOB,\n alias: `job-${key}`,\n resourceKey: `job-${key}`,\n description: `Databricks Job \"${key}\"`,\n permission: \"CAN_MANAGE_RUN\" as const,\n fields: {\n id: {\n env:\n key === \"default\"\n ? \"DATABRICKS_JOB_ID\"\n : `DATABRICKS_JOB_${key.toUpperCase()}`,\n description: `Job ID for \"${key}\"`,\n },\n },\n required: true,\n }));\n }\n\n constructor(config: IJobsConfig) {\n super(config);\n this.config = config;\n this.connector = new JobsConnector({\n telemetry: config.telemetry,\n });\n\n const jobs = JobsPlugin.discoverJobs(config);\n this.jobKeys = Object.keys(jobs);\n this.jobConfigs = jobs;\n\n for (const key of this.jobKeys) {\n const envVar =\n key === \"default\"\n ? \"DATABRICKS_JOB_ID\"\n : `DATABRICKS_JOB_${key.toUpperCase()}`;\n const jobIdStr = process.env[envVar];\n if (jobIdStr) {\n const parsed = Number.parseInt(jobIdStr, 10);\n if (!Number.isNaN(parsed)) {\n this.jobIds[key] = parsed;\n }\n }\n }\n }\n\n async setup() {\n logger.info(\n `Jobs plugin initialized with ${this.jobKeys.length} job(s): ${this.jobKeys.join(\", \")}`,\n );\n }\n\n private get client() {\n return getWorkspaceClient();\n }\n\n private getJobId(jobKey: string): number {\n const id = this.jobIds[jobKey];\n if (!id) {\n const envVar =\n jobKey === \"default\"\n ? \"DATABRICKS_JOB_ID\"\n : `DATABRICKS_JOB_${jobKey.toUpperCase()}`;\n throw new Error(\n `Job \"${jobKey}\" has no configured job ID. Set ${envVar} env var.`,\n );\n }\n return id;\n }\n\n private _readSettings(\n cacheKey: (string | number | object)[],\n ): PluginExecutionSettings {\n return {\n default: {\n ...JOBS_READ_DEFAULTS,\n ...(this.config.timeout != null && { timeout: this.config.timeout }),\n cache: { ...JOBS_READ_DEFAULTS.cache, cacheKey },\n },\n };\n }\n\n private _writeSettings(): PluginExecutionSettings {\n return {\n default: {\n ...JOBS_WRITE_DEFAULTS,\n ...(this.config.timeout != null && { timeout: this.config.timeout }),\n },\n };\n }\n\n /**\n * Validates params against the job's Zod schema (if any) and maps them\n * to SDK request fields based on the task type. Shared by runNow and runAndWait.\n */\n private _validateAndMap(\n jobKey: string,\n params?: Record<string, unknown>,\n ): Record<string, unknown> {\n const jobConfig = this.jobConfigs[jobKey];\n let validated = params;\n\n if (jobConfig?.params) {\n const result = jobConfig.params.safeParse(params ?? {});\n if (!result.success) {\n throw new ValidationError(\n `Parameter validation failed for job \"${jobKey}\": ${result.error.message}`,\n );\n }\n validated = result.data as Record<string, unknown>;\n }\n\n return jobConfig?.taskType && validated\n ? mapParams(jobConfig.taskType, validated)\n : (validated ?? {});\n }\n\n /**\n * Creates a JobAPI for a specific configured job key.\n * Each method is scoped to the job's configured ID.\n */\n protected createJobAPI(jobKey: string): JobAPI {\n const jobId = this.getJobId(jobKey);\n const jobConfig = this.jobConfigs[jobKey];\n // Capture `this` for use in the async generator\n const self = this;\n // Eagerly capture the client and userId so that when createJobAPI is\n // called inside an asUser() proxy (which runs in user context), the\n // closures below use the user-scoped client instead of falling back\n // to the service principal when the ALS context has already exited.\n const client = this.client;\n const userKey = getCurrentUserId();\n\n /**\n * Verify that `runId` belongs to this job's configured `jobId`. Returns\n * null if the run is in scope; otherwise returns a 404 `ExecutionResult`.\n * Prevents cross-job access via the `/:jobKey/runs/:runId` HTTP surface.\n */\n const verifyRunScope = async (\n runId: number,\n ): Promise<ExecutionResult<never> | null> => {\n const result = await self.execute(\n async (signal) =>\n self.connector.getRun(client, { run_id: runId }, signal),\n self._readSettings([\"jobs:getRun\", jobKey, runId]),\n userKey,\n );\n if (!result.ok) return errorResult(result.status);\n if (result.data.job_id !== jobId) return errorResult(404);\n return null;\n };\n\n return {\n runNow: async (\n params?: Record<string, unknown>,\n ): Promise<ExecutionResult<jobsTypes.RunNowResponse>> => {\n const sdkFields = self._validateAndMap(jobKey, params);\n\n const result = await self.execute(\n async (signal) =>\n self.connector.runNow(\n client,\n { ...sdkFields, job_id: jobId },\n signal,\n ),\n self._writeSettings(),\n userKey,\n );\n return result.ok ? result : errorResult(result.status);\n },\n\n async *runAndWait(\n params?: Record<string, unknown>,\n signal?: AbortSignal,\n ): AsyncGenerator<JobRunStatus, void, unknown> {\n const sdkFields = self._validateAndMap(jobKey, params);\n\n const runResult = await self.execute(\n async (signal) =>\n self.connector.runNow(\n client,\n { ...sdkFields, job_id: jobId },\n signal,\n ),\n self._writeSettings(),\n userKey,\n );\n\n if (!runResult.ok) {\n throw new ExecutionError(\"Failed to trigger job run\");\n }\n const runId = runResult.data.run_id;\n if (!runId) {\n throw new Error(\"runNow did not return a run_id\");\n }\n\n const basePollInterval =\n self.config.pollIntervalMs ?? DEFAULT_POLL_INTERVAL;\n const maxPollInterval = basePollInterval * 6;\n const timeout = jobConfig?.waitTimeout ?? DEFAULT_WAIT_TIMEOUT;\n const startTime = Date.now();\n let currentInterval = basePollInterval;\n\n while (!signal?.aborted) {\n if (Date.now() - startTime > timeout) {\n throw new Error(\n `Job run ${runId} polling timeout after ${timeout}ms`,\n );\n }\n\n const runStatusResult = await self.execute(\n async (signal) =>\n self.connector.getRun(client, { run_id: runId }, signal),\n {\n default: {\n ...JOBS_READ_DEFAULTS,\n cache: { enabled: false },\n },\n },\n userKey,\n );\n if (!runStatusResult.ok) {\n throw new ExecutionError(\n `Failed to poll run status for run ${runId}`,\n );\n }\n const run = runStatusResult.data;\n const state = run.state?.life_cycle_state;\n\n yield { status: state, timestamp: Date.now(), run };\n\n if (isTerminalRunState(state)) return;\n\n const { delay, next } = nextPollDelay(\n currentInterval,\n maxPollInterval,\n );\n currentInterval = next;\n await abortableSleep(delay, signal);\n }\n },\n\n lastRun: async (): Promise<\n ExecutionResult<jobsTypes.BaseRun | undefined>\n > => {\n const result = await self.execute(\n async (signal) =>\n self.connector.listRuns(\n client,\n { job_id: jobId, limit: 1 },\n signal,\n ),\n self._readSettings([\"jobs:lastRun\", jobKey]),\n userKey,\n );\n if (!result.ok) return errorResult(result.status);\n return { ok: true, data: result.data[0] };\n },\n\n listRuns: async (options?: {\n limit?: number;\n }): Promise<ExecutionResult<jobsTypes.BaseRun[]>> => {\n const result = await self.execute(\n async (signal) =>\n self.connector.listRuns(\n client,\n { job_id: jobId, limit: options?.limit },\n signal,\n ),\n self._readSettings([\n \"jobs:listRuns\",\n jobKey,\n options?.limit ?? \"default\",\n ]),\n userKey,\n );\n return result.ok ? result : errorResult(result.status);\n },\n\n getRun: async (\n runId: number,\n ): Promise<ExecutionResult<jobsTypes.Run>> => {\n const result = await self.execute(\n async (signal) =>\n self.connector.getRun(client, { run_id: runId }, signal),\n self._readSettings([\"jobs:getRun\", jobKey, runId]),\n userKey,\n );\n if (!result.ok) return errorResult(result.status);\n if (result.data.job_id !== jobId) return errorResult(404);\n return result;\n },\n\n getRunOutput: async (\n runId: number,\n ): Promise<ExecutionResult<jobsTypes.RunOutput>> => {\n const scopeError = await verifyRunScope(runId);\n if (scopeError) return scopeError;\n const result = await self.execute(\n async (signal) =>\n self.connector.getRunOutput(client, { run_id: runId }, signal),\n self._readSettings([\"jobs:getRunOutput\", jobKey, runId]),\n userKey,\n );\n return result.ok ? result : errorResult(result.status);\n },\n\n cancelRun: async (runId: number): Promise<ExecutionResult<void>> => {\n const scopeError = await verifyRunScope(runId);\n if (scopeError) return scopeError;\n const result = await self.execute(\n async (signal) =>\n self.connector.cancelRun(client, { run_id: runId }, signal),\n self._writeSettings(),\n userKey,\n );\n return result.ok ? result : errorResult(result.status);\n },\n\n getJob: async (): Promise<ExecutionResult<jobsTypes.Job>> => {\n const result = await self.execute(\n async (signal) =>\n self.connector.getJob(client, { job_id: jobId }, signal),\n self._readSettings([\"jobs:getJob\", jobKey]),\n userKey,\n );\n return result.ok ? result : errorResult(result.status);\n },\n };\n }\n\n /**\n * Resolve `:jobKey` from the request. Returns the key and ID,\n * or sends a 404 and returns `{ jobKey: undefined, jobId: undefined }`.\n */\n private _resolveJob(\n req: express.Request,\n res: express.Response,\n ):\n | { jobKey: string; jobId: number }\n | { jobKey: undefined; jobId: undefined } {\n const jobKey = req.params.jobKey;\n if (!this.jobKeys.includes(jobKey)) {\n const safeKey = jobKey.replace(/[^a-zA-Z0-9_-]/g, \"\");\n res.status(404).json({\n error: `Unknown job \"${safeKey}\"`,\n plugin: this.name,\n });\n return { jobKey: undefined, jobId: undefined };\n }\n const jobId = this.jobIds[jobKey];\n if (!jobId) {\n res.status(404).json({\n error: `Job \"${jobKey}\" has no configured job ID`,\n plugin: this.name,\n });\n return { jobKey: undefined, jobId: undefined };\n }\n return { jobKey, jobId };\n }\n\n private _sendStatusError(res: express.Response, status: number): void {\n res.status(status).json({\n error: STATUS_CODES[status] ?? \"Unknown Error\",\n plugin: this.name,\n });\n }\n\n /**\n * Validate params from an HTTP request body. Eager validation lets streaming\n * requests get a clean 400 instead of a generic SSE error event. Throws\n * ValidationError so handlers can map to a 400 response via their catch block.\n */\n private _parseRunParams(\n jobKey: string,\n rawParams: unknown,\n ): Record<string, unknown> | undefined {\n if (\n rawParams !== undefined &&\n (typeof rawParams !== \"object\" ||\n rawParams === null ||\n Array.isArray(rawParams))\n ) {\n throw new ValidationError(\"params must be a plain object\");\n }\n\n const jobConfig = this.jobConfigs[jobKey];\n if (jobConfig?.params) {\n const result = jobConfig.params.safeParse(rawParams ?? {});\n if (!result.success) {\n throw new ValidationError(\"Invalid job parameters\");\n }\n // Pass rawParams — not result.data — to avoid double-transforming\n // when _validateAndMap calls safeParse again downstream.\n return rawParams as Record<string, unknown>;\n }\n // No schema. Either reject (no taskType) or enforce a key cap so that\n // untrusted clients can't spread arbitrarily many fields into the SDK.\n if (rawParams !== undefined) {\n if (!jobConfig?.taskType) {\n throw new ValidationError(\"This job does not accept parameters\");\n }\n const keyCount = Object.keys(rawParams as Record<string, unknown>).length;\n if (keyCount > MAX_UNVALIDATED_PARAM_KEYS) {\n throw new ValidationError(\n `Too many parameters (${keyCount}). Define a Zod schema to accept more than ${MAX_UNVALIDATED_PARAM_KEYS}.`,\n );\n }\n }\n return rawParams as Record<string, unknown> | undefined;\n }\n\n private async _handleRun(\n req: express.Request,\n res: express.Response,\n ): Promise<void> {\n const { jobKey } = this._resolveJob(req, res);\n if (!jobKey) return;\n\n const stream = req.query.stream === \"true\";\n\n try {\n const params = this._parseRunParams(jobKey, req.body?.params);\n const api = this.createJobAPI(jobKey);\n\n if (stream) {\n const streamSettings: StreamExecutionSettings = {\n default: JOBS_STREAM_DEFAULTS,\n };\n await this.executeStream<JobRunStatus>(\n res,\n (signal) => api.runAndWait(params, signal),\n streamSettings,\n );\n } else {\n const result = await api.runNow(params);\n if (!result.ok) {\n this._sendStatusError(res, result.status);\n return;\n }\n res.json({ runId: result.data.run_id });\n }\n } catch (error) {\n if (error instanceof ValidationError) {\n if (!res.headersSent) {\n res.status(400).json({ error: error.message, plugin: this.name });\n }\n return;\n }\n logger.error(\"Run failed for job %s: %O\", jobKey, error);\n if (!res.headersSent) {\n res.status(500).json({ error: \"Run failed\", plugin: this.name });\n }\n }\n }\n\n injectRoutes(router: IAppRouter) {\n this.route(router, {\n name: \"run\",\n method: \"post\",\n path: \"/:jobKey/run\",\n handler: (req, res) => this._handleRun(req, res),\n });\n\n // GET /:jobKey/runs\n this.route(router, {\n name: \"runs\",\n method: \"get\",\n path: \"/:jobKey/runs\",\n handler: async (req: express.Request, res: express.Response) => {\n const { jobKey } = this._resolveJob(req, res);\n if (!jobKey) return;\n\n const limit = Math.max(\n 1,\n Math.min(Number.parseInt(req.query.limit as string, 10) || 20, 100),\n );\n\n try {\n const api = this.createJobAPI(jobKey);\n const result = await api.listRuns({ limit });\n if (!result.ok) {\n this._sendStatusError(res, result.status);\n return;\n }\n res.json({ runs: result.data });\n } catch (error) {\n logger.error(\"List runs failed for job %s: %O\", jobKey, error);\n res\n .status(500)\n .json({ error: \"List runs failed\", plugin: this.name });\n }\n },\n });\n\n // GET /:jobKey/runs/:runId\n this.route(router, {\n name: \"run-detail\",\n method: \"get\",\n path: \"/:jobKey/runs/:runId\",\n handler: async (req: express.Request, res: express.Response) => {\n const { jobKey } = this._resolveJob(req, res);\n if (!jobKey) return;\n\n const runId = Number.parseInt(req.params.runId, 10);\n if (Number.isNaN(runId) || runId <= 0) {\n res.status(400).json({ error: \"Invalid runId\", plugin: this.name });\n return;\n }\n\n try {\n const api = this.createJobAPI(jobKey);\n const result = await api.getRun(runId);\n if (!result.ok) {\n this._sendStatusError(res, result.status);\n return;\n }\n res.json(result.data);\n } catch (error) {\n logger.error(\n \"Get run failed for job %s run %d: %O\",\n jobKey,\n runId,\n error,\n );\n res.status(500).json({ error: \"Get run failed\", plugin: this.name });\n }\n },\n });\n\n // GET /:jobKey/status\n this.route(router, {\n name: \"status\",\n method: \"get\",\n path: \"/:jobKey/status\",\n handler: async (req: express.Request, res: express.Response) => {\n const { jobKey } = this._resolveJob(req, res);\n if (!jobKey) return;\n\n try {\n const api = this.createJobAPI(jobKey);\n const result = await api.lastRun();\n if (!result.ok) {\n this._sendStatusError(res, result.status);\n return;\n }\n res.json({\n status: result.data?.state?.life_cycle_state ?? null,\n run: result.data ?? null,\n });\n } catch (error) {\n logger.error(\"Status check failed for job %s: %O\", jobKey, error);\n res\n .status(500)\n .json({ error: \"Status check failed\", plugin: this.name });\n }\n },\n });\n\n // DELETE /:jobKey/runs/:runId\n this.route(router, {\n name: \"cancel-run\",\n method: \"delete\",\n path: \"/:jobKey/runs/:runId\",\n handler: async (req: express.Request, res: express.Response) => {\n const { jobKey } = this._resolveJob(req, res);\n if (!jobKey) return;\n\n const runId = Number.parseInt(req.params.runId, 10);\n if (Number.isNaN(runId) || runId <= 0) {\n res.status(400).json({ error: \"Invalid runId\", plugin: this.name });\n return;\n }\n\n try {\n const api = this.createJobAPI(jobKey);\n const result = await api.cancelRun(runId);\n if (!result.ok) {\n this._sendStatusError(res, result.status);\n return;\n }\n res.status(204).end();\n } catch (error) {\n logger.error(\n \"Cancel run failed for job %s run %d: %O\",\n jobKey,\n runId,\n error,\n );\n res\n .status(500)\n .json({ error: \"Cancel run failed\", plugin: this.name });\n }\n },\n });\n }\n\n exports(): JobsExport {\n const resolveJob = (jobKey: string): JobHandle => {\n if (!this.jobKeys.includes(jobKey)) {\n throw new Error(\n `Unknown job \"${jobKey}\". Available jobs: ${this.jobKeys.join(\", \")}`,\n );\n }\n\n const spApi = this.createJobAPI(jobKey);\n\n return {\n ...spApi,\n asUser: (req: IAppRequest) => {\n const userPlugin = this.asUser(req) as JobsPlugin;\n return userPlugin.createJobAPI(jobKey);\n },\n };\n };\n\n return resolveJob as JobsExport;\n }\n\n clientConfig(): Record<string, unknown> {\n const jobs: Record<string, { params: unknown; taskType: string | null }> =\n {};\n for (const key of this.jobKeys) {\n const config = this.jobConfigs[key];\n jobs[key] = {\n params: config?.params ? toJSONSchema(config.params) : null,\n taskType: config?.taskType ?? null,\n };\n }\n return { jobs };\n }\n}\n\n/**\n * @internal\n */\nexport const jobs = toPlugin(JobsPlugin);\n\n/**\n * @internal\n */\nexport { JobsPlugin };\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","names":["manifest"],"sources":["../../../src/plugins/jobs/plugin.ts"],"sourcesContent":["import { STATUS_CODES } from \"node:http\";\nimport type express from \"express\";\nimport type {\n IAppRouter,\n PluginExecutionSettings,\n StreamExecutionSettings,\n} from \"shared\";\nimport { toJSONSchema } from \"zod\";\nimport { JobsConnector } from \"../../connectors/jobs\";\nimport { getCurrentUserId, getWorkspaceClient } from \"../../context\";\nimport { ExecutionError, ValidationError } from \"../../errors\";\nimport { createLogger } from \"../../logging/logger\";\nimport type { ExecutionResult } from \"../../plugin\";\nimport { Plugin, toPlugin } from \"../../plugin\";\nimport type { PluginManifest, ResourceRequirement } from \"../../registry\";\nimport { ResourceType } from \"../../registry\";\nimport type { jobs as jobsTypes } from \"../../workspace-client\";\nimport {\n JOBS_READ_DEFAULTS,\n JOBS_STREAM_DEFAULTS,\n JOBS_WRITE_DEFAULTS,\n} from \"./defaults\";\nimport manifest from \"./manifest.json\";\nimport { mapParams } from \"./params\";\nimport type {\n IJobsConfig,\n JobAPI,\n JobConfig,\n JobRunStatus,\n JobsExport,\n} from \"./types\";\n\nconst logger = createLogger(\"jobs\");\n\nconst DEFAULT_WAIT_TIMEOUT = 600_000;\nconst DEFAULT_POLL_INTERVAL = 5_000;\n/** Cap on param-key count when a job has no Zod schema. Jobs that need more keys must define a schema. */\nconst MAX_UNVALIDATED_PARAM_KEYS = 50;\n\n/** Replace upstream error messages with generic descriptions keyed by HTTP status. */\nfunction errorResult(status: number): ExecutionResult<never> {\n return {\n ok: false,\n status,\n message: STATUS_CODES[status] ?? \"Request failed\",\n };\n}\n\nfunction isTerminalRunState(state: string | undefined): boolean {\n return (\n state === \"TERMINATED\" || state === \"SKIPPED\" || state === \"INTERNAL_ERROR\"\n );\n}\n\n/** Exponential backoff (1.5x) with +/- 20% jitter, capped at `max`. */\nfunction nextPollDelay(\n current: number,\n max: number,\n): { delay: number; next: number } {\n const jitter = 1 + (Math.random() * 0.4 - 0.2);\n return {\n delay: Math.min(current * jitter, max),\n next: Math.min(current * 1.5, max),\n };\n}\n\nfunction abortableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve) => {\n if (signal?.aborted) {\n resolve();\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n resolve();\n },\n { once: true },\n );\n });\n}\n\nclass JobsPlugin extends Plugin {\n static manifest = manifest as PluginManifest;\n\n protected declare config: IJobsConfig;\n private connector: JobsConnector;\n private jobIds: Record<string, number> = {};\n private jobConfigs: Record<string, JobConfig> = {};\n private jobKeys: string[] = [];\n\n /**\n * Scans process.env for DATABRICKS_JOB_* keys and merges with explicit config.\n * Explicit config wins for per-job overrides; auto-discovered jobs get default `{}` config.\n */\n static discoverJobs(config: IJobsConfig): Record<string, JobConfig> {\n const explicit = config.jobs ?? {};\n const discovered: Record<string, JobConfig> = {};\n\n const prefix = \"DATABRICKS_JOB_\";\n for (const key of Object.keys(process.env)) {\n if (!key.startsWith(prefix)) continue;\n if (key === \"DATABRICKS_JOB_ID\") continue;\n const suffix = key.slice(prefix.length);\n if (!suffix || !process.env[key]) continue;\n const jobKey = suffix.toLowerCase();\n if (!(jobKey in explicit)) {\n discovered[jobKey] = {};\n }\n }\n\n // Single-job shorthand: DATABRICKS_JOB_ID maps to \"default\" key\n if (\n process.env.DATABRICKS_JOB_ID &&\n Object.keys(explicit).length === 0 &&\n Object.keys(discovered).length === 0\n ) {\n discovered.default = {};\n }\n\n return { ...discovered, ...explicit };\n }\n\n /**\n * Generates resource requirements dynamically from discovered + configured jobs.\n * Each job key maps to a `DATABRICKS_JOB_{KEY_UPPERCASE}` env var (or `DATABRICKS_JOB_ID` for \"default\").\n */\n static getResourceRequirements(config: IJobsConfig): ResourceRequirement[] {\n const jobs = JobsPlugin.discoverJobs(config);\n return Object.keys(jobs).map((key) => ({\n type: ResourceType.JOB,\n alias: `job-${key}`,\n resourceKey: `job-${key}`,\n description: `Databricks Job \"${key}\"`,\n permission: \"CAN_MANAGE_RUN\" as const,\n fields: {\n id: {\n env:\n key === \"default\"\n ? \"DATABRICKS_JOB_ID\"\n : `DATABRICKS_JOB_${key.toUpperCase()}`,\n description: `Job ID for \"${key}\"`,\n },\n },\n required: true,\n }));\n }\n\n constructor(config: IJobsConfig) {\n super(config);\n this.config = config;\n this.connector = new JobsConnector({\n telemetry: config.telemetry,\n });\n\n const jobs = JobsPlugin.discoverJobs(config);\n this.jobKeys = Object.keys(jobs);\n this.jobConfigs = jobs;\n\n for (const key of this.jobKeys) {\n const envVar =\n key === \"default\"\n ? \"DATABRICKS_JOB_ID\"\n : `DATABRICKS_JOB_${key.toUpperCase()}`;\n const jobIdStr = process.env[envVar];\n if (jobIdStr) {\n const parsed = Number.parseInt(jobIdStr, 10);\n if (!Number.isNaN(parsed)) {\n this.jobIds[key] = parsed;\n }\n }\n }\n }\n\n async setup() {\n logger.info(\n `Jobs plugin initialized with ${this.jobKeys.length} job(s): ${this.jobKeys.join(\", \")}`,\n );\n }\n\n private get client() {\n return getWorkspaceClient();\n }\n\n private getJobId(jobKey: string): number {\n const id = this.jobIds[jobKey];\n if (!id) {\n const envVar =\n jobKey === \"default\"\n ? \"DATABRICKS_JOB_ID\"\n : `DATABRICKS_JOB_${jobKey.toUpperCase()}`;\n throw new Error(\n `Job \"${jobKey}\" has no configured job ID. Set ${envVar} env var.`,\n );\n }\n return id;\n }\n\n private _readSettings(\n cacheKey: (string | number | object)[],\n ): PluginExecutionSettings {\n return {\n default: {\n ...JOBS_READ_DEFAULTS,\n ...(this.config.timeout != null && { timeout: this.config.timeout }),\n cache: { ...JOBS_READ_DEFAULTS.cache, cacheKey },\n },\n };\n }\n\n private _writeSettings(): PluginExecutionSettings {\n return {\n default: {\n ...JOBS_WRITE_DEFAULTS,\n ...(this.config.timeout != null && { timeout: this.config.timeout }),\n },\n };\n }\n\n /**\n * Validates params against the job's Zod schema (if any) and maps them\n * to SDK request fields based on the task type. Shared by runNow and runAndWait.\n */\n private _validateAndMap(\n jobKey: string,\n params?: Record<string, unknown>,\n ): Record<string, unknown> {\n const jobConfig = this.jobConfigs[jobKey];\n let validated = params;\n\n if (jobConfig?.params) {\n const result = jobConfig.params.safeParse(params ?? {});\n if (!result.success) {\n throw new ValidationError(\n `Parameter validation failed for job \"${jobKey}\": ${result.error.message}`,\n );\n }\n validated = result.data as Record<string, unknown>;\n }\n\n return jobConfig?.taskType && validated\n ? mapParams(jobConfig.taskType, validated)\n : (validated ?? {});\n }\n\n /**\n * Creates a JobAPI for a specific configured job key.\n * Each method is scoped to the job's configured ID.\n */\n protected createJobAPI(jobKey: string): JobAPI {\n const jobId = this.getJobId(jobKey);\n const jobConfig = this.jobConfigs[jobKey];\n // Capture `this` for use in the async generator\n const self = this;\n // Capture client and userId eagerly: the closures below run later, after the ALS context may have exited.\n const client = this.client;\n const userKey = getCurrentUserId();\n\n /**\n * Verify that `runId` belongs to this job's configured `jobId`. Returns\n * null if the run is in scope; otherwise returns a 404 `ExecutionResult`.\n * Prevents cross-job access via the `/:jobKey/runs/:runId` HTTP surface.\n */\n const verifyRunScope = async (\n runId: number,\n ): Promise<ExecutionResult<never> | null> => {\n const result = await self.execute(\n async (signal) =>\n self.connector.getRun(client, { run_id: runId }, signal),\n self._readSettings([\"jobs:getRun\", jobKey, runId]),\n userKey,\n );\n if (!result.ok) return errorResult(result.status);\n if (result.data.job_id !== jobId) return errorResult(404);\n return null;\n };\n\n return {\n runNow: async (\n params?: Record<string, unknown>,\n ): Promise<ExecutionResult<jobsTypes.RunNowResponse>> => {\n const sdkFields = self._validateAndMap(jobKey, params);\n\n const result = await self.execute(\n async (signal) =>\n self.connector.runNow(\n client,\n { ...sdkFields, job_id: jobId },\n signal,\n ),\n self._writeSettings(),\n userKey,\n );\n return result.ok ? result : errorResult(result.status);\n },\n\n async *runAndWait(\n params?: Record<string, unknown>,\n signal?: AbortSignal,\n ): AsyncGenerator<JobRunStatus, void, unknown> {\n const sdkFields = self._validateAndMap(jobKey, params);\n\n const runResult = await self.execute(\n async (signal) =>\n self.connector.runNow(\n client,\n { ...sdkFields, job_id: jobId },\n signal,\n ),\n self._writeSettings(),\n userKey,\n );\n\n if (!runResult.ok) {\n throw new ExecutionError(\"Failed to trigger job run\");\n }\n const runId = runResult.data.run_id;\n if (!runId) {\n throw new Error(\"runNow did not return a run_id\");\n }\n\n const basePollInterval =\n self.config.pollIntervalMs ?? DEFAULT_POLL_INTERVAL;\n const maxPollInterval = basePollInterval * 6;\n const timeout = jobConfig?.waitTimeout ?? DEFAULT_WAIT_TIMEOUT;\n const startTime = Date.now();\n let currentInterval = basePollInterval;\n\n while (!signal?.aborted) {\n if (Date.now() - startTime > timeout) {\n throw new Error(\n `Job run ${runId} polling timeout after ${timeout}ms`,\n );\n }\n\n const runStatusResult = await self.execute(\n async (signal) =>\n self.connector.getRun(client, { run_id: runId }, signal),\n {\n default: {\n ...JOBS_READ_DEFAULTS,\n cache: { enabled: false },\n },\n },\n userKey,\n );\n if (!runStatusResult.ok) {\n throw new ExecutionError(\n `Failed to poll run status for run ${runId}`,\n );\n }\n const run = runStatusResult.data;\n const state = run.state?.life_cycle_state;\n\n yield { status: state, timestamp: Date.now(), run };\n\n if (isTerminalRunState(state)) return;\n\n const { delay, next } = nextPollDelay(\n currentInterval,\n maxPollInterval,\n );\n currentInterval = next;\n await abortableSleep(delay, signal);\n }\n },\n\n lastRun: async (): Promise<\n ExecutionResult<jobsTypes.BaseRun | undefined>\n > => {\n const result = await self.execute(\n async (signal) =>\n self.connector.listRuns(\n client,\n { job_id: jobId, limit: 1 },\n signal,\n ),\n self._readSettings([\"jobs:lastRun\", jobKey]),\n userKey,\n );\n if (!result.ok) return errorResult(result.status);\n return { ok: true, data: result.data[0] };\n },\n\n listRuns: async (options?: {\n limit?: number;\n }): Promise<ExecutionResult<jobsTypes.BaseRun[]>> => {\n const result = await self.execute(\n async (signal) =>\n self.connector.listRuns(\n client,\n { job_id: jobId, limit: options?.limit },\n signal,\n ),\n self._readSettings([\n \"jobs:listRuns\",\n jobKey,\n options?.limit ?? \"default\",\n ]),\n userKey,\n );\n return result.ok ? result : errorResult(result.status);\n },\n\n getRun: async (\n runId: number,\n ): Promise<ExecutionResult<jobsTypes.Run>> => {\n const result = await self.execute(\n async (signal) =>\n self.connector.getRun(client, { run_id: runId }, signal),\n self._readSettings([\"jobs:getRun\", jobKey, runId]),\n userKey,\n );\n if (!result.ok) return errorResult(result.status);\n if (result.data.job_id !== jobId) return errorResult(404);\n return result;\n },\n\n getRunOutput: async (\n runId: number,\n ): Promise<ExecutionResult<jobsTypes.RunOutput>> => {\n const scopeError = await verifyRunScope(runId);\n if (scopeError) return scopeError;\n const result = await self.execute(\n async (signal) =>\n self.connector.getRunOutput(client, { run_id: runId }, signal),\n self._readSettings([\"jobs:getRunOutput\", jobKey, runId]),\n userKey,\n );\n return result.ok ? result : errorResult(result.status);\n },\n\n cancelRun: async (runId: number): Promise<ExecutionResult<void>> => {\n const scopeError = await verifyRunScope(runId);\n if (scopeError) return scopeError;\n const result = await self.execute(\n async (signal) =>\n self.connector.cancelRun(client, { run_id: runId }, signal),\n self._writeSettings(),\n userKey,\n );\n return result.ok ? result : errorResult(result.status);\n },\n\n getJob: async (): Promise<ExecutionResult<jobsTypes.Job>> => {\n const result = await self.execute(\n async (signal) =>\n self.connector.getJob(client, { job_id: jobId }, signal),\n self._readSettings([\"jobs:getJob\", jobKey]),\n userKey,\n );\n return result.ok ? result : errorResult(result.status);\n },\n };\n }\n\n /**\n * Resolve `:jobKey` from the request. Returns the key and ID,\n * or sends a 404 and returns `{ jobKey: undefined, jobId: undefined }`.\n */\n private _resolveJob(\n req: express.Request,\n res: express.Response,\n ):\n | { jobKey: string; jobId: number }\n | { jobKey: undefined; jobId: undefined } {\n const jobKey = req.params.jobKey;\n if (!this.jobKeys.includes(jobKey)) {\n const safeKey = jobKey.replace(/[^a-zA-Z0-9_-]/g, \"\");\n res.status(404).json({\n error: `Unknown job \"${safeKey}\"`,\n plugin: this.name,\n });\n return { jobKey: undefined, jobId: undefined };\n }\n const jobId = this.jobIds[jobKey];\n if (!jobId) {\n res.status(404).json({\n error: `Job \"${jobKey}\" has no configured job ID`,\n plugin: this.name,\n });\n return { jobKey: undefined, jobId: undefined };\n }\n return { jobKey, jobId };\n }\n\n private _sendStatusError(res: express.Response, status: number): void {\n res.status(status).json({\n error: STATUS_CODES[status] ?? \"Unknown Error\",\n plugin: this.name,\n });\n }\n\n /**\n * Validate params from an HTTP request body. Eager validation lets streaming\n * requests get a clean 400 instead of a generic SSE error event. Throws\n * ValidationError so handlers can map to a 400 response via their catch block.\n */\n private _parseRunParams(\n jobKey: string,\n rawParams: unknown,\n ): Record<string, unknown> | undefined {\n if (\n rawParams !== undefined &&\n (typeof rawParams !== \"object\" ||\n rawParams === null ||\n Array.isArray(rawParams))\n ) {\n throw new ValidationError(\"params must be a plain object\");\n }\n\n const jobConfig = this.jobConfigs[jobKey];\n if (jobConfig?.params) {\n const result = jobConfig.params.safeParse(rawParams ?? {});\n if (!result.success) {\n throw new ValidationError(\"Invalid job parameters\");\n }\n // Pass rawParams — not result.data — to avoid double-transforming\n // when _validateAndMap calls safeParse again downstream.\n return rawParams as Record<string, unknown>;\n }\n // No schema. Either reject (no taskType) or enforce a key cap so that\n // untrusted clients can't spread arbitrarily many fields into the SDK.\n if (rawParams !== undefined) {\n if (!jobConfig?.taskType) {\n throw new ValidationError(\"This job does not accept parameters\");\n }\n const keyCount = Object.keys(rawParams as Record<string, unknown>).length;\n if (keyCount > MAX_UNVALIDATED_PARAM_KEYS) {\n throw new ValidationError(\n `Too many parameters (${keyCount}). Define a Zod schema to accept more than ${MAX_UNVALIDATED_PARAM_KEYS}.`,\n );\n }\n }\n return rawParams as Record<string, unknown> | undefined;\n }\n\n private async _handleRun(\n req: express.Request,\n res: express.Response,\n ): Promise<void> {\n const { jobKey } = this._resolveJob(req, res);\n if (!jobKey) return;\n\n const stream = req.query.stream === \"true\";\n\n try {\n const params = this._parseRunParams(jobKey, req.body?.params);\n const api = this.createJobAPI(jobKey);\n\n if (stream) {\n const streamSettings: StreamExecutionSettings = {\n default: JOBS_STREAM_DEFAULTS,\n };\n await this.executeStream<JobRunStatus>(\n res,\n (signal) => api.runAndWait(params, signal),\n streamSettings,\n );\n } else {\n const result = await api.runNow(params);\n if (!result.ok) {\n this._sendStatusError(res, result.status);\n return;\n }\n res.json({ runId: result.data.run_id });\n }\n } catch (error) {\n if (error instanceof ValidationError) {\n if (!res.headersSent) {\n res.status(400).json({ error: error.message, plugin: this.name });\n }\n return;\n }\n logger.error(\"Run failed for job %s: %O\", jobKey, error);\n if (!res.headersSent) {\n res.status(500).json({ error: \"Run failed\", plugin: this.name });\n }\n }\n }\n\n injectRoutes(router: IAppRouter) {\n this.route(router, {\n name: \"run\",\n method: \"post\",\n path: \"/:jobKey/run\",\n handler: (req, res) => this._handleRun(req, res),\n });\n\n // GET /:jobKey/runs\n this.route(router, {\n name: \"runs\",\n method: \"get\",\n path: \"/:jobKey/runs\",\n handler: async (req: express.Request, res: express.Response) => {\n const { jobKey } = this._resolveJob(req, res);\n if (!jobKey) return;\n\n const limit = Math.max(\n 1,\n Math.min(Number.parseInt(req.query.limit as string, 10) || 20, 100),\n );\n\n try {\n const api = this.createJobAPI(jobKey);\n const result = await api.listRuns({ limit });\n if (!result.ok) {\n this._sendStatusError(res, result.status);\n return;\n }\n res.json({ runs: result.data });\n } catch (error) {\n logger.error(\"List runs failed for job %s: %O\", jobKey, error);\n res\n .status(500)\n .json({ error: \"List runs failed\", plugin: this.name });\n }\n },\n });\n\n // GET /:jobKey/runs/:runId\n this.route(router, {\n name: \"run-detail\",\n method: \"get\",\n path: \"/:jobKey/runs/:runId\",\n handler: async (req: express.Request, res: express.Response) => {\n const { jobKey } = this._resolveJob(req, res);\n if (!jobKey) return;\n\n const runId = Number.parseInt(req.params.runId, 10);\n if (Number.isNaN(runId) || runId <= 0) {\n res.status(400).json({ error: \"Invalid runId\", plugin: this.name });\n return;\n }\n\n try {\n const api = this.createJobAPI(jobKey);\n const result = await api.getRun(runId);\n if (!result.ok) {\n this._sendStatusError(res, result.status);\n return;\n }\n res.json(result.data);\n } catch (error) {\n logger.error(\n \"Get run failed for job %s run %d: %O\",\n jobKey,\n runId,\n error,\n );\n res.status(500).json({ error: \"Get run failed\", plugin: this.name });\n }\n },\n });\n\n // GET /:jobKey/status\n this.route(router, {\n name: \"status\",\n method: \"get\",\n path: \"/:jobKey/status\",\n handler: async (req: express.Request, res: express.Response) => {\n const { jobKey } = this._resolveJob(req, res);\n if (!jobKey) return;\n\n try {\n const api = this.createJobAPI(jobKey);\n const result = await api.lastRun();\n if (!result.ok) {\n this._sendStatusError(res, result.status);\n return;\n }\n res.json({\n status: result.data?.state?.life_cycle_state ?? null,\n run: result.data ?? null,\n });\n } catch (error) {\n logger.error(\"Status check failed for job %s: %O\", jobKey, error);\n res\n .status(500)\n .json({ error: \"Status check failed\", plugin: this.name });\n }\n },\n });\n\n // DELETE /:jobKey/runs/:runId\n this.route(router, {\n name: \"cancel-run\",\n method: \"delete\",\n path: \"/:jobKey/runs/:runId\",\n handler: async (req: express.Request, res: express.Response) => {\n const { jobKey } = this._resolveJob(req, res);\n if (!jobKey) return;\n\n const runId = Number.parseInt(req.params.runId, 10);\n if (Number.isNaN(runId) || runId <= 0) {\n res.status(400).json({ error: \"Invalid runId\", plugin: this.name });\n return;\n }\n\n try {\n const api = this.createJobAPI(jobKey);\n const result = await api.cancelRun(runId);\n if (!result.ok) {\n this._sendStatusError(res, result.status);\n return;\n }\n res.status(204).end();\n } catch (error) {\n logger.error(\n \"Cancel run failed for job %s run %d: %O\",\n jobKey,\n runId,\n error,\n );\n res\n .status(500)\n .json({ error: \"Cancel run failed\", plugin: this.name });\n }\n },\n });\n }\n\n exports(): JobsExport {\n const resolveJob = (jobKey: string): JobAPI => {\n if (!this.jobKeys.includes(jobKey)) {\n throw new Error(\n `Unknown job \"${jobKey}\". Available jobs: ${this.jobKeys.join(\", \")}`,\n );\n }\n\n return this.createJobAPI(jobKey);\n };\n\n return resolveJob as JobsExport;\n }\n\n clientConfig(): Record<string, unknown> {\n const jobs: Record<string, { params: unknown; taskType: string | null }> =\n {};\n for (const key of this.jobKeys) {\n const config = this.jobConfigs[key];\n jobs[key] = {\n params: config?.params ? toJSONSchema(config.params) : null,\n taskType: config?.taskType ?? null,\n };\n }\n return { jobs };\n }\n}\n\n/**\n * @internal\n */\nexport const jobs = toPlugin(JobsPlugin);\n\n/**\n * @internal\n */\nexport { JobsPlugin };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAgCA,MAAM,SAAS,aAAa,OAAO;AAEnC,MAAM,uBAAuB;AAC7B,MAAM,wBAAwB;;AAE9B,MAAM,6BAA6B;;AAGnC,SAAS,YAAY,QAAwC;AAC3D,QAAO;EACL,IAAI;EACJ;EACA,SAAS,aAAa,WAAW;EAClC;;AAGH,SAAS,mBAAmB,OAAoC;AAC9D,QACE,UAAU,gBAAgB,UAAU,aAAa,UAAU;;;AAK/D,SAAS,cACP,SACA,KACiC;CACjC,MAAM,SAAS,KAAK,KAAK,QAAQ,GAAG,KAAM;AAC1C,QAAO;EACL,OAAO,KAAK,IAAI,UAAU,QAAQ,IAAI;EACtC,MAAM,KAAK,IAAI,UAAU,KAAK,IAAI;EACnC;;AAGH,SAAS,eAAe,IAAY,QAAqC;AACvE,QAAO,IAAI,SAAe,YAAY;AACpC,MAAI,QAAQ,SAAS;AACnB,YAAS;AACT;;EAEF,MAAM,QAAQ,WAAW,SAAS,GAAG;AACrC,UAAQ,iBACN,eACM;AACJ,gBAAa,MAAM;AACnB,YAAS;KAEX,EAAE,MAAM,MAAM,CACf;GACD;;AAGJ,IAAM,aAAN,MAAM,mBAAmB,OAAO;CAC9B,OAAO,WAAWA;CAGlB,AAAQ;CACR,AAAQ,SAAiC,EAAE;CAC3C,AAAQ,aAAwC,EAAE;CAClD,AAAQ,UAAoB,EAAE;;;;;CAM9B,OAAO,aAAa,QAAgD;EAClE,MAAM,WAAW,OAAO,QAAQ,EAAE;EAClC,MAAM,aAAwC,EAAE;EAEhD,MAAM,SAAS;AACf,OAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,IAAI,EAAE;AAC1C,OAAI,CAAC,IAAI,WAAW,OAAO,CAAE;AAC7B,OAAI,QAAQ,oBAAqB;GACjC,MAAM,SAAS,IAAI,MAAM,GAAc;AACvC,OAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,KAAM;GAClC,MAAM,SAAS,OAAO,aAAa;AACnC,OAAI,EAAE,UAAU,UACd,YAAW,UAAU,EAAE;;AAK3B,MACE,QAAQ,IAAI,qBACZ,OAAO,KAAK,SAAS,CAAC,WAAW,KACjC,OAAO,KAAK,WAAW,CAAC,WAAW,EAEnC,YAAW,UAAU,EAAE;AAGzB,SAAO;GAAE,GAAG;GAAY,GAAG;GAAU;;;;;;CAOvC,OAAO,wBAAwB,QAA4C;EACzE,MAAM,OAAO,WAAW,aAAa,OAAO;AAC5C,SAAO,OAAO,KAAK,KAAK,CAAC,KAAK,SAAS;GACrC,MAAM,aAAa;GACnB,OAAO,OAAO;GACd,aAAa,OAAO;GACpB,aAAa,mBAAmB,IAAI;GACpC,YAAY;GACZ,QAAQ,EACN,IAAI;IACF,KACE,QAAQ,YACJ,sBACA,kBAAkB,IAAI,aAAa;IACzC,aAAa,eAAe,IAAI;IACjC,EACF;GACD,UAAU;GACX,EAAE;;CAGL,YAAY,QAAqB;AAC/B,QAAM,OAAO;AACb,OAAK,SAAS;AACd,OAAK,YAAY,IAAI,cAAc,EACjC,WAAW,OAAO,WACnB,CAAC;EAEF,MAAM,OAAO,WAAW,aAAa,OAAO;AAC5C,OAAK,UAAU,OAAO,KAAK,KAAK;AAChC,OAAK,aAAa;AAElB,OAAK,MAAM,OAAO,KAAK,SAAS;GAC9B,MAAM,SACJ,QAAQ,YACJ,sBACA,kBAAkB,IAAI,aAAa;GACzC,MAAM,WAAW,QAAQ,IAAI;AAC7B,OAAI,UAAU;IACZ,MAAM,SAAS,OAAO,SAAS,UAAU,GAAG;AAC5C,QAAI,CAAC,OAAO,MAAM,OAAO,CACvB,MAAK,OAAO,OAAO;;;;CAM3B,MAAM,QAAQ;AACZ,SAAO,KACL,gCAAgC,KAAK,QAAQ,OAAO,WAAW,KAAK,QAAQ,KAAK,KAAK,GACvF;;CAGH,IAAY,SAAS;AACnB,SAAO,oBAAoB;;CAG7B,AAAQ,SAAS,QAAwB;EACvC,MAAM,KAAK,KAAK,OAAO;AACvB,MAAI,CAAC,IAAI;GACP,MAAM,SACJ,WAAW,YACP,sBACA,kBAAkB,OAAO,aAAa;AAC5C,SAAM,IAAI,MACR,QAAQ,OAAO,kCAAkC,OAAO,WACzD;;AAEH,SAAO;;CAGT,AAAQ,cACN,UACyB;AACzB,SAAO,EACL,SAAS;GACP,GAAG;GACH,GAAI,KAAK,OAAO,WAAW,QAAQ,EAAE,SAAS,KAAK,OAAO,SAAS;GACnE,OAAO;IAAE,GAAG,mBAAmB;IAAO;IAAU;GACjD,EACF;;CAGH,AAAQ,iBAA0C;AAChD,SAAO,EACL,SAAS;GACP,GAAG;GACH,GAAI,KAAK,OAAO,WAAW,QAAQ,EAAE,SAAS,KAAK,OAAO,SAAS;GACpE,EACF;;;;;;CAOH,AAAQ,gBACN,QACA,QACyB;EACzB,MAAM,YAAY,KAAK,WAAW;EAClC,IAAI,YAAY;AAEhB,MAAI,WAAW,QAAQ;GACrB,MAAM,SAAS,UAAU,OAAO,UAAU,UAAU,EAAE,CAAC;AACvD,OAAI,CAAC,OAAO,QACV,OAAM,IAAI,gBACR,wCAAwC,OAAO,KAAK,OAAO,MAAM,UAClE;AAEH,eAAY,OAAO;;AAGrB,SAAO,WAAW,YAAY,YAC1B,UAAU,UAAU,UAAU,UAAU,GACvC,aAAa,EAAE;;;;;;CAOtB,AAAU,aAAa,QAAwB;EAC7C,MAAM,QAAQ,KAAK,SAAS,OAAO;EACnC,MAAM,YAAY,KAAK,WAAW;EAElC,MAAM,OAAO;EAEb,MAAM,SAAS,KAAK;EACpB,MAAM,UAAU,kBAAkB;;;;;;EAOlC,MAAM,iBAAiB,OACrB,UAC2C;GAC3C,MAAM,SAAS,MAAM,KAAK,QACxB,OAAO,WACL,KAAK,UAAU,OAAO,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,EAC1D,KAAK,cAAc;IAAC;IAAe;IAAQ;IAAM,CAAC,EAClD,QACD;AACD,OAAI,CAAC,OAAO,GAAI,QAAO,YAAY,OAAO,OAAO;AACjD,OAAI,OAAO,KAAK,WAAW,MAAO,QAAO,YAAY,IAAI;AACzD,UAAO;;AAGT,SAAO;GACL,QAAQ,OACN,WACuD;IACvD,MAAM,YAAY,KAAK,gBAAgB,QAAQ,OAAO;IAEtD,MAAM,SAAS,MAAM,KAAK,QACxB,OAAO,WACL,KAAK,UAAU,OACb,QACA;KAAE,GAAG;KAAW,QAAQ;KAAO,EAC/B,OACD,EACH,KAAK,gBAAgB,EACrB,QACD;AACD,WAAO,OAAO,KAAK,SAAS,YAAY,OAAO,OAAO;;GAGxD,OAAO,WACL,QACA,QAC6C;IAC7C,MAAM,YAAY,KAAK,gBAAgB,QAAQ,OAAO;IAEtD,MAAM,YAAY,MAAM,KAAK,QAC3B,OAAO,WACL,KAAK,UAAU,OACb,QACA;KAAE,GAAG;KAAW,QAAQ;KAAO,EAC/B,OACD,EACH,KAAK,gBAAgB,EACrB,QACD;AAED,QAAI,CAAC,UAAU,GACb,OAAM,IAAI,eAAe,4BAA4B;IAEvD,MAAM,QAAQ,UAAU,KAAK;AAC7B,QAAI,CAAC,MACH,OAAM,IAAI,MAAM,iCAAiC;IAGnD,MAAM,mBACJ,KAAK,OAAO,kBAAkB;IAChC,MAAM,kBAAkB,mBAAmB;IAC3C,MAAM,UAAU,WAAW,eAAe;IAC1C,MAAM,YAAY,KAAK,KAAK;IAC5B,IAAI,kBAAkB;AAEtB,WAAO,CAAC,QAAQ,SAAS;AACvB,SAAI,KAAK,KAAK,GAAG,YAAY,QAC3B,OAAM,IAAI,MACR,WAAW,MAAM,yBAAyB,QAAQ,IACnD;KAGH,MAAM,kBAAkB,MAAM,KAAK,QACjC,OAAO,WACL,KAAK,UAAU,OAAO,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,EAC1D,EACE,SAAS;MACP,GAAG;MACH,OAAO,EAAE,SAAS,OAAO;MAC1B,EACF,EACD,QACD;AACD,SAAI,CAAC,gBAAgB,GACnB,OAAM,IAAI,eACR,qCAAqC,QACtC;KAEH,MAAM,MAAM,gBAAgB;KAC5B,MAAM,QAAQ,IAAI,OAAO;AAEzB,WAAM;MAAE,QAAQ;MAAO,WAAW,KAAK,KAAK;MAAE;MAAK;AAEnD,SAAI,mBAAmB,MAAM,CAAE;KAE/B,MAAM,EAAE,OAAO,SAAS,cACtB,iBACA,gBACD;AACD,uBAAkB;AAClB,WAAM,eAAe,OAAO,OAAO;;;GAIvC,SAAS,YAEJ;IACH,MAAM,SAAS,MAAM,KAAK,QACxB,OAAO,WACL,KAAK,UAAU,SACb,QACA;KAAE,QAAQ;KAAO,OAAO;KAAG,EAC3B,OACD,EACH,KAAK,cAAc,CAAC,gBAAgB,OAAO,CAAC,EAC5C,QACD;AACD,QAAI,CAAC,OAAO,GAAI,QAAO,YAAY,OAAO,OAAO;AACjD,WAAO;KAAE,IAAI;KAAM,MAAM,OAAO,KAAK;KAAI;;GAG3C,UAAU,OAAO,YAEoC;IACnD,MAAM,SAAS,MAAM,KAAK,QACxB,OAAO,WACL,KAAK,UAAU,SACb,QACA;KAAE,QAAQ;KAAO,OAAO,SAAS;KAAO,EACxC,OACD,EACH,KAAK,cAAc;KACjB;KACA;KACA,SAAS,SAAS;KACnB,CAAC,EACF,QACD;AACD,WAAO,OAAO,KAAK,SAAS,YAAY,OAAO,OAAO;;GAGxD,QAAQ,OACN,UAC4C;IAC5C,MAAM,SAAS,MAAM,KAAK,QACxB,OAAO,WACL,KAAK,UAAU,OAAO,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,EAC1D,KAAK,cAAc;KAAC;KAAe;KAAQ;KAAM,CAAC,EAClD,QACD;AACD,QAAI,CAAC,OAAO,GAAI,QAAO,YAAY,OAAO,OAAO;AACjD,QAAI,OAAO,KAAK,WAAW,MAAO,QAAO,YAAY,IAAI;AACzD,WAAO;;GAGT,cAAc,OACZ,UACkD;IAClD,MAAM,aAAa,MAAM,eAAe,MAAM;AAC9C,QAAI,WAAY,QAAO;IACvB,MAAM,SAAS,MAAM,KAAK,QACxB,OAAO,WACL,KAAK,UAAU,aAAa,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,EAChE,KAAK,cAAc;KAAC;KAAqB;KAAQ;KAAM,CAAC,EACxD,QACD;AACD,WAAO,OAAO,KAAK,SAAS,YAAY,OAAO,OAAO;;GAGxD,WAAW,OAAO,UAAkD;IAClE,MAAM,aAAa,MAAM,eAAe,MAAM;AAC9C,QAAI,WAAY,QAAO;IACvB,MAAM,SAAS,MAAM,KAAK,QACxB,OAAO,WACL,KAAK,UAAU,UAAU,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,EAC7D,KAAK,gBAAgB,EACrB,QACD;AACD,WAAO,OAAO,KAAK,SAAS,YAAY,OAAO,OAAO;;GAGxD,QAAQ,YAAqD;IAC3D,MAAM,SAAS,MAAM,KAAK,QACxB,OAAO,WACL,KAAK,UAAU,OAAO,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,EAC1D,KAAK,cAAc,CAAC,eAAe,OAAO,CAAC,EAC3C,QACD;AACD,WAAO,OAAO,KAAK,SAAS,YAAY,OAAO,OAAO;;GAEzD;;;;;;CAOH,AAAQ,YACN,KACA,KAG0C;EAC1C,MAAM,SAAS,IAAI,OAAO;AAC1B,MAAI,CAAC,KAAK,QAAQ,SAAS,OAAO,EAAE;GAClC,MAAM,UAAU,OAAO,QAAQ,mBAAmB,GAAG;AACrD,OAAI,OAAO,IAAI,CAAC,KAAK;IACnB,OAAO,gBAAgB,QAAQ;IAC/B,QAAQ,KAAK;IACd,CAAC;AACF,UAAO;IAAE,QAAQ;IAAW,OAAO;IAAW;;EAEhD,MAAM,QAAQ,KAAK,OAAO;AAC1B,MAAI,CAAC,OAAO;AACV,OAAI,OAAO,IAAI,CAAC,KAAK;IACnB,OAAO,QAAQ,OAAO;IACtB,QAAQ,KAAK;IACd,CAAC;AACF,UAAO;IAAE,QAAQ;IAAW,OAAO;IAAW;;AAEhD,SAAO;GAAE;GAAQ;GAAO;;CAG1B,AAAQ,iBAAiB,KAAuB,QAAsB;AACpE,MAAI,OAAO,OAAO,CAAC,KAAK;GACtB,OAAO,aAAa,WAAW;GAC/B,QAAQ,KAAK;GACd,CAAC;;;;;;;CAQJ,AAAQ,gBACN,QACA,WACqC;AACrC,MACE,cAAc,WACb,OAAO,cAAc,YACpB,cAAc,QACd,MAAM,QAAQ,UAAU,EAE1B,OAAM,IAAI,gBAAgB,gCAAgC;EAG5D,MAAM,YAAY,KAAK,WAAW;AAClC,MAAI,WAAW,QAAQ;AAErB,OAAI,CADW,UAAU,OAAO,UAAU,aAAa,EAAE,CAAC,CAC9C,QACV,OAAM,IAAI,gBAAgB,yBAAyB;AAIrD,UAAO;;AAIT,MAAI,cAAc,QAAW;AAC3B,OAAI,CAAC,WAAW,SACd,OAAM,IAAI,gBAAgB,sCAAsC;GAElE,MAAM,WAAW,OAAO,KAAK,UAAqC,CAAC;AACnE,OAAI,WAAW,2BACb,OAAM,IAAI,gBACR,wBAAwB,SAAS,6CAA6C,2BAA2B,GAC1G;;AAGL,SAAO;;CAGT,MAAc,WACZ,KACA,KACe;EACf,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK,IAAI;AAC7C,MAAI,CAAC,OAAQ;EAEb,MAAM,SAAS,IAAI,MAAM,WAAW;AAEpC,MAAI;GACF,MAAM,SAAS,KAAK,gBAAgB,QAAQ,IAAI,MAAM,OAAO;GAC7D,MAAM,MAAM,KAAK,aAAa,OAAO;AAErC,OAAI,QAAQ;IACV,MAAM,iBAA0C,EAC9C,SAAS,sBACV;AACD,UAAM,KAAK,cACT,MACC,WAAW,IAAI,WAAW,QAAQ,OAAO,EAC1C,eACD;UACI;IACL,MAAM,SAAS,MAAM,IAAI,OAAO,OAAO;AACvC,QAAI,CAAC,OAAO,IAAI;AACd,UAAK,iBAAiB,KAAK,OAAO,OAAO;AACzC;;AAEF,QAAI,KAAK,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC;;WAElC,OAAO;AACd,OAAI,iBAAiB,iBAAiB;AACpC,QAAI,CAAC,IAAI,YACP,KAAI,OAAO,IAAI,CAAC,KAAK;KAAE,OAAO,MAAM;KAAS,QAAQ,KAAK;KAAM,CAAC;AAEnE;;AAEF,UAAO,MAAM,6BAA6B,QAAQ,MAAM;AACxD,OAAI,CAAC,IAAI,YACP,KAAI,OAAO,IAAI,CAAC,KAAK;IAAE,OAAO;IAAc,QAAQ,KAAK;IAAM,CAAC;;;CAKtE,aAAa,QAAoB;AAC/B,OAAK,MAAM,QAAQ;GACjB,MAAM;GACN,QAAQ;GACR,MAAM;GACN,UAAU,KAAK,QAAQ,KAAK,WAAW,KAAK,IAAI;GACjD,CAAC;AAGF,OAAK,MAAM,QAAQ;GACjB,MAAM;GACN,QAAQ;GACR,MAAM;GACN,SAAS,OAAO,KAAsB,QAA0B;IAC9D,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK,IAAI;AAC7C,QAAI,CAAC,OAAQ;IAEb,MAAM,QAAQ,KAAK,IACjB,GACA,KAAK,IAAI,OAAO,SAAS,IAAI,MAAM,OAAiB,GAAG,IAAI,IAAI,IAAI,CACpE;AAED,QAAI;KAEF,MAAM,SAAS,MADH,KAAK,aAAa,OAAO,CACZ,SAAS,EAAE,OAAO,CAAC;AAC5C,SAAI,CAAC,OAAO,IAAI;AACd,WAAK,iBAAiB,KAAK,OAAO,OAAO;AACzC;;AAEF,SAAI,KAAK,EAAE,MAAM,OAAO,MAAM,CAAC;aACxB,OAAO;AACd,YAAO,MAAM,mCAAmC,QAAQ,MAAM;AAC9D,SACG,OAAO,IAAI,CACX,KAAK;MAAE,OAAO;MAAoB,QAAQ,KAAK;MAAM,CAAC;;;GAG9D,CAAC;AAGF,OAAK,MAAM,QAAQ;GACjB,MAAM;GACN,QAAQ;GACR,MAAM;GACN,SAAS,OAAO,KAAsB,QAA0B;IAC9D,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK,IAAI;AAC7C,QAAI,CAAC,OAAQ;IAEb,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,OAAO,GAAG;AACnD,QAAI,OAAO,MAAM,MAAM,IAAI,SAAS,GAAG;AACrC,SAAI,OAAO,IAAI,CAAC,KAAK;MAAE,OAAO;MAAiB,QAAQ,KAAK;MAAM,CAAC;AACnE;;AAGF,QAAI;KAEF,MAAM,SAAS,MADH,KAAK,aAAa,OAAO,CACZ,OAAO,MAAM;AACtC,SAAI,CAAC,OAAO,IAAI;AACd,WAAK,iBAAiB,KAAK,OAAO,OAAO;AACzC;;AAEF,SAAI,KAAK,OAAO,KAAK;aACd,OAAO;AACd,YAAO,MACL,wCACA,QACA,OACA,MACD;AACD,SAAI,OAAO,IAAI,CAAC,KAAK;MAAE,OAAO;MAAkB,QAAQ,KAAK;MAAM,CAAC;;;GAGzE,CAAC;AAGF,OAAK,MAAM,QAAQ;GACjB,MAAM;GACN,QAAQ;GACR,MAAM;GACN,SAAS,OAAO,KAAsB,QAA0B;IAC9D,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK,IAAI;AAC7C,QAAI,CAAC,OAAQ;AAEb,QAAI;KAEF,MAAM,SAAS,MADH,KAAK,aAAa,OAAO,CACZ,SAAS;AAClC,SAAI,CAAC,OAAO,IAAI;AACd,WAAK,iBAAiB,KAAK,OAAO,OAAO;AACzC;;AAEF,SAAI,KAAK;MACP,QAAQ,OAAO,MAAM,OAAO,oBAAoB;MAChD,KAAK,OAAO,QAAQ;MACrB,CAAC;aACK,OAAO;AACd,YAAO,MAAM,sCAAsC,QAAQ,MAAM;AACjE,SACG,OAAO,IAAI,CACX,KAAK;MAAE,OAAO;MAAuB,QAAQ,KAAK;MAAM,CAAC;;;GAGjE,CAAC;AAGF,OAAK,MAAM,QAAQ;GACjB,MAAM;GACN,QAAQ;GACR,MAAM;GACN,SAAS,OAAO,KAAsB,QAA0B;IAC9D,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK,IAAI;AAC7C,QAAI,CAAC,OAAQ;IAEb,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,OAAO,GAAG;AACnD,QAAI,OAAO,MAAM,MAAM,IAAI,SAAS,GAAG;AACrC,SAAI,OAAO,IAAI,CAAC,KAAK;MAAE,OAAO;MAAiB,QAAQ,KAAK;MAAM,CAAC;AACnE;;AAGF,QAAI;KAEF,MAAM,SAAS,MADH,KAAK,aAAa,OAAO,CACZ,UAAU,MAAM;AACzC,SAAI,CAAC,OAAO,IAAI;AACd,WAAK,iBAAiB,KAAK,OAAO,OAAO;AACzC;;AAEF,SAAI,OAAO,IAAI,CAAC,KAAK;aACd,OAAO;AACd,YAAO,MACL,2CACA,QACA,OACA,MACD;AACD,SACG,OAAO,IAAI,CACX,KAAK;MAAE,OAAO;MAAqB,QAAQ,KAAK;MAAM,CAAC;;;GAG/D,CAAC;;CAGJ,UAAsB;EACpB,MAAM,cAAc,WAA2B;AAC7C,OAAI,CAAC,KAAK,QAAQ,SAAS,OAAO,CAChC,OAAM,IAAI,MACR,gBAAgB,OAAO,qBAAqB,KAAK,QAAQ,KAAK,KAAK,GACpE;AAGH,UAAO,KAAK,aAAa,OAAO;;AAGlC,SAAO;;CAGT,eAAwC;EACtC,MAAM,OACJ,EAAE;AACJ,OAAK,MAAM,OAAO,KAAK,SAAS;GAC9B,MAAM,SAAS,KAAK,WAAW;AAC/B,QAAK,OAAO;IACV,QAAQ,QAAQ,SAAS,aAAa,OAAO,OAAO,GAAG;IACvD,UAAU,QAAQ,YAAY;IAC/B;;AAEH,SAAO,EAAE,MAAM;;;;;;AAOnB,MAAa,OAAO,SAAS,WAAW"}
@@ -1,4 +1,4 @@
1
- import { BasePluginConfig, IAppRequest } from "../../shared/src/plugin.js";
1
+ import { BasePluginConfig } from "../../shared/src/plugin.js";
2
2
  import "../../shared/src/index.js";
3
3
  import { jobs } from "../../workspace-client/types.js";
4
4
  import "../../workspace-client/index.js";
@@ -54,13 +54,6 @@ interface IJobsConfig extends BasePluginConfig {
54
54
  /** Named jobs to expose. Each key becomes a job accessor. */
55
55
  jobs?: Record<string, JobConfig>;
56
56
  }
57
- /**
58
- * Job handle returned by `appkit.jobs("etl")`.
59
- * Supports OBO access via `.asUser(req)`.
60
- */
61
- type JobHandle = JobAPI & {
62
- asUser: (req: IAppRequest) => JobAPI;
63
- };
64
57
  /**
65
58
  * Public API shape of the jobs plugin.
66
59
  * Callable to select a job by key.
@@ -74,12 +67,9 @@ type JobHandle = JobAPI & {
74
67
  * for await (const status of appkit.jobs("etl").runAndWait()) {
75
68
  * console.log(status.status, status.run);
76
69
  * }
77
- *
78
- * // OBO access
79
- * await appkit.jobs("etl").asUser(req).runNow();
80
70
  * ```
81
71
  */
82
- type JobsExport = (jobKey: string) => JobHandle;
72
+ type JobsExport = (jobKey: string) => JobAPI;
83
73
  //#endregion
84
- export { IJobsConfig, JobAPI, JobConfig, JobHandle, JobsExport };
74
+ export { IJobsConfig, JobAPI, JobConfig, JobsExport };
85
75
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/plugins/jobs/types.ts"],"mappings":";;;;;;;;;;KAMY,QAAA;;UASK,SAAA;;EAEf,WAAA;EAXkB;EAalB,QAAA,GAAW,QAAA;EAbO;EAelB,MAAA,GAAS,CAAA,CAAE,OAAA,CAAQ,MAAA;AAAA;;UAIJ,YAAA;EACf,MAAA;EACA,SAAA;EACA,GAAA,EAAK,IAAA,CAAK,GAAA;AAAA;;UAIK,MAAA;EAbf;EAeA,MAAA,CACE,MAAA,GAAS,MAAA,oBACR,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,cAAA;EAfhC;EAiBA,UAAA,CACE,MAAA,GAAS,MAAA,mBACT,MAAA,GAAS,WAAA,GACR,cAAA,CAAe,YAAA;EApBP;EAsBX,OAAA,IAAW,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,OAAA;EAtBf;EAwBzB,QAAA,CAAS,OAAA;IACP,KAAA;EAAA,IACE,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,OAAA;;EAEjC,MAAA,CAAO,KAAA,WAAgB,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,GAAA;EAvBpD;EAyBA,YAAA,CAAa,KAAA,WAAgB,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,SAAA;EAvB1D;EAyBA,SAAA,CAAU,KAAA,WAAgB,OAAA,CAAQ,eAAA;EAzBxB;EA2BV,MAAA,IAAU,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,GAAA;AAAA;AAvBzC;AAAA,UA2BiB,WAAA,SAAoB,gBAAA;;EAEnC,OAAA;EAzB2B;EA2B3B,cAAA;EA3BG;EA6BH,IAAA,GAAO,MAAA,SAAe,SAAA;AAAA;;;;;KAOZ,SAAA,GAAY,MAAA;EACtB,MAAA,GAAS,GAAA,EAAK,WAAA,KAAgB,MAAA;AAAA;;;;;;;;;;;;;;;;;;;KAqBpB,UAAA,IAAc,MAAA,aAAmB,SAAA"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/plugins/jobs/types.ts"],"mappings":";;;;;;;;;;KAMY,QAAA;;UASK,SAAA;;EAEf,WAAA;EAXkB;EAalB,QAAA,GAAW,QAAA;EAbO;EAelB,MAAA,GAAS,CAAA,CAAE,OAAA,CAAQ,MAAA;AAAA;;UAIJ,YAAA;EACf,MAAA;EACA,SAAA;EACA,GAAA,EAAK,IAAA,CAAK,GAAA;AAAA;;UAIK,MAAA;EAbf;EAeA,MAAA,CACE,MAAA,GAAS,MAAA,oBACR,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,cAAA;EAfhC;EAiBA,UAAA,CACE,MAAA,GAAS,MAAA,mBACT,MAAA,GAAS,WAAA,GACR,cAAA,CAAe,YAAA;EApBP;EAsBX,OAAA,IAAW,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,OAAA;EAtBf;EAwBzB,QAAA,CAAS,OAAA;IACP,KAAA;EAAA,IACE,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,OAAA;;EAEjC,MAAA,CAAO,KAAA,WAAgB,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,GAAA;EAvBpD;EAyBA,YAAA,CAAa,KAAA,WAAgB,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,SAAA;EAvB1D;EAyBA,SAAA,CAAU,KAAA,WAAgB,OAAA,CAAQ,eAAA;EAzBxB;EA2BV,MAAA,IAAU,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,GAAA;AAAA;AAvBzC;AAAA,UA2BiB,WAAA,SAAoB,gBAAA;;EAEnC,OAAA;EAzB2B;EA2B3B,cAAA;EA3BG;EA6BH,IAAA,GAAO,MAAA,SAAe,SAAA;AAAA;;;;;;;;;;;;;;;;KAkBZ,UAAA,IAAc,MAAA,aAAmB,MAAA"}
@@ -162,9 +162,9 @@ declare const pluginManifestSchema: z.ZodObject<{
162
162
  type: z.ZodLiteral<"sql_warehouse">;
163
163
  }, z.core.$strict>, z.ZodObject<{
164
164
  permission: z.ZodEnum<{
165
+ CAN_QUERY: "CAN_QUERY";
165
166
  CAN_VIEW: "CAN_VIEW";
166
167
  CAN_MANAGE: "CAN_MANAGE";
167
- CAN_QUERY: "CAN_QUERY";
168
168
  }>;
169
169
  alias: z.ZodString;
170
170
  resourceKey: z.ZodString;
@@ -683,9 +683,9 @@ declare const pluginManifestSchema: z.ZodObject<{
683
683
  type: z.ZodLiteral<"sql_warehouse">;
684
684
  }, z.core.$strict>, z.ZodObject<{
685
685
  permission: z.ZodEnum<{
686
+ CAN_QUERY: "CAN_QUERY";
686
687
  CAN_VIEW: "CAN_VIEW";
687
688
  CAN_MANAGE: "CAN_MANAGE";
688
- CAN_QUERY: "CAN_QUERY";
689
689
  }>;
690
690
  alias: z.ZodString;
691
691
  resourceKey: z.ZodString;
@@ -1,7 +1,7 @@
1
1
  # Type Alias: JobsExport()
2
2
 
3
3
  ```ts
4
- type JobsExport = (jobKey: string) => JobHandle;
4
+ type JobsExport = (jobKey: string) => JobAPI;
5
5
 
6
6
  ```
7
7
 
@@ -15,7 +15,7 @@ Public API shape of the jobs plugin. Callable to select a job by key.
15
15
 
16
16
  ## Returns[​](#returns "Direct link to Returns")
17
17
 
18
- [`JobHandle`](./docs/api/appkit/TypeAlias.JobHandle.md)
18
+ [`JobAPI`](./docs/api/appkit/Interface.JobAPI.md)
19
19
 
20
20
  ## Example[​](#example "Direct link to Example")
21
21
 
@@ -28,7 +28,4 @@ for await (const status of appkit.jobs("etl").runAndWait()) {
28
28
  console.log(status.status, status.run);
29
29
  }
30
30
 
31
- // OBO access
32
- await appkit.jobs("etl").asUser(req).runNow();
33
-
34
31
  ```
@@ -110,7 +110,6 @@ Documentation merge entry for Typedoc — combines the stable `@databricks/appki
110
110
  | [FilePolicy](./docs/api/appkit/TypeAlias.FilePolicy.md) | A policy function that decides whether `user` may perform `action` on `resource`. Return `true` to allow, `false` to deny. |
111
111
  | [HostedTool](./docs/api/appkit/TypeAlias.HostedTool.md) | - |
112
112
  | [IAppRouter](./docs/api/appkit/TypeAlias.IAppRouter.md) | Express router type for plugin route registration |
113
- | [JobHandle](./docs/api/appkit/TypeAlias.JobHandle.md) | Job handle returned by `appkit.jobs("etl")`. Supports OBO access via `.asUser(req)`. |
114
113
  | [JobsExport](./docs/api/appkit/TypeAlias.JobsExport.md) | Public API shape of the jobs plugin. Callable to select a job by key. |
115
114
  | [PluginData](./docs/api/appkit/TypeAlias.PluginData.md) | Tuple of plugin class, config, and name. Created by `toPlugin()` and passed to `createApp()`. |
116
115
  | [Plugins](./docs/api/appkit/TypeAlias.Plugins.md) | Plugin map passed to the function form of [AgentDefinition.tools](./docs/api/appkit/Interface.AgentDefinition.md#tools). Each entry exposes a `.toolkit(opts?)` method that returns a record of [ToolkitEntry](./docs/api/appkit/Interface.ToolkitEntry.md) markers ready to be spread into a tool record. |
@@ -9,7 +9,6 @@ Trigger and monitor [Databricks Lakeflow Jobs](https://docs.databricks.com/en/jo
9
9
  * Run-and-wait with SSE streaming status updates
10
10
  * Parameter validation with Zod schemas
11
11
  * Task-type-aware parameter mapping (notebook, python\_wheel, sql, etc.)
12
- * Optional on-behalf-of (OBO) user execution via `.asUser(req)`
13
12
 
14
13
  ## Basic usage[​](#basic-usage "Direct link to Basic usage")
15
14
 
@@ -127,19 +126,7 @@ When `taskType` is omitted, parameters are passed through to the SDK as-is.
127
126
 
128
127
  ## Execution context[​](#execution-context "Direct link to Execution context")
129
128
 
130
- HTTP routes run as the **app's service principal** by default. Jobs are typically shared infrastructure, and the app's resource binding (`databricks.yml`) grants `CAN_MANAGE_RUN` to the SP — so users trigger runs without needing individual grants.
131
-
132
- Per-run attribution in the Jobs UI will show the app's SP, not the human user. If you need user-level attribution (or want the Databricks permission check to use the user's grants), opt in to OBO explicitly in a custom handler via `.asUser(req)`:
133
-
134
- ```ts
135
- // Default: runs as the app's service principal
136
- const result = await AppKit.jobs("etl").runNow({ startDate: "2025-01-01" });
137
-
138
- // Opt-in: runs as the logged-in user (requires `jobs.jobs` in
139
- // `databricks.yml` user_api_scopes AND the user's own CAN_MANAGE_RUN grant)
140
- const result = await AppKit.jobs("etl").asUser(req).runNow({ startDate: "2025-01-01" });
141
-
142
- ```
129
+ Jobs always run as the **app's service principal**. The app's resource binding (`databricks.yml`) grants `CAN_MANAGE_RUN` to the SP, so users trigger runs without needing individual grants. Per-run attribution in the Jobs UI shows the app's SP, not the human user.
143
130
 
144
131
  ## HTTP endpoints[​](#http-endpoints "Direct link to HTTP endpoints")
145
132
 
package/llms.txt CHANGED
@@ -186,7 +186,6 @@ npx @databricks/appkit docs <query>
186
186
  - [Type Alias: FilePolicy()](./docs/api/appkit/TypeAlias.FilePolicy.md): A policy function that decides whether user may perform action on
187
187
  - [Type Alias: HostedTool](./docs/api/appkit/TypeAlias.HostedTool.md)
188
188
  - [Type Alias: IAppRouter](./docs/api/appkit/TypeAlias.IAppRouter.md): Express router type for plugin route registration
189
- - [Type Alias: JobHandle](./docs/api/appkit/TypeAlias.JobHandle.md): Job handle returned by appkit.jobs("etl").
190
189
  - [Type Alias: JobsExport()](./docs/api/appkit/TypeAlias.JobsExport.md): Public API shape of the jobs plugin.
191
190
  - [Type Alias: PluginData<T, U, N>](./docs/api/appkit/TypeAlias.PluginData.md): Tuple of plugin class, config, and name. Created by toPlugin() and passed to createApp().
192
191
  - [Type Alias: Plugins](./docs/api/appkit/TypeAlias.Plugins.md): Plugin map passed to the function form of AgentDefinition.tools.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@databricks/appkit",
3
3
  "type": "module",
4
- "version": "0.55.0",
4
+ "version": "0.55.1",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "bin": {
package/sbom.cdx.json CHANGED
@@ -1 +1 @@
1
- {"bomFormat":"CycloneDX","specVersion":"1.6","serialNumber":"urn:uuid:b42b70ed-0d4b-4ecc-9109-d4b5d614c5ab","version":1,"metadata":{"timestamp":"2026-08-05T14:55:52Z","tools":{"components":[{"group":"@cyclonedx","name":"cdxgen","version":"12.1.2","purl":"pkg:npm/%40cyclonedx/cdxgen@12.1.2","type":"application","bom-ref":"pkg:npm/@cyclonedx/cdxgen@12.1.2","publisher":"OWASP Foundation","authors":[{"name":"OWASP Foundation"}]}]},"authors":[{"name":"OWASP Foundation"}],"lifecycles":[{"phase":"build"}],"component":{"name":"appkit","group":"@databricks","version":"0.55.0","purl":"pkg:npm/%40databricks/appkit@0.55.0","bom-ref":"pkg:npm/@databricks/appkit@0.55.0","type":"application","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"externalReferences":[{"type":"vcs","url":"git+https://github.com/databricks/appkit.git"}]},"properties":[{"name":"cdx:bom:componentTypes","value":"npm"},{"name":"cdx:bom:componentNamespaces","value":"@ast-grep\\n@databricks\\n@opentelemetry"},{"name":"cdx:bom:componentSrcFiles","value":"packages/appkit/node_modules/@ast-grep/napi/package.json\\npackages/appkit/node_modules/@databricks/lakebase/package.json\\npackages/appkit/node_modules/@databricks/sdk-experimental/package.json\\npackages/appkit/node_modules/@opentelemetry/api-logs/package.json\\npackages/appkit/node_modules/@opentelemetry/api/package.json\\npackages/appkit/node_modules/@opentelemetry/auto-instrumentations-node/package.json\\npackages/appkit/node_modules/@opentelemetry/exporter-logs-otlp-proto/package.json\\npackages/appkit/node_modules/@opentelemetry/exporter-metrics-otlp-proto/package.json\\npackages/appkit/node_modules/@opentelemetry/exporter-trace-otlp-proto/package.json\\npackages/appkit/node_modules/@opentelemetry/instrumentation-express/package.json\\npackages/appkit/node_modules/@opentelemetry/instrumentation-http/package.json\\npackages/appkit/node_modules/@opentelemetry/instrumentation/package.json\\npackages/appkit/node_modules/@opentelemetry/resources/package.json\\npackages/appkit/node_modules/@opentelemetry/sdk-logs/package.json\\npackages/appkit/node_modules/@opentelemetry/sdk-metrics/package.json\\npackages/appkit/node_modules/@opentelemetry/sdk-node/package.json\\npackages/appkit/node_modules/@opentelemetry/sdk-trace-base/package.json\\npackages/appkit/node_modules/@opentelemetry/semantic-conventions/package.json\\npackages/appkit/node_modules/apache-arrow/package.json\\npackages/appkit/node_modules/dotenv/package.json\\npackages/appkit/node_modules/drizzle-orm/package.json\\npackages/appkit/node_modules/express/package.json\\npackages/appkit/node_modules/get-port/package.json\\npackages/appkit/node_modules/js-yaml/package.json\\npackages/appkit/node_modules/magic-string/package.json\\npackages/appkit/node_modules/obug/package.json\\npackages/appkit/node_modules/pg/package.json\\npackages/appkit/node_modules/picocolors/package.json\\npackages/appkit/node_modules/semver/package.json\\npackages/appkit/node_modules/shared/package.json\\npackages/appkit/node_modules/ws/package.json\\npackages/appkit/node_modules/zod/package.json"}]},"components":[{"group":"@ast-grep","name":"napi","version":"0.37.0","description":"Search and Rewrite code at large scale using precise AST pattern","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/%40ast-grep/napi@0.37.0","externalReferences":[{"type":"vcs","url":"https://ast-grep.github.io"}],"type":"library","bom-ref":"pkg:npm/@ast-grep/napi@0.37.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@ast-grep/napi/package.json"},{"name":"ImportedModules","value":"@ast-grep/napi,Lang,@ast-grep/napi/Lang,parse,@ast-grep/napi/parse,SgNode,@ast-grep/napi/SgNode"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@ast-grep/napi/package.json"}],"concludedValue":"packages/appkit/node_modules/@ast-grep/napi/package.json"}],"occurrences":[{"location":"dist/plugins/server/react-source-loc-vite-plugin.js#2"},{"location":"dist/type-generator/serving/server-file-extractor.js#4"},{"location":"tmp/dist/cli/commands/codemod/on-plugins-ready.js#4"},{"location":"tmp/dist/cli/commands/lint.js#4"},{"location":"tmp/dist/cli/commands/plugin/sync/sync.js#8"},{"location":"tmp/dist/plugins/server/react-source-loc-vite-plugin.js#2"},{"location":"tmp/dist/type-generator/serving/server-file-extractor.js#4"},{"location":"src/plugins/server/react-source-loc-vite-plugin.ts#2"},{"location":"src/type-generator/serving/server-file-extractor.ts#3"}]}},{"group":"@databricks","name":"lakebase","version":"0.5.0","description":"PostgreSQL driver for Databricks Lakebase Autoscaling with automatic OAuth token refresh","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40databricks/lakebase@0.5.0","externalReferences":[{"type":"vcs","url":"git+https://github.com/databricks/appkit.git"}],"type":"library","bom-ref":"pkg:npm/@databricks/lakebase@0.5.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@databricks/lakebase/package.json"},{"name":"ExportedModules","value":"@databricks/lakebase,DatabaseCredential,@databricks/lakebase/DatabaseCredential,GenerateDatabaseCredentialRequest,@databricks/lakebase/GenerateDatabaseCredentialRequest,generateDatabaseCredential,@databricks/lakebase/generateDatabaseCredential,getLakebaseOrmConfig,@databricks/lakebase/getLakebaseOrmConfig,getLakebasePgConfig,@databricks/lakebase/getLakebasePgConfig,getUsernameWithApiLookup,@databricks/lakebase/getUsernameWithApiLookup,getWorkspaceClient,@databricks/lakebase/getWorkspaceClient,LakebasePoolConfig,@databricks/lakebase/LakebasePoolConfig,RequestedClaims,@databricks/lakebase/RequestedClaims,RequestedClaimsPermissionSet,@databricks/lakebase/RequestedClaimsPermissionSet,RequestedResource,@databricks/lakebase/RequestedResource"},{"name":"ImportedModules","value":"@databricks/lakebase,RequestedClaimsPermissionSet,@databricks/lakebase/RequestedClaimsPermissionSet,createLakebasePool,@databricks/lakebase/createLakebasePool,generateDatabaseCredential,@databricks/lakebase/generateDatabaseCredential,getLakebaseOrmConfig,@databricks/lakebase/getLakebaseOrmConfig,getLakebasePgConfig,@databricks/lakebase/getLakebasePgConfig,getUsernameWithApiLookup,@databricks/lakebase/getUsernameWithApiLookup,getWorkspaceClient,@databricks/lakebase/getWorkspaceClient,LakebasePoolConfig,@databricks/lakebase/LakebasePoolConfig"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@databricks/lakebase/package.json"}],"concludedValue":"packages/appkit/node_modules/@databricks/lakebase/package.json"}],"occurrences":[{"location":"dist/connectors/lakebase/index.js#4"},{"location":"tmp/dist/connectors/lakebase/index.js#4"},{"location":"src/connectors/lakebase/index.ts#4"},{"location":"src/connectors/lakebase/index.ts#37"},{"location":"src/connectors/lakebase/pool-manager.ts#1"}]},"tags":["token"]},{"group":"@databricks","name":"sdk-experimental","version":"0.17.0","description":"Databricks SDK","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40databricks/sdk-experimental@0.17.0","externalReferences":[{"type":"vcs","url":"https://github.com/databricks/databricks-sdk-js"},{"type":"vcs","url":"git+https://github.com/databricks/databricks-sdk-js.git#main"}],"type":"library","bom-ref":"pkg:npm/@databricks/sdk-experimental@0.17.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@databricks/sdk-experimental/package.json"},{"name":"ExportedModules","value":"@databricks/sdk-experimental,@databricks/sdk-experimental/apis/dashboards,@databricks/sdk-experimental/wait,CancellationToken,@databricks/sdk-experimental/CancellationToken,ClientOptions,@databricks/sdk-experimental/ClientOptions,files,@databricks/sdk-experimental/files,jobs,@databricks/sdk-experimental/jobs,serving,@databricks/sdk-experimental/serving,@databricks/sdk-experimental/sql"},{"name":"ImportedModules","value":"@databricks/sdk-experimental,ApiError,@databricks/sdk-experimental/ApiError,ClientOptions,@databricks/sdk-experimental/ClientOptions,WorkspaceClient,@databricks/sdk-experimental/WorkspaceClient,@databricks/sdk-experimental/dist/apis/dashboards,@databricks/sdk-experimental/dist/wait"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@databricks/sdk-experimental/package.json"}],"concludedValue":"packages/appkit/node_modules/@databricks/sdk-experimental/package.json"}],"occurrences":[{"location":"dist/workspace-client/errors.js#1"},{"location":"dist/workspace-client/legacy.js#1"},{"location":"tmp/dist/workspace-client/errors.js#1"},{"location":"tmp/dist/workspace-client/legacy.js#1"},{"location":"src/workspace-client/errors.ts#14"},{"location":"src/workspace-client/legacy.ts#16"},{"location":"src/workspace-client/legacy.ts#17"},{"location":"src/workspace-client/legacy.ts#71"},{"location":"src/workspace-client/types.ts#25"},{"location":"src/workspace-client/legacy.ts#93"},{"location":"src/workspace-client/legacy.ts#94"}]},"tags":["sql"]},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"api-logs","version":"0.219.0","description":"Public logs API for OpenTelemetry","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/api-logs@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/api-logs"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/api-logs@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/api-logs/package.json"},{"name":"ExportedModules","value":"@opentelemetry/api-logs"},{"name":"ImportedModules","value":"@opentelemetry/api-logs,SeverityNumber,@opentelemetry/api-logs/SeverityNumber,logs,@opentelemetry/api-logs/logs,createNoopLogger,@opentelemetry/api-logs/createNoopLogger,Logger,@opentelemetry/api-logs/Logger,LogRecord,@opentelemetry/api-logs/LogRecord"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/api-logs/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/api-logs/package.json"}],"occurrences":[{"location":"dist/logging/wide-event-emitter.js#1"},{"location":"dist/telemetry/index.js#6"},{"location":"dist/telemetry/noop.js#2"},{"location":"dist/telemetry/telemetry-provider.js#4"},{"location":"tmp/dist/logging/wide-event-emitter.js#1"},{"location":"tmp/dist/telemetry/index.js#6"},{"location":"tmp/dist/telemetry/noop.js#2"},{"location":"tmp/dist/telemetry/telemetry-provider.js#4"},{"location":"src/logging/wide-event-emitter.ts#1"},{"location":"src/telemetry/index.ts#7"},{"location":"src/telemetry/noop.ts#23"},{"location":"src/telemetry/telemetry-provider.ts#3"},{"location":"src/telemetry/types.ts#2"}]},"tags":["api"]},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"api","version":"1.9.0","description":"Public API for OpenTelemetry","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/api@1.9.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/api"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/api@1.9.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/api/package.json"},{"name":"ExportedModules","value":"@opentelemetry/api,@opentelemetry/api-logs,Counter,@opentelemetry/api/Counter,Histogram,@opentelemetry/api/Histogram,Span,@opentelemetry/api/Span,SpanKind,@opentelemetry/api/SpanKind,SpanStatusCode,@opentelemetry/api/SpanStatusCode"},{"name":"ImportedModules","value":"@opentelemetry/api,trace,@opentelemetry/api/trace,context,@opentelemetry/api/context,createContextKey,@opentelemetry/api/createContextKey,SpanKind,@opentelemetry/api/SpanKind,SpanStatusCode,@opentelemetry/api/SpanStatusCode,INVALID_SPAN_CONTEXT,@opentelemetry/api/INVALID_SPAN_CONTEXT,createNoopMeter,@opentelemetry/api/createNoopMeter,metrics,@opentelemetry/api/metrics,Context,@opentelemetry/api/Context,Span,@opentelemetry/api/Span,SpanContext,@opentelemetry/api/SpanContext,SpanOptions,@opentelemetry/api/SpanOptions,Tracer,@opentelemetry/api/Tracer,Meter,@opentelemetry/api/Meter,Attributes,@opentelemetry/api/Attributes,Link,@opentelemetry/api/Link"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/api/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/api/package.json"}],"occurrences":[{"location":"dist/logging/logger.js#6"},{"location":"dist/plugin/plugin.js#23"},{"location":"dist/stream/stream-manager.js#12"},{"location":"dist/telemetry/index.js#5"},{"location":"dist/telemetry/noop.js#1"},{"location":"dist/telemetry/telemetry-provider.js#3"},{"location":"tmp/dist/logging/logger.js#6"},{"location":"tmp/dist/plugin/plugin.js#23"},{"location":"tmp/dist/stream/stream-manager.js#12"},{"location":"tmp/dist/telemetry/index.js#5"},{"location":"tmp/dist/telemetry/noop.js#1"},{"location":"tmp/dist/telemetry/telemetry-provider.js#3"},{"location":"src/logging/logger.ts#3"},{"location":"src/plugin/plugin.ts#1"},{"location":"src/stream/stream-manager.ts#2"},{"location":"src/stream/types.ts#1"},{"location":"src/telemetry/index.ts#5"},{"location":"src/telemetry/index.ts#6"},{"location":"src/telemetry/noop.ts#17"},{"location":"src/telemetry/noop.ts#22"},{"location":"src/telemetry/telemetry-provider.ts#1"},{"location":"src/telemetry/telemetry-provider.ts#2"},{"location":"src/telemetry/trace-sampler.ts#1"},{"location":"src/telemetry/types.ts#1"}]},"tags":["api"]},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"auto-instrumentations-node","version":"0.77.0","description":"Metapackage which bundles opentelemetry node core and contrib instrumentations","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/auto-instrumentations-node@0.77.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/auto-instrumentations-node#readme"},{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js-contrib.git"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/auto-instrumentations-node@0.77.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/auto-instrumentations-node/package.json"},{"name":"ImportedModules","value":"@opentelemetry/auto-instrumentations-node,getNodeAutoInstrumentations,@opentelemetry/auto-instrumentations-node/getNodeAutoInstrumentations"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/auto-instrumentations-node/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/auto-instrumentations-node/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#4"},{"location":"tmp/dist/telemetry/telemetry-manager.js#4"},{"location":"src/telemetry/telemetry-manager.ts#1"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"exporter-logs-otlp-proto","version":"0.219.0","description":"An OTLP exporter to send logs using protobuf over HTTP","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/exporter-logs-otlp-proto@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/exporter-logs-otlp-proto"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/exporter-logs-otlp-proto@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/exporter-logs-otlp-proto/package.json"},{"name":"ImportedModules","value":"@opentelemetry/exporter-logs-otlp-proto,OTLPLogExporter,@opentelemetry/exporter-logs-otlp-proto/OTLPLogExporter"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/exporter-logs-otlp-proto/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/exporter-logs-otlp-proto/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#5"},{"location":"tmp/dist/telemetry/telemetry-manager.js#5"},{"location":"src/telemetry/telemetry-manager.ts#2"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"exporter-metrics-otlp-proto","version":"0.219.0","description":"OpenTelemetry Collector Metrics Exporter allows user to send collected metrics to the OpenTelemetry Collector using protobuf over HTTP","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/exporter-metrics-otlp-proto@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-exporter-metrics-otlp-proto"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/exporter-metrics-otlp-proto@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/exporter-metrics-otlp-proto/package.json"},{"name":"ImportedModules","value":"@opentelemetry/exporter-metrics-otlp-proto,OTLPMetricExporter,@opentelemetry/exporter-metrics-otlp-proto/OTLPMetricExporter"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/exporter-metrics-otlp-proto/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/exporter-metrics-otlp-proto/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#6"},{"location":"tmp/dist/telemetry/telemetry-manager.js#6"},{"location":"src/telemetry/telemetry-manager.ts#3"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"exporter-trace-otlp-proto","version":"0.219.0","description":"OpenTelemetry Collector Exporter allows user to send collected traces to the OpenTelemetry Collector using protobuf over HTTP","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/exporter-trace-otlp-proto@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/exporter-trace-otlp-proto"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/exporter-trace-otlp-proto@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/exporter-trace-otlp-proto/package.json"},{"name":"ImportedModules","value":"@opentelemetry/exporter-trace-otlp-proto,OTLPTraceExporter,@opentelemetry/exporter-trace-otlp-proto/OTLPTraceExporter"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/exporter-trace-otlp-proto/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/exporter-trace-otlp-proto/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#7"},{"location":"tmp/dist/telemetry/telemetry-manager.js#7"},{"location":"src/telemetry/telemetry-manager.ts#4"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"instrumentation-express","version":"0.67.0","description":"OpenTelemetry instrumentation for `express` http web application framework","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/instrumentation-express@0.67.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-express#readme"},{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js-contrib.git"}],"type":"framework","bom-ref":"pkg:npm/@opentelemetry/instrumentation-express@0.67.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/instrumentation-express/package.json"},{"name":"ImportedModules","value":"@opentelemetry/instrumentation-express,ExpressInstrumentation,@opentelemetry/instrumentation-express/ExpressInstrumentation"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/instrumentation-express/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/instrumentation-express/package.json"}],"occurrences":[{"location":"dist/telemetry/instrumentations.js#2"},{"location":"tmp/dist/telemetry/instrumentations.js#2"},{"location":"src/telemetry/instrumentations.ts#2"}]},"tags":["framework","web"]},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"instrumentation-http","version":"0.219.0","description":"OpenTelemetry instrumentation for `node:http` and `node:https` http client and server modules","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/instrumentation-http@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-http"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/instrumentation-http@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/instrumentation-http/package.json"},{"name":"ImportedModules","value":"@opentelemetry/instrumentation-http,HttpInstrumentation,@opentelemetry/instrumentation-http/HttpInstrumentation"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/instrumentation-http/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/instrumentation-http/package.json"}],"occurrences":[{"location":"dist/telemetry/instrumentations.js#3"},{"location":"tmp/dist/telemetry/instrumentations.js#3"},{"location":"src/telemetry/instrumentations.ts#3"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"instrumentation","version":"0.219.0","description":"Base class for node which OpenTelemetry instrumentation modules extend","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/instrumentation@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation"},{"type":"vcs","url":"git+https://github.com/open-telemetry/opentelemetry-js.git"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/instrumentation@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/instrumentation/package.json"},{"name":"ImportedModules","value":"@opentelemetry/instrumentation,registerInstrumentations,@opentelemetry/instrumentation/registerInstrumentations,Instrumentation,@opentelemetry/instrumentation/Instrumentation"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/instrumentation/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/instrumentation/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#8"},{"location":"tmp/dist/telemetry/telemetry-manager.js#8"},{"location":"src/telemetry/instrumentations.ts#1"},{"location":"src/telemetry/telemetry-manager.ts#8"},{"location":"src/telemetry/telemetry-provider.ts#4"},{"location":"src/telemetry/types.ts#3"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"resources","version":"2.8.0","description":"OpenTelemetry SDK resources","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/resources@2.8.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-resources"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/resources@2.8.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/resources/package.json"},{"name":"ImportedModules","value":"@opentelemetry/resources,detectResources,@opentelemetry/resources/detectResources,envDetector,@opentelemetry/resources/envDetector,hostDetector,@opentelemetry/resources/hostDetector,processDetector,@opentelemetry/resources/processDetector,resourceFromAttributes,@opentelemetry/resources/resourceFromAttributes,Resource,@opentelemetry/resources/Resource"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/resources/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/resources/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#9"},{"location":"tmp/dist/telemetry/telemetry-manager.js#9"},{"location":"src/telemetry/telemetry-manager.ts#16"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"sdk-logs","version":"0.219.0","description":"OpenTelemetry logs SDK","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/sdk-logs@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/sdk-logs"},{"type":"vcs","url":"git+https://github.com/open-telemetry/opentelemetry-js.git"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/sdk-logs@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/sdk-logs/package.json"},{"name":"ImportedModules","value":"@opentelemetry/sdk-logs,BatchLogRecordProcessor,@opentelemetry/sdk-logs/BatchLogRecordProcessor"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/sdk-logs/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/sdk-logs/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#10"},{"location":"tmp/dist/telemetry/telemetry-manager.js#10"},{"location":"src/telemetry/telemetry-manager.ts#17"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"sdk-metrics","version":"2.8.0","description":"OpenTelemetry metrics SDK","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/sdk-metrics@2.8.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/sdk-metrics"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/sdk-metrics@2.8.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/sdk-metrics/package.json"},{"name":"ImportedModules","value":"@opentelemetry/sdk-metrics,PeriodicExportingMetricReader,@opentelemetry/sdk-metrics/PeriodicExportingMetricReader"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/sdk-metrics/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/sdk-metrics/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#11"},{"location":"tmp/dist/telemetry/telemetry-manager.js#11"},{"location":"src/telemetry/telemetry-manager.ts#18"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"sdk-node","version":"0.219.0","description":"OpenTelemetry SDK for Node.js","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/sdk-node@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-sdk-node"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/sdk-node@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/sdk-node/package.json"},{"name":"ImportedModules","value":"@opentelemetry/sdk-node,NodeSDK,@opentelemetry/sdk-node/NodeSDK"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/sdk-node/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/sdk-node/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#12"},{"location":"tmp/dist/telemetry/telemetry-manager.js#12"},{"location":"src/telemetry/telemetry-manager.ts#19"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"sdk-trace-base","version":"2.8.0","description":"OpenTelemetry Tracing","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/sdk-trace-base@2.8.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-base"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/sdk-trace-base@2.8.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/sdk-trace-base/package.json"},{"name":"ImportedModules","value":"@opentelemetry/sdk-trace-base,SamplingDecision,@opentelemetry/sdk-trace-base/SamplingDecision,Sampler,@opentelemetry/sdk-trace-base/Sampler,SamplingResult,@opentelemetry/sdk-trace-base/SamplingResult"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/sdk-trace-base/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/sdk-trace-base/package.json"}],"occurrences":[{"location":"dist/telemetry/trace-sampler.js#2"},{"location":"tmp/dist/telemetry/trace-sampler.js#2"},{"location":"src/telemetry/trace-sampler.ts#2"},{"location":"src/telemetry/trace-sampler.ts#3"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"semantic-conventions","version":"1.38.0","description":"OpenTelemetry semantic conventions","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/semantic-conventions@1.38.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/semantic-conventions@1.38.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/semantic-conventions/package.json"},{"name":"ImportedModules","value":"@opentelemetry/semantic-conventions,ATTR_SERVICE_NAME,@opentelemetry/semantic-conventions/ATTR_SERVICE_NAME,ATTR_SERVICE_VERSION,@opentelemetry/semantic-conventions/ATTR_SERVICE_VERSION"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/semantic-conventions/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/semantic-conventions/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#13"},{"location":"tmp/dist/telemetry/telemetry-manager.js#13"},{"location":"src/telemetry/telemetry-manager.ts#23"}]}},{"authors":[{"name":"Apache Software Foundation"}],"group":"","name":"apache-arrow","version":"21.1.0","description":"Apache Arrow columnar in-memory format","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/apache-arrow@21.1.0","externalReferences":[{"type":"website","url":"https://arrow.apache.org/js/"},{"type":"vcs","url":"git+https://github.com/apache/arrow-js.git"}],"type":"library","bom-ref":"pkg:npm/apache-arrow@21.1.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/apache-arrow/package.json"},{"name":"ImportedModules","value":"apache-arrow,Binary,apache-arrow/Binary,Bool,apache-arrow/Bool,DateDay,apache-arrow/DateDay,Decimal,apache-arrow/Decimal,DurationMicrosecond,apache-arrow/DurationMicrosecond,Field,apache-arrow/Field,Float32,apache-arrow/Float32,Float64,apache-arrow/Float64,Int16,apache-arrow/Int16,Int32,apache-arrow/Int32,Int64,apache-arrow/Int64,Int8,apache-arrow/Int8,IntervalYearMonth,apache-arrow/IntervalYearMonth,List,apache-arrow/List,Map_,apache-arrow/Map_,Null,apache-arrow/Null,Schema,apache-arrow/Schema,Struct,apache-arrow/Struct,Table,apache-arrow/Table,TimestampMicrosecond,apache-arrow/TimestampMicrosecond,Utf8,apache-arrow/Utf8,tableToIPC,apache-arrow/tableToIPC,Type,apache-arrow/Type,tableFromIPC,apache-arrow/tableFromIPC,DataType,apache-arrow/DataType"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/apache-arrow/package.json"}],"concludedValue":"packages/appkit/node_modules/apache-arrow/package.json"}],"occurrences":[{"location":"dist/connectors/sql-warehouse/arrow-schema.js#1"},{"location":"dist/plugins/analytics/result-delivery.js#4"},{"location":"dist/type-generator/query-registry.js#14"},{"location":"tmp/dist/connectors/sql-warehouse/arrow-schema.js#1"},{"location":"tmp/dist/plugins/analytics/result-delivery.js#4"},{"location":"tmp/dist/type-generator/query-registry.js#14"},{"location":"src/connectors/sql-warehouse/arrow-schema.ts#25"},{"location":"src/plugins/analytics/result-delivery.ts#1"},{"location":"src/type-generator/query-registry.ts#3"}]}},{"group":"","name":"dotenv","version":"16.6.1","description":"Loads environment variables from .env file","scope":"required","licenses":[{"license":{"id":"BSD-2-Clause","url":"https://opensource.org/licenses/BSD-2-Clause"}}],"purl":"pkg:npm/dotenv@16.6.1","externalReferences":[{"type":"vcs","url":"https://github.com/motdotla/dotenv#readme"},{"type":"vcs","url":"git://github.com/motdotla/dotenv.git"}],"type":"library","bom-ref":"pkg:npm/dotenv@16.6.1","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/dotenv/package.json"},{"name":"ImportedModules","value":"dotenv,dotenv/config"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/dotenv/package.json"}],"concludedValue":"packages/appkit/node_modules/dotenv/package.json"}],"occurrences":[{"location":"dist/plugins/server/index.js#21"},{"location":"dist/type-generator/index.js#19"},{"location":"tmp/dist/cli/index.js#8"},{"location":"tmp/dist/plugins/server/index.js#21"},{"location":"tmp/dist/type-generator/index.js#19"},{"location":"src/plugins/server/index.ts#4"},{"location":"src/type-generator/index.ts#4"},{"location":"tmp/dist/cli/index.js#8"}]}},{"authors":[{"name":"Drizzle Team"}],"group":"","name":"drizzle-orm","version":"0.45.1","description":"Drizzle ORM package for SQL databases","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/drizzle-orm@0.45.1","externalReferences":[{"type":"website","url":"https://orm.drizzle.team"},{"type":"vcs","url":"git+https://github.com/drizzle-team/drizzle-orm.git"}],"type":"library","bom-ref":"pkg:npm/drizzle-orm@0.45.1","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/drizzle-orm/package.json"},{"name":"ImportedModules","value":"drizzle-orm,Relation,drizzle-orm/Relation,relations,drizzle-orm/relations,drizzle-orm/pg-core,AnyPgColumn,drizzle-orm/pg-core/AnyPgColumn,PgTable,drizzle-orm/pg-core/PgTable,bigserial,drizzle-orm/pg-core/bigserial,PgColumnBuilderBase,drizzle-orm/pg-core/PgColumnBuilderBase,PgEnum,drizzle-orm/pg-core/PgEnum,bigint,drizzle-orm/pg-core/bigint,boolean,drizzle-orm/pg-core/boolean,pgEnum,drizzle-orm/pg-core/pgEnum,integer,drizzle-orm/pg-core/integer,jsonb,drizzle-orm/pg-core/jsonb,pgSchema,drizzle-orm/pg-core/pgSchema,pgTable,drizzle-orm/pg-core/pgTable,text,drizzle-orm/pg-core/text,timestamp,drizzle-orm/pg-core/timestamp,uuid,drizzle-orm/pg-core/uuid,varchar,drizzle-orm/pg-core/varchar,serial,drizzle-orm/pg-core/serial"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/drizzle-orm/package.json"}],"concludedValue":"packages/appkit/node_modules/drizzle-orm/package.json"}],"occurrences":[{"location":"src/database/schema-builder/engine/relations.ts#1"},{"location":"src/database/schema-builder/engine/relations.ts#2"},{"location":"src/database/schema-builder/engine/tables.ts#19"},{"location":"src/database/schema-builder/engine/relations.ts#2"},{"location":"src/database/schema-builder/engine/tables.ts#19"}]},"tags":["orm","sql"]},{"authors":[{"name":"TJ Holowaychuk <tj@vision-media.ca>"}],"group":"","name":"express","version":"4.22.2","description":"Fast, unopinionated, minimalist web framework","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/express@4.22.2","externalReferences":[{"type":"website","url":"http://expressjs.com/"}],"type":"framework","bom-ref":"pkg:npm/express@4.22.2","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/express/package.json"},{"name":"ImportedModules","value":"express,NextFunction,express/NextFunction,Request,express/Request,Response,express/Response"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/express/package.json"}],"concludedValue":"packages/appkit/node_modules/express/package.json"}],"occurrences":[{"location":"dist/plugins/server/index.js#22"},{"location":"dist/plugins/server/static-server.js#4"},{"location":"tmp/dist/plugins/server/index.js#22"},{"location":"tmp/dist/plugins/server/static-server.js#4"},{"location":"src/core/plugin-context.ts#1"},{"location":"src/logging/logger.ts#4"},{"location":"src/plugin/plugin.ts#2"},{"location":"src/plugins/agents/agents.ts#3"},{"location":"src/plugins/ai-search/ai-search.ts#1"},{"location":"src/plugins/analytics/analytics.ts#1"},{"location":"src/plugins/files/plugin.ts#3"},{"location":"src/plugins/genie/genie.ts#2"},{"location":"src/plugins/jobs/plugin.ts#2"},{"location":"src/plugins/server/base-server.ts#1"},{"location":"src/plugins/server/index.ts#5"},{"location":"src/plugins/server/remote-tunnel/gate.ts#1"},{"location":"src/plugins/server/remote-tunnel/remote-tunnel-controller.ts#2"},{"location":"src/plugins/server/remote-tunnel/remote-tunnel-manager.ts#6"},{"location":"src/plugins/server/static-server.ts#3"},{"location":"src/plugins/server/static-server.ts#4"},{"location":"src/plugins/server/vite-dev-server.ts#3"},{"location":"src/plugins/serving/serving.ts#4"},{"location":"src/utils/safe-handler.ts#1"}]},"tags":["framework","web"]},{"authors":[{"name":"Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)"}],"group":"","name":"get-port","version":"7.2.0","description":"Get an available port","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/get-port@7.2.0","type":"library","bom-ref":"pkg:npm/get-port@7.2.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/get-port/package.json"},{"name":"ImportedModules","value":"get-port,portNumbers,get-port/portNumbers"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/get-port/package.json"}],"concludedValue":"packages/appkit/node_modules/get-port/package.json"}],"occurrences":[{"location":"dist/plugins/server/index.js#23"},{"location":"tmp/dist/plugins/server/index.js#23"},{"location":"src/plugins/server/index.ts#6"}]}},{"authors":[{"name":"Vladimir Zapparov <dervus.grim@gmail.com>"}],"group":"","name":"js-yaml","version":"4.2.0","description":"YAML 1.2 parser and serializer","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/js-yaml@4.2.0","type":"library","bom-ref":"pkg:npm/js-yaml@4.2.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/js-yaml/package.json"},{"name":"ImportedModules","value":"js-yaml"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/js-yaml/package.json"}],"concludedValue":"packages/appkit/node_modules/js-yaml/package.json"}],"occurrences":[{"location":"dist/core/agent/load-agents.js#5"},{"location":"tmp/dist/core/agent/load-agents.js#5"},{"location":"src/core/agent/load-agents.ts#4"}]}},{"authors":[{"name":"Rich Harris"}],"group":"","name":"magic-string","version":"0.30.21","description":"Modify strings, generate sourcemaps","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/magic-string@0.30.21","externalReferences":[{"type":"vcs","url":"git+https://github.com/Rich-Harris/magic-string.git"}],"type":"library","bom-ref":"pkg:npm/magic-string@0.30.21","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/magic-string/package.json"},{"name":"ImportedModules","value":"magic-string"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/magic-string/package.json"}],"concludedValue":"packages/appkit/node_modules/magic-string/package.json"}],"occurrences":[{"location":"dist/plugins/server/react-source-loc-vite-plugin.js#3"},{"location":"tmp/dist/plugins/server/react-source-loc-vite-plugin.js#3"},{"location":"src/plugins/server/react-source-loc-vite-plugin.ts#3"}]}},{"authors":[{"name":"Kevin Deng <sxzz@sxzz.moe>"}],"group":"","name":"obug","version":"2.1.1","description":"A lightweight JavaScript debugging utility, forked from debug, featuring TypeScript and ESM support.","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/obug@2.1.1","externalReferences":[{"type":"vcs","url":"https://github.com/sxzz/obug#readme"},{"type":"vcs","url":"git+https://github.com/sxzz/obug.git"}],"type":"library","bom-ref":"pkg:npm/obug@2.1.1","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/obug/package.json"},{"name":"ImportedModules","value":"obug,createDebug,obug/createDebug"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/obug/package.json"}],"concludedValue":"packages/appkit/node_modules/obug/package.json"}],"occurrences":[{"location":"dist/logging/logger.js#7"},{"location":"tmp/dist/logging/logger.js#7"},{"location":"src/logging/logger.ts#5"}]}},{"authors":[{"name":"Brian Carlson <brian.m.carlson@gmail.com>"}],"group":"","name":"pg","version":"8.18.0","description":"PostgreSQL client - pure javascript & libpq with the same API","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/pg@8.18.0","externalReferences":[{"type":"vcs","url":"https://github.com/brianc/node-postgres"},{"type":"vcs","url":"git://github.com/brianc/node-postgres.git"}],"type":"library","bom-ref":"pkg:npm/pg@8.18.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/pg/package.json"},{"name":"ImportedModules","value":"pg,Pool,pg/Pool,PoolClient,pg/PoolClient,QueryResult,pg/QueryResult,QueryResultRow,pg/QueryResultRow"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/pg/package.json"}],"concludedValue":"packages/appkit/node_modules/pg/package.json"}],"occurrences":[{"location":"src/cache/storage/persistent.ts#2"},{"location":"src/connectors/lakebase/index.ts#5"},{"location":"src/connectors/lakebase/pool-manager.ts#2"},{"location":"src/connectors/lakebase/routing-pool.ts#1"},{"location":"src/plugins/lakebase/lakebase.ts#1"}]}},{"authors":[{"name":"Alexey Raspopov"}],"group":"","name":"picocolors","version":"1.1.1","description":"The tiniest and the fastest library for terminal output formatting with ANSI colors","scope":"required","licenses":[{"license":{"id":"ISC","url":"https://opensource.org/licenses/ISC"}}],"purl":"pkg:npm/picocolors@1.1.1","type":"library","bom-ref":"pkg:npm/picocolors@1.1.1","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/picocolors/package.json"},{"name":"ImportedModules","value":"picocolors"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/picocolors/package.json"}],"concludedValue":"packages/appkit/node_modules/picocolors/package.json"}],"occurrences":[{"location":"dist/errors/configuration.js#2"},{"location":"dist/plugins/agents/agents.js#27"},{"location":"dist/plugins/server/client-config-sanitizer.js#2"},{"location":"dist/plugins/server/utils.js#2"},{"location":"dist/type-generator/index.js#15"},{"location":"dist/type-generator/migration.js#2"},{"location":"dist/type-generator/query-registry.js#11"},{"location":"dist/type-generator/serving/generator.js#9"},{"location":"tmp/dist/errors/configuration.js#2"},{"location":"tmp/dist/plugins/agents/agents.js#27"},{"location":"tmp/dist/plugins/server/client-config-sanitizer.js#2"},{"location":"tmp/dist/plugins/server/utils.js#2"},{"location":"tmp/dist/type-generator/index.js#15"},{"location":"tmp/dist/type-generator/migration.js#2"},{"location":"tmp/dist/type-generator/query-registry.js#11"},{"location":"tmp/dist/type-generator/serving/generator.js#9"},{"location":"src/errors/configuration.ts#1"},{"location":"src/plugins/agents/agents.ts#4"},{"location":"src/plugins/server/client-config-sanitizer.ts#1"},{"location":"src/plugins/server/utils.ts#5"},{"location":"src/type-generator/index.ts#5"},{"location":"src/type-generator/migration.ts#4"},{"location":"src/type-generator/query-registry.ts#4"},{"location":"src/type-generator/serving/generator.ts#3"}]}},{"authors":[{"name":"GitHub Inc."}],"group":"","name":"semver","version":"7.7.3","description":"The semantic version parser used by npm.","scope":"required","licenses":[{"license":{"id":"ISC","url":"https://opensource.org/licenses/ISC"}}],"purl":"pkg:npm/semver@7.7.3","externalReferences":[{"type":"vcs","url":"git+https://github.com/npm/node-semver.git"}],"type":"library","bom-ref":"pkg:npm/semver@7.7.3","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/semver/package.json"},{"name":"ImportedModules","value":"semver,coerce,semver/coerce"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/semver/package.json"}],"concludedValue":"packages/appkit/node_modules/semver/package.json"}],"occurrences":[{"location":"dist/context/client-options.js#2"},{"location":"tmp/dist/context/client-options.js#2"},{"location":"src/context/client-options.ts#1"}]}},{"group":"","name":"shared","version":"0.0.1","scope":"required","purl":"pkg:npm/shared@0.0.1","type":"library","bom-ref":"pkg:npm/shared@0.0.1","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/shared/package.json"},{"name":"ExportedModules","value":"shared,AgentAdapter,shared/AgentAdapter,AgentEvent,shared/AgentEvent,AgentInput,shared/AgentInput,AgentRunContext,shared/AgentRunContext,AgentToolDefinition,shared/AgentToolDefinition,Message,shared/Message,Thread,shared/Thread,ThreadStore,shared/ThreadStore,ToolAnnotations,shared/ToolAnnotations,ToolProvider,shared/ToolProvider,GenieAttachmentResponse,shared/GenieAttachmentResponse,GenieMessageResponse,shared/GenieMessageResponse,GenieStatementResponse,shared/GenieStatementResponse,GenieStreamEvent,shared/GenieStreamEvent,BasePluginConfig,shared/BasePluginConfig,CacheConfig,shared/CacheConfig,IAppRouter,shared/IAppRouter,PluginData,shared/PluginData,StreamExecutionSettings,shared/StreamExecutionSettings,isSQLTypeMarker,shared/isSQLTypeMarker,shared/sql"},{"name":"ImportedModules","value":"shared,AgentAdapter,shared/AgentAdapter,AgentEvent,shared/AgentEvent,AgentInput,shared/AgentInput,AgentRunContext,shared/AgentRunContext,AgentToolDefinition,shared/AgentToolDefinition,Message,shared/Message,ResponseStreamEvent,shared/ResponseStreamEvent,CacheConfig,shared/CacheConfig,CacheEntry,shared/CacheEntry,CacheStorage,shared/CacheStorage,TelemetryOptions,shared/TelemetryOptions,GenieMessageResponse,shared/GenieMessageResponse,PluginConstructor,shared/PluginConstructor,PluginData,shared/PluginData,ToolProvider,shared/ToolProvider,ToolAnnotations,shared/ToolAnnotations,BasePluginConfig,shared/BasePluginConfig,ThreadStore,shared/ThreadStore,BasePlugin,shared/BasePlugin,InputPluginMap,shared/InputPluginMap,OptionalConfigPluginDef,shared/OptionalConfigPluginDef,PluginMap,shared/PluginMap,IAppRequest,shared/IAppRequest,TunnelConnection,shared/TunnelConnection,RetryConfig,shared/RetryConfig,TelemetryConfig,shared/TelemetryConfig,IAppResponse,shared/IAppResponse,PluginEndpointMap,shared/PluginEndpointMap,PluginExecuteConfig,shared/PluginExecuteConfig,PluginExecutionSettings,shared/PluginExecutionSettings,PluginPhase,shared/PluginPhase,RouteConfig,shared/RouteConfig,StreamExecuteHandler,shared/StreamExecuteHandler,StreamExecutionSettings,shared/StreamExecutionSettings,camelToKebab,shared/camelToKebab,ToPlugin,shared/ToPlugin,IAppRouter,shared/IAppRouter,ResponseOutputMessage,shared/ResponseOutputMessage,Thread,shared/Thread,ResponseFunctionCallOutput,shared/ResponseFunctionCallOutput,ResponseFunctionToolCall,shared/ResponseFunctionToolCall,AnalyticsSseMessage,shared/AnalyticsSseMessage,makeResultMessage,shared/makeResultMessage,SQLTypeMarker,shared/SQLTypeMarker,shared/sql,MetricViewColumnDisplay,shared/MetricViewColumnDisplay,MetricViewsMetadata,shared/MetricViewsMetadata,isSQLTypeMarker,shared/isSQLTypeMarker,PluginClientConfigs,shared/PluginClientConfigs,PluginEndpoints,shared/PluginEndpoints,ResourceFieldEntry,shared/ResourceFieldEntry,PluginManifest,shared/PluginManifest,StreamConfig,shared/StreamConfig"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/shared/package.json"}],"concludedValue":"packages/appkit/node_modules/shared/package.json"}],"occurrences":[{"location":"src/agents/databricks.ts#7"},{"location":"src/agents/supervisor-api.ts#8"},{"location":"src/beta.ts#20"},{"location":"src/cache/defaults.ts#1"},{"location":"src/cache/index.ts#2"},{"location":"src/cache/storage/memory.ts#1"},{"location":"src/cache/storage/persistent.ts#3"},{"location":"src/connectors/ai-search/types.ts#1"},{"location":"src/connectors/files/client.ts#2"},{"location":"src/connectors/genie/types.ts#3"},{"location":"src/connectors/genie/types.ts#10"},{"location":"src/connectors/jobs/types.ts#1"},{"location":"src/connectors/mcp/client.ts#25"},{"location":"src/connectors/sql-warehouse/client.ts#1"},{"location":"src/core/agent/build-toolkit.ts#1"},{"location":"src/core/agent/consume-adapter-stream.ts#1"},{"location":"src/core/agent/load-agents.ts#5"},{"location":"src/core/agent/run-agent.ts#10"},{"location":"src/core/agent/toolkit-resolver.ts#1"},{"location":"src/core/agent/tools/define-tool.ts#1"},{"location":"src/core/agent/tools/function-tool.ts#1"},{"location":"src/core/agent/tools/tool.ts#1"},{"location":"src/core/agent/types.ts#7"},{"location":"src/core/appkit.ts#9"},{"location":"src/core/lifecycle-manager.ts#1"},{"location":"src/core/plugin-context.ts#2"},{"location":"src/index.ts#15"},{"location":"src/index.ts#16"},{"location":"src/plugin/dev-reader.ts#2"},{"location":"src/plugin/index.ts#1"},{"location":"src/plugin/interceptors/cache.ts#1"},{"location":"src/plugin/interceptors/retry.ts#1"},{"location":"src/plugin/interceptors/telemetry.ts#1"},{"location":"src/plugin/plugin.ts#14"},{"location":"src/plugin/plugin.ts#15"},{"location":"src/plugin/to-plugin.ts#1"},{"location":"src/plugins/agents/agents.ts#17"},{"location":"src/plugins/agents/defaults.ts#1"},{"location":"src/plugins/agents/event-translator.ts#8"},{"location":"src/plugins/agents/thread-store.ts#2"},{"location":"src/plugins/ai-search/ai-search.ts#2"},{"location":"src/plugins/ai-search/defaults.ts#1"},{"location":"src/plugins/ai-search/types.ts#1"},{"location":"src/plugins/analytics/analytics.ts#11"},{"location":"src/plugins/analytics/defaults.ts#1"},{"location":"src/plugins/analytics/mv/formatters.ts#1"},{"location":"src/plugins/analytics/mv/metadata.ts#1"},{"location":"src/plugins/analytics/query.ts#2"},{"location":"src/plugins/analytics/result-delivery.ts#2"},{"location":"src/plugins/analytics/types.ts#5"},{"location":"src/plugins/files/defaults.ts#1"},{"location":"src/plugins/files/plugin.ts#9"},{"location":"src/plugins/files/types.ts#1"},{"location":"src/plugins/genie/defaults.ts#1"},{"location":"src/plugins/genie/genie.ts#8"},{"location":"src/plugins/genie/types.ts#1"},{"location":"src/plugins/genie/types.ts#4"},{"location":"src/plugins/jobs/defaults.ts#1"},{"location":"src/plugins/jobs/plugin.ts#8"},{"location":"src/plugins/jobs/types.ts#1"},{"location":"src/plugins/lakebase/lakebase.ts#2"},{"location":"src/plugins/lakebase/types.ts#1"},{"location":"src/plugins/server/index.ts#7"},{"location":"src/plugins/server/index.ts#8"},{"location":"src/plugins/server/remote-tunnel/remote-tunnel-manager.ts#7"},{"location":"src/plugins/server/types.ts#1"},{"location":"src/plugins/server/utils.ts#6"},{"location":"src/plugins/serving/serving.ts#5"},{"location":"src/plugins/serving/types.ts#1"},{"location":"src/plugins/ui-variants/index.ts#1"},{"location":"src/registry/manifest-loader.ts#1"},{"location":"src/registry/resource-registry.ts#13"},{"location":"src/registry/types.ts#33"},{"location":"src/registry/types.ts#39"},{"location":"src/stream/sse-writer.ts#1"},{"location":"src/stream/stream-manager.ts#3"},{"location":"src/stream/types.ts#2"},{"location":"src/telemetry/telemetry-manager.ts#24"},{"location":"src/telemetry/telemetry-provider.ts#5"}]},"tags":["sql"]},{"authors":[{"name":"Einar Otto Stangvik <einaros@gmail.com> (http://2x.io)"}],"group":"","name":"ws","version":"8.21.0","description":"Simple to use, blazing fast and thoroughly tested websocket client and server for Node.js","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/ws@8.21.0","externalReferences":[{"type":"vcs","url":"https://github.com/websockets/ws"},{"type":"vcs","url":"git+https://github.com/websockets/ws.git"}],"type":"library","bom-ref":"pkg:npm/ws@8.21.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/ws/package.json"},{"name":"ImportedModules","value":"ws,WebSocketServer,ws/WebSocketServer"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/ws/package.json"}],"concludedValue":"packages/appkit/node_modules/ws/package.json"}],"occurrences":[{"location":"dist/plugins/server/remote-tunnel/remote-tunnel-manager.js#8"},{"location":"tmp/dist/plugins/server/remote-tunnel/remote-tunnel-manager.js#8"},{"location":"src/plugins/server/remote-tunnel/remote-tunnel-manager.ts#8"}]}},{"authors":[{"name":"Colin McDonnell <zod@colinhacks.com>"}],"group":"","name":"zod","version":"4.3.6","description":"TypeScript-first schema declaration and validation library with static type inference","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/zod@4.3.6","externalReferences":[{"type":"website","url":"https://zod.dev"},{"type":"vcs","url":"git+https://github.com/colinhacks/zod.git"}],"type":"library","bom-ref":"pkg:npm/zod@4.3.6","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/zod/package.json"},{"name":"ImportedModules","value":"zod,toJSONSchema,zod/toJSONSchema,zod/z,ZodType,zod/ZodType"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/zod/package.json"}],"concludedValue":"packages/appkit/node_modules/zod/package.json"}],"occurrences":[{"location":"dist/core/agent/tools/json-schema.js#1"},{"location":"dist/plugins/agents/schemas.js#1"},{"location":"dist/plugins/analytics/analytics.js#27"},{"location":"dist/plugins/analytics/mv/schemas.js#6"},{"location":"dist/plugins/files/plugin.js#24"},{"location":"dist/plugins/genie/genie.js#14"},{"location":"dist/plugins/jobs/plugin.js#17"},{"location":"dist/plugins/lakebase/lakebase.js#16"},{"location":"dist/shared/src/schemas/metric-source.js#2"},{"location":"dist/shared/src/sse/analytics.js#1"},{"location":"tmp/dist/core/agent/tools/json-schema.js#1"},{"location":"tmp/dist/plugins/agents/schemas.js#1"},{"location":"tmp/dist/plugins/analytics/analytics.js#27"},{"location":"tmp/dist/plugins/analytics/mv/schemas.js#6"},{"location":"tmp/dist/plugins/files/plugin.js#24"},{"location":"tmp/dist/plugins/genie/genie.js#14"},{"location":"tmp/dist/plugins/jobs/plugin.js#17"},{"location":"tmp/dist/plugins/lakebase/lakebase.js#16"},{"location":"tmp/dist/schemas/manifest.js#2"},{"location":"tmp/dist/shared/src/schemas/metric-source.js#2"},{"location":"tmp/dist/shared/src/sse/analytics.js#1"},{"location":"src/core/agent/tools/define-tool.ts#2"},{"location":"src/core/agent/tools/json-schema.ts#1"},{"location":"src/core/agent/tools/tool.ts#2"},{"location":"src/database/schema-builder/validators.ts#1"},{"location":"src/database/schema-builder/validators.ts#2"},{"location":"src/plugins/agents/schemas.ts#1"},{"location":"src/plugins/analytics/analytics.ts#12"},{"location":"src/plugins/analytics/mv/schemas.ts#1"},{"location":"src/plugins/files/plugin.ts#10"},{"location":"src/plugins/genie/genie.ts#9"},{"location":"src/plugins/jobs/plugin.ts#9"},{"location":"src/plugins/jobs/types.ts#2"},{"location":"src/plugins/lakebase/lakebase.ts#3"}]},"tags":["validation"]}],"dependencies":[],"compositions":[{"bom-ref":"pkg:npm/@databricks/appkit@0.55.0","aggregate":"incomplete"}],"annotations":[{"bom-ref":"metadata-annotations","subjects":["pkg:npm/@databricks/appkit@0.55.0"],"annotator":{"component":{"group":"@cyclonedx","name":"cdxgen","version":"12.1.2","purl":"pkg:npm/%40cyclonedx/cdxgen@12.1.2","type":"application","bom-ref":"pkg:npm/@cyclonedx/cdxgen@12.1.2","publisher":"OWASP Foundation","authors":[{"name":"OWASP Foundation"}]}},"timestamp":"2026-08-05T14:55:52Z","text":"This Software Bill-of-Materials (SBOM) document was created on Wednesday, August 5, 2026 with cdxgen. The data was captured during the build lifecycle phase. The document describes an application named 'appkit' with version '0.55.0'. There are 32 components. The package type in this SBOM is npm with 3 purl namespaces described under components. The components were identified from 32 source files."}]}
1
+ {"bomFormat":"CycloneDX","specVersion":"1.6","serialNumber":"urn:uuid:dcc41ad7-5bcc-4367-ab32-058fa86d62e5","version":1,"metadata":{"timestamp":"2026-08-07T08:38:21Z","tools":{"components":[{"group":"@cyclonedx","name":"cdxgen","version":"12.1.2","purl":"pkg:npm/%40cyclonedx/cdxgen@12.1.2","type":"application","bom-ref":"pkg:npm/@cyclonedx/cdxgen@12.1.2","publisher":"OWASP Foundation","authors":[{"name":"OWASP Foundation"}]}]},"authors":[{"name":"OWASP Foundation"}],"lifecycles":[{"phase":"build"}],"component":{"name":"appkit","group":"@databricks","version":"0.55.1","purl":"pkg:npm/%40databricks/appkit@0.55.1","bom-ref":"pkg:npm/@databricks/appkit@0.55.1","type":"application","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"externalReferences":[{"type":"vcs","url":"git+https://github.com/databricks/appkit.git"}]},"properties":[{"name":"cdx:bom:componentTypes","value":"npm"},{"name":"cdx:bom:componentNamespaces","value":"@ast-grep\\n@databricks\\n@opentelemetry"},{"name":"cdx:bom:componentSrcFiles","value":"packages/appkit/node_modules/@ast-grep/napi/package.json\\npackages/appkit/node_modules/@databricks/lakebase/package.json\\npackages/appkit/node_modules/@databricks/sdk-experimental/package.json\\npackages/appkit/node_modules/@opentelemetry/api-logs/package.json\\npackages/appkit/node_modules/@opentelemetry/api/package.json\\npackages/appkit/node_modules/@opentelemetry/auto-instrumentations-node/package.json\\npackages/appkit/node_modules/@opentelemetry/exporter-logs-otlp-proto/package.json\\npackages/appkit/node_modules/@opentelemetry/exporter-metrics-otlp-proto/package.json\\npackages/appkit/node_modules/@opentelemetry/exporter-trace-otlp-proto/package.json\\npackages/appkit/node_modules/@opentelemetry/instrumentation-express/package.json\\npackages/appkit/node_modules/@opentelemetry/instrumentation-http/package.json\\npackages/appkit/node_modules/@opentelemetry/instrumentation/package.json\\npackages/appkit/node_modules/@opentelemetry/resources/package.json\\npackages/appkit/node_modules/@opentelemetry/sdk-logs/package.json\\npackages/appkit/node_modules/@opentelemetry/sdk-metrics/package.json\\npackages/appkit/node_modules/@opentelemetry/sdk-node/package.json\\npackages/appkit/node_modules/@opentelemetry/sdk-trace-base/package.json\\npackages/appkit/node_modules/@opentelemetry/semantic-conventions/package.json\\npackages/appkit/node_modules/apache-arrow/package.json\\npackages/appkit/node_modules/dotenv/package.json\\npackages/appkit/node_modules/drizzle-orm/package.json\\npackages/appkit/node_modules/express/package.json\\npackages/appkit/node_modules/get-port/package.json\\npackages/appkit/node_modules/js-yaml/package.json\\npackages/appkit/node_modules/magic-string/package.json\\npackages/appkit/node_modules/obug/package.json\\npackages/appkit/node_modules/pg/package.json\\npackages/appkit/node_modules/picocolors/package.json\\npackages/appkit/node_modules/semver/package.json\\npackages/appkit/node_modules/shared/package.json\\npackages/appkit/node_modules/ws/package.json\\npackages/appkit/node_modules/zod/package.json"}]},"components":[{"group":"@ast-grep","name":"napi","version":"0.37.0","description":"Search and Rewrite code at large scale using precise AST pattern","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/%40ast-grep/napi@0.37.0","externalReferences":[{"type":"vcs","url":"https://ast-grep.github.io"}],"type":"library","bom-ref":"pkg:npm/@ast-grep/napi@0.37.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@ast-grep/napi/package.json"},{"name":"ImportedModules","value":"@ast-grep/napi,Lang,@ast-grep/napi/Lang,parse,@ast-grep/napi/parse,SgNode,@ast-grep/napi/SgNode"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@ast-grep/napi/package.json"}],"concludedValue":"packages/appkit/node_modules/@ast-grep/napi/package.json"}],"occurrences":[{"location":"dist/plugins/server/react-source-loc-vite-plugin.js#2"},{"location":"dist/type-generator/serving/server-file-extractor.js#4"},{"location":"tmp/dist/cli/commands/codemod/on-plugins-ready.js#4"},{"location":"tmp/dist/cli/commands/lint.js#4"},{"location":"tmp/dist/cli/commands/plugin/sync/sync.js#8"},{"location":"tmp/dist/plugins/server/react-source-loc-vite-plugin.js#2"},{"location":"tmp/dist/type-generator/serving/server-file-extractor.js#4"},{"location":"src/plugins/server/react-source-loc-vite-plugin.ts#2"},{"location":"src/type-generator/serving/server-file-extractor.ts#3"}]}},{"group":"@databricks","name":"lakebase","version":"0.5.0","description":"PostgreSQL driver for Databricks Lakebase Autoscaling with automatic OAuth token refresh","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40databricks/lakebase@0.5.0","externalReferences":[{"type":"vcs","url":"git+https://github.com/databricks/appkit.git"}],"type":"library","bom-ref":"pkg:npm/@databricks/lakebase@0.5.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@databricks/lakebase/package.json"},{"name":"ExportedModules","value":"@databricks/lakebase,DatabaseCredential,@databricks/lakebase/DatabaseCredential,GenerateDatabaseCredentialRequest,@databricks/lakebase/GenerateDatabaseCredentialRequest,generateDatabaseCredential,@databricks/lakebase/generateDatabaseCredential,getLakebaseOrmConfig,@databricks/lakebase/getLakebaseOrmConfig,getLakebasePgConfig,@databricks/lakebase/getLakebasePgConfig,getUsernameWithApiLookup,@databricks/lakebase/getUsernameWithApiLookup,getWorkspaceClient,@databricks/lakebase/getWorkspaceClient,LakebasePoolConfig,@databricks/lakebase/LakebasePoolConfig,RequestedClaims,@databricks/lakebase/RequestedClaims,RequestedClaimsPermissionSet,@databricks/lakebase/RequestedClaimsPermissionSet,RequestedResource,@databricks/lakebase/RequestedResource"},{"name":"ImportedModules","value":"@databricks/lakebase,RequestedClaimsPermissionSet,@databricks/lakebase/RequestedClaimsPermissionSet,createLakebasePool,@databricks/lakebase/createLakebasePool,generateDatabaseCredential,@databricks/lakebase/generateDatabaseCredential,getLakebaseOrmConfig,@databricks/lakebase/getLakebaseOrmConfig,getLakebasePgConfig,@databricks/lakebase/getLakebasePgConfig,getUsernameWithApiLookup,@databricks/lakebase/getUsernameWithApiLookup,getWorkspaceClient,@databricks/lakebase/getWorkspaceClient,LakebasePoolConfig,@databricks/lakebase/LakebasePoolConfig"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@databricks/lakebase/package.json"}],"concludedValue":"packages/appkit/node_modules/@databricks/lakebase/package.json"}],"occurrences":[{"location":"dist/connectors/lakebase/index.js#4"},{"location":"tmp/dist/connectors/lakebase/index.js#4"},{"location":"src/connectors/lakebase/index.ts#4"},{"location":"src/connectors/lakebase/index.ts#37"},{"location":"src/connectors/lakebase/pool-manager.ts#1"}]},"tags":["token"]},{"group":"@databricks","name":"sdk-experimental","version":"0.17.0","description":"Databricks SDK","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40databricks/sdk-experimental@0.17.0","externalReferences":[{"type":"vcs","url":"https://github.com/databricks/databricks-sdk-js"},{"type":"vcs","url":"git+https://github.com/databricks/databricks-sdk-js.git#main"}],"type":"library","bom-ref":"pkg:npm/@databricks/sdk-experimental@0.17.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@databricks/sdk-experimental/package.json"},{"name":"ExportedModules","value":"@databricks/sdk-experimental,@databricks/sdk-experimental/apis/dashboards,@databricks/sdk-experimental/wait,CancellationToken,@databricks/sdk-experimental/CancellationToken,ClientOptions,@databricks/sdk-experimental/ClientOptions,files,@databricks/sdk-experimental/files,jobs,@databricks/sdk-experimental/jobs,serving,@databricks/sdk-experimental/serving,@databricks/sdk-experimental/sql"},{"name":"ImportedModules","value":"@databricks/sdk-experimental,ApiError,@databricks/sdk-experimental/ApiError,ClientOptions,@databricks/sdk-experimental/ClientOptions,WorkspaceClient,@databricks/sdk-experimental/WorkspaceClient,@databricks/sdk-experimental/dist/apis/dashboards,@databricks/sdk-experimental/dist/wait"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@databricks/sdk-experimental/package.json"}],"concludedValue":"packages/appkit/node_modules/@databricks/sdk-experimental/package.json"}],"occurrences":[{"location":"dist/workspace-client/errors.js#1"},{"location":"dist/workspace-client/legacy.js#1"},{"location":"tmp/dist/workspace-client/errors.js#1"},{"location":"tmp/dist/workspace-client/legacy.js#1"},{"location":"src/workspace-client/errors.ts#14"},{"location":"src/workspace-client/legacy.ts#16"},{"location":"src/workspace-client/legacy.ts#17"},{"location":"src/workspace-client/legacy.ts#71"},{"location":"src/workspace-client/types.ts#25"},{"location":"src/workspace-client/legacy.ts#93"},{"location":"src/workspace-client/legacy.ts#94"}]},"tags":["sql"]},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"api-logs","version":"0.219.0","description":"Public logs API for OpenTelemetry","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/api-logs@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/api-logs"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/api-logs@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/api-logs/package.json"},{"name":"ExportedModules","value":"@opentelemetry/api-logs"},{"name":"ImportedModules","value":"@opentelemetry/api-logs,SeverityNumber,@opentelemetry/api-logs/SeverityNumber,logs,@opentelemetry/api-logs/logs,createNoopLogger,@opentelemetry/api-logs/createNoopLogger,Logger,@opentelemetry/api-logs/Logger,LogRecord,@opentelemetry/api-logs/LogRecord"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/api-logs/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/api-logs/package.json"}],"occurrences":[{"location":"dist/logging/wide-event-emitter.js#1"},{"location":"dist/telemetry/index.js#6"},{"location":"dist/telemetry/noop.js#2"},{"location":"dist/telemetry/telemetry-provider.js#4"},{"location":"tmp/dist/logging/wide-event-emitter.js#1"},{"location":"tmp/dist/telemetry/index.js#6"},{"location":"tmp/dist/telemetry/noop.js#2"},{"location":"tmp/dist/telemetry/telemetry-provider.js#4"},{"location":"src/logging/wide-event-emitter.ts#1"},{"location":"src/telemetry/index.ts#7"},{"location":"src/telemetry/noop.ts#23"},{"location":"src/telemetry/telemetry-provider.ts#3"},{"location":"src/telemetry/types.ts#2"}]},"tags":["api"]},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"api","version":"1.9.0","description":"Public API for OpenTelemetry","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/api@1.9.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/api"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/api@1.9.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/api/package.json"},{"name":"ExportedModules","value":"@opentelemetry/api,@opentelemetry/api-logs,Counter,@opentelemetry/api/Counter,Histogram,@opentelemetry/api/Histogram,Span,@opentelemetry/api/Span,SpanKind,@opentelemetry/api/SpanKind,SpanStatusCode,@opentelemetry/api/SpanStatusCode"},{"name":"ImportedModules","value":"@opentelemetry/api,trace,@opentelemetry/api/trace,context,@opentelemetry/api/context,createContextKey,@opentelemetry/api/createContextKey,SpanKind,@opentelemetry/api/SpanKind,SpanStatusCode,@opentelemetry/api/SpanStatusCode,INVALID_SPAN_CONTEXT,@opentelemetry/api/INVALID_SPAN_CONTEXT,createNoopMeter,@opentelemetry/api/createNoopMeter,metrics,@opentelemetry/api/metrics,Context,@opentelemetry/api/Context,Span,@opentelemetry/api/Span,SpanContext,@opentelemetry/api/SpanContext,SpanOptions,@opentelemetry/api/SpanOptions,Tracer,@opentelemetry/api/Tracer,Meter,@opentelemetry/api/Meter,Attributes,@opentelemetry/api/Attributes,Link,@opentelemetry/api/Link"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/api/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/api/package.json"}],"occurrences":[{"location":"dist/logging/logger.js#6"},{"location":"dist/plugin/plugin.js#23"},{"location":"dist/stream/stream-manager.js#12"},{"location":"dist/telemetry/index.js#5"},{"location":"dist/telemetry/noop.js#1"},{"location":"dist/telemetry/telemetry-provider.js#3"},{"location":"tmp/dist/logging/logger.js#6"},{"location":"tmp/dist/plugin/plugin.js#23"},{"location":"tmp/dist/stream/stream-manager.js#12"},{"location":"tmp/dist/telemetry/index.js#5"},{"location":"tmp/dist/telemetry/noop.js#1"},{"location":"tmp/dist/telemetry/telemetry-provider.js#3"},{"location":"src/logging/logger.ts#3"},{"location":"src/plugin/plugin.ts#1"},{"location":"src/stream/stream-manager.ts#2"},{"location":"src/stream/types.ts#1"},{"location":"src/telemetry/index.ts#5"},{"location":"src/telemetry/index.ts#6"},{"location":"src/telemetry/noop.ts#17"},{"location":"src/telemetry/noop.ts#22"},{"location":"src/telemetry/telemetry-provider.ts#1"},{"location":"src/telemetry/telemetry-provider.ts#2"},{"location":"src/telemetry/trace-sampler.ts#1"},{"location":"src/telemetry/types.ts#1"}]},"tags":["api"]},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"auto-instrumentations-node","version":"0.77.0","description":"Metapackage which bundles opentelemetry node core and contrib instrumentations","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/auto-instrumentations-node@0.77.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/auto-instrumentations-node#readme"},{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js-contrib.git"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/auto-instrumentations-node@0.77.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/auto-instrumentations-node/package.json"},{"name":"ImportedModules","value":"@opentelemetry/auto-instrumentations-node,getNodeAutoInstrumentations,@opentelemetry/auto-instrumentations-node/getNodeAutoInstrumentations"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/auto-instrumentations-node/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/auto-instrumentations-node/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#4"},{"location":"tmp/dist/telemetry/telemetry-manager.js#4"},{"location":"src/telemetry/telemetry-manager.ts#1"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"exporter-logs-otlp-proto","version":"0.219.0","description":"An OTLP exporter to send logs using protobuf over HTTP","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/exporter-logs-otlp-proto@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/exporter-logs-otlp-proto"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/exporter-logs-otlp-proto@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/exporter-logs-otlp-proto/package.json"},{"name":"ImportedModules","value":"@opentelemetry/exporter-logs-otlp-proto,OTLPLogExporter,@opentelemetry/exporter-logs-otlp-proto/OTLPLogExporter"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/exporter-logs-otlp-proto/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/exporter-logs-otlp-proto/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#5"},{"location":"tmp/dist/telemetry/telemetry-manager.js#5"},{"location":"src/telemetry/telemetry-manager.ts#2"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"exporter-metrics-otlp-proto","version":"0.219.0","description":"OpenTelemetry Collector Metrics Exporter allows user to send collected metrics to the OpenTelemetry Collector using protobuf over HTTP","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/exporter-metrics-otlp-proto@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-exporter-metrics-otlp-proto"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/exporter-metrics-otlp-proto@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/exporter-metrics-otlp-proto/package.json"},{"name":"ImportedModules","value":"@opentelemetry/exporter-metrics-otlp-proto,OTLPMetricExporter,@opentelemetry/exporter-metrics-otlp-proto/OTLPMetricExporter"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/exporter-metrics-otlp-proto/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/exporter-metrics-otlp-proto/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#6"},{"location":"tmp/dist/telemetry/telemetry-manager.js#6"},{"location":"src/telemetry/telemetry-manager.ts#3"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"exporter-trace-otlp-proto","version":"0.219.0","description":"OpenTelemetry Collector Exporter allows user to send collected traces to the OpenTelemetry Collector using protobuf over HTTP","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/exporter-trace-otlp-proto@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/exporter-trace-otlp-proto"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/exporter-trace-otlp-proto@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/exporter-trace-otlp-proto/package.json"},{"name":"ImportedModules","value":"@opentelemetry/exporter-trace-otlp-proto,OTLPTraceExporter,@opentelemetry/exporter-trace-otlp-proto/OTLPTraceExporter"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/exporter-trace-otlp-proto/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/exporter-trace-otlp-proto/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#7"},{"location":"tmp/dist/telemetry/telemetry-manager.js#7"},{"location":"src/telemetry/telemetry-manager.ts#4"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"instrumentation-express","version":"0.67.0","description":"OpenTelemetry instrumentation for `express` http web application framework","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/instrumentation-express@0.67.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-express#readme"},{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js-contrib.git"}],"type":"framework","bom-ref":"pkg:npm/@opentelemetry/instrumentation-express@0.67.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/instrumentation-express/package.json"},{"name":"ImportedModules","value":"@opentelemetry/instrumentation-express,ExpressInstrumentation,@opentelemetry/instrumentation-express/ExpressInstrumentation"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/instrumentation-express/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/instrumentation-express/package.json"}],"occurrences":[{"location":"dist/telemetry/instrumentations.js#2"},{"location":"tmp/dist/telemetry/instrumentations.js#2"},{"location":"src/telemetry/instrumentations.ts#2"}]},"tags":["framework","web"]},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"instrumentation-http","version":"0.219.0","description":"OpenTelemetry instrumentation for `node:http` and `node:https` http client and server modules","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/instrumentation-http@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-http"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/instrumentation-http@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/instrumentation-http/package.json"},{"name":"ImportedModules","value":"@opentelemetry/instrumentation-http,HttpInstrumentation,@opentelemetry/instrumentation-http/HttpInstrumentation"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/instrumentation-http/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/instrumentation-http/package.json"}],"occurrences":[{"location":"dist/telemetry/instrumentations.js#3"},{"location":"tmp/dist/telemetry/instrumentations.js#3"},{"location":"src/telemetry/instrumentations.ts#3"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"instrumentation","version":"0.219.0","description":"Base class for node which OpenTelemetry instrumentation modules extend","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/instrumentation@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation"},{"type":"vcs","url":"git+https://github.com/open-telemetry/opentelemetry-js.git"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/instrumentation@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/instrumentation/package.json"},{"name":"ImportedModules","value":"@opentelemetry/instrumentation,registerInstrumentations,@opentelemetry/instrumentation/registerInstrumentations,Instrumentation,@opentelemetry/instrumentation/Instrumentation"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/instrumentation/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/instrumentation/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#8"},{"location":"tmp/dist/telemetry/telemetry-manager.js#8"},{"location":"src/telemetry/instrumentations.ts#1"},{"location":"src/telemetry/telemetry-manager.ts#8"},{"location":"src/telemetry/telemetry-provider.ts#4"},{"location":"src/telemetry/types.ts#3"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"resources","version":"2.8.0","description":"OpenTelemetry SDK resources","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/resources@2.8.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-resources"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/resources@2.8.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/resources/package.json"},{"name":"ImportedModules","value":"@opentelemetry/resources,detectResources,@opentelemetry/resources/detectResources,envDetector,@opentelemetry/resources/envDetector,hostDetector,@opentelemetry/resources/hostDetector,processDetector,@opentelemetry/resources/processDetector,resourceFromAttributes,@opentelemetry/resources/resourceFromAttributes,Resource,@opentelemetry/resources/Resource"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/resources/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/resources/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#9"},{"location":"tmp/dist/telemetry/telemetry-manager.js#9"},{"location":"src/telemetry/telemetry-manager.ts#16"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"sdk-logs","version":"0.219.0","description":"OpenTelemetry logs SDK","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/sdk-logs@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/sdk-logs"},{"type":"vcs","url":"git+https://github.com/open-telemetry/opentelemetry-js.git"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/sdk-logs@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/sdk-logs/package.json"},{"name":"ImportedModules","value":"@opentelemetry/sdk-logs,BatchLogRecordProcessor,@opentelemetry/sdk-logs/BatchLogRecordProcessor"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/sdk-logs/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/sdk-logs/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#10"},{"location":"tmp/dist/telemetry/telemetry-manager.js#10"},{"location":"src/telemetry/telemetry-manager.ts#17"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"sdk-metrics","version":"2.8.0","description":"OpenTelemetry metrics SDK","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/sdk-metrics@2.8.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/sdk-metrics"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/sdk-metrics@2.8.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/sdk-metrics/package.json"},{"name":"ImportedModules","value":"@opentelemetry/sdk-metrics,PeriodicExportingMetricReader,@opentelemetry/sdk-metrics/PeriodicExportingMetricReader"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/sdk-metrics/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/sdk-metrics/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#11"},{"location":"tmp/dist/telemetry/telemetry-manager.js#11"},{"location":"src/telemetry/telemetry-manager.ts#18"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"sdk-node","version":"0.219.0","description":"OpenTelemetry SDK for Node.js","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/sdk-node@0.219.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-sdk-node"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/sdk-node@0.219.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/sdk-node/package.json"},{"name":"ImportedModules","value":"@opentelemetry/sdk-node,NodeSDK,@opentelemetry/sdk-node/NodeSDK"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/sdk-node/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/sdk-node/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#12"},{"location":"tmp/dist/telemetry/telemetry-manager.js#12"},{"location":"src/telemetry/telemetry-manager.ts#19"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"sdk-trace-base","version":"2.8.0","description":"OpenTelemetry Tracing","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/sdk-trace-base@2.8.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-base"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/sdk-trace-base@2.8.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/sdk-trace-base/package.json"},{"name":"ImportedModules","value":"@opentelemetry/sdk-trace-base,SamplingDecision,@opentelemetry/sdk-trace-base/SamplingDecision,Sampler,@opentelemetry/sdk-trace-base/Sampler,SamplingResult,@opentelemetry/sdk-trace-base/SamplingResult"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/sdk-trace-base/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/sdk-trace-base/package.json"}],"occurrences":[{"location":"dist/telemetry/trace-sampler.js#2"},{"location":"tmp/dist/telemetry/trace-sampler.js#2"},{"location":"src/telemetry/trace-sampler.ts#2"},{"location":"src/telemetry/trace-sampler.ts#3"}]}},{"authors":[{"name":"OpenTelemetry Authors"}],"group":"@opentelemetry","name":"semantic-conventions","version":"1.38.0","description":"OpenTelemetry semantic conventions","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/%40opentelemetry/semantic-conventions@1.38.0","externalReferences":[{"type":"vcs","url":"https://github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions"}],"type":"library","bom-ref":"pkg:npm/@opentelemetry/semantic-conventions@1.38.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/@opentelemetry/semantic-conventions/package.json"},{"name":"ImportedModules","value":"@opentelemetry/semantic-conventions,ATTR_SERVICE_NAME,@opentelemetry/semantic-conventions/ATTR_SERVICE_NAME,ATTR_SERVICE_VERSION,@opentelemetry/semantic-conventions/ATTR_SERVICE_VERSION"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/@opentelemetry/semantic-conventions/package.json"}],"concludedValue":"packages/appkit/node_modules/@opentelemetry/semantic-conventions/package.json"}],"occurrences":[{"location":"dist/telemetry/telemetry-manager.js#13"},{"location":"tmp/dist/telemetry/telemetry-manager.js#13"},{"location":"src/telemetry/telemetry-manager.ts#23"}]}},{"authors":[{"name":"Apache Software Foundation"}],"group":"","name":"apache-arrow","version":"21.1.0","description":"Apache Arrow columnar in-memory format","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/apache-arrow@21.1.0","externalReferences":[{"type":"website","url":"https://arrow.apache.org/js/"},{"type":"vcs","url":"git+https://github.com/apache/arrow-js.git"}],"type":"library","bom-ref":"pkg:npm/apache-arrow@21.1.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/apache-arrow/package.json"},{"name":"ImportedModules","value":"apache-arrow,Binary,apache-arrow/Binary,Bool,apache-arrow/Bool,DateDay,apache-arrow/DateDay,Decimal,apache-arrow/Decimal,DurationMicrosecond,apache-arrow/DurationMicrosecond,Field,apache-arrow/Field,Float32,apache-arrow/Float32,Float64,apache-arrow/Float64,Int16,apache-arrow/Int16,Int32,apache-arrow/Int32,Int64,apache-arrow/Int64,Int8,apache-arrow/Int8,IntervalYearMonth,apache-arrow/IntervalYearMonth,List,apache-arrow/List,Map_,apache-arrow/Map_,Null,apache-arrow/Null,Schema,apache-arrow/Schema,Struct,apache-arrow/Struct,Table,apache-arrow/Table,TimestampMicrosecond,apache-arrow/TimestampMicrosecond,Utf8,apache-arrow/Utf8,tableToIPC,apache-arrow/tableToIPC,Type,apache-arrow/Type,tableFromIPC,apache-arrow/tableFromIPC,DataType,apache-arrow/DataType"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/apache-arrow/package.json"}],"concludedValue":"packages/appkit/node_modules/apache-arrow/package.json"}],"occurrences":[{"location":"dist/connectors/sql-warehouse/arrow-schema.js#1"},{"location":"dist/plugins/analytics/result-delivery.js#4"},{"location":"dist/type-generator/query-registry.js#14"},{"location":"tmp/dist/connectors/sql-warehouse/arrow-schema.js#1"},{"location":"tmp/dist/plugins/analytics/result-delivery.js#4"},{"location":"tmp/dist/type-generator/query-registry.js#14"},{"location":"src/connectors/sql-warehouse/arrow-schema.ts#25"},{"location":"src/plugins/analytics/result-delivery.ts#1"},{"location":"src/type-generator/query-registry.ts#3"}]}},{"group":"","name":"dotenv","version":"16.6.1","description":"Loads environment variables from .env file","scope":"required","licenses":[{"license":{"id":"BSD-2-Clause","url":"https://opensource.org/licenses/BSD-2-Clause"}}],"purl":"pkg:npm/dotenv@16.6.1","externalReferences":[{"type":"vcs","url":"https://github.com/motdotla/dotenv#readme"},{"type":"vcs","url":"git://github.com/motdotla/dotenv.git"}],"type":"library","bom-ref":"pkg:npm/dotenv@16.6.1","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/dotenv/package.json"},{"name":"ImportedModules","value":"dotenv,dotenv/config"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/dotenv/package.json"}],"concludedValue":"packages/appkit/node_modules/dotenv/package.json"}],"occurrences":[{"location":"dist/plugins/server/index.js#21"},{"location":"dist/type-generator/index.js#19"},{"location":"tmp/dist/cli/index.js#8"},{"location":"tmp/dist/plugins/server/index.js#21"},{"location":"tmp/dist/type-generator/index.js#19"},{"location":"src/plugins/server/index.ts#4"},{"location":"src/type-generator/index.ts#4"},{"location":"tmp/dist/cli/index.js#8"}]}},{"authors":[{"name":"Drizzle Team"}],"group":"","name":"drizzle-orm","version":"0.45.1","description":"Drizzle ORM package for SQL databases","scope":"required","licenses":[{"license":{"id":"Apache-2.0","url":"https://opensource.org/licenses/Apache-2.0"}}],"purl":"pkg:npm/drizzle-orm@0.45.1","externalReferences":[{"type":"website","url":"https://orm.drizzle.team"},{"type":"vcs","url":"git+https://github.com/drizzle-team/drizzle-orm.git"}],"type":"library","bom-ref":"pkg:npm/drizzle-orm@0.45.1","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/drizzle-orm/package.json"},{"name":"ImportedModules","value":"drizzle-orm,Relation,drizzle-orm/Relation,relations,drizzle-orm/relations,drizzle-orm/pg-core,AnyPgColumn,drizzle-orm/pg-core/AnyPgColumn,PgTable,drizzle-orm/pg-core/PgTable,bigserial,drizzle-orm/pg-core/bigserial,PgColumnBuilderBase,drizzle-orm/pg-core/PgColumnBuilderBase,PgEnum,drizzle-orm/pg-core/PgEnum,bigint,drizzle-orm/pg-core/bigint,boolean,drizzle-orm/pg-core/boolean,pgEnum,drizzle-orm/pg-core/pgEnum,integer,drizzle-orm/pg-core/integer,jsonb,drizzle-orm/pg-core/jsonb,pgSchema,drizzle-orm/pg-core/pgSchema,pgTable,drizzle-orm/pg-core/pgTable,text,drizzle-orm/pg-core/text,timestamp,drizzle-orm/pg-core/timestamp,uuid,drizzle-orm/pg-core/uuid,varchar,drizzle-orm/pg-core/varchar,serial,drizzle-orm/pg-core/serial"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/drizzle-orm/package.json"}],"concludedValue":"packages/appkit/node_modules/drizzle-orm/package.json"}],"occurrences":[{"location":"src/database/schema-builder/engine/relations.ts#1"},{"location":"src/database/schema-builder/engine/relations.ts#2"},{"location":"src/database/schema-builder/engine/tables.ts#19"},{"location":"src/database/schema-builder/engine/relations.ts#2"},{"location":"src/database/schema-builder/engine/tables.ts#19"}]},"tags":["orm","sql"]},{"authors":[{"name":"TJ Holowaychuk <tj@vision-media.ca>"}],"group":"","name":"express","version":"4.22.2","description":"Fast, unopinionated, minimalist web framework","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/express@4.22.2","externalReferences":[{"type":"website","url":"http://expressjs.com/"}],"type":"framework","bom-ref":"pkg:npm/express@4.22.2","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/express/package.json"},{"name":"ImportedModules","value":"express,NextFunction,express/NextFunction,Request,express/Request,Response,express/Response"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/express/package.json"}],"concludedValue":"packages/appkit/node_modules/express/package.json"}],"occurrences":[{"location":"dist/plugins/server/index.js#22"},{"location":"dist/plugins/server/static-server.js#4"},{"location":"tmp/dist/plugins/server/index.js#22"},{"location":"tmp/dist/plugins/server/static-server.js#4"},{"location":"src/core/plugin-context.ts#1"},{"location":"src/logging/logger.ts#4"},{"location":"src/plugin/plugin.ts#2"},{"location":"src/plugins/agents/agents.ts#3"},{"location":"src/plugins/ai-search/ai-search.ts#1"},{"location":"src/plugins/analytics/analytics.ts#1"},{"location":"src/plugins/files/plugin.ts#3"},{"location":"src/plugins/genie/genie.ts#2"},{"location":"src/plugins/jobs/plugin.ts#2"},{"location":"src/plugins/server/base-server.ts#1"},{"location":"src/plugins/server/index.ts#5"},{"location":"src/plugins/server/remote-tunnel/gate.ts#1"},{"location":"src/plugins/server/remote-tunnel/remote-tunnel-controller.ts#2"},{"location":"src/plugins/server/remote-tunnel/remote-tunnel-manager.ts#6"},{"location":"src/plugins/server/static-server.ts#3"},{"location":"src/plugins/server/static-server.ts#4"},{"location":"src/plugins/server/vite-dev-server.ts#3"},{"location":"src/plugins/serving/serving.ts#4"},{"location":"src/utils/safe-handler.ts#1"}]},"tags":["framework","web"]},{"authors":[{"name":"Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)"}],"group":"","name":"get-port","version":"7.2.0","description":"Get an available port","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/get-port@7.2.0","type":"library","bom-ref":"pkg:npm/get-port@7.2.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/get-port/package.json"},{"name":"ImportedModules","value":"get-port,portNumbers,get-port/portNumbers"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/get-port/package.json"}],"concludedValue":"packages/appkit/node_modules/get-port/package.json"}],"occurrences":[{"location":"dist/plugins/server/index.js#23"},{"location":"tmp/dist/plugins/server/index.js#23"},{"location":"src/plugins/server/index.ts#6"}]}},{"authors":[{"name":"Vladimir Zapparov <dervus.grim@gmail.com>"}],"group":"","name":"js-yaml","version":"4.2.0","description":"YAML 1.2 parser and serializer","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/js-yaml@4.2.0","type":"library","bom-ref":"pkg:npm/js-yaml@4.2.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/js-yaml/package.json"},{"name":"ImportedModules","value":"js-yaml"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/js-yaml/package.json"}],"concludedValue":"packages/appkit/node_modules/js-yaml/package.json"}],"occurrences":[{"location":"dist/core/agent/load-agents.js#5"},{"location":"tmp/dist/core/agent/load-agents.js#5"},{"location":"src/core/agent/load-agents.ts#4"}]}},{"authors":[{"name":"Rich Harris"}],"group":"","name":"magic-string","version":"0.30.21","description":"Modify strings, generate sourcemaps","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/magic-string@0.30.21","externalReferences":[{"type":"vcs","url":"git+https://github.com/Rich-Harris/magic-string.git"}],"type":"library","bom-ref":"pkg:npm/magic-string@0.30.21","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/magic-string/package.json"},{"name":"ImportedModules","value":"magic-string"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/magic-string/package.json"}],"concludedValue":"packages/appkit/node_modules/magic-string/package.json"}],"occurrences":[{"location":"dist/plugins/server/react-source-loc-vite-plugin.js#3"},{"location":"tmp/dist/plugins/server/react-source-loc-vite-plugin.js#3"},{"location":"src/plugins/server/react-source-loc-vite-plugin.ts#3"}]}},{"authors":[{"name":"Kevin Deng <sxzz@sxzz.moe>"}],"group":"","name":"obug","version":"2.1.1","description":"A lightweight JavaScript debugging utility, forked from debug, featuring TypeScript and ESM support.","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/obug@2.1.1","externalReferences":[{"type":"vcs","url":"https://github.com/sxzz/obug#readme"},{"type":"vcs","url":"git+https://github.com/sxzz/obug.git"}],"type":"library","bom-ref":"pkg:npm/obug@2.1.1","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/obug/package.json"},{"name":"ImportedModules","value":"obug,createDebug,obug/createDebug"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/obug/package.json"}],"concludedValue":"packages/appkit/node_modules/obug/package.json"}],"occurrences":[{"location":"dist/logging/logger.js#7"},{"location":"tmp/dist/logging/logger.js#7"},{"location":"src/logging/logger.ts#5"}]}},{"authors":[{"name":"Brian Carlson <brian.m.carlson@gmail.com>"}],"group":"","name":"pg","version":"8.18.0","description":"PostgreSQL client - pure javascript & libpq with the same API","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/pg@8.18.0","externalReferences":[{"type":"vcs","url":"https://github.com/brianc/node-postgres"},{"type":"vcs","url":"git://github.com/brianc/node-postgres.git"}],"type":"library","bom-ref":"pkg:npm/pg@8.18.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/pg/package.json"},{"name":"ImportedModules","value":"pg,Pool,pg/Pool,PoolClient,pg/PoolClient,QueryResult,pg/QueryResult,QueryResultRow,pg/QueryResultRow"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/pg/package.json"}],"concludedValue":"packages/appkit/node_modules/pg/package.json"}],"occurrences":[{"location":"src/cache/storage/persistent.ts#2"},{"location":"src/connectors/lakebase/index.ts#5"},{"location":"src/connectors/lakebase/pool-manager.ts#2"},{"location":"src/connectors/lakebase/routing-pool.ts#1"},{"location":"src/plugins/lakebase/lakebase.ts#1"}]}},{"authors":[{"name":"Alexey Raspopov"}],"group":"","name":"picocolors","version":"1.1.1","description":"The tiniest and the fastest library for terminal output formatting with ANSI colors","scope":"required","licenses":[{"license":{"id":"ISC","url":"https://opensource.org/licenses/ISC"}}],"purl":"pkg:npm/picocolors@1.1.1","type":"library","bom-ref":"pkg:npm/picocolors@1.1.1","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/picocolors/package.json"},{"name":"ImportedModules","value":"picocolors"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/picocolors/package.json"}],"concludedValue":"packages/appkit/node_modules/picocolors/package.json"}],"occurrences":[{"location":"dist/errors/configuration.js#2"},{"location":"dist/plugins/agents/agents.js#27"},{"location":"dist/plugins/server/client-config-sanitizer.js#2"},{"location":"dist/plugins/server/utils.js#2"},{"location":"dist/type-generator/index.js#15"},{"location":"dist/type-generator/migration.js#2"},{"location":"dist/type-generator/query-registry.js#11"},{"location":"dist/type-generator/serving/generator.js#9"},{"location":"tmp/dist/errors/configuration.js#2"},{"location":"tmp/dist/plugins/agents/agents.js#27"},{"location":"tmp/dist/plugins/server/client-config-sanitizer.js#2"},{"location":"tmp/dist/plugins/server/utils.js#2"},{"location":"tmp/dist/type-generator/index.js#15"},{"location":"tmp/dist/type-generator/migration.js#2"},{"location":"tmp/dist/type-generator/query-registry.js#11"},{"location":"tmp/dist/type-generator/serving/generator.js#9"},{"location":"src/errors/configuration.ts#1"},{"location":"src/plugins/agents/agents.ts#4"},{"location":"src/plugins/server/client-config-sanitizer.ts#1"},{"location":"src/plugins/server/utils.ts#5"},{"location":"src/type-generator/index.ts#5"},{"location":"src/type-generator/migration.ts#4"},{"location":"src/type-generator/query-registry.ts#4"},{"location":"src/type-generator/serving/generator.ts#3"}]}},{"authors":[{"name":"GitHub Inc."}],"group":"","name":"semver","version":"7.7.3","description":"The semantic version parser used by npm.","scope":"required","licenses":[{"license":{"id":"ISC","url":"https://opensource.org/licenses/ISC"}}],"purl":"pkg:npm/semver@7.7.3","externalReferences":[{"type":"vcs","url":"git+https://github.com/npm/node-semver.git"}],"type":"library","bom-ref":"pkg:npm/semver@7.7.3","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/semver/package.json"},{"name":"ImportedModules","value":"semver,coerce,semver/coerce"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/semver/package.json"}],"concludedValue":"packages/appkit/node_modules/semver/package.json"}],"occurrences":[{"location":"dist/context/client-options.js#2"},{"location":"tmp/dist/context/client-options.js#2"},{"location":"src/context/client-options.ts#1"}]}},{"group":"","name":"shared","version":"0.0.1","scope":"required","purl":"pkg:npm/shared@0.0.1","type":"library","bom-ref":"pkg:npm/shared@0.0.1","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/shared/package.json"},{"name":"ExportedModules","value":"shared,AgentAdapter,shared/AgentAdapter,AgentEvent,shared/AgentEvent,AgentInput,shared/AgentInput,AgentRunContext,shared/AgentRunContext,AgentToolDefinition,shared/AgentToolDefinition,Message,shared/Message,Thread,shared/Thread,ThreadStore,shared/ThreadStore,ToolAnnotations,shared/ToolAnnotations,ToolProvider,shared/ToolProvider,GenieAttachmentResponse,shared/GenieAttachmentResponse,GenieMessageResponse,shared/GenieMessageResponse,GenieStatementResponse,shared/GenieStatementResponse,GenieStreamEvent,shared/GenieStreamEvent,BasePluginConfig,shared/BasePluginConfig,CacheConfig,shared/CacheConfig,IAppRouter,shared/IAppRouter,PluginData,shared/PluginData,StreamExecutionSettings,shared/StreamExecutionSettings,isSQLTypeMarker,shared/isSQLTypeMarker,shared/sql"},{"name":"ImportedModules","value":"shared,AgentAdapter,shared/AgentAdapter,AgentEvent,shared/AgentEvent,AgentInput,shared/AgentInput,AgentRunContext,shared/AgentRunContext,AgentToolDefinition,shared/AgentToolDefinition,Message,shared/Message,ResponseStreamEvent,shared/ResponseStreamEvent,CacheConfig,shared/CacheConfig,CacheEntry,shared/CacheEntry,CacheStorage,shared/CacheStorage,TelemetryOptions,shared/TelemetryOptions,GenieMessageResponse,shared/GenieMessageResponse,PluginConstructor,shared/PluginConstructor,PluginData,shared/PluginData,ToolProvider,shared/ToolProvider,ToolAnnotations,shared/ToolAnnotations,BasePluginConfig,shared/BasePluginConfig,ThreadStore,shared/ThreadStore,BasePlugin,shared/BasePlugin,InputPluginMap,shared/InputPluginMap,OptionalConfigPluginDef,shared/OptionalConfigPluginDef,PluginMap,shared/PluginMap,IAppRequest,shared/IAppRequest,TunnelConnection,shared/TunnelConnection,RetryConfig,shared/RetryConfig,TelemetryConfig,shared/TelemetryConfig,IAppResponse,shared/IAppResponse,PluginEndpointMap,shared/PluginEndpointMap,PluginExecuteConfig,shared/PluginExecuteConfig,PluginExecutionSettings,shared/PluginExecutionSettings,PluginPhase,shared/PluginPhase,RouteConfig,shared/RouteConfig,StreamExecuteHandler,shared/StreamExecuteHandler,StreamExecutionSettings,shared/StreamExecutionSettings,camelToKebab,shared/camelToKebab,ToPlugin,shared/ToPlugin,IAppRouter,shared/IAppRouter,ResponseOutputMessage,shared/ResponseOutputMessage,Thread,shared/Thread,ResponseFunctionCallOutput,shared/ResponseFunctionCallOutput,ResponseFunctionToolCall,shared/ResponseFunctionToolCall,AnalyticsSseMessage,shared/AnalyticsSseMessage,makeResultMessage,shared/makeResultMessage,SQLTypeMarker,shared/SQLTypeMarker,shared/sql,MetricViewColumnDisplay,shared/MetricViewColumnDisplay,MetricViewsMetadata,shared/MetricViewsMetadata,isSQLTypeMarker,shared/isSQLTypeMarker,PluginClientConfigs,shared/PluginClientConfigs,PluginEndpoints,shared/PluginEndpoints,ResourceFieldEntry,shared/ResourceFieldEntry,PluginManifest,shared/PluginManifest,StreamConfig,shared/StreamConfig"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/shared/package.json"}],"concludedValue":"packages/appkit/node_modules/shared/package.json"}],"occurrences":[{"location":"src/agents/databricks.ts#7"},{"location":"src/agents/supervisor-api.ts#8"},{"location":"src/beta.ts#20"},{"location":"src/cache/defaults.ts#1"},{"location":"src/cache/index.ts#2"},{"location":"src/cache/storage/memory.ts#1"},{"location":"src/cache/storage/persistent.ts#3"},{"location":"src/connectors/ai-search/types.ts#1"},{"location":"src/connectors/files/client.ts#2"},{"location":"src/connectors/genie/types.ts#3"},{"location":"src/connectors/genie/types.ts#10"},{"location":"src/connectors/jobs/types.ts#1"},{"location":"src/connectors/mcp/client.ts#25"},{"location":"src/connectors/sql-warehouse/client.ts#1"},{"location":"src/core/agent/build-toolkit.ts#1"},{"location":"src/core/agent/consume-adapter-stream.ts#1"},{"location":"src/core/agent/load-agents.ts#5"},{"location":"src/core/agent/run-agent.ts#10"},{"location":"src/core/agent/toolkit-resolver.ts#1"},{"location":"src/core/agent/tools/define-tool.ts#1"},{"location":"src/core/agent/tools/function-tool.ts#1"},{"location":"src/core/agent/tools/tool.ts#1"},{"location":"src/core/agent/types.ts#7"},{"location":"src/core/appkit.ts#9"},{"location":"src/core/lifecycle-manager.ts#1"},{"location":"src/core/plugin-context.ts#2"},{"location":"src/index.ts#15"},{"location":"src/index.ts#16"},{"location":"src/plugin/dev-reader.ts#2"},{"location":"src/plugin/index.ts#1"},{"location":"src/plugin/interceptors/cache.ts#1"},{"location":"src/plugin/interceptors/retry.ts#1"},{"location":"src/plugin/interceptors/telemetry.ts#1"},{"location":"src/plugin/plugin.ts#14"},{"location":"src/plugin/plugin.ts#15"},{"location":"src/plugin/to-plugin.ts#1"},{"location":"src/plugins/agents/agents.ts#17"},{"location":"src/plugins/agents/defaults.ts#1"},{"location":"src/plugins/agents/event-translator.ts#8"},{"location":"src/plugins/agents/thread-store.ts#2"},{"location":"src/plugins/ai-search/ai-search.ts#2"},{"location":"src/plugins/ai-search/defaults.ts#1"},{"location":"src/plugins/ai-search/types.ts#1"},{"location":"src/plugins/analytics/analytics.ts#11"},{"location":"src/plugins/analytics/defaults.ts#1"},{"location":"src/plugins/analytics/mv/formatters.ts#1"},{"location":"src/plugins/analytics/mv/metadata.ts#1"},{"location":"src/plugins/analytics/query.ts#2"},{"location":"src/plugins/analytics/result-delivery.ts#2"},{"location":"src/plugins/analytics/types.ts#5"},{"location":"src/plugins/files/defaults.ts#1"},{"location":"src/plugins/files/plugin.ts#9"},{"location":"src/plugins/files/types.ts#1"},{"location":"src/plugins/genie/defaults.ts#1"},{"location":"src/plugins/genie/genie.ts#8"},{"location":"src/plugins/genie/types.ts#1"},{"location":"src/plugins/genie/types.ts#4"},{"location":"src/plugins/jobs/defaults.ts#1"},{"location":"src/plugins/jobs/plugin.ts#7"},{"location":"src/plugins/jobs/types.ts#1"},{"location":"src/plugins/lakebase/lakebase.ts#2"},{"location":"src/plugins/lakebase/types.ts#1"},{"location":"src/plugins/server/index.ts#7"},{"location":"src/plugins/server/index.ts#8"},{"location":"src/plugins/server/remote-tunnel/remote-tunnel-manager.ts#7"},{"location":"src/plugins/server/types.ts#1"},{"location":"src/plugins/server/utils.ts#6"},{"location":"src/plugins/serving/serving.ts#5"},{"location":"src/plugins/serving/types.ts#1"},{"location":"src/plugins/ui-variants/index.ts#1"},{"location":"src/registry/manifest-loader.ts#1"},{"location":"src/registry/resource-registry.ts#13"},{"location":"src/registry/types.ts#33"},{"location":"src/registry/types.ts#39"},{"location":"src/stream/sse-writer.ts#1"},{"location":"src/stream/stream-manager.ts#3"},{"location":"src/stream/types.ts#2"},{"location":"src/telemetry/telemetry-manager.ts#24"},{"location":"src/telemetry/telemetry-provider.ts#5"}]},"tags":["sql"]},{"authors":[{"name":"Einar Otto Stangvik <einaros@gmail.com> (http://2x.io)"}],"group":"","name":"ws","version":"8.21.0","description":"Simple to use, blazing fast and thoroughly tested websocket client and server for Node.js","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/ws@8.21.0","externalReferences":[{"type":"vcs","url":"https://github.com/websockets/ws"},{"type":"vcs","url":"git+https://github.com/websockets/ws.git"}],"type":"library","bom-ref":"pkg:npm/ws@8.21.0","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/ws/package.json"},{"name":"ImportedModules","value":"ws,WebSocketServer,ws/WebSocketServer"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/ws/package.json"}],"concludedValue":"packages/appkit/node_modules/ws/package.json"}],"occurrences":[{"location":"dist/plugins/server/remote-tunnel/remote-tunnel-manager.js#8"},{"location":"tmp/dist/plugins/server/remote-tunnel/remote-tunnel-manager.js#8"},{"location":"src/plugins/server/remote-tunnel/remote-tunnel-manager.ts#8"}]}},{"authors":[{"name":"Colin McDonnell <zod@colinhacks.com>"}],"group":"","name":"zod","version":"4.3.6","description":"TypeScript-first schema declaration and validation library with static type inference","scope":"required","licenses":[{"license":{"id":"MIT","url":"https://opensource.org/licenses/MIT"}}],"purl":"pkg:npm/zod@4.3.6","externalReferences":[{"type":"website","url":"https://zod.dev"},{"type":"vcs","url":"git+https://github.com/colinhacks/zod.git"}],"type":"library","bom-ref":"pkg:npm/zod@4.3.6","properties":[{"name":"SrcFile","value":"packages/appkit/node_modules/zod/package.json"},{"name":"ImportedModules","value":"zod,toJSONSchema,zod/toJSONSchema,zod/z,ZodType,zod/ZodType"}],"evidence":{"identity":[{"field":"purl","confidence":0.7,"methods":[{"technique":"manifest-analysis","confidence":0.7,"value":"packages/appkit/node_modules/zod/package.json"}],"concludedValue":"packages/appkit/node_modules/zod/package.json"}],"occurrences":[{"location":"dist/core/agent/tools/json-schema.js#1"},{"location":"dist/plugins/agents/schemas.js#1"},{"location":"dist/plugins/analytics/analytics.js#27"},{"location":"dist/plugins/analytics/mv/schemas.js#6"},{"location":"dist/plugins/files/plugin.js#24"},{"location":"dist/plugins/genie/genie.js#14"},{"location":"dist/plugins/jobs/plugin.js#17"},{"location":"dist/plugins/lakebase/lakebase.js#16"},{"location":"dist/shared/src/schemas/metric-source.js#2"},{"location":"dist/shared/src/sse/analytics.js#1"},{"location":"tmp/dist/core/agent/tools/json-schema.js#1"},{"location":"tmp/dist/plugins/agents/schemas.js#1"},{"location":"tmp/dist/plugins/analytics/analytics.js#27"},{"location":"tmp/dist/plugins/analytics/mv/schemas.js#6"},{"location":"tmp/dist/plugins/files/plugin.js#24"},{"location":"tmp/dist/plugins/genie/genie.js#14"},{"location":"tmp/dist/plugins/jobs/plugin.js#17"},{"location":"tmp/dist/plugins/lakebase/lakebase.js#16"},{"location":"tmp/dist/schemas/manifest.js#2"},{"location":"tmp/dist/shared/src/schemas/metric-source.js#2"},{"location":"tmp/dist/shared/src/sse/analytics.js#1"},{"location":"src/core/agent/tools/define-tool.ts#2"},{"location":"src/core/agent/tools/json-schema.ts#1"},{"location":"src/core/agent/tools/tool.ts#2"},{"location":"src/database/schema-builder/validators.ts#1"},{"location":"src/database/schema-builder/validators.ts#2"},{"location":"src/plugins/agents/schemas.ts#1"},{"location":"src/plugins/analytics/analytics.ts#12"},{"location":"src/plugins/analytics/mv/schemas.ts#1"},{"location":"src/plugins/files/plugin.ts#10"},{"location":"src/plugins/genie/genie.ts#9"},{"location":"src/plugins/jobs/plugin.ts#8"},{"location":"src/plugins/jobs/types.ts#2"},{"location":"src/plugins/lakebase/lakebase.ts#3"}]},"tags":["validation"]}],"dependencies":[],"compositions":[{"bom-ref":"pkg:npm/@databricks/appkit@0.55.1","aggregate":"incomplete"}],"annotations":[{"bom-ref":"metadata-annotations","subjects":["pkg:npm/@databricks/appkit@0.55.1"],"annotator":{"component":{"group":"@cyclonedx","name":"cdxgen","version":"12.1.2","purl":"pkg:npm/%40cyclonedx/cdxgen@12.1.2","type":"application","bom-ref":"pkg:npm/@cyclonedx/cdxgen@12.1.2","publisher":"OWASP Foundation","authors":[{"name":"OWASP Foundation"}]}},"timestamp":"2026-08-07T08:38:21Z","text":"This Software Bill-of-Materials (SBOM) document was created on Friday, August 7, 2026 with cdxgen. The data was captured during the build lifecycle phase. The document describes an application named 'appkit' with version '0.55.1'. There are 32 components. The package type in this SBOM is npm with 3 purl namespaces described under components. The components were identified from 32 source files."}]}
@@ -1,29 +0,0 @@
1
- # Type Alias: JobHandle
2
-
3
- ```ts
4
- type JobHandle = JobAPI & {
5
- asUser: (req: IAppRequest) => JobAPI;
6
- };
7
-
8
- ```
9
-
10
- Job handle returned by `appkit.jobs("etl")`. Supports OBO access via `.asUser(req)`.
11
-
12
- ## Type Declaration[​](#type-declaration "Direct link to Type Declaration")
13
-
14
- ### asUser()[​](#asuser "Direct link to asUser()")
15
-
16
- ```ts
17
- asUser: (req: IAppRequest) => JobAPI;
18
-
19
- ```
20
-
21
- #### Parameters[​](#parameters "Direct link to Parameters")
22
-
23
- | Parameter | Type |
24
- | --------- | ------------- |
25
- | `req` | `IAppRequest` |
26
-
27
- #### Returns[​](#returns "Direct link to Returns")
28
-
29
- [`JobAPI`](./docs/api/appkit/Interface.JobAPI.md)