@databricks/appkit 0.20.2 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/CLAUDE.md +5 -13
  2. package/NOTICE.md +3 -6
  3. package/dist/app/index.js.map +1 -1
  4. package/dist/appkit/package.js +1 -1
  5. package/dist/cli/commands/plugin/add-resource/add-resource.js.map +1 -1
  6. package/dist/connectors/files/client.js.map +1 -1
  7. package/dist/connectors/files/defaults.js +1 -1
  8. package/dist/connectors/files/defaults.js.map +1 -1
  9. package/dist/connectors/files/index.js +1 -1
  10. package/dist/connectors/genie/client.js.map +1 -1
  11. package/dist/connectors/genie/index.d.ts +0 -1
  12. package/dist/connectors/genie/index.js +0 -2
  13. package/dist/connectors/index.js +1 -3
  14. package/dist/connectors/lakebase/index.js.map +1 -1
  15. package/dist/connectors/sql-warehouse/client.js.map +1 -1
  16. package/dist/context/index.d.ts +2 -2
  17. package/dist/context/index.js +0 -1
  18. package/dist/context/index.js.map +1 -1
  19. package/dist/index.d.ts +2 -1
  20. package/dist/logging/index.js +0 -13
  21. package/dist/logging/logger.js.map +1 -1
  22. package/dist/logging/sampling.js.map +1 -1
  23. package/dist/plugins/files/defaults.js +0 -2
  24. package/dist/plugins/files/defaults.js.map +1 -1
  25. package/dist/plugins/files/index.js +0 -1
  26. package/dist/plugins/genie/index.d.ts +1 -1
  27. package/dist/plugins/genie/types.d.ts +1 -1
  28. package/dist/plugins/genie/types.d.ts.map +1 -1
  29. package/dist/plugins/index.d.ts +2 -3
  30. package/dist/plugins/index.js +1 -2
  31. package/dist/plugins/lakebase/index.d.ts +1 -1
  32. package/dist/plugins/lakebase/index.js +1 -1
  33. package/dist/plugins/lakebase/lakebase.d.ts +1 -1
  34. package/dist/plugins/lakebase/lakebase.d.ts.map +1 -1
  35. package/dist/plugins/lakebase/lakebase.js +1 -1
  36. package/dist/plugins/lakebase/lakebase.js.map +1 -1
  37. package/dist/plugins/server/index.js.map +1 -1
  38. package/dist/plugins/server/utils.js.map +1 -1
  39. package/dist/registry/index.d.ts +3 -2
  40. package/dist/registry/manifest-loader.d.ts +4 -3
  41. package/dist/registry/manifest-loader.d.ts.map +1 -1
  42. package/dist/registry/types.d.ts +19 -57
  43. package/dist/registry/types.d.ts.map +1 -1
  44. package/dist/registry/types.generated.d.ts +1 -1
  45. package/dist/registry/types.js +7 -2
  46. package/dist/registry/types.js.map +1 -1
  47. package/dist/schemas/plugin-manifest.generated.d.ts +178 -0
  48. package/dist/schemas/plugin-manifest.generated.d.ts.map +1 -0
  49. package/dist/schemas/plugin-manifest.schema.json +2 -0
  50. package/dist/shared/src/cache.d.ts +1 -1
  51. package/dist/shared/src/execute.d.ts +7 -1
  52. package/dist/shared/src/execute.d.ts.map +1 -1
  53. package/dist/shared/src/index.d.ts +2 -1
  54. package/dist/shared/src/plugin.d.ts +19 -48
  55. package/dist/shared/src/plugin.d.ts.map +1 -1
  56. package/dist/shared/src/schemas/plugin-manifest.generated.d.ts +178 -0
  57. package/dist/shared/src/schemas/plugin-manifest.generated.d.ts.map +1 -0
  58. package/dist/stream/arrow-stream-processor.js.map +1 -1
  59. package/dist/stream/index.d.ts +1 -3
  60. package/dist/stream/index.js +0 -3
  61. package/dist/stream/stream-manager.js +1 -1
  62. package/dist/stream/types.js.map +1 -1
  63. package/dist/telemetry/config.js +1 -0
  64. package/dist/telemetry/config.js.map +1 -1
  65. package/dist/telemetry/index.d.ts +1 -1
  66. package/dist/telemetry/noop.js.map +1 -1
  67. package/dist/telemetry/types.d.ts +1 -1
  68. package/dist/type-generator/query-registry.js.map +1 -1
  69. package/dist/utils/path-exclusions.js.map +1 -1
  70. package/docs/api/appkit/Interface.CacheConfig.md +1 -1
  71. package/docs/api/appkit/Interface.PluginManifest.md +104 -6
  72. package/docs/api/appkit/Interface.ResourceEntry.md +5 -7
  73. package/docs/api/appkit/Interface.ResourceFieldEntry.md +2 -0
  74. package/docs/api/appkit/Interface.ResourceRequirement.md +63 -7
  75. package/docs/api/appkit/Interface.StreamExecutionSettings.md +1 -1
  76. package/docs/api/appkit/TypeAlias.PluginData.md +2 -0
  77. package/docs/api/appkit/TypeAlias.ToPlugin.md +2 -0
  78. package/docs/api/appkit.md +6 -6
  79. package/llms.txt +5 -13
  80. package/package.json +2 -2
  81. package/dist/stream/arrow-stream-processor.d.ts +0 -1
  82. package/dist/stream/buffers.d.ts +0 -1
  83. package/dist/stream/types.d.ts +0 -3
  84. package/docs/api/appkit-ui/data/AreaChart.md +0 -79
  85. package/docs/api/appkit-ui/data/BarChart.md +0 -74
  86. package/docs/api/appkit-ui/data/DonutChart.md +0 -72
  87. package/docs/api/appkit-ui/data/HeatmapChart.md +0 -91
  88. package/docs/api/appkit-ui/data/LineChart.md +0 -77
  89. package/docs/api/appkit-ui/data/PieChart.md +0 -72
  90. package/docs/api/appkit-ui/data/RadarChart.md +0 -74
  91. package/docs/api/appkit-ui/data/ScatterChart.md +0 -76
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../src/registry/types.ts"],"sourcesContent":["/**\n * Resource Registry Type System\n *\n * This module defines the type system for the AppKit Resource Registry,\n * which enables plugins to declare their Databricks resource requirements\n * in a machine-readable format.\n *\n * Resource types and permissions are generated from plugin-manifest.schema.json\n * (see types.generated.ts). Hand-written interfaces below define the registry API.\n */\n\n// Re-export generated registry types (enum + const must be value exports for runtime)\nimport {\n type AppPermission,\n type DatabasePermission,\n type ExperimentPermission,\n type GenieSpacePermission,\n type JobPermission,\n PERMISSION_HIERARCHY_BY_TYPE,\n PERMISSIONS_BY_TYPE,\n type ResourcePermission,\n ResourceType,\n type SecretPermission,\n type ServingEndpointPermission,\n type SqlWarehousePermission,\n type UcConnectionPermission,\n type UcFunctionPermission,\n type VectorSearchIndexPermission,\n type VolumePermission,\n} from \"./types.generated\";\n\nexport {\n PERMISSION_HIERARCHY_BY_TYPE,\n PERMISSIONS_BY_TYPE,\n ResourceType,\n type AppPermission,\n type DatabasePermission,\n type ExperimentPermission,\n type GenieSpacePermission,\n type JobPermission,\n type ResourcePermission,\n type SecretPermission,\n type ServingEndpointPermission,\n type SqlWarehousePermission,\n type UcConnectionPermission,\n type UcFunctionPermission,\n type VectorSearchIndexPermission,\n type VolumePermission,\n};\n\n// ============================================================================\n// Hand-written interfaces (not in JSON schema)\n// ============================================================================\n\n/**\n * Defines a single field for a resource. Each field has its own environment variable and optional description.\n * Single-value types use one key (e.g. id); multi-value types (database, secret) use multiple (e.g. instance_name, database_name or scope, key).\n */\nexport interface ResourceFieldEntry {\n /** Environment variable name for this field */\n env?: string;\n /** Human-readable description for this field */\n description?: string;\n /** When true, this field is excluded from Databricks bundle configuration (databricks.yml) generation. */\n bundleIgnore?: boolean;\n /** Example values showing the expected format for this field */\n examples?: string[];\n /** When true, this field is only generated for local .env files. The Databricks Apps platform auto-injects it at deploy time. */\n localOnly?: boolean;\n /** Static value for this field. Used when no prompted or resolved value exists. */\n value?: string;\n /** Named resolver prefixed by resource type (e.g., 'postgres:host'). The CLI resolves this value during the init prompt flow. */\n resolve?: string;\n}\n\n/**\n * Declares a resource requirement for a plugin.\n * Can be defined statically in a manifest or dynamically via getResourceRequirements().\n */\nexport interface ResourceRequirement {\n /** Type of Databricks resource required */\n type: ResourceType;\n\n /** Unique alias for this resource within the plugin (e.g., 'warehouse', 'secrets'). Used for UI/display. */\n alias: string;\n\n /** Stable key for machine use (env naming, composite keys, app.yaml). Required. */\n resourceKey: string;\n\n /** Human-readable description of why this resource is needed */\n description: string;\n\n /** Required permission level for the resource */\n permission: ResourcePermission;\n\n /**\n * Map of field name to env and optional description.\n * Single-value types use one key (e.g. id); multi-value (database, secret) use multiple keys.\n */\n fields: Record<string, ResourceFieldEntry>;\n\n /** Whether this resource is required (true) or optional (false) */\n required: boolean;\n}\n\n/**\n * Internal representation of a resource in the registry.\n * Extends ResourceRequirement with resolution state and plugin ownership.\n */\nexport interface ResourceEntry extends ResourceRequirement {\n /** Plugin(s) that require this resource (comma-separated if multiple) */\n plugin: string;\n\n /** Whether the resource has been resolved (all field env vars set) */\n resolved: boolean;\n\n /** Resolved value per field name. Populated by validate() when all field env vars are set. */\n values?: Record<string, string>;\n\n /**\n * Per-plugin permission tracking.\n * Maps plugin name to the permission it originally requested.\n * Populated when multiple plugins share the same resource.\n */\n permissionSources?: Record<string, ResourcePermission>;\n}\n\n/**\n * Result of validating all registered resources against the environment.\n */\nexport interface ValidationResult {\n /** Whether all required resources are available */\n valid: boolean;\n\n /** List of missing required resources */\n missing: ResourceEntry[];\n\n /** Complete list of all registered resources (required and optional) */\n all: ResourceEntry[];\n}\n\nimport type { JSONSchema7 } from \"json-schema\";\n\n/**\n * Configuration schema definition for plugin config.\n * Re-exported from the standard JSON Schema Draft 7 types.\n *\n * @see {@link https://json-schema.org/draft-07/json-schema-release-notes | JSON Schema Draft 7}\n */\nexport type ConfigSchema = JSONSchema7;\n\n/**\n * Plugin manifest that declares metadata and resource requirements.\n * Attached to plugin classes as a static property.\n */\nexport interface PluginManifest<TName extends string = string> {\n /** Plugin identifier — the single source of truth for the plugin's name */\n name: TName;\n\n /** Human-readable display name for UI/CLI */\n displayName: string;\n\n /** Brief description of what the plugin does */\n description: string;\n\n /**\n * Resource requirements declaration\n */\n resources: {\n /** Resources that must be available for the plugin to function */\n required: Omit<ResourceRequirement, \"required\">[];\n\n /** Resources that enhance functionality but are not mandatory */\n optional: Omit<ResourceRequirement, \"required\">[];\n };\n\n /**\n * Configuration schema for the plugin.\n * Defines the shape and validation rules for plugin config.\n */\n config?: {\n schema: ConfigSchema;\n };\n\n /**\n * When true, excluded from the template plugins manifest during sync.\n */\n hidden?: boolean;\n\n /**\n * Optional metadata for community plugins\n */\n author?: string;\n version?: string;\n repository?: string;\n keywords?: string[];\n license?: string;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/registry/types.ts"],"sourcesContent":["/**\n * Resource Registry Type System\n *\n * This module defines the type system for the AppKit Resource Registry,\n * which enables plugins to declare their Databricks resource requirements\n * in a machine-readable format.\n *\n * Base interfaces (ResourceFieldEntry, ResourceRequirement, PluginManifest)\n * are generated from plugin-manifest.schema.json and imported via shared.\n * This module re-exports them with strict narrowing (ResourceType enum,\n * ResourcePermission union) for appkit-internal use.\n *\n * Resource types, permissions, and hierarchy constants are generated by\n * tools/generate-registry-types.ts into types.generated.ts.\n */\n\n// Re-export generated registry types (enum + const must be value exports for runtime)\nimport {\n PERMISSION_HIERARCHY_BY_TYPE,\n PERMISSIONS_BY_TYPE,\n type ResourcePermission,\n ResourceType,\n} from \"./types.generated\";\n\nexport {\n PERMISSION_HIERARCHY_BY_TYPE,\n PERMISSIONS_BY_TYPE,\n ResourceType,\n type ResourcePermission,\n};\n\n// Re-export generated base type from shared (schema-derived, used directly).\nexport type { ResourceFieldEntry } from \"shared\";\n\n// Import shared base types for strict extension below.\nimport type {\n PluginManifest as SharedPluginManifest,\n ResourceRequirement as SharedResourceRequirement,\n} from \"shared\";\n\n// ============================================================================\n// Strict appkit wrappers narrow generated base types for registry use\n// ============================================================================\n\n/**\n * Declares a resource requirement for a plugin.\n * Can be defined statically in a manifest or dynamically via getResourceRequirements().\n * Narrows the generated base: type ResourceType enum, permission ResourcePermission union.\n *\n * @see `packages/shared/src/schemas/plugin-manifest.generated.ts` `ResourceRequirement` generated base\n * @see {@link SharedResourceRequirement} shared re-export with runtime `fields` and `required`\n */\nexport interface ResourceRequirement extends SharedResourceRequirement {\n /** Type of Databricks resource required (narrowed to enum) */\n type: ResourceType;\n\n /** Required permission level for the resource (narrowed to union) */\n permission: ResourcePermission;\n}\n\n/**\n * Internal representation of a resource in the registry.\n * Extends ResourceRequirement with resolution state and plugin ownership.\n */\nexport interface ResourceEntry extends ResourceRequirement {\n /** Plugin(s) that require this resource (comma-separated if multiple) */\n plugin: string;\n\n /** Whether the resource has been resolved (all field env vars set) */\n resolved: boolean;\n\n /** Resolved value per field name. Populated by validate() when all field env vars are set. */\n values?: Record<string, string>;\n\n /**\n * Per-plugin permission tracking.\n * Maps plugin name to the permission it originally requested.\n * Populated when multiple plugins share the same resource.\n */\n permissionSources?: Record<string, ResourcePermission>;\n}\n\n/**\n * Result of validating all registered resources against the environment.\n */\nexport interface ValidationResult {\n /** Whether all required resources are available */\n valid: boolean;\n\n /** List of missing required resources */\n missing: ResourceEntry[];\n\n /** Complete list of all registered resources (required and optional) */\n all: ResourceEntry[];\n}\n\nimport type { JSONSchema7 } from \"json-schema\";\n\n/**\n * Configuration schema definition for plugin config.\n * Re-exported from the standard JSON Schema Draft 7 types.\n *\n * @see {@link https://json-schema.org/draft-07/json-schema-release-notes | JSON Schema Draft 7}\n */\nexport type ConfigSchema = JSONSchema7;\n\n/**\n * Plugin manifest that declares metadata and resource requirements.\n * Attached to plugin classes as a static property.\n * Extends the shared PluginManifest with strict resource types.\n *\n * @see `packages/shared/src/schemas/plugin-manifest.generated.ts` `PluginManifest` — generated base\n * @see {@link SharedPluginManifest} — shared re-export with JSONSchema7 config\n */\nexport interface PluginManifest<TName extends string = string>\n extends Omit<SharedPluginManifest, \"resources\" | \"config\"> {\n /** Plugin identifier — the single source of truth for the plugin's name */\n name: TName;\n\n /**\n * Resource requirements declaration (with strict ResourceRequirement types)\n */\n resources: {\n /** Resources that must be available for the plugin to function */\n required: Omit<ResourceRequirement, \"required\">[];\n\n /** Resources that enhance functionality but are not mandatory */\n optional: Omit<ResourceRequirement, \"required\">[];\n };\n\n /**\n * Configuration schema for the plugin.\n * Uses JSONSchema7 instead of the generated ConfigSchema (which is too restrictive).\n */\n config?: {\n schema: ConfigSchema;\n };\n}\n"],"mappings":""}
@@ -0,0 +1,178 @@
1
+ //#region src/schemas/plugin-manifest.generated.d.ts
2
+ /**
3
+ * Declares a resource requirement for a plugin. Can be defined statically in a manifest or dynamically via getResourceRequirements().
4
+ *
5
+ * This interface was referenced by `PluginManifest`'s JSON-Schema
6
+ * via the `definition` "resourceRequirement".
7
+ */
8
+ type ResourceRequirement = ({
9
+ type: ResourceType;
10
+ /**
11
+ * Human-readable label for UI/display only. Deduplication uses resourceKey, not alias.
12
+ */
13
+ alias: string;
14
+ /**
15
+ * Stable key for machine use: deduplication, env naming, composite keys, app.yaml. Required for registry lookup.
16
+ */
17
+ resourceKey: string;
18
+ /**
19
+ * Human-readable description of why this resource is needed
20
+ */
21
+ description: string;
22
+ /**
23
+ * Required permission level. Validated per resource type by the allOf/if-then rules below.
24
+ */
25
+ permission: string;
26
+ /**
27
+ * Map of field name to env and optional description. Single-value types use one key (e.g. id); multi-value (database, secret) use multiple (e.g. instance_name, database_name or scope, key).
28
+ */
29
+ fields?: {
30
+ [k: string]: ResourceFieldEntry;
31
+ };
32
+ });
33
+ /**
34
+ * Type of Databricks resource
35
+ *
36
+ * This interface was referenced by `PluginManifest`'s JSON-Schema
37
+ * via the `definition` "resourceType".
38
+ */
39
+ type ResourceType = ("secret" | "job" | "sql_warehouse" | "serving_endpoint" | "volume" | "vector_search_index" | "uc_function" | "uc_connection" | "database" | "postgres" | "genie_space" | "experiment" | "app");
40
+ /**
41
+ * Schema for Databricks AppKit plugin manifest files. Defines plugin metadata, resource requirements, and configuration options.
42
+ */
43
+ interface PluginManifest {
44
+ /**
45
+ * Reference to the JSON Schema for validation
46
+ */
47
+ $schema?: string;
48
+ /**
49
+ * Plugin identifier. Must be lowercase, start with a letter, and contain only letters, numbers, and hyphens.
50
+ */
51
+ name: string;
52
+ /**
53
+ * Human-readable display name for UI and CLI
54
+ */
55
+ displayName: string;
56
+ /**
57
+ * Brief description of what the plugin does
58
+ */
59
+ description: string;
60
+ /**
61
+ * Databricks resource requirements for this plugin
62
+ */
63
+ resources: {
64
+ /**
65
+ * Resources that must be available for the plugin to function
66
+ */
67
+ required: ResourceRequirement[];
68
+ /**
69
+ * Resources that enhance functionality but are not mandatory
70
+ */
71
+ optional: ResourceRequirement[];
72
+ };
73
+ /**
74
+ * Configuration schema for the plugin
75
+ */
76
+ config?: {
77
+ schema?: ConfigSchema;
78
+ };
79
+ /**
80
+ * Author name or organization
81
+ */
82
+ author?: string;
83
+ /**
84
+ * Plugin version (semver format)
85
+ */
86
+ version?: string;
87
+ /**
88
+ * URL to the plugin's source repository
89
+ */
90
+ repository?: string;
91
+ /**
92
+ * Keywords for plugin discovery
93
+ */
94
+ keywords?: string[];
95
+ /**
96
+ * SPDX license identifier
97
+ */
98
+ license?: string;
99
+ /**
100
+ * Message displayed to the user after project initialization. Use this to inform about manual setup steps (e.g. environment variables, resource provisioning).
101
+ */
102
+ onSetupMessage?: string;
103
+ /**
104
+ * When true, this plugin is excluded from the template plugins manifest (appkit.plugins.json) during sync.
105
+ */
106
+ hidden?: boolean;
107
+ }
108
+ /**
109
+ * Defines a single field for a resource. Each field has its own environment variable and optional description. Single-value types use one key (e.g. id); multi-value types (database, secret) use multiple (e.g. instance_name, database_name or scope, key).
110
+ *
111
+ * This interface was referenced by `PluginManifest`'s JSON-Schema
112
+ * via the `definition` "resourceFieldEntry".
113
+ */
114
+ interface ResourceFieldEntry {
115
+ /**
116
+ * Environment variable name for this field
117
+ */
118
+ env?: string;
119
+ /**
120
+ * Human-readable description for this field
121
+ */
122
+ description?: string;
123
+ /**
124
+ * When true, this field is excluded from Databricks bundle configuration (databricks.yml) generation.
125
+ */
126
+ bundleIgnore?: boolean;
127
+ /**
128
+ * Example values showing the expected format for this field
129
+ */
130
+ examples?: string[];
131
+ /**
132
+ * When true, this field is only generated for local .env files. The Databricks Apps platform auto-injects it at deploy time.
133
+ */
134
+ localOnly?: boolean;
135
+ /**
136
+ * Static value for this field. Used when no prompted or resolved value exists.
137
+ */
138
+ value?: string;
139
+ /**
140
+ * Named resolver prefixed by resource type (e.g., 'postgres:host'). The CLI resolves this value during the init prompt flow.
141
+ */
142
+ resolve?: string;
143
+ }
144
+ /**
145
+ * This interface was referenced by `PluginManifest`'s JSON-Schema
146
+ * via the `definition` "configSchema".
147
+ */
148
+ interface ConfigSchema {
149
+ type: ("object" | "array" | "string" | "number" | "boolean");
150
+ properties?: {
151
+ [k: string]: ConfigSchemaProperty;
152
+ };
153
+ items?: ConfigSchema;
154
+ required?: string[];
155
+ additionalProperties?: boolean;
156
+ }
157
+ /**
158
+ * This interface was referenced by `PluginManifest`'s JSON-Schema
159
+ * via the `definition` "configSchemaProperty".
160
+ */
161
+ interface ConfigSchemaProperty {
162
+ type: ("object" | "array" | "string" | "number" | "boolean" | "integer");
163
+ description?: string;
164
+ default?: unknown;
165
+ enum?: unknown[];
166
+ properties?: {
167
+ [k: string]: ConfigSchemaProperty;
168
+ };
169
+ items?: ConfigSchemaProperty;
170
+ minimum?: number;
171
+ maximum?: number;
172
+ minLength?: number;
173
+ maxLength?: number;
174
+ required?: string[];
175
+ }
176
+ //#endregion
177
+ export { PluginManifest, ResourceFieldEntry, ResourceRequirement };
178
+ //# sourceMappingURL=plugin-manifest.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-manifest.generated.d.ts","names":[],"sources":["../../src/schemas/plugin-manifest.generated.ts"],"mappings":";;AAQA;;;;;KAAY,mBAAA;EACZ,IAAA,EAAM,YAAA;EAQN;;;EAJA,KAAA;EAiBC;;;EAbD,WAAA;EAsBY;;;EAlBZ,WAAA;EAkBwB;AAgGxB;;EA9GA,UAAA;EAsIU;;;EAlIV,MAAA;IAAA,CACC,CAAA,WAAY,kBAAA;EAAA;AAAA;;;;;;;KASD,YAAA;;;;UAgGK,cAAA;;;;EAIjB,OAAA;;;;EAIA,IAAA;;;;EAIA,WAAA;;;;EAIA,WAAA;;;;EAIA,SAAA;;;;IAIA,QAAA,EAAU,mBAAA;;;;IAIV,QAAA,EAAU,mBAAA;EAAA;;;;EAKV,MAAA;IACA,MAAA,GAAS,YAAA;EAAA;;;;EAKT,MAAA;;;;EAIA,OAAA;;;;EAIA,UAAA;;;;EAIA,QAAA;;;;EAIA,OAAA;;;;EAIA,cAAA;;;;EAIA,MAAA;AAAA;;;;;;;UAQiB,kBAAA;;;;EAIjB,GAAA;;;;EAIA,WAAA;;;;EAIA,YAAA;;;;EAIA,QAAA;;;;EAIA,SAAA;;;;EAIA,KAAA;;;;EAIA,OAAA;AAAA;;;;;UAMiB,YAAA;EACjB,IAAA;EACA,UAAA;IAAA,CACC,CAAA,WAAY,oBAAA;EAAA;EAEb,KAAA,GAAQ,YAAA;EACR,QAAA;EACA,oBAAA;AAAA;;;;;UAMiB,oBAAA;EACjB,IAAA;EACA,WAAA;EACA,OAAA;EACA,IAAA;EACA,UAAA;IAAA,CACC,CAAA,WAAY,oBAAA;EAAA;EAEb,KAAA,GAAQ,oBAAA;EACR,OAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;EACA,QAAA;AAAA"}
@@ -185,6 +185,7 @@
185
185
  },
186
186
  "resourceFieldEntry": {
187
187
  "type": "object",
188
+ "description": "Defines a single field for a resource. Each field has its own environment variable and optional description. Single-value types use one key (e.g. id); multi-value types (database, secret) use multiple (e.g. instance_name, database_name or scope, key).",
188
189
  "properties": {
189
190
  "env": {
190
191
  "type": "string",
@@ -225,6 +226,7 @@
225
226
  },
226
227
  "resourceRequirement": {
227
228
  "type": "object",
229
+ "description": "Declares a resource requirement for a plugin. Can be defined statically in a manifest or dynamically via getResourceRequirements().",
228
230
  "required": ["type", "alias", "resourceKey", "description", "permission"],
229
231
  "properties": {
230
232
  "type": {
@@ -31,7 +31,7 @@ interface CacheStorage {
31
31
  /** Close the storage */
32
32
  close(): Promise<void>;
33
33
  }
34
- /** Configuration for caching */
34
+ /** Configuration for the CacheInterceptor. Controls TTL, size limits, storage backend, and probabilistic cleanup. */
35
35
  interface CacheConfig {
36
36
  /** Whether caching is enabled */
37
37
  enabled?: boolean;
@@ -1,6 +1,7 @@
1
1
  import { CacheConfig } from "./cache.js";
2
2
 
3
3
  //#region ../shared/src/execute.d.ts
4
+ /** SSE stream configuration for `executeStream()`. Controls buffer sizes, heartbeat interval, and cleanup behavior. */
4
5
  interface StreamConfig {
5
6
  userSignal?: AbortSignal;
6
7
  streamId?: string;
@@ -12,17 +13,20 @@ interface StreamConfig {
12
13
  heartbeatInterval?: number;
13
14
  maxActiveStreams?: number;
14
15
  }
16
+ /** Retry configuration for the RetryInterceptor. Uses exponential backoff between attempts. */
15
17
  interface RetryConfig {
16
18
  enabled?: boolean;
17
19
  attempts?: number;
18
20
  initialDelay?: number;
19
21
  maxDelay?: number;
20
22
  }
23
+ /** Telemetry configuration for the TelemetryInterceptor. Controls span creation and custom attributes. */
21
24
  interface TelemetryConfig {
22
25
  enabled?: boolean;
23
26
  spanName?: string;
24
27
  attributes?: Record<string, any>;
25
28
  }
29
+ /** Options passed to `Plugin.execute()` and `Plugin.executeStream()` to configure the interceptor chain (cache, retry, telemetry, timeout). */
26
30
  interface PluginExecuteConfig {
27
31
  cache?: CacheConfig;
28
32
  retry?: RetryConfig;
@@ -31,12 +35,14 @@ interface PluginExecuteConfig {
31
35
  timeout?: number;
32
36
  [key: string]: unknown;
33
37
  }
38
+ /** Default and user-scoped execution settings for a plugin. The `user` config, when present, overrides `default` for on-behalf-of requests. */
34
39
  interface PluginExecutionSettings {
35
40
  default: PluginExecuteConfig;
36
41
  user?: PluginExecuteConfig;
37
42
  }
43
+ /** Handler function for `executeStream()`. Can return a Promise (single result) or an AsyncGenerator (chunked streaming). */
38
44
  type StreamExecuteHandler<T> = ((signal?: AbortSignal) => Promise<T>) | ((signal?: AbortSignal) => AsyncGenerator<T, void, unknown>);
39
- /** Configuration for streaming execution with default and user-scoped settings */
45
+ /** Execution settings for streaming endpoints. Extends PluginExecutionSettings with SSE stream configuration. */
40
46
  interface StreamExecutionSettings {
41
47
  default: PluginExecuteConfig;
42
48
  user?: PluginExecuteConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"execute.d.ts","names":[],"sources":["../../../../shared/src/execute.ts"],"mappings":";;;UAEiB,YAAA;EACf,UAAA,GAAa,WAAA;EACb,QAAA;EACA,UAAA;EACA,YAAA;EACA,SAAA;EACA,eAAA;EACA,oBAAA;EACA,iBAAA;EACA,gBAAA;AAAA;AAAA,UAGe,WAAA;EACf,OAAA;EACA,QAAA;EACA,YAAA;EACA,QAAA;AAAA;AAAA,UAGe,eAAA;EACf,OAAA;EACA,QAAA;EACA,UAAA,GAAa,MAAA;AAAA;AAAA,UAGE,mBAAA;EACf,KAAA,GAAQ,WAAA;EACR,KAAA,GAAQ,WAAA;EAER,oBAAA,GAAuB,eAAA;EACvB,KAAA,GAAQ,WAAA;EACR,OAAA;EAAA,CACC,GAAA;AAAA;AAAA,UAGc,uBAAA;EACf,OAAA,EAAS,mBAAA;EACT,IAAA,GAAO,mBAAA;AAAA;AAAA,KAIG,oBAAA,QACN,MAAA,GAAS,WAAA,KAAgB,OAAA,CAAQ,CAAA,OACjC,MAAA,GAAS,WAAA,KAAgB,cAAA,CAAe,CAAA;;UAG7B,uBAAA;EACf,OAAA,EAAS,mBAAA;EACT,IAAA,GAAO,mBAAA;EACP,MAAA,GAAS,YAAA;AAAA"}
1
+ {"version":3,"file":"execute.d.ts","names":[],"sources":["../../../../shared/src/execute.ts"],"mappings":";;;;UAGiB,YAAA;EACf,UAAA,GAAa,WAAA;EACb,QAAA;EACA,UAAA;EACA,YAAA;EACA,SAAA;EACA,eAAA;EACA,oBAAA;EACA,iBAAA;EACA,gBAAA;AAAA;;UAIe,WAAA;EACf,OAAA;EACA,QAAA;EACA,YAAA;EACA,QAAA;AAAA;;UAIe,eAAA;EACf,OAAA;EACA,QAAA;EACA,UAAA,GAAa,MAAA;AAAA;;UAIE,mBAAA;EACf,KAAA,GAAQ,WAAA;EACR,KAAA,GAAQ,WAAA;EAER,oBAAA,GAAuB,eAAA;EACvB,KAAA,GAAQ,WAAA;EACR,OAAA;EAAA,CACC,GAAA;AAAA;;UAIc,uBAAA;EACf,OAAA,EAAS,mBAAA;EACT,IAAA,GAAO,mBAAA;AAAA;;KAIG,oBAAA,QACN,MAAA,GAAS,WAAA,KAAgB,OAAA,CAAQ,CAAA,OACjC,MAAA,GAAS,WAAA,KAAgB,cAAA,CAAe,CAAA;;UAG7B,uBAAA;EACf,OAAA,EAAS,mBAAA;EACT,IAAA,GAAO,mBAAA;EACP,MAAA,GAAS,YAAA;AAAA"}
@@ -1,4 +1,5 @@
1
- import { BasePlugin, BasePluginConfig, HttpMethod, IAppRequest, IAppResponse, IAppRouter, PluginConstructor, PluginData, PluginEndpointMap, PluginExports, PluginManifest, PluginMap, PluginPhase, ResourceFieldEntry, ResourceRequirement, RouteConfig, TelemetryOptions, ToPlugin, WithAsUser } from "./plugin.js";
1
+ import { ResourceFieldEntry } from "./schemas/plugin-manifest.generated.js";
2
+ import { BasePlugin, BasePluginConfig, HttpMethod, IAppRequest, IAppResponse, IAppRouter, PluginConstructor, PluginData, PluginEndpointMap, PluginExports, PluginManifest, PluginMap, PluginPhase, ResourceRequirement, RouteConfig, TelemetryOptions, ToPlugin, WithAsUser } from "./plugin.js";
2
3
  import { CacheConfig, CacheEntry, CacheStorage } from "./cache.js";
3
4
  import { PluginExecuteConfig, PluginExecutionSettings, RetryConfig, StreamConfig, StreamExecuteHandler, StreamExecutionSettings, TelemetryConfig } from "./execute.js";
4
5
  import { GenieAttachmentResponse, GenieMessageResponse, GenieStatementResponse, GenieStreamEvent } from "./genie.js";
@@ -1,3 +1,4 @@
1
+ import { PluginManifest as PluginManifest$1, ResourceFieldEntry, ResourceRequirement as ResourceRequirement$1 } from "./schemas/plugin-manifest.generated.js";
1
2
  import express from "express";
2
3
  import { JSONSchema7 } from "json-schema";
3
4
 
@@ -44,13 +45,16 @@ type PluginConstructor<C = BasePluginConfig, I extends BasePlugin = BasePlugin>
44
45
  getResourceRequirements?(config: C): ResourceRequirement[];
45
46
  };
46
47
  /**
47
- * Manifest declaration for plugins (imported from registry types).
48
- * Re-exported here to avoid circular dependencies.
48
+ * Manifest declaration for plugins.
49
+ * Extends the generated PluginManifest with a generic name parameter
50
+ * and uses JSONSchema7 for config.schema (the generated ConfigSchema
51
+ * is too restrictive for plugin consumers).
52
+ *
53
+ * @see {@link GeneratedPluginManifest} — generated base from plugin-manifest.schema.json
54
+ * @see `packages/appkit/src/registry/types.ts` `PluginManifest` — strict appkit narrowing (enum types)
49
55
  */
50
- interface PluginManifest<TName extends string = string> {
56
+ interface PluginManifest<TName extends string = string> extends Omit<PluginManifest$1, "name" | "config" | "$schema" | "resources"> {
51
57
  name: TName;
52
- displayName: string;
53
- description: string;
54
58
  resources: {
55
59
  required: Omit<ResourceRequirement, "required">[];
56
60
  optional: Omit<ResourceRequirement, "required">[];
@@ -58,51 +62,16 @@ interface PluginManifest<TName extends string = string> {
58
62
  config?: {
59
63
  schema: JSONSchema7;
60
64
  };
61
- onSetupMessage?: string;
62
- hidden?: boolean;
63
- author?: string;
64
- version?: string;
65
- repository?: string;
66
- keywords?: string[];
67
- license?: string;
68
- }
69
- /**
70
- * Defines a single field for a resource.
71
- * Each field maps to its own environment variable and optional description.
72
- * Single-value types use one key (e.g. id); multi-value types (database, secret)
73
- * use multiple (e.g. instance_name, database_name or scope, key).
74
- */
75
- interface ResourceFieldEntry {
76
- /** Environment variable name for this field */
77
- env?: string;
78
- /** Human-readable description for this field */
79
- description?: string;
80
- /** When true, this field is excluded from Databricks bundle configuration (databricks.yml) generation. */
81
- bundleIgnore?: boolean;
82
- /** Example values showing the expected format for this field */
83
- examples?: string[];
84
- /** When true, this field is only generated for local .env files. The Databricks Apps platform auto-injects it at deploy time. */
85
- localOnly?: boolean;
86
- /** Static value for this field. Used when no prompted or resolved value exists. */
87
- value?: string;
88
- /** Named resolver prefixed by resource type (e.g., 'postgres:host'). The CLI resolves this value during the init prompt flow. */
89
- resolve?: string;
90
65
  }
91
66
  /**
92
- * Resource requirement declaration (imported from registry types).
93
- * Re-exported here to avoid circular dependencies.
67
+ * Resource requirement with runtime fields added beyond the schema definition.
68
+ * - `fields` is made required (schema has it optional, but registry always populates it)
69
+ * - `required` boolean tracks whether the resource is mandatory at runtime
70
+ *
71
+ * @see {@link GeneratedResourceRequirement} — generated base from plugin-manifest.schema.json
72
+ * @see `packages/appkit/src/registry/types.ts` `ResourceRequirement` — strict appkit narrowing (enum types)
94
73
  */
95
- interface ResourceRequirement {
96
- type: string;
97
- alias: string;
98
- /** Stable key for machine use (env naming, composite keys, app.yaml). */
99
- resourceKey: string;
100
- description: string;
101
- permission: string;
102
- /**
103
- * Map of field name to env and optional description.
104
- * Single-value types use one key (e.g. id); multi-value (database, secret) use multiple keys.
105
- */
74
+ interface ResourceRequirement extends ResourceRequirement$1 {
106
75
  fields: Record<string, ResourceFieldEntry>;
107
76
  required: boolean;
108
77
  }
@@ -136,11 +105,13 @@ type WithAsUser<SDK> = SDK extends ((...args: any[]) => any) ? SDK : SDK & {
136
105
  * as they manage their own `asUser` pattern (e.g. files plugin).
137
106
  */
138
107
  type PluginMap<U extends readonly PluginData<PluginConstructor, unknown, string>[]> = { [P in U[number] as P["name"]]: WithAsUser<PluginExports<InstanceType<P["plugin"]>>> };
108
+ /** Tuple of plugin class, config, and name. Created by `toPlugin()` and passed to `createApp()`. */
139
109
  type PluginData<T, U, N> = {
140
110
  plugin: T;
141
111
  config: U;
142
112
  name: N;
143
113
  };
114
+ /** Factory function type returned by `toPlugin()`. Accepts optional config and returns a PluginData tuple. */
144
115
  type ToPlugin<T, U, N extends string> = (config?: U) => PluginData<T, U, N>;
145
116
  /** Express router type for plugin route registration */
146
117
  type IAppRouter = express.Router;
@@ -157,5 +128,5 @@ type RouteConfig = {
157
128
  /** Map of endpoint names to their full paths for a plugin */
158
129
  type PluginEndpointMap = Record<string, string>;
159
130
  //#endregion
160
- export { BasePlugin, BasePluginConfig, HttpMethod, IAppRequest, IAppResponse, IAppRouter, PluginConstructor, PluginData, PluginEndpointMap, PluginExports, PluginManifest, PluginMap, PluginPhase, ResourceFieldEntry, ResourceRequirement, RouteConfig, TelemetryOptions, ToPlugin, WithAsUser };
131
+ export { BasePlugin, BasePluginConfig, HttpMethod, IAppRequest, IAppResponse, IAppRouter, PluginConstructor, PluginData, PluginEndpointMap, PluginExports, PluginManifest, PluginMap, PluginPhase, ResourceRequirement, RouteConfig, TelemetryOptions, ToPlugin, WithAsUser };
161
132
  //# sourceMappingURL=plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","names":[],"sources":["../../../../shared/src/plugin.ts"],"mappings":";;;;;UAIiB,UAAA;EACf,IAAA;EAEA,qBAAA;EAEA,KAAA,IAAS,OAAA;EAET,YAAA,CAAa,MAAA,EAAQ,OAAA,CAAQ,MAAA;EAE7B,YAAA,IAAgB,iBAAA;EAEhB,uBAAA,KAA4B,WAAA;EAE5B,OAAA;AAAA;;UAIe,gBAAA;EACf,IAAA;EACA,IAAA;EAAA,CAEC,GAAA;EAMD,SAAA,GAAY,gBAAA;AAAA;AAAA,KAGF,gBAAA;EAGN,MAAA;EACA,OAAA;EACA,IAAA;AAAA;AAAA,KAQM,WAAA;;;;;KAMA,iBAAA,KACN,gBAAA,YACM,UAAA,GAAa,UAAA,UAEvB,MAAA,EAAQ,CAAA,KACL,CAAA;EACH,cAAA,GAAiB,MAAA;EACjB,KAAA,GAAQ,WAAA;EA7BI;;;AAGd;EA+BE,QAAA,EAAU,cAAA;;;;;EAKV,uBAAA,EAAyB,MAAA,EAAQ,CAAA,GAAI,mBAAA;AAAA;;AAvBvC;;;UA8BiB,cAAA;EACf,IAAA,EAAM,KAAA;EACN,WAAA;EACA,WAAA;EACA,SAAA;IACE,QAAA,EAAU,IAAA,CAAK,mBAAA;IACf,QAAA,EAAU,IAAA,CAAK,mBAAA;EAAA;EAEjB,MAAA;IACE,MAAA,EAAQ,WAAA;EAAA;EAEV,cAAA;EACA,MAAA;EACA,MAAA;EACA,OAAA;EACA,UAAA;EACA,QAAA;EACA,OAAA;AAAA;;;;;;;UASe,kBAAA;EA5CE;EA8CjB,GAAA;EA7CQ;EA+CR,WAAA;EA1CU;EA4CV,YAAA;EAvCiC;EAyCjC,QAAA;EAzCqC;EA2CrC,SAAA;EA3CwD;EA6CxD,KAAA;EAtC6B;EAwC7B,OAAA;AAAA;;;;;UAOe,mBAAA;EACf,IAAA;EACA,KAAA;EAjD8B;EAmD9B,WAAA;EACA,WAAA;EACA,UAAA;EAlDA;;;;EAuDA,MAAA,EAAQ,MAAA,SAAe,kBAAA;EACvB,QAAA;AAAA;;;;;;KAoCU,aAAA,WAAwB,UAAA,IAClC,CAAA,sCAAqC,CAAA,GAAI,MAAA;;;;AAjD3C;;;;KA0DY,UAAA,QAAkB,GAAA,cAAgB,IAAA,mBAC1C,GAAA,GACA,GAAA;EA1DF;;;;;EAgEI,MAAA,GAAS,GAAA,EAAK,WAAA,KAAgB,GAAA;AAAA;;;;AAlBpC;;;;;KA6BY,SAAA,oBACS,UAAA,CAAW,iBAAA,gCAExB,CAAA,YAAa,CAAA,WAAY,UAAA,CAC7B,aAAA,CAAc,YAAA,CAAa,CAAA;AAAA,KAInB,UAAA;EAAwB,MAAA,EAAQ,CAAA;EAAG,MAAA,EAAQ,CAAA;EAAG,IAAA,EAAM,CAAA;AAAA;AAAA,KACpD,QAAA,4BACV,MAAA,GAAS,CAAA,KACN,UAAA,CAAW,CAAA,EAAG,CAAA,EAAG,CAAA;;KAGV,UAAA,GAAa,OAAA,CAAQ,MAAA;AAAA,KACrB,YAAA,GAAe,OAAA,CAAQ,QAAA;AAAA,KACvB,WAAA,GAAc,OAAA,CAAQ,OAAA;AAAA,KAEtB,UAAA;AAAA,KAEA,WAAA;EAtCR,+DAwCF,IAAA;EACA,MAAA,EAAQ,UAAA;EACR,IAAA;EACA,OAAA,GAAU,GAAA,EAAK,WAAA,EAAa,GAAA,EAAK,YAAA,KAAiB,OAAA,QApCb;EAsCrC,eAAA;AAAA;;KAIU,iBAAA,GAAoB,MAAA"}
1
+ {"version":3,"file":"plugin.d.ts","names":[],"sources":["../../../../shared/src/plugin.ts"],"mappings":";;;;;;UAYiB,UAAA;EACf,IAAA;EAEA,qBAAA;EAEA,KAAA,IAAS,OAAA;EAET,YAAA,CAAa,MAAA,EAAQ,OAAA,CAAQ,MAAA;EAE7B,YAAA,IAAgB,iBAAA;EAEhB,uBAAA,KAA4B,WAAA;EAE5B,OAAA;AAAA;;UAIe,gBAAA;EACf,IAAA;EACA,IAAA;EAAA,CAEC,GAAA;EAMD,SAAA,GAAY,gBAAA;AAAA;AAAA,KAGF,gBAAA;EAGN,MAAA;EACA,OAAA;EACA,IAAA;AAAA;AAAA,KAQM,WAAA;;;;;KAMA,iBAAA,KACN,gBAAA,YACM,UAAA,GAAa,UAAA,UAEvB,MAAA,EAAQ,CAAA,KACL,CAAA;EACH,cAAA,GAAiB,MAAA;EACjB,KAAA,GAAQ,WAAA;EA7BoB;;AAG9B;;EA+BE,QAAA,EAAU,cAAA;EA/BgB;;;;EAoC1B,uBAAA,EAAyB,MAAA,EAAQ,CAAA,GAAI,mBAAA;AAAA;AAvBvC;;;;;AAMA;;;;AANA,UAmCiB,cAAA,wCACP,IAAA,CACN,gBAAA;EAGF,IAAA,EAAM,KAAA;EACN,SAAA;IACE,QAAA,EAAU,IAAA,CAAK,mBAAA;IACf,QAAA,EAAU,IAAA,CAAK,mBAAA;EAAA;EAEjB,MAAA;IACE,MAAA,EAAQ,WAAA;EAAA;AAAA;;;;;;;;;UAYK,mBAAA,SAA4B,qBAAA;EAC3C,MAAA,EAAQ,MAAA,SAAe,kBAAA;EACvB,QAAA;AAAA;;;;;;KAoCU,aAAA,WAAwB,UAAA,IAClC,CAAA,sCAAqC,CAAA,GAAI,MAAA;;;;;;;;KAS/B,UAAA,QAAkB,GAAA,cAAgB,IAAA,mBAC1C,GAAA,GACA,GAAA;EAjEA;;;;;EAuEE,MAAA,GAAS,GAAA,EAAK,WAAA,KAAgB,GAAA;AAAA;;AAxDpC;;;;;;;KAmEY,SAAA,oBACS,UAAA,CAAW,iBAAA,gCAExB,CAAA,YAAa,CAAA,WAAY,UAAA,CAC7B,aAAA,CAAc,YAAA,CAAa,CAAA;;KAKnB,UAAA;EAAwB,MAAA,EAAQ,CAAA;EAAG,MAAA,EAAQ,CAAA;EAAG,IAAA,EAAM,CAAA;AAAA;;KAEpD,QAAA,4BACV,MAAA,GAAS,CAAA,KACN,UAAA,CAAW,CAAA,EAAG,CAAA,EAAG,CAAA;;KAGV,UAAA,GAAa,OAAA,CAAQ,MAAA;AAAA,KACrB,YAAA,GAAe,OAAA,CAAQ,QAAA;AAAA,KACvB,WAAA,GAAc,OAAA,CAAQ,OAAA;AAAA,KAEtB,UAAA;AAAA,KAEA,WAAA;EAnDwB,+DAqDlC,IAAA;EACA,MAAA,EAAQ,UAAA;EACR,IAAA;EACA,OAAA,GAAU,GAAA,EAAK,WAAA,EAAa,GAAA,EAAK,YAAA,KAAiB,OAAA,QAvDH;EAyD/C,eAAA;AAAA;;KAIU,iBAAA,GAAoB,MAAA"}
@@ -0,0 +1,178 @@
1
+ //#region ../shared/src/schemas/plugin-manifest.generated.d.ts
2
+ /**
3
+ * Declares a resource requirement for a plugin. Can be defined statically in a manifest or dynamically via getResourceRequirements().
4
+ *
5
+ * This interface was referenced by `PluginManifest`'s JSON-Schema
6
+ * via the `definition` "resourceRequirement".
7
+ */
8
+ type ResourceRequirement = ({
9
+ type: ResourceType;
10
+ /**
11
+ * Human-readable label for UI/display only. Deduplication uses resourceKey, not alias.
12
+ */
13
+ alias: string;
14
+ /**
15
+ * Stable key for machine use: deduplication, env naming, composite keys, app.yaml. Required for registry lookup.
16
+ */
17
+ resourceKey: string;
18
+ /**
19
+ * Human-readable description of why this resource is needed
20
+ */
21
+ description: string;
22
+ /**
23
+ * Required permission level. Validated per resource type by the allOf/if-then rules below.
24
+ */
25
+ permission: string;
26
+ /**
27
+ * Map of field name to env and optional description. Single-value types use one key (e.g. id); multi-value (database, secret) use multiple (e.g. instance_name, database_name or scope, key).
28
+ */
29
+ fields?: {
30
+ [k: string]: ResourceFieldEntry;
31
+ };
32
+ });
33
+ /**
34
+ * Type of Databricks resource
35
+ *
36
+ * This interface was referenced by `PluginManifest`'s JSON-Schema
37
+ * via the `definition` "resourceType".
38
+ */
39
+ type ResourceType = ("secret" | "job" | "sql_warehouse" | "serving_endpoint" | "volume" | "vector_search_index" | "uc_function" | "uc_connection" | "database" | "postgres" | "genie_space" | "experiment" | "app");
40
+ /**
41
+ * Schema for Databricks AppKit plugin manifest files. Defines plugin metadata, resource requirements, and configuration options.
42
+ */
43
+ interface PluginManifest {
44
+ /**
45
+ * Reference to the JSON Schema for validation
46
+ */
47
+ $schema?: string;
48
+ /**
49
+ * Plugin identifier. Must be lowercase, start with a letter, and contain only letters, numbers, and hyphens.
50
+ */
51
+ name: string;
52
+ /**
53
+ * Human-readable display name for UI and CLI
54
+ */
55
+ displayName: string;
56
+ /**
57
+ * Brief description of what the plugin does
58
+ */
59
+ description: string;
60
+ /**
61
+ * Databricks resource requirements for this plugin
62
+ */
63
+ resources: {
64
+ /**
65
+ * Resources that must be available for the plugin to function
66
+ */
67
+ required: ResourceRequirement[];
68
+ /**
69
+ * Resources that enhance functionality but are not mandatory
70
+ */
71
+ optional: ResourceRequirement[];
72
+ };
73
+ /**
74
+ * Configuration schema for the plugin
75
+ */
76
+ config?: {
77
+ schema?: ConfigSchema;
78
+ };
79
+ /**
80
+ * Author name or organization
81
+ */
82
+ author?: string;
83
+ /**
84
+ * Plugin version (semver format)
85
+ */
86
+ version?: string;
87
+ /**
88
+ * URL to the plugin's source repository
89
+ */
90
+ repository?: string;
91
+ /**
92
+ * Keywords for plugin discovery
93
+ */
94
+ keywords?: string[];
95
+ /**
96
+ * SPDX license identifier
97
+ */
98
+ license?: string;
99
+ /**
100
+ * Message displayed to the user after project initialization. Use this to inform about manual setup steps (e.g. environment variables, resource provisioning).
101
+ */
102
+ onSetupMessage?: string;
103
+ /**
104
+ * When true, this plugin is excluded from the template plugins manifest (appkit.plugins.json) during sync.
105
+ */
106
+ hidden?: boolean;
107
+ }
108
+ /**
109
+ * Defines a single field for a resource. Each field has its own environment variable and optional description. Single-value types use one key (e.g. id); multi-value types (database, secret) use multiple (e.g. instance_name, database_name or scope, key).
110
+ *
111
+ * This interface was referenced by `PluginManifest`'s JSON-Schema
112
+ * via the `definition` "resourceFieldEntry".
113
+ */
114
+ interface ResourceFieldEntry {
115
+ /**
116
+ * Environment variable name for this field
117
+ */
118
+ env?: string;
119
+ /**
120
+ * Human-readable description for this field
121
+ */
122
+ description?: string;
123
+ /**
124
+ * When true, this field is excluded from Databricks bundle configuration (databricks.yml) generation.
125
+ */
126
+ bundleIgnore?: boolean;
127
+ /**
128
+ * Example values showing the expected format for this field
129
+ */
130
+ examples?: string[];
131
+ /**
132
+ * When true, this field is only generated for local .env files. The Databricks Apps platform auto-injects it at deploy time.
133
+ */
134
+ localOnly?: boolean;
135
+ /**
136
+ * Static value for this field. Used when no prompted or resolved value exists.
137
+ */
138
+ value?: string;
139
+ /**
140
+ * Named resolver prefixed by resource type (e.g., 'postgres:host'). The CLI resolves this value during the init prompt flow.
141
+ */
142
+ resolve?: string;
143
+ }
144
+ /**
145
+ * This interface was referenced by `PluginManifest`'s JSON-Schema
146
+ * via the `definition` "configSchema".
147
+ */
148
+ interface ConfigSchema {
149
+ type: ("object" | "array" | "string" | "number" | "boolean");
150
+ properties?: {
151
+ [k: string]: ConfigSchemaProperty;
152
+ };
153
+ items?: ConfigSchema;
154
+ required?: string[];
155
+ additionalProperties?: boolean;
156
+ }
157
+ /**
158
+ * This interface was referenced by `PluginManifest`'s JSON-Schema
159
+ * via the `definition` "configSchemaProperty".
160
+ */
161
+ interface ConfigSchemaProperty {
162
+ type: ("object" | "array" | "string" | "number" | "boolean" | "integer");
163
+ description?: string;
164
+ default?: unknown;
165
+ enum?: unknown[];
166
+ properties?: {
167
+ [k: string]: ConfigSchemaProperty;
168
+ };
169
+ items?: ConfigSchemaProperty;
170
+ minimum?: number;
171
+ maximum?: number;
172
+ minLength?: number;
173
+ maxLength?: number;
174
+ required?: string[];
175
+ }
176
+ //#endregion
177
+ export { PluginManifest, ResourceFieldEntry, ResourceRequirement };
178
+ //# sourceMappingURL=plugin-manifest.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-manifest.generated.d.ts","names":[],"sources":["../../../../../shared/src/schemas/plugin-manifest.generated.ts"],"mappings":";;AAQA;;;;;KAAY,mBAAA;EACZ,IAAA,EAAM,YAAA;EAQN;;;EAJA,KAAA;EAiBC;;;EAbD,WAAA;EAsBY;;;EAlBZ,WAAA;EAkBwB;AAgGxB;;EA9GA,UAAA;EAsIU;;;EAlIV,MAAA;IAAA,CACC,CAAA,WAAY,kBAAA;EAAA;AAAA;;;;;;;KASD,YAAA;;;;UAgGK,cAAA;;;;EAIjB,OAAA;;;;EAIA,IAAA;;;;EAIA,WAAA;;;;EAIA,WAAA;;;;EAIA,SAAA;;;;IAIA,QAAA,EAAU,mBAAA;;;;IAIV,QAAA,EAAU,mBAAA;EAAA;;;;EAKV,MAAA;IACA,MAAA,GAAS,YAAA;EAAA;;;;EAKT,MAAA;;;;EAIA,OAAA;;;;EAIA,UAAA;;;;EAIA,QAAA;;;;EAIA,OAAA;;;;EAIA,cAAA;;;;EAIA,MAAA;AAAA;;;;;;;UAQiB,kBAAA;;;;EAIjB,GAAA;;;;EAIA,WAAA;;;;EAIA,YAAA;;;;EAIA,QAAA;;;;EAIA,SAAA;;;;EAIA,KAAA;;;;EAIA,OAAA;AAAA;;;;;UAMiB,YAAA;EACjB,IAAA;EACA,UAAA;IAAA,CACC,CAAA,WAAY,oBAAA;EAAA;EAEb,KAAA,GAAQ,YAAA;EACR,QAAA;EACA,oBAAA;AAAA;;;;;UAMiB,oBAAA;EACjB,IAAA;EACA,WAAA;EACA,OAAA;EACA,IAAA;EACA,UAAA;IAAA,CACC,CAAA,WAAY,oBAAA;EAAA;EAEb,KAAA,GAAQ,oBAAA;EACR,OAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;EACA,QAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"arrow-stream-processor.js","names":[],"sources":["../../src/stream/arrow-stream-processor.ts"],"sourcesContent":["import type { sql } from \"@databricks/sdk-experimental\";\nimport { ExecutionError, ValidationError } from \"../errors\";\nimport { createLogger } from \"../logging/logger\";\n\nconst logger = createLogger(\"stream:arrow\");\n\ntype ResultManifest = sql.ResultManifest;\ntype ExternalLink = sql.ExternalLink;\n\nexport interface ArrowStreamOptions {\n maxConcurrentDownloads: number;\n timeout: number;\n retries: number;\n}\n\n/**\n * Result from zero-copy Arrow chunk processing.\n * Contains raw IPC bytes without server-side parsing.\n */\nexport interface ArrowRawResult {\n /** Concatenated raw Arrow IPC bytes */\n data: Uint8Array;\n /** Schema from Databricks manifest (not parsed from Arrow) */\n schema: ResultManifest[\"schema\"];\n}\n\nconst BACKOFF_MULTIPLIER = 1000;\n\nexport class ArrowStreamProcessor {\n static readonly DEFAULT_MAX_CONCURRENT_DOWNLOADS = 5;\n static readonly DEFAULT_TIMEOUT = 30000;\n static readonly DEFAULT_RETRIES = 3;\n\n constructor(\n private options: ArrowStreamOptions = {\n maxConcurrentDownloads:\n ArrowStreamProcessor.DEFAULT_MAX_CONCURRENT_DOWNLOADS,\n timeout: ArrowStreamProcessor.DEFAULT_TIMEOUT,\n retries: ArrowStreamProcessor.DEFAULT_RETRIES,\n },\n ) {\n this.options = {\n maxConcurrentDownloads:\n options.maxConcurrentDownloads ??\n ArrowStreamProcessor.DEFAULT_MAX_CONCURRENT_DOWNLOADS,\n timeout: options.timeout ?? ArrowStreamProcessor.DEFAULT_TIMEOUT,\n retries: options.retries ?? ArrowStreamProcessor.DEFAULT_RETRIES,\n };\n }\n\n /**\n * Process Arrow chunks using zero-copy proxy pattern.\n *\n * Downloads raw IPC bytes from external links and concatenates them\n * without parsing into Arrow Tables on the server. This reduces:\n * - Memory usage by ~50% (no parsed Table representation)\n * - CPU usage (no tableFromIPC/tableToIPC calls)\n *\n * The client is responsible for parsing the IPC bytes.\n *\n * @param chunks - External links to Arrow IPC data\n * @param schema - Schema from Databricks manifest\n * @param signal - Optional abort signal\n * @returns Raw concatenated IPC bytes with schema\n */\n async processChunks(\n chunks: ExternalLink[],\n schema: ResultManifest[\"schema\"],\n signal?: AbortSignal,\n ): Promise<ArrowRawResult> {\n if (chunks.length === 0) {\n throw ValidationError.missingField(\"chunks\");\n }\n\n const buffers = await this.downloadChunksRaw(chunks, signal);\n const data = this.concatenateBuffers(buffers);\n\n return { data, schema };\n }\n\n /**\n * Download all chunks as raw bytes with concurrency control.\n */\n private async downloadChunksRaw(\n chunks: ExternalLink[],\n signal?: AbortSignal,\n ): Promise<Uint8Array[]> {\n const semaphore = new Semaphore(this.options.maxConcurrentDownloads);\n\n const downloadPromises = chunks.map(async (chunk) => {\n await semaphore.acquire();\n try {\n return await this.downloadChunkRaw(chunk, signal);\n } finally {\n semaphore.release();\n }\n });\n\n return Promise.all(downloadPromises);\n }\n\n /**\n * Download a single chunk as raw bytes with retry logic.\n */\n private async downloadChunkRaw(\n chunk: ExternalLink,\n signal?: AbortSignal,\n ): Promise<Uint8Array> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < this.options.retries; attempt++) {\n const timeoutController = new AbortController();\n const timeoutId = setTimeout(() => {\n timeoutController.abort();\n }, this.options.timeout);\n\n const combinedSignal = signal\n ? this.combineAbortSignals(signal, timeoutController.signal)\n : timeoutController.signal;\n\n try {\n const externalLink = chunk.external_link;\n if (!externalLink) {\n logger.error(\"External link is required for chunk: %O\", chunk);\n continue;\n }\n\n const response = await fetch(externalLink, {\n signal: combinedSignal,\n });\n\n if (!response.ok) {\n throw ExecutionError.statementFailed(\n `Failed to download chunk ${chunk.chunk_index}: ${response.status} ${response.statusText}`,\n );\n }\n\n const arrayBuffer = await response.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n } catch (error) {\n lastError = error as Error;\n\n if (timeoutController.signal.aborted) {\n lastError = new Error(\n `Chunk ${chunk.chunk_index} download timed out after ${this.options.timeout}ms`,\n );\n }\n\n if (signal?.aborted) {\n throw ExecutionError.canceled();\n }\n\n if (attempt < this.options.retries - 1) {\n await this.delay(2 ** attempt * BACKOFF_MULTIPLIER);\n }\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n throw ExecutionError.statementFailed(\n `Failed to download chunk ${chunk.chunk_index} after ${this.options.retries} attempts: ${lastError?.message}`,\n );\n }\n\n /**\n * Concatenate multiple Uint8Array buffers into a single buffer.\n * Pre-allocates the result array for efficiency.\n */\n private concatenateBuffers(buffers: Uint8Array[]): Uint8Array {\n if (buffers.length === 0) {\n throw ValidationError.missingField(\"buffers\");\n }\n\n if (buffers.length === 1) {\n return buffers[0];\n }\n\n const totalLength = buffers.reduce((sum, buf) => sum + buf.length, 0);\n const result = new Uint8Array(totalLength);\n\n let offset = 0;\n for (const buffer of buffers) {\n result.set(buffer, offset);\n offset += buffer.length;\n }\n\n return result;\n }\n\n /**\n * Combines multiple AbortSignals into one.\n * The combined signal aborts when any of the input signals abort.\n */\n private combineAbortSignals(...signals: AbortSignal[]): AbortSignal {\n const controller = new AbortController();\n\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort();\n return controller.signal;\n }\n signal.addEventListener(\"abort\", () => controller.abort(), {\n once: true,\n });\n }\n\n return controller.signal;\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nclass Semaphore {\n private permits: number;\n private waiting: (() => void)[] = [];\n\n constructor(permits: number) {\n this.permits = permits;\n }\n\n async acquire(): Promise<void> {\n if (this.permits > 0) {\n this.permits--;\n return;\n }\n\n return new Promise<void>((resolve) => {\n this.waiting.push(resolve);\n });\n }\n\n release(): void {\n if (this.waiting.length > 0) {\n const next = this.waiting.shift();\n\n if (next) {\n next();\n }\n } else {\n this.permits++;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"arrow-stream-processor.js","names":[],"sources":["../../src/stream/arrow-stream-processor.ts"],"sourcesContent":["import type { sql } from \"@databricks/sdk-experimental\";\nimport { ExecutionError, ValidationError } from \"../errors\";\nimport { createLogger } from \"../logging/logger\";\n\nconst logger = createLogger(\"stream:arrow\");\n\ntype ResultManifest = sql.ResultManifest;\ntype ExternalLink = sql.ExternalLink;\n\ninterface ArrowStreamOptions {\n maxConcurrentDownloads: number;\n timeout: number;\n retries: number;\n}\n\n/**\n * Result from zero-copy Arrow chunk processing.\n * Contains raw IPC bytes without server-side parsing.\n */\ninterface ArrowRawResult {\n /** Concatenated raw Arrow IPC bytes */\n data: Uint8Array;\n /** Schema from Databricks manifest (not parsed from Arrow) */\n schema: ResultManifest[\"schema\"];\n}\n\nconst BACKOFF_MULTIPLIER = 1000;\n\nexport class ArrowStreamProcessor {\n static readonly DEFAULT_MAX_CONCURRENT_DOWNLOADS = 5;\n static readonly DEFAULT_TIMEOUT = 30000;\n static readonly DEFAULT_RETRIES = 3;\n\n constructor(\n private options: ArrowStreamOptions = {\n maxConcurrentDownloads:\n ArrowStreamProcessor.DEFAULT_MAX_CONCURRENT_DOWNLOADS,\n timeout: ArrowStreamProcessor.DEFAULT_TIMEOUT,\n retries: ArrowStreamProcessor.DEFAULT_RETRIES,\n },\n ) {\n this.options = {\n maxConcurrentDownloads:\n options.maxConcurrentDownloads ??\n ArrowStreamProcessor.DEFAULT_MAX_CONCURRENT_DOWNLOADS,\n timeout: options.timeout ?? ArrowStreamProcessor.DEFAULT_TIMEOUT,\n retries: options.retries ?? ArrowStreamProcessor.DEFAULT_RETRIES,\n };\n }\n\n /**\n * Process Arrow chunks using zero-copy proxy pattern.\n *\n * Downloads raw IPC bytes from external links and concatenates them\n * without parsing into Arrow Tables on the server. This reduces:\n * - Memory usage by ~50% (no parsed Table representation)\n * - CPU usage (no tableFromIPC/tableToIPC calls)\n *\n * The client is responsible for parsing the IPC bytes.\n *\n * @param chunks - External links to Arrow IPC data\n * @param schema - Schema from Databricks manifest\n * @param signal - Optional abort signal\n * @returns Raw concatenated IPC bytes with schema\n */\n async processChunks(\n chunks: ExternalLink[],\n schema: ResultManifest[\"schema\"],\n signal?: AbortSignal,\n ): Promise<ArrowRawResult> {\n if (chunks.length === 0) {\n throw ValidationError.missingField(\"chunks\");\n }\n\n const buffers = await this.downloadChunksRaw(chunks, signal);\n const data = this.concatenateBuffers(buffers);\n\n return { data, schema };\n }\n\n /**\n * Download all chunks as raw bytes with concurrency control.\n */\n private async downloadChunksRaw(\n chunks: ExternalLink[],\n signal?: AbortSignal,\n ): Promise<Uint8Array[]> {\n const semaphore = new Semaphore(this.options.maxConcurrentDownloads);\n\n const downloadPromises = chunks.map(async (chunk) => {\n await semaphore.acquire();\n try {\n return await this.downloadChunkRaw(chunk, signal);\n } finally {\n semaphore.release();\n }\n });\n\n return Promise.all(downloadPromises);\n }\n\n /**\n * Download a single chunk as raw bytes with retry logic.\n */\n private async downloadChunkRaw(\n chunk: ExternalLink,\n signal?: AbortSignal,\n ): Promise<Uint8Array> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < this.options.retries; attempt++) {\n const timeoutController = new AbortController();\n const timeoutId = setTimeout(() => {\n timeoutController.abort();\n }, this.options.timeout);\n\n const combinedSignal = signal\n ? this.combineAbortSignals(signal, timeoutController.signal)\n : timeoutController.signal;\n\n try {\n const externalLink = chunk.external_link;\n if (!externalLink) {\n logger.error(\"External link is required for chunk: %O\", chunk);\n continue;\n }\n\n const response = await fetch(externalLink, {\n signal: combinedSignal,\n });\n\n if (!response.ok) {\n throw ExecutionError.statementFailed(\n `Failed to download chunk ${chunk.chunk_index}: ${response.status} ${response.statusText}`,\n );\n }\n\n const arrayBuffer = await response.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n } catch (error) {\n lastError = error as Error;\n\n if (timeoutController.signal.aborted) {\n lastError = new Error(\n `Chunk ${chunk.chunk_index} download timed out after ${this.options.timeout}ms`,\n );\n }\n\n if (signal?.aborted) {\n throw ExecutionError.canceled();\n }\n\n if (attempt < this.options.retries - 1) {\n await this.delay(2 ** attempt * BACKOFF_MULTIPLIER);\n }\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n throw ExecutionError.statementFailed(\n `Failed to download chunk ${chunk.chunk_index} after ${this.options.retries} attempts: ${lastError?.message}`,\n );\n }\n\n /**\n * Concatenate multiple Uint8Array buffers into a single buffer.\n * Pre-allocates the result array for efficiency.\n */\n private concatenateBuffers(buffers: Uint8Array[]): Uint8Array {\n if (buffers.length === 0) {\n throw ValidationError.missingField(\"buffers\");\n }\n\n if (buffers.length === 1) {\n return buffers[0];\n }\n\n const totalLength = buffers.reduce((sum, buf) => sum + buf.length, 0);\n const result = new Uint8Array(totalLength);\n\n let offset = 0;\n for (const buffer of buffers) {\n result.set(buffer, offset);\n offset += buffer.length;\n }\n\n return result;\n }\n\n /**\n * Combines multiple AbortSignals into one.\n * The combined signal aborts when any of the input signals abort.\n */\n private combineAbortSignals(...signals: AbortSignal[]): AbortSignal {\n const controller = new AbortController();\n\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort();\n return controller.signal;\n }\n signal.addEventListener(\"abort\", () => controller.abort(), {\n once: true,\n });\n }\n\n return controller.signal;\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nclass Semaphore {\n private permits: number;\n private waiting: (() => void)[] = [];\n\n constructor(permits: number) {\n this.permits = permits;\n }\n\n async acquire(): Promise<void> {\n if (this.permits > 0) {\n this.permits--;\n return;\n }\n\n return new Promise<void>((resolve) => {\n this.waiting.push(resolve);\n });\n }\n\n release(): void {\n if (this.waiting.length > 0) {\n const next = this.waiting.shift();\n\n if (next) {\n next();\n }\n } else {\n this.permits++;\n }\n }\n}\n"],"mappings":"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"}