@stina/extension-api 0.22.0 → 0.23.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 (42) hide show
  1. package/dist/{chunk-U3PEHSBG.js → chunk-DGUM43GV.js} +2 -8
  2. package/dist/chunk-DGUM43GV.js.map +1 -0
  3. package/dist/chunk-PTPOHFA4.js +9 -0
  4. package/dist/{chunk-U3PEHSBG.js.map → chunk-PTPOHFA4.js.map} +1 -1
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.d.cts +4 -4
  7. package/dist/index.d.ts +4 -4
  8. package/dist/index.js +2 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/runtime.cjs +134 -41
  11. package/dist/runtime.cjs.map +1 -1
  12. package/dist/runtime.d.cts +2 -2
  13. package/dist/runtime.d.ts +2 -2
  14. package/dist/runtime.js +138 -43
  15. package/dist/runtime.js.map +1 -1
  16. package/dist/schemas/index.cjs +711 -0
  17. package/dist/schemas/index.cjs.map +1 -0
  18. package/dist/schemas/index.d.cts +4707 -0
  19. package/dist/schemas/index.d.ts +4707 -0
  20. package/dist/schemas/index.js +615 -0
  21. package/dist/schemas/index.js.map +1 -0
  22. package/dist/{types.tools-BXGZf8zc.d.cts → types.tools-6o0mTWW-.d.cts} +311 -85
  23. package/dist/{types.tools-BXGZf8zc.d.ts → types.tools-6o0mTWW-.d.ts} +311 -85
  24. package/package.json +16 -4
  25. package/schema/extension-manifest.schema.json +993 -0
  26. package/scripts/generate-schema.ts +41 -0
  27. package/src/background.test.ts +33 -0
  28. package/src/background.ts +24 -0
  29. package/src/index.ts +8 -2
  30. package/src/messages.ts +31 -4
  31. package/src/runtime.ts +149 -43
  32. package/src/schemas/components.schema.ts +465 -0
  33. package/src/schemas/contributions.schema.ts +473 -0
  34. package/src/schemas/index.ts +162 -0
  35. package/src/schemas/manifest.schema.ts +71 -0
  36. package/src/schemas/permissions.schema.ts +141 -0
  37. package/src/types.context.ts +36 -93
  38. package/src/types.contributions.ts +9 -0
  39. package/src/types.permissions.ts +1 -1
  40. package/src/types.storage.ts +287 -0
  41. package/src/types.ts +10 -2
  42. package/tsup.config.ts +1 -1
@@ -5,13 +5,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
5
5
  throw Error('Dynamic require of "' + x + '" is not supported');
6
6
  });
7
7
 
8
- // src/messages.ts
9
- function generateMessageId() {
10
- return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
11
- }
12
-
13
8
  export {
14
- __require,
15
- generateMessageId
9
+ __require
16
10
  };
17
- //# sourceMappingURL=chunk-U3PEHSBG.js.map
11
+ //# sourceMappingURL=chunk-DGUM43GV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,9 @@
1
+ // src/messages.ts
2
+ function generateMessageId() {
3
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
4
+ }
5
+
6
+ export {
7
+ generateMessageId
8
+ };
9
+ //# sourceMappingURL=chunk-PTPOHFA4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/messages.ts"],"sourcesContent":["/**\n * Message protocol between Extension Host and Extension Workers\n */\n\nimport type {\n ChatMessage,\n ChatOptions,\n GetModelsOptions,\n StreamEvent,\n ToolResult,\n ActionResult,\n ModelInfo,\n SchedulerFirePayload,\n} from './types.js'\n\n// ============================================================================\n// Host → Worker Messages\n// ============================================================================\n\nexport type HostToWorkerMessage =\n | ActivateMessage\n | DeactivateMessage\n | SettingsChangedMessage\n | SchedulerFireMessage\n | ProviderChatRequestMessage\n | ProviderModelsRequestMessage\n | ToolExecuteRequestMessage\n | ActionExecuteRequestMessage\n | ResponseMessage\n | StreamingFetchChunkMessage\n | BackgroundTaskStartMessage\n | BackgroundTaskStopMessage\n\nexport interface ActivateMessage {\n type: 'activate'\n id: string\n payload: {\n extensionId: string\n extensionVersion: string\n storagePath: string\n permissions: string[]\n settings: Record<string, unknown>\n }\n}\n\nexport interface DeactivateMessage {\n type: 'deactivate'\n id: string\n}\n\nexport interface SettingsChangedMessage {\n type: 'settings-changed'\n id: string\n payload: {\n key: string\n value: unknown\n }\n}\n\nexport interface SchedulerFireMessage {\n type: 'scheduler-fire'\n id: string\n payload: SchedulerFirePayload\n}\n\nexport interface ProviderChatRequestMessage {\n type: 'provider-chat-request'\n id: string\n payload: {\n providerId: string\n messages: ChatMessage[]\n options: ChatOptions\n }\n}\n\nexport interface ProviderModelsRequestMessage {\n type: 'provider-models-request'\n id: string\n payload: {\n providerId: string\n options?: GetModelsOptions\n }\n}\n\nexport interface ToolExecuteRequestMessage {\n type: 'tool-execute-request'\n id: string\n payload: {\n toolId: string\n params: Record<string, unknown>\n /** User ID if the tool is executed in a user context */\n userId?: string\n }\n}\n\nexport interface ActionExecuteRequestMessage {\n type: 'action-execute-request'\n id: string\n payload: {\n actionId: string\n params: Record<string, unknown>\n /** User ID if the action is executed in a user context */\n userId?: string\n }\n}\n\nexport interface ResponseMessage {\n type: 'response'\n id: string\n payload: {\n requestId: string\n success: boolean\n data?: unknown\n error?: string\n }\n}\n\n/**\n * Message sent from host to worker with streaming fetch data chunks.\n * Used for streaming network responses (e.g., NDJSON streams from Ollama).\n */\nexport interface StreamingFetchChunkMessage {\n type: 'streaming-fetch-chunk'\n id: string\n payload: {\n requestId: string\n chunk: string\n done: boolean\n error?: string\n }\n}\n\n/**\n * Message sent from host to worker to start a registered background task.\n */\nexport interface BackgroundTaskStartMessage {\n type: 'background-task-start'\n id: string\n payload: {\n taskId: string\n }\n}\n\n/**\n * Message sent from host to worker to stop a running background task.\n */\nexport interface BackgroundTaskStopMessage {\n type: 'background-task-stop'\n id: string\n payload: {\n taskId: string\n }\n}\n\n// ============================================================================\n// Worker → Host Messages\n// ============================================================================\n\nexport type WorkerToHostMessage =\n | ReadyMessage\n | RequestMessage\n | ProviderRegisteredMessage\n | ToolRegisteredMessage\n | ActionRegisteredMessage\n | StreamEventMessage\n | LogMessage\n | ProviderModelsResponseMessage\n | ToolExecuteResponseMessage\n | ActionExecuteResponseMessage\n | StreamingFetchAckMessage\n | BackgroundTaskRegisteredMessage\n | BackgroundTaskStatusMessage\n | BackgroundTaskHealthMessage\n\nexport interface ReadyMessage {\n type: 'ready'\n}\n\n/**\n * Message sent from worker to host to acknowledge receipt of a streaming fetch chunk.\n * This enables backpressure control to prevent unbounded memory growth.\n */\nexport interface StreamingFetchAckMessage {\n type: 'streaming-fetch-ack'\n payload: {\n requestId: string\n }\n}\n\nexport interface RequestMessage {\n type: 'request'\n id: string\n method: RequestMethod\n payload: unknown\n}\n\nexport type RequestMethod =\n | 'network.fetch'\n | 'network.fetch-stream'\n | 'settings.getAll'\n | 'settings.get'\n | 'settings.set'\n | 'user.getProfile'\n | 'events.emit'\n | 'scheduler.schedule'\n | 'scheduler.cancel'\n | 'chat.appendInstruction'\n | 'database.execute'\n | 'storage.get'\n | 'storage.set'\n | 'storage.delete'\n | 'storage.keys'\n | 'storage.getForUser'\n | 'storage.setForUser'\n | 'storage.deleteForUser'\n | 'storage.keysForUser'\n\nexport interface ProviderRegisteredMessage {\n type: 'provider-registered'\n payload: {\n id: string\n name: string\n }\n}\n\nexport interface ToolRegisteredMessage {\n type: 'tool-registered'\n payload: {\n id: string\n name: string\n description: string\n parameters?: Record<string, unknown>\n }\n}\n\nexport interface ActionRegisteredMessage {\n type: 'action-registered'\n payload: {\n id: string\n }\n}\n\nexport interface StreamEventMessage {\n type: 'stream-event'\n payload: {\n requestId: string\n event: StreamEvent\n }\n}\n\nexport interface ProviderModelsResponseMessage {\n type: 'provider-models-response'\n payload: {\n requestId: string\n models: ModelInfo[]\n error?: string\n }\n}\n\nexport interface ToolExecuteResponseMessage {\n type: 'tool-execute-response'\n payload: {\n requestId: string\n result: ToolResult\n error?: string\n }\n}\n\nexport interface ActionExecuteResponseMessage {\n type: 'action-execute-response'\n payload: {\n requestId: string\n result: ActionResult\n error?: string\n }\n}\n\nexport interface LogMessage {\n type: 'log'\n payload: {\n level: 'debug' | 'info' | 'warn' | 'error'\n message: string\n data?: Record<string, unknown>\n }\n}\n\n/**\n * Message sent from worker to host when a background task is registered.\n */\nexport interface BackgroundTaskRegisteredMessage {\n type: 'background-task-registered'\n payload: {\n taskId: string\n name: string\n userId: string\n restartPolicy: {\n type: 'always' | 'on-failure' | 'never'\n maxRestarts?: number\n initialDelayMs?: number\n maxDelayMs?: number\n backoffMultiplier?: number\n }\n payload?: Record<string, unknown>\n }\n}\n\n/**\n * Message sent from worker to host with background task status updates.\n */\nexport interface BackgroundTaskStatusMessage {\n type: 'background-task-status'\n payload: {\n taskId: string\n status: 'running' | 'stopped' | 'failed'\n error?: string\n }\n}\n\n/**\n * Message sent from worker to host with background task health reports.\n */\nexport interface BackgroundTaskHealthMessage {\n type: 'background-task-health'\n payload: {\n taskId: string\n status: string\n timestamp: string\n }\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\nexport interface PendingRequest<T = unknown> {\n resolve: (value: T) => void\n reject: (error: Error) => void\n timeout: ReturnType<typeof setTimeout>\n}\n\n/**\n * Generate a unique message ID\n */\nexport function generateMessageId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n}\n"],"mappings":";;;;;;;;AAuVO,SAAS,oBAA4B;AAC1C,SAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACjE;","names":[]}
1
+ {"version":3,"sources":["../src/messages.ts"],"sourcesContent":["/**\n * Message protocol between Extension Host and Extension Workers\n */\n\nimport type {\n ChatMessage,\n ChatOptions,\n GetModelsOptions,\n StreamEvent,\n ToolResult,\n ActionResult,\n ModelInfo,\n SchedulerFirePayload,\n} from './types.js'\n\n// ============================================================================\n// Host → Worker Messages\n// ============================================================================\n\nexport type HostToWorkerMessage =\n | ActivateMessage\n | DeactivateMessage\n | SettingsChangedMessage\n | SchedulerFireMessage\n | ProviderChatRequestMessage\n | ProviderModelsRequestMessage\n | ToolExecuteRequestMessage\n | ActionExecuteRequestMessage\n | ResponseMessage\n | StreamingFetchChunkMessage\n | BackgroundTaskStartMessage\n | BackgroundTaskStopMessage\n\nexport interface ActivateMessage {\n type: 'activate'\n id: string\n payload: {\n extensionId: string\n extensionVersion: string\n storagePath: string\n permissions: string[]\n settings: Record<string, unknown>\n }\n}\n\nexport interface DeactivateMessage {\n type: 'deactivate'\n id: string\n}\n\nexport interface SettingsChangedMessage {\n type: 'settings-changed'\n id: string\n payload: {\n key: string\n value: unknown\n }\n}\n\nexport interface SchedulerFireMessage {\n type: 'scheduler-fire'\n id: string\n payload: SchedulerFirePayload\n}\n\nexport interface ProviderChatRequestMessage {\n type: 'provider-chat-request'\n id: string\n payload: {\n providerId: string\n messages: ChatMessage[]\n options: ChatOptions\n }\n}\n\nexport interface ProviderModelsRequestMessage {\n type: 'provider-models-request'\n id: string\n payload: {\n providerId: string\n options?: GetModelsOptions\n }\n}\n\nexport interface ToolExecuteRequestMessage {\n type: 'tool-execute-request'\n id: string\n payload: {\n toolId: string\n params: Record<string, unknown>\n /** User ID if the tool is executed in a user context */\n userId?: string\n }\n}\n\nexport interface ActionExecuteRequestMessage {\n type: 'action-execute-request'\n id: string\n payload: {\n actionId: string\n params: Record<string, unknown>\n /** User ID if the action is executed in a user context */\n userId?: string\n }\n}\n\nexport interface ResponseMessage {\n type: 'response'\n id: string\n payload: {\n requestId: string\n success: boolean\n data?: unknown\n error?: string\n }\n}\n\n/**\n * Message sent from host to worker with streaming fetch data chunks.\n * Used for streaming network responses (e.g., NDJSON streams from Ollama).\n */\nexport interface StreamingFetchChunkMessage {\n type: 'streaming-fetch-chunk'\n id: string\n payload: {\n requestId: string\n chunk: string\n done: boolean\n error?: string\n }\n}\n\n/**\n * Message sent from host to worker to start a registered background task.\n */\nexport interface BackgroundTaskStartMessage {\n type: 'background-task-start'\n id: string\n payload: {\n taskId: string\n }\n}\n\n/**\n * Message sent from host to worker to stop a running background task.\n */\nexport interface BackgroundTaskStopMessage {\n type: 'background-task-stop'\n id: string\n payload: {\n taskId: string\n }\n}\n\n// ============================================================================\n// Worker → Host Messages\n// ============================================================================\n\nexport type WorkerToHostMessage =\n | ReadyMessage\n | RequestMessage\n | ProviderRegisteredMessage\n | ToolRegisteredMessage\n | ActionRegisteredMessage\n | StreamEventMessage\n | LogMessage\n | ProviderModelsResponseMessage\n | ToolExecuteResponseMessage\n | ActionExecuteResponseMessage\n | StreamingFetchAckMessage\n | BackgroundTaskRegisteredMessage\n | BackgroundTaskStatusMessage\n | BackgroundTaskHealthMessage\n\nexport interface ReadyMessage {\n type: 'ready'\n}\n\n/**\n * Message sent from worker to host to acknowledge receipt of a streaming fetch chunk.\n * This enables backpressure control to prevent unbounded memory growth.\n */\nexport interface StreamingFetchAckMessage {\n type: 'streaming-fetch-ack'\n payload: {\n requestId: string\n }\n}\n\nexport interface RequestMessage {\n type: 'request'\n id: string\n method: RequestMethod\n payload: unknown\n}\n\nexport type RequestMethod =\n | 'network.fetch'\n | 'network.fetch-stream'\n | 'settings.getAll'\n | 'settings.get'\n | 'settings.set'\n | 'user.getProfile'\n | 'events.emit'\n | 'scheduler.schedule'\n | 'scheduler.cancel'\n | 'chat.appendInstruction'\n | 'database.execute'\n // Simple key-value storage methods\n | 'storage.set'\n | 'storage.keys'\n | 'storage.setForUser'\n | 'storage.keysForUser'\n // Collection-based storage methods\n | 'storage.put'\n | 'storage.get'\n | 'storage.delete'\n | 'storage.find'\n | 'storage.findOne'\n | 'storage.count'\n | 'storage.putMany'\n | 'storage.deleteMany'\n | 'storage.dropCollection'\n | 'storage.listCollections'\n | 'storage.putForUser'\n | 'storage.getForUser'\n | 'storage.deleteForUser'\n | 'storage.findForUser'\n | 'storage.findOneForUser'\n | 'storage.countForUser'\n | 'storage.putManyForUser'\n | 'storage.deleteManyForUser'\n | 'storage.dropCollectionForUser'\n | 'storage.listCollectionsForUser'\n // Secrets methods\n | 'secrets.set'\n | 'secrets.get'\n | 'secrets.delete'\n | 'secrets.list'\n | 'secrets.setForUser'\n | 'secrets.getForUser'\n | 'secrets.deleteForUser'\n | 'secrets.listForUser'\n\nexport interface ProviderRegisteredMessage {\n type: 'provider-registered'\n payload: {\n id: string\n name: string\n }\n}\n\nexport interface ToolRegisteredMessage {\n type: 'tool-registered'\n payload: {\n id: string\n name: string\n description: string\n parameters?: Record<string, unknown>\n }\n}\n\nexport interface ActionRegisteredMessage {\n type: 'action-registered'\n payload: {\n id: string\n }\n}\n\nexport interface StreamEventMessage {\n type: 'stream-event'\n payload: {\n requestId: string\n event: StreamEvent\n }\n}\n\nexport interface ProviderModelsResponseMessage {\n type: 'provider-models-response'\n payload: {\n requestId: string\n models: ModelInfo[]\n error?: string\n }\n}\n\nexport interface ToolExecuteResponseMessage {\n type: 'tool-execute-response'\n payload: {\n requestId: string\n result: ToolResult\n error?: string\n }\n}\n\nexport interface ActionExecuteResponseMessage {\n type: 'action-execute-response'\n payload: {\n requestId: string\n result: ActionResult\n error?: string\n }\n}\n\nexport interface LogMessage {\n type: 'log'\n payload: {\n level: 'debug' | 'info' | 'warn' | 'error'\n message: string\n data?: Record<string, unknown>\n }\n}\n\n/**\n * Message sent from worker to host when a background task is registered.\n */\nexport interface BackgroundTaskRegisteredMessage {\n type: 'background-task-registered'\n payload: {\n taskId: string\n name: string\n userId: string\n restartPolicy: {\n type: 'always' | 'on-failure' | 'never'\n maxRestarts?: number\n initialDelayMs?: number\n maxDelayMs?: number\n backoffMultiplier?: number\n }\n payload?: Record<string, unknown>\n }\n}\n\n/**\n * Message sent from worker to host with background task status updates.\n */\nexport interface BackgroundTaskStatusMessage {\n type: 'background-task-status'\n payload: {\n taskId: string\n status: 'running' | 'stopped' | 'failed'\n error?: string\n }\n}\n\n/**\n * Message sent from worker to host with background task health reports.\n */\nexport interface BackgroundTaskHealthMessage {\n type: 'background-task-health'\n payload: {\n taskId: string\n status: string\n timestamp: string\n }\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\nexport interface PendingRequest<T = unknown> {\n resolve: (value: T) => void\n reject: (error: Error) => void\n timeout: ReturnType<typeof setTimeout>\n}\n\n/**\n * Generate a unique message ID\n */\nexport function generateMessageId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n}\n"],"mappings":";AAkXO,SAAS,oBAA4B;AAC1C,SAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACjE;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/types.localization.ts","../src/messages.ts"],"sourcesContent":["/**\n * @stina/extension-api\n *\n * Types and utilities for building Stina extensions.\n *\n * Extensions should import from this package for type definitions.\n * The runtime (worker-side code) should import from '@stina/extension-api/runtime'.\n */\n\n// Localization\nexport type { LocalizedString } from './types.js'\nexport { resolveLocalizedString } from './types.js'\n\n// Types\nexport type {\n // Manifest\n ExtensionManifest,\n Platform,\n ExtensionContributions,\n SettingDefinition,\n SettingOptionsMapping,\n SettingCreateMapping,\n ToolSettingsViewDefinition,\n ToolSettingsView,\n ToolSettingsListView,\n ToolSettingsListMapping,\n ToolSettingsComponentView,\n ToolSettingsActionDataSource,\n PanelDefinition,\n PanelView,\n PanelComponentView,\n PanelActionDataSource,\n PanelUnknownView,\n ProviderDefinition,\n PromptContribution,\n PromptSection,\n ToolDefinition,\n CommandDefinition,\n\n // Provider Configuration Schema\n ProviderConfigSchema,\n ProviderConfigProperty,\n ProviderConfigPropertyType,\n ProviderConfigSelectOption,\n ProviderConfigValidation,\n\n // Permissions\n Permission,\n NetworkPermission,\n StoragePermission,\n UserDataPermission,\n CapabilityPermission,\n SystemPermission,\n\n // Context\n ExtensionContext,\n Disposable,\n NetworkAPI,\n SettingsAPI,\n ProvidersAPI,\n ToolsAPI,\n ActionsAPI,\n EventsAPI,\n SchedulerAPI,\n SchedulerJobRequest,\n SchedulerSchedule,\n SchedulerFirePayload,\n UserAPI,\n UserProfile,\n ChatAPI,\n ChatInstructionMessage,\n DatabaseAPI,\n StorageAPI,\n LogAPI,\n\n // Background workers\n BackgroundWorkersAPI,\n BackgroundTaskConfig,\n BackgroundTaskCallback,\n BackgroundTaskContext,\n BackgroundTaskHealth,\n BackgroundRestartPolicy,\n\n // AI Provider\n AIProvider,\n ModelInfo,\n ChatMessage,\n ChatOptions,\n GetModelsOptions,\n StreamEvent,\n ToolCall,\n\n // Tools\n Tool,\n ToolResult,\n\n // Actions\n Action,\n ActionResult,\n\n // Entry point\n ExtensionModule,\n} from './types.js'\n\n// Messages (for host implementation)\nexport type {\n HostToWorkerMessage,\n WorkerToHostMessage,\n ActivateMessage,\n DeactivateMessage,\n SettingsChangedMessage,\n ProviderChatRequestMessage,\n ProviderModelsRequestMessage,\n ToolExecuteRequestMessage,\n ToolExecuteResponseMessage,\n ActionExecuteRequestMessage,\n ActionExecuteResponseMessage,\n ResponseMessage,\n ReadyMessage,\n RequestMessage,\n RequestMethod,\n ProviderRegisteredMessage,\n ToolRegisteredMessage,\n ActionRegisteredMessage,\n StreamEventMessage,\n LogMessage,\n PendingRequest,\n // Background task messages\n BackgroundTaskStartMessage,\n BackgroundTaskStopMessage,\n BackgroundTaskRegisteredMessage,\n BackgroundTaskStatusMessage,\n BackgroundTaskHealthMessage,\n} from './messages.js'\n\nexport { generateMessageId } from './messages.js'\n\n// Component types (for extension UI components)\nexport type {\n // Styling\n AllowedCSSProperty,\n ExtensionComponentStyle,\n // Base types\n ExtensionComponentData,\n // Iteration & Children\n ExtensionComponentIterator,\n ExtensionComponentChildren,\n // Actions\n ExtensionActionCall,\n ExtensionActionRef,\n // Data Sources & Panel Definition\n ExtensionDataSource,\n ExtensionPanelDefinition,\n // Component Props\n HeaderProps,\n LabelProps,\n ParagraphProps,\n ButtonProps,\n TextInputProps,\n DateTimeInputProps,\n SelectProps,\n VerticalStackProps,\n HorizontalStackProps,\n GridProps,\n DividerProps,\n IconProps,\n IconButtonType,\n IconButtonProps,\n PanelAction,\n PanelProps,\n ToggleProps,\n CollapsibleProps,\n PillVariant,\n PillProps,\n CheckboxProps,\n MarkdownProps,\n ModalProps,\n ConditionalGroupProps,\n} from './types.components.js'\n","/**\n * Localization Types\n *\n * Types and utilities for localized strings in extensions.\n */\n\n/**\n * A string that can be either a simple string or a map of language codes to localized strings.\n * When a simple string is provided, it's used as the default/fallback value.\n * When a map is provided, the appropriate language is selected at runtime.\n *\n * @example\n * // Simple string (backwards compatible)\n * name: \"Get Weather\"\n *\n * @example\n * // Localized strings\n * name: { en: \"Get Weather\", sv: \"Hämta väder\", de: \"Wetter abrufen\" }\n */\nexport type LocalizedString = string | Record<string, string>\n\n/**\n * Resolves a LocalizedString to an actual string value.\n * @param value The LocalizedString to resolve\n * @param lang The preferred language code (e.g., \"sv\", \"en\")\n * @param fallbackLang The fallback language code (defaults to \"en\")\n * @returns The resolved string value\n */\nexport function resolveLocalizedString(\n value: LocalizedString,\n lang: string,\n fallbackLang = 'en'\n): string {\n if (typeof value === 'string') {\n return value\n }\n // Try preferred language first, then fallback language, then first available, then empty string\n return value[lang] ?? value[fallbackLang] ?? Object.values(value)[0] ?? ''\n}\n","/**\n * Message protocol between Extension Host and Extension Workers\n */\n\nimport type {\n ChatMessage,\n ChatOptions,\n GetModelsOptions,\n StreamEvent,\n ToolResult,\n ActionResult,\n ModelInfo,\n SchedulerFirePayload,\n} from './types.js'\n\n// ============================================================================\n// Host → Worker Messages\n// ============================================================================\n\nexport type HostToWorkerMessage =\n | ActivateMessage\n | DeactivateMessage\n | SettingsChangedMessage\n | SchedulerFireMessage\n | ProviderChatRequestMessage\n | ProviderModelsRequestMessage\n | ToolExecuteRequestMessage\n | ActionExecuteRequestMessage\n | ResponseMessage\n | StreamingFetchChunkMessage\n | BackgroundTaskStartMessage\n | BackgroundTaskStopMessage\n\nexport interface ActivateMessage {\n type: 'activate'\n id: string\n payload: {\n extensionId: string\n extensionVersion: string\n storagePath: string\n permissions: string[]\n settings: Record<string, unknown>\n }\n}\n\nexport interface DeactivateMessage {\n type: 'deactivate'\n id: string\n}\n\nexport interface SettingsChangedMessage {\n type: 'settings-changed'\n id: string\n payload: {\n key: string\n value: unknown\n }\n}\n\nexport interface SchedulerFireMessage {\n type: 'scheduler-fire'\n id: string\n payload: SchedulerFirePayload\n}\n\nexport interface ProviderChatRequestMessage {\n type: 'provider-chat-request'\n id: string\n payload: {\n providerId: string\n messages: ChatMessage[]\n options: ChatOptions\n }\n}\n\nexport interface ProviderModelsRequestMessage {\n type: 'provider-models-request'\n id: string\n payload: {\n providerId: string\n options?: GetModelsOptions\n }\n}\n\nexport interface ToolExecuteRequestMessage {\n type: 'tool-execute-request'\n id: string\n payload: {\n toolId: string\n params: Record<string, unknown>\n /** User ID if the tool is executed in a user context */\n userId?: string\n }\n}\n\nexport interface ActionExecuteRequestMessage {\n type: 'action-execute-request'\n id: string\n payload: {\n actionId: string\n params: Record<string, unknown>\n /** User ID if the action is executed in a user context */\n userId?: string\n }\n}\n\nexport interface ResponseMessage {\n type: 'response'\n id: string\n payload: {\n requestId: string\n success: boolean\n data?: unknown\n error?: string\n }\n}\n\n/**\n * Message sent from host to worker with streaming fetch data chunks.\n * Used for streaming network responses (e.g., NDJSON streams from Ollama).\n */\nexport interface StreamingFetchChunkMessage {\n type: 'streaming-fetch-chunk'\n id: string\n payload: {\n requestId: string\n chunk: string\n done: boolean\n error?: string\n }\n}\n\n/**\n * Message sent from host to worker to start a registered background task.\n */\nexport interface BackgroundTaskStartMessage {\n type: 'background-task-start'\n id: string\n payload: {\n taskId: string\n }\n}\n\n/**\n * Message sent from host to worker to stop a running background task.\n */\nexport interface BackgroundTaskStopMessage {\n type: 'background-task-stop'\n id: string\n payload: {\n taskId: string\n }\n}\n\n// ============================================================================\n// Worker → Host Messages\n// ============================================================================\n\nexport type WorkerToHostMessage =\n | ReadyMessage\n | RequestMessage\n | ProviderRegisteredMessage\n | ToolRegisteredMessage\n | ActionRegisteredMessage\n | StreamEventMessage\n | LogMessage\n | ProviderModelsResponseMessage\n | ToolExecuteResponseMessage\n | ActionExecuteResponseMessage\n | StreamingFetchAckMessage\n | BackgroundTaskRegisteredMessage\n | BackgroundTaskStatusMessage\n | BackgroundTaskHealthMessage\n\nexport interface ReadyMessage {\n type: 'ready'\n}\n\n/**\n * Message sent from worker to host to acknowledge receipt of a streaming fetch chunk.\n * This enables backpressure control to prevent unbounded memory growth.\n */\nexport interface StreamingFetchAckMessage {\n type: 'streaming-fetch-ack'\n payload: {\n requestId: string\n }\n}\n\nexport interface RequestMessage {\n type: 'request'\n id: string\n method: RequestMethod\n payload: unknown\n}\n\nexport type RequestMethod =\n | 'network.fetch'\n | 'network.fetch-stream'\n | 'settings.getAll'\n | 'settings.get'\n | 'settings.set'\n | 'user.getProfile'\n | 'events.emit'\n | 'scheduler.schedule'\n | 'scheduler.cancel'\n | 'chat.appendInstruction'\n | 'database.execute'\n | 'storage.get'\n | 'storage.set'\n | 'storage.delete'\n | 'storage.keys'\n | 'storage.getForUser'\n | 'storage.setForUser'\n | 'storage.deleteForUser'\n | 'storage.keysForUser'\n\nexport interface ProviderRegisteredMessage {\n type: 'provider-registered'\n payload: {\n id: string\n name: string\n }\n}\n\nexport interface ToolRegisteredMessage {\n type: 'tool-registered'\n payload: {\n id: string\n name: string\n description: string\n parameters?: Record<string, unknown>\n }\n}\n\nexport interface ActionRegisteredMessage {\n type: 'action-registered'\n payload: {\n id: string\n }\n}\n\nexport interface StreamEventMessage {\n type: 'stream-event'\n payload: {\n requestId: string\n event: StreamEvent\n }\n}\n\nexport interface ProviderModelsResponseMessage {\n type: 'provider-models-response'\n payload: {\n requestId: string\n models: ModelInfo[]\n error?: string\n }\n}\n\nexport interface ToolExecuteResponseMessage {\n type: 'tool-execute-response'\n payload: {\n requestId: string\n result: ToolResult\n error?: string\n }\n}\n\nexport interface ActionExecuteResponseMessage {\n type: 'action-execute-response'\n payload: {\n requestId: string\n result: ActionResult\n error?: string\n }\n}\n\nexport interface LogMessage {\n type: 'log'\n payload: {\n level: 'debug' | 'info' | 'warn' | 'error'\n message: string\n data?: Record<string, unknown>\n }\n}\n\n/**\n * Message sent from worker to host when a background task is registered.\n */\nexport interface BackgroundTaskRegisteredMessage {\n type: 'background-task-registered'\n payload: {\n taskId: string\n name: string\n userId: string\n restartPolicy: {\n type: 'always' | 'on-failure' | 'never'\n maxRestarts?: number\n initialDelayMs?: number\n maxDelayMs?: number\n backoffMultiplier?: number\n }\n payload?: Record<string, unknown>\n }\n}\n\n/**\n * Message sent from worker to host with background task status updates.\n */\nexport interface BackgroundTaskStatusMessage {\n type: 'background-task-status'\n payload: {\n taskId: string\n status: 'running' | 'stopped' | 'failed'\n error?: string\n }\n}\n\n/**\n * Message sent from worker to host with background task health reports.\n */\nexport interface BackgroundTaskHealthMessage {\n type: 'background-task-health'\n payload: {\n taskId: string\n status: string\n timestamp: string\n }\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\nexport interface PendingRequest<T = unknown> {\n resolve: (value: T) => void\n reject: (error: Error) => void\n timeout: ReturnType<typeof setTimeout>\n}\n\n/**\n * Generate a unique message ID\n */\nexport function generateMessageId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC4BO,SAAS,uBACd,OACA,MACA,eAAe,MACP;AACR,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,IAAI,KAAK,MAAM,YAAY,KAAK,OAAO,OAAO,KAAK,EAAE,CAAC,KAAK;AAC1E;;;ACiTO,SAAS,oBAA4B;AAC1C,SAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACjE;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/types.localization.ts","../src/messages.ts"],"sourcesContent":["/**\n * @stina/extension-api\n *\n * Types and utilities for building Stina extensions.\n *\n * Extensions should import from this package for type definitions.\n * The runtime (worker-side code) should import from '@stina/extension-api/runtime'.\n */\n\n// Localization\nexport type { LocalizedString } from './types.js'\nexport { resolveLocalizedString } from './types.js'\n\n// Types\nexport type {\n // Manifest\n ExtensionManifest,\n Platform,\n ExtensionContributions,\n SettingDefinition,\n SettingOptionsMapping,\n SettingCreateMapping,\n ToolSettingsViewDefinition,\n ToolSettingsView,\n ToolSettingsListView,\n ToolSettingsListMapping,\n ToolSettingsComponentView,\n ToolSettingsActionDataSource,\n PanelDefinition,\n PanelView,\n PanelComponentView,\n PanelActionDataSource,\n PanelUnknownView,\n ProviderDefinition,\n PromptContribution,\n PromptSection,\n ToolDefinition,\n CommandDefinition,\n\n // Provider Configuration Schema\n ProviderConfigSchema,\n ProviderConfigProperty,\n ProviderConfigPropertyType,\n ProviderConfigSelectOption,\n ProviderConfigValidation,\n\n // Permissions\n Permission,\n NetworkPermission,\n StoragePermission,\n UserDataPermission,\n CapabilityPermission,\n SystemPermission,\n\n // Context\n ExtensionContext,\n Disposable,\n NetworkAPI,\n SettingsAPI,\n ProvidersAPI,\n ToolsAPI,\n ActionsAPI,\n EventsAPI,\n SchedulerAPI,\n SchedulerJobRequest,\n SchedulerSchedule,\n SchedulerFirePayload,\n UserAPI,\n UserProfile,\n ChatAPI,\n ChatInstructionMessage,\n LogAPI,\n\n // Background workers\n BackgroundWorkersAPI,\n BackgroundTaskConfig,\n BackgroundTaskCallback,\n BackgroundTaskContext,\n BackgroundTaskHealth,\n BackgroundRestartPolicy,\n\n // Storage and Secrets\n Query,\n QueryOptions,\n StorageAPI,\n SecretsAPI,\n StorageCollectionConfig,\n StorageContributions,\n\n // AI Provider\n AIProvider,\n ModelInfo,\n ChatMessage,\n ChatOptions,\n GetModelsOptions,\n StreamEvent,\n ToolCall,\n\n // Tools\n Tool,\n ToolResult,\n\n // Actions\n Action,\n ActionResult,\n\n // Entry point\n ExtensionModule,\n} from './types.js'\n\n// Messages (for host implementation)\nexport type {\n HostToWorkerMessage,\n WorkerToHostMessage,\n ActivateMessage,\n DeactivateMessage,\n SettingsChangedMessage,\n ProviderChatRequestMessage,\n ProviderModelsRequestMessage,\n ToolExecuteRequestMessage,\n ToolExecuteResponseMessage,\n ActionExecuteRequestMessage,\n ActionExecuteResponseMessage,\n ResponseMessage,\n ReadyMessage,\n RequestMessage,\n RequestMethod,\n ProviderRegisteredMessage,\n ToolRegisteredMessage,\n ActionRegisteredMessage,\n StreamEventMessage,\n LogMessage,\n PendingRequest,\n // Background task messages\n BackgroundTaskStartMessage,\n BackgroundTaskStopMessage,\n BackgroundTaskRegisteredMessage,\n BackgroundTaskStatusMessage,\n BackgroundTaskHealthMessage,\n} from './messages.js'\n\nexport { generateMessageId } from './messages.js'\n\n// Component types (for extension UI components)\nexport type {\n // Styling\n AllowedCSSProperty,\n ExtensionComponentStyle,\n // Base types\n ExtensionComponentData,\n // Iteration & Children\n ExtensionComponentIterator,\n ExtensionComponentChildren,\n // Actions\n ExtensionActionCall,\n ExtensionActionRef,\n // Data Sources & Panel Definition\n ExtensionDataSource,\n ExtensionPanelDefinition,\n // Component Props\n HeaderProps,\n LabelProps,\n ParagraphProps,\n ButtonProps,\n TextInputProps,\n DateTimeInputProps,\n SelectProps,\n VerticalStackProps,\n HorizontalStackProps,\n GridProps,\n DividerProps,\n IconProps,\n IconButtonType,\n IconButtonProps,\n PanelAction,\n PanelProps,\n ToggleProps,\n CollapsibleProps,\n PillVariant,\n PillProps,\n CheckboxProps,\n MarkdownProps,\n ModalProps,\n ConditionalGroupProps,\n} from './types.components.js'\n","/**\n * Localization Types\n *\n * Types and utilities for localized strings in extensions.\n */\n\n/**\n * A string that can be either a simple string or a map of language codes to localized strings.\n * When a simple string is provided, it's used as the default/fallback value.\n * When a map is provided, the appropriate language is selected at runtime.\n *\n * @example\n * // Simple string (backwards compatible)\n * name: \"Get Weather\"\n *\n * @example\n * // Localized strings\n * name: { en: \"Get Weather\", sv: \"Hämta väder\", de: \"Wetter abrufen\" }\n */\nexport type LocalizedString = string | Record<string, string>\n\n/**\n * Resolves a LocalizedString to an actual string value.\n * @param value The LocalizedString to resolve\n * @param lang The preferred language code (e.g., \"sv\", \"en\")\n * @param fallbackLang The fallback language code (defaults to \"en\")\n * @returns The resolved string value\n */\nexport function resolveLocalizedString(\n value: LocalizedString,\n lang: string,\n fallbackLang = 'en'\n): string {\n if (typeof value === 'string') {\n return value\n }\n // Try preferred language first, then fallback language, then first available, then empty string\n return value[lang] ?? value[fallbackLang] ?? Object.values(value)[0] ?? ''\n}\n","/**\n * Message protocol between Extension Host and Extension Workers\n */\n\nimport type {\n ChatMessage,\n ChatOptions,\n GetModelsOptions,\n StreamEvent,\n ToolResult,\n ActionResult,\n ModelInfo,\n SchedulerFirePayload,\n} from './types.js'\n\n// ============================================================================\n// Host → Worker Messages\n// ============================================================================\n\nexport type HostToWorkerMessage =\n | ActivateMessage\n | DeactivateMessage\n | SettingsChangedMessage\n | SchedulerFireMessage\n | ProviderChatRequestMessage\n | ProviderModelsRequestMessage\n | ToolExecuteRequestMessage\n | ActionExecuteRequestMessage\n | ResponseMessage\n | StreamingFetchChunkMessage\n | BackgroundTaskStartMessage\n | BackgroundTaskStopMessage\n\nexport interface ActivateMessage {\n type: 'activate'\n id: string\n payload: {\n extensionId: string\n extensionVersion: string\n storagePath: string\n permissions: string[]\n settings: Record<string, unknown>\n }\n}\n\nexport interface DeactivateMessage {\n type: 'deactivate'\n id: string\n}\n\nexport interface SettingsChangedMessage {\n type: 'settings-changed'\n id: string\n payload: {\n key: string\n value: unknown\n }\n}\n\nexport interface SchedulerFireMessage {\n type: 'scheduler-fire'\n id: string\n payload: SchedulerFirePayload\n}\n\nexport interface ProviderChatRequestMessage {\n type: 'provider-chat-request'\n id: string\n payload: {\n providerId: string\n messages: ChatMessage[]\n options: ChatOptions\n }\n}\n\nexport interface ProviderModelsRequestMessage {\n type: 'provider-models-request'\n id: string\n payload: {\n providerId: string\n options?: GetModelsOptions\n }\n}\n\nexport interface ToolExecuteRequestMessage {\n type: 'tool-execute-request'\n id: string\n payload: {\n toolId: string\n params: Record<string, unknown>\n /** User ID if the tool is executed in a user context */\n userId?: string\n }\n}\n\nexport interface ActionExecuteRequestMessage {\n type: 'action-execute-request'\n id: string\n payload: {\n actionId: string\n params: Record<string, unknown>\n /** User ID if the action is executed in a user context */\n userId?: string\n }\n}\n\nexport interface ResponseMessage {\n type: 'response'\n id: string\n payload: {\n requestId: string\n success: boolean\n data?: unknown\n error?: string\n }\n}\n\n/**\n * Message sent from host to worker with streaming fetch data chunks.\n * Used for streaming network responses (e.g., NDJSON streams from Ollama).\n */\nexport interface StreamingFetchChunkMessage {\n type: 'streaming-fetch-chunk'\n id: string\n payload: {\n requestId: string\n chunk: string\n done: boolean\n error?: string\n }\n}\n\n/**\n * Message sent from host to worker to start a registered background task.\n */\nexport interface BackgroundTaskStartMessage {\n type: 'background-task-start'\n id: string\n payload: {\n taskId: string\n }\n}\n\n/**\n * Message sent from host to worker to stop a running background task.\n */\nexport interface BackgroundTaskStopMessage {\n type: 'background-task-stop'\n id: string\n payload: {\n taskId: string\n }\n}\n\n// ============================================================================\n// Worker → Host Messages\n// ============================================================================\n\nexport type WorkerToHostMessage =\n | ReadyMessage\n | RequestMessage\n | ProviderRegisteredMessage\n | ToolRegisteredMessage\n | ActionRegisteredMessage\n | StreamEventMessage\n | LogMessage\n | ProviderModelsResponseMessage\n | ToolExecuteResponseMessage\n | ActionExecuteResponseMessage\n | StreamingFetchAckMessage\n | BackgroundTaskRegisteredMessage\n | BackgroundTaskStatusMessage\n | BackgroundTaskHealthMessage\n\nexport interface ReadyMessage {\n type: 'ready'\n}\n\n/**\n * Message sent from worker to host to acknowledge receipt of a streaming fetch chunk.\n * This enables backpressure control to prevent unbounded memory growth.\n */\nexport interface StreamingFetchAckMessage {\n type: 'streaming-fetch-ack'\n payload: {\n requestId: string\n }\n}\n\nexport interface RequestMessage {\n type: 'request'\n id: string\n method: RequestMethod\n payload: unknown\n}\n\nexport type RequestMethod =\n | 'network.fetch'\n | 'network.fetch-stream'\n | 'settings.getAll'\n | 'settings.get'\n | 'settings.set'\n | 'user.getProfile'\n | 'events.emit'\n | 'scheduler.schedule'\n | 'scheduler.cancel'\n | 'chat.appendInstruction'\n | 'database.execute'\n // Simple key-value storage methods\n | 'storage.set'\n | 'storage.keys'\n | 'storage.setForUser'\n | 'storage.keysForUser'\n // Collection-based storage methods\n | 'storage.put'\n | 'storage.get'\n | 'storage.delete'\n | 'storage.find'\n | 'storage.findOne'\n | 'storage.count'\n | 'storage.putMany'\n | 'storage.deleteMany'\n | 'storage.dropCollection'\n | 'storage.listCollections'\n | 'storage.putForUser'\n | 'storage.getForUser'\n | 'storage.deleteForUser'\n | 'storage.findForUser'\n | 'storage.findOneForUser'\n | 'storage.countForUser'\n | 'storage.putManyForUser'\n | 'storage.deleteManyForUser'\n | 'storage.dropCollectionForUser'\n | 'storage.listCollectionsForUser'\n // Secrets methods\n | 'secrets.set'\n | 'secrets.get'\n | 'secrets.delete'\n | 'secrets.list'\n | 'secrets.setForUser'\n | 'secrets.getForUser'\n | 'secrets.deleteForUser'\n | 'secrets.listForUser'\n\nexport interface ProviderRegisteredMessage {\n type: 'provider-registered'\n payload: {\n id: string\n name: string\n }\n}\n\nexport interface ToolRegisteredMessage {\n type: 'tool-registered'\n payload: {\n id: string\n name: string\n description: string\n parameters?: Record<string, unknown>\n }\n}\n\nexport interface ActionRegisteredMessage {\n type: 'action-registered'\n payload: {\n id: string\n }\n}\n\nexport interface StreamEventMessage {\n type: 'stream-event'\n payload: {\n requestId: string\n event: StreamEvent\n }\n}\n\nexport interface ProviderModelsResponseMessage {\n type: 'provider-models-response'\n payload: {\n requestId: string\n models: ModelInfo[]\n error?: string\n }\n}\n\nexport interface ToolExecuteResponseMessage {\n type: 'tool-execute-response'\n payload: {\n requestId: string\n result: ToolResult\n error?: string\n }\n}\n\nexport interface ActionExecuteResponseMessage {\n type: 'action-execute-response'\n payload: {\n requestId: string\n result: ActionResult\n error?: string\n }\n}\n\nexport interface LogMessage {\n type: 'log'\n payload: {\n level: 'debug' | 'info' | 'warn' | 'error'\n message: string\n data?: Record<string, unknown>\n }\n}\n\n/**\n * Message sent from worker to host when a background task is registered.\n */\nexport interface BackgroundTaskRegisteredMessage {\n type: 'background-task-registered'\n payload: {\n taskId: string\n name: string\n userId: string\n restartPolicy: {\n type: 'always' | 'on-failure' | 'never'\n maxRestarts?: number\n initialDelayMs?: number\n maxDelayMs?: number\n backoffMultiplier?: number\n }\n payload?: Record<string, unknown>\n }\n}\n\n/**\n * Message sent from worker to host with background task status updates.\n */\nexport interface BackgroundTaskStatusMessage {\n type: 'background-task-status'\n payload: {\n taskId: string\n status: 'running' | 'stopped' | 'failed'\n error?: string\n }\n}\n\n/**\n * Message sent from worker to host with background task health reports.\n */\nexport interface BackgroundTaskHealthMessage {\n type: 'background-task-health'\n payload: {\n taskId: string\n status: string\n timestamp: string\n }\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\nexport interface PendingRequest<T = unknown> {\n resolve: (value: T) => void\n reject: (error: Error) => void\n timeout: ReturnType<typeof setTimeout>\n}\n\n/**\n * Generate a unique message ID\n */\nexport function generateMessageId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC4BO,SAAS,uBACd,OACA,MACA,eAAe,MACP;AACR,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,IAAI,KAAK,MAAM,YAAY,KAAK,OAAO,OAAO,KAAK,EAAE,CAAC,KAAK;AAC1E;;;AC4UO,SAAS,oBAA4B;AAC1C,SAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACjE;","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { E as ExtensionContributions, S as SchedulerFirePayload, C as ChatMessage, a as ChatOptions, G as GetModelsOptions, b as StreamEvent, M as ModelInfo, T as ToolResult, A as ActionResult } from './types.tools-BXGZf8zc.cjs';
2
- export { a5 as AIProvider, a8 as Action, J as ActionsAPI, aa as AllowedCSSProperty, a4 as BackgroundRestartPolicy, a1 as BackgroundTaskCallback, a0 as BackgroundTaskConfig, a2 as BackgroundTaskContext, a3 as BackgroundTaskHealth, $ as BackgroundWorkersAPI, am as ButtonProps, W as ChatAPI, X as ChatInstructionMessage, aD as CheckboxProps, aA as CollapsibleProps, u as CommandDefinition, aG as ConditionalGroupProps, Y as DatabaseAPI, ao as DateTimeInputProps, D as Disposable, at as DividerProps, K as EventsAPI, af as ExtensionActionCall, ag as ExtensionActionRef, ae as ExtensionComponentChildren, ac as ExtensionComponentData, ad as ExtensionComponentIterator, ab as ExtensionComponentStyle, B as ExtensionContext, ah as ExtensionDataSource, a9 as ExtensionModule, ai as ExtensionPanelDefinition, as as GridProps, aj as HeaderProps, ar as HorizontalStackProps, aw as IconButtonProps, av as IconButtonType, au as IconProps, ak as LabelProps, L as LocalizedString, _ as LogAPI, aE as MarkdownProps, aF as ModalProps, N as NetworkAPI, ax as PanelAction, n as PanelActionDataSource, m as PanelComponentView, P as PanelDefinition, ay as PanelProps, o as PanelUnknownView, l as PanelView, al as ParagraphProps, aC as PillProps, aB as PillVariant, q as PromptContribution, s as PromptSection, w as ProviderConfigProperty, x as ProviderConfigPropertyType, v as ProviderConfigSchema, y as ProviderConfigSelectOption, z as ProviderConfigValidation, p as ProviderDefinition, H as ProvidersAPI, O as SchedulerAPI, Q as SchedulerJobRequest, R as SchedulerSchedule, ap as SelectProps, e as SettingCreateMapping, c as SettingDefinition, d as SettingOptionsMapping, F as SettingsAPI, Z as StorageAPI, an as TextInputProps, az as ToggleProps, a7 as Tool, a6 as ToolCall, t as ToolDefinition, k as ToolSettingsActionDataSource, j as ToolSettingsComponentView, i as ToolSettingsListMapping, h as ToolSettingsListView, g as ToolSettingsView, f as ToolSettingsViewDefinition, I as ToolsAPI, U as UserAPI, V as UserProfile, aq as VerticalStackProps, r as resolveLocalizedString } from './types.tools-BXGZf8zc.cjs';
1
+ import { E as ExtensionContributions, S as SchedulerFirePayload, C as ChatMessage, a as ChatOptions, G as GetModelsOptions, b as StreamEvent, M as ModelInfo, T as ToolResult, A as ActionResult } from './types.tools-6o0mTWW-.cjs';
2
+ export { a9 as AIProvider, ac as Action, J as ActionsAPI, ae as AllowedCSSProperty, a2 as BackgroundRestartPolicy, $ as BackgroundTaskCallback, _ as BackgroundTaskConfig, a0 as BackgroundTaskContext, a1 as BackgroundTaskHealth, Z as BackgroundWorkersAPI, aq as ButtonProps, W as ChatAPI, X as ChatInstructionMessage, aH as CheckboxProps, aE as CollapsibleProps, u as CommandDefinition, aK as ConditionalGroupProps, as as DateTimeInputProps, D as Disposable, ax as DividerProps, K as EventsAPI, aj as ExtensionActionCall, ak as ExtensionActionRef, ai as ExtensionComponentChildren, ag as ExtensionComponentData, ah as ExtensionComponentIterator, af as ExtensionComponentStyle, B as ExtensionContext, al as ExtensionDataSource, ad as ExtensionModule, am as ExtensionPanelDefinition, aw as GridProps, an as HeaderProps, av as HorizontalStackProps, aA as IconButtonProps, az as IconButtonType, ay as IconProps, ao as LabelProps, L as LocalizedString, Y as LogAPI, aI as MarkdownProps, aJ as ModalProps, N as NetworkAPI, aB as PanelAction, n as PanelActionDataSource, m as PanelComponentView, P as PanelDefinition, aC as PanelProps, o as PanelUnknownView, l as PanelView, ap as ParagraphProps, aG as PillProps, aF as PillVariant, q as PromptContribution, s as PromptSection, w as ProviderConfigProperty, x as ProviderConfigPropertyType, v as ProviderConfigSchema, y as ProviderConfigSelectOption, z as ProviderConfigValidation, p as ProviderDefinition, H as ProvidersAPI, a3 as Query, a4 as QueryOptions, O as SchedulerAPI, Q as SchedulerJobRequest, R as SchedulerSchedule, a6 as SecretsAPI, at as SelectProps, e as SettingCreateMapping, c as SettingDefinition, d as SettingOptionsMapping, F as SettingsAPI, a5 as StorageAPI, a7 as StorageCollectionConfig, a8 as StorageContributions, ar as TextInputProps, aD as ToggleProps, ab as Tool, aa as ToolCall, t as ToolDefinition, k as ToolSettingsActionDataSource, j as ToolSettingsComponentView, i as ToolSettingsListMapping, h as ToolSettingsListView, g as ToolSettingsView, f as ToolSettingsViewDefinition, I as ToolsAPI, U as UserAPI, V as UserProfile, au as VerticalStackProps, r as resolveLocalizedString } from './types.tools-6o0mTWW-.cjs';
3
3
 
4
4
  /**
5
5
  * Permission Types
@@ -10,7 +10,7 @@ type Permission = NetworkPermission | StoragePermission | UserDataPermission | C
10
10
  /** Network access permissions */
11
11
  type NetworkPermission = 'network:*' | `network:localhost` | `network:localhost:${number}` | `network:${string}`;
12
12
  /** Storage permissions */
13
- type StoragePermission = 'database.own' | 'storage.local';
13
+ type StoragePermission = 'storage.collections' | 'secrets.manage';
14
14
  /** User data permissions */
15
15
  type UserDataPermission = 'user.profile.read' | 'user.location.read' | 'chat.history.read' | 'chat.current.read';
16
16
  /** Capability permissions */
@@ -194,7 +194,7 @@ interface RequestMessage {
194
194
  method: RequestMethod;
195
195
  payload: unknown;
196
196
  }
197
- type RequestMethod = 'network.fetch' | 'network.fetch-stream' | 'settings.getAll' | 'settings.get' | 'settings.set' | 'user.getProfile' | 'events.emit' | 'scheduler.schedule' | 'scheduler.cancel' | 'chat.appendInstruction' | 'database.execute' | 'storage.get' | 'storage.set' | 'storage.delete' | 'storage.keys' | 'storage.getForUser' | 'storage.setForUser' | 'storage.deleteForUser' | 'storage.keysForUser';
197
+ type RequestMethod = 'network.fetch' | 'network.fetch-stream' | 'settings.getAll' | 'settings.get' | 'settings.set' | 'user.getProfile' | 'events.emit' | 'scheduler.schedule' | 'scheduler.cancel' | 'chat.appendInstruction' | 'database.execute' | 'storage.set' | 'storage.keys' | 'storage.setForUser' | 'storage.keysForUser' | 'storage.put' | 'storage.get' | 'storage.delete' | 'storage.find' | 'storage.findOne' | 'storage.count' | 'storage.putMany' | 'storage.deleteMany' | 'storage.dropCollection' | 'storage.listCollections' | 'storage.putForUser' | 'storage.getForUser' | 'storage.deleteForUser' | 'storage.findForUser' | 'storage.findOneForUser' | 'storage.countForUser' | 'storage.putManyForUser' | 'storage.deleteManyForUser' | 'storage.dropCollectionForUser' | 'storage.listCollectionsForUser' | 'secrets.set' | 'secrets.get' | 'secrets.delete' | 'secrets.list' | 'secrets.setForUser' | 'secrets.getForUser' | 'secrets.deleteForUser' | 'secrets.listForUser';
198
198
  interface ProviderRegisteredMessage {
199
199
  type: 'provider-registered';
200
200
  payload: {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { E as ExtensionContributions, S as SchedulerFirePayload, C as ChatMessage, a as ChatOptions, G as GetModelsOptions, b as StreamEvent, M as ModelInfo, T as ToolResult, A as ActionResult } from './types.tools-BXGZf8zc.js';
2
- export { a5 as AIProvider, a8 as Action, J as ActionsAPI, aa as AllowedCSSProperty, a4 as BackgroundRestartPolicy, a1 as BackgroundTaskCallback, a0 as BackgroundTaskConfig, a2 as BackgroundTaskContext, a3 as BackgroundTaskHealth, $ as BackgroundWorkersAPI, am as ButtonProps, W as ChatAPI, X as ChatInstructionMessage, aD as CheckboxProps, aA as CollapsibleProps, u as CommandDefinition, aG as ConditionalGroupProps, Y as DatabaseAPI, ao as DateTimeInputProps, D as Disposable, at as DividerProps, K as EventsAPI, af as ExtensionActionCall, ag as ExtensionActionRef, ae as ExtensionComponentChildren, ac as ExtensionComponentData, ad as ExtensionComponentIterator, ab as ExtensionComponentStyle, B as ExtensionContext, ah as ExtensionDataSource, a9 as ExtensionModule, ai as ExtensionPanelDefinition, as as GridProps, aj as HeaderProps, ar as HorizontalStackProps, aw as IconButtonProps, av as IconButtonType, au as IconProps, ak as LabelProps, L as LocalizedString, _ as LogAPI, aE as MarkdownProps, aF as ModalProps, N as NetworkAPI, ax as PanelAction, n as PanelActionDataSource, m as PanelComponentView, P as PanelDefinition, ay as PanelProps, o as PanelUnknownView, l as PanelView, al as ParagraphProps, aC as PillProps, aB as PillVariant, q as PromptContribution, s as PromptSection, w as ProviderConfigProperty, x as ProviderConfigPropertyType, v as ProviderConfigSchema, y as ProviderConfigSelectOption, z as ProviderConfigValidation, p as ProviderDefinition, H as ProvidersAPI, O as SchedulerAPI, Q as SchedulerJobRequest, R as SchedulerSchedule, ap as SelectProps, e as SettingCreateMapping, c as SettingDefinition, d as SettingOptionsMapping, F as SettingsAPI, Z as StorageAPI, an as TextInputProps, az as ToggleProps, a7 as Tool, a6 as ToolCall, t as ToolDefinition, k as ToolSettingsActionDataSource, j as ToolSettingsComponentView, i as ToolSettingsListMapping, h as ToolSettingsListView, g as ToolSettingsView, f as ToolSettingsViewDefinition, I as ToolsAPI, U as UserAPI, V as UserProfile, aq as VerticalStackProps, r as resolveLocalizedString } from './types.tools-BXGZf8zc.js';
1
+ import { E as ExtensionContributions, S as SchedulerFirePayload, C as ChatMessage, a as ChatOptions, G as GetModelsOptions, b as StreamEvent, M as ModelInfo, T as ToolResult, A as ActionResult } from './types.tools-6o0mTWW-.js';
2
+ export { a9 as AIProvider, ac as Action, J as ActionsAPI, ae as AllowedCSSProperty, a2 as BackgroundRestartPolicy, $ as BackgroundTaskCallback, _ as BackgroundTaskConfig, a0 as BackgroundTaskContext, a1 as BackgroundTaskHealth, Z as BackgroundWorkersAPI, aq as ButtonProps, W as ChatAPI, X as ChatInstructionMessage, aH as CheckboxProps, aE as CollapsibleProps, u as CommandDefinition, aK as ConditionalGroupProps, as as DateTimeInputProps, D as Disposable, ax as DividerProps, K as EventsAPI, aj as ExtensionActionCall, ak as ExtensionActionRef, ai as ExtensionComponentChildren, ag as ExtensionComponentData, ah as ExtensionComponentIterator, af as ExtensionComponentStyle, B as ExtensionContext, al as ExtensionDataSource, ad as ExtensionModule, am as ExtensionPanelDefinition, aw as GridProps, an as HeaderProps, av as HorizontalStackProps, aA as IconButtonProps, az as IconButtonType, ay as IconProps, ao as LabelProps, L as LocalizedString, Y as LogAPI, aI as MarkdownProps, aJ as ModalProps, N as NetworkAPI, aB as PanelAction, n as PanelActionDataSource, m as PanelComponentView, P as PanelDefinition, aC as PanelProps, o as PanelUnknownView, l as PanelView, ap as ParagraphProps, aG as PillProps, aF as PillVariant, q as PromptContribution, s as PromptSection, w as ProviderConfigProperty, x as ProviderConfigPropertyType, v as ProviderConfigSchema, y as ProviderConfigSelectOption, z as ProviderConfigValidation, p as ProviderDefinition, H as ProvidersAPI, a3 as Query, a4 as QueryOptions, O as SchedulerAPI, Q as SchedulerJobRequest, R as SchedulerSchedule, a6 as SecretsAPI, at as SelectProps, e as SettingCreateMapping, c as SettingDefinition, d as SettingOptionsMapping, F as SettingsAPI, a5 as StorageAPI, a7 as StorageCollectionConfig, a8 as StorageContributions, ar as TextInputProps, aD as ToggleProps, ab as Tool, aa as ToolCall, t as ToolDefinition, k as ToolSettingsActionDataSource, j as ToolSettingsComponentView, i as ToolSettingsListMapping, h as ToolSettingsListView, g as ToolSettingsView, f as ToolSettingsViewDefinition, I as ToolsAPI, U as UserAPI, V as UserProfile, au as VerticalStackProps, r as resolveLocalizedString } from './types.tools-6o0mTWW-.js';
3
3
 
4
4
  /**
5
5
  * Permission Types
@@ -10,7 +10,7 @@ type Permission = NetworkPermission | StoragePermission | UserDataPermission | C
10
10
  /** Network access permissions */
11
11
  type NetworkPermission = 'network:*' | `network:localhost` | `network:localhost:${number}` | `network:${string}`;
12
12
  /** Storage permissions */
13
- type StoragePermission = 'database.own' | 'storage.local';
13
+ type StoragePermission = 'storage.collections' | 'secrets.manage';
14
14
  /** User data permissions */
15
15
  type UserDataPermission = 'user.profile.read' | 'user.location.read' | 'chat.history.read' | 'chat.current.read';
16
16
  /** Capability permissions */
@@ -194,7 +194,7 @@ interface RequestMessage {
194
194
  method: RequestMethod;
195
195
  payload: unknown;
196
196
  }
197
- type RequestMethod = 'network.fetch' | 'network.fetch-stream' | 'settings.getAll' | 'settings.get' | 'settings.set' | 'user.getProfile' | 'events.emit' | 'scheduler.schedule' | 'scheduler.cancel' | 'chat.appendInstruction' | 'database.execute' | 'storage.get' | 'storage.set' | 'storage.delete' | 'storage.keys' | 'storage.getForUser' | 'storage.setForUser' | 'storage.deleteForUser' | 'storage.keysForUser';
197
+ type RequestMethod = 'network.fetch' | 'network.fetch-stream' | 'settings.getAll' | 'settings.get' | 'settings.set' | 'user.getProfile' | 'events.emit' | 'scheduler.schedule' | 'scheduler.cancel' | 'chat.appendInstruction' | 'database.execute' | 'storage.set' | 'storage.keys' | 'storage.setForUser' | 'storage.keysForUser' | 'storage.put' | 'storage.get' | 'storage.delete' | 'storage.find' | 'storage.findOne' | 'storage.count' | 'storage.putMany' | 'storage.deleteMany' | 'storage.dropCollection' | 'storage.listCollections' | 'storage.putForUser' | 'storage.getForUser' | 'storage.deleteForUser' | 'storage.findForUser' | 'storage.findOneForUser' | 'storage.countForUser' | 'storage.putManyForUser' | 'storage.deleteManyForUser' | 'storage.dropCollectionForUser' | 'storage.listCollectionsForUser' | 'secrets.set' | 'secrets.get' | 'secrets.delete' | 'secrets.list' | 'secrets.setForUser' | 'secrets.getForUser' | 'secrets.deleteForUser' | 'secrets.listForUser';
198
198
  interface ProviderRegisteredMessage {
199
199
  type: 'provider-registered';
200
200
  payload: {
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  generateMessageId
3
- } from "./chunk-U3PEHSBG.js";
3
+ } from "./chunk-PTPOHFA4.js";
4
+ import "./chunk-DGUM43GV.js";
4
5
 
5
6
  // src/types.localization.ts
6
7
  function resolveLocalizedString(value, lang, fallbackLang = "en") {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.localization.ts"],"sourcesContent":["/**\n * Localization Types\n *\n * Types and utilities for localized strings in extensions.\n */\n\n/**\n * A string that can be either a simple string or a map of language codes to localized strings.\n * When a simple string is provided, it's used as the default/fallback value.\n * When a map is provided, the appropriate language is selected at runtime.\n *\n * @example\n * // Simple string (backwards compatible)\n * name: \"Get Weather\"\n *\n * @example\n * // Localized strings\n * name: { en: \"Get Weather\", sv: \"Hämta väder\", de: \"Wetter abrufen\" }\n */\nexport type LocalizedString = string | Record<string, string>\n\n/**\n * Resolves a LocalizedString to an actual string value.\n * @param value The LocalizedString to resolve\n * @param lang The preferred language code (e.g., \"sv\", \"en\")\n * @param fallbackLang The fallback language code (defaults to \"en\")\n * @returns The resolved string value\n */\nexport function resolveLocalizedString(\n value: LocalizedString,\n lang: string,\n fallbackLang = 'en'\n): string {\n if (typeof value === 'string') {\n return value\n }\n // Try preferred language first, then fallback language, then first available, then empty string\n return value[lang] ?? value[fallbackLang] ?? Object.values(value)[0] ?? ''\n}\n"],"mappings":";;;;;AA4BO,SAAS,uBACd,OACA,MACA,eAAe,MACP;AACR,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,IAAI,KAAK,MAAM,YAAY,KAAK,OAAO,OAAO,KAAK,EAAE,CAAC,KAAK;AAC1E;","names":[]}
1
+ {"version":3,"sources":["../src/types.localization.ts"],"sourcesContent":["/**\n * Localization Types\n *\n * Types and utilities for localized strings in extensions.\n */\n\n/**\n * A string that can be either a simple string or a map of language codes to localized strings.\n * When a simple string is provided, it's used as the default/fallback value.\n * When a map is provided, the appropriate language is selected at runtime.\n *\n * @example\n * // Simple string (backwards compatible)\n * name: \"Get Weather\"\n *\n * @example\n * // Localized strings\n * name: { en: \"Get Weather\", sv: \"Hämta väder\", de: \"Wetter abrufen\" }\n */\nexport type LocalizedString = string | Record<string, string>\n\n/**\n * Resolves a LocalizedString to an actual string value.\n * @param value The LocalizedString to resolve\n * @param lang The preferred language code (e.g., \"sv\", \"en\")\n * @param fallbackLang The fallback language code (defaults to \"en\")\n * @returns The resolved string value\n */\nexport function resolveLocalizedString(\n value: LocalizedString,\n lang: string,\n fallbackLang = 'en'\n): string {\n if (typeof value === 'string') {\n return value\n }\n // Try preferred language first, then fallback language, then first available, then empty string\n return value[lang] ?? value[fallbackLang] ?? Object.values(value)[0] ?? ''\n}\n"],"mappings":";;;;;;AA4BO,SAAS,uBACd,OACA,MACA,eAAe,MACP;AACR,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,IAAI,KAAK,MAAM,YAAY,KAAK,OAAO,OAAO,KAAK,EAAE,CAAC,KAAK;AAC1E;","names":[]}
package/dist/runtime.cjs CHANGED
@@ -124,6 +124,10 @@ var WorkerBackgroundTaskManager = class {
124
124
  const { config, abortController } = task;
125
125
  const signal = abortController.signal;
126
126
  const log = this.options.createLogAPI(config.id);
127
+ const storage = this.options.createStorageAPI();
128
+ const userStorage = config.userId ? this.options.createUserStorageAPI(config.userId) : storage;
129
+ const secrets = this.options.createSecretsAPI();
130
+ const userSecrets = config.userId ? this.options.createUserSecretsAPI(config.userId) : secrets;
127
131
  const context = {
128
132
  userId: config.userId,
129
133
  extension: {
@@ -131,6 +135,10 @@ var WorkerBackgroundTaskManager = class {
131
135
  version: this.options.extensionVersion,
132
136
  storagePath: this.options.storagePath
133
137
  },
138
+ storage,
139
+ userStorage,
140
+ secrets,
141
+ userSecrets,
134
142
  signal,
135
143
  reportHealth: (status) => {
136
144
  const timestamp = (/* @__PURE__ */ new Date()).toISOString();
@@ -361,6 +369,106 @@ function handleSettingsChanged(key, value) {
361
369
  }
362
370
  }
363
371
  }
372
+ function buildExtensionStorageAPI() {
373
+ return {
374
+ async put(collection, id, data) {
375
+ return sendRequest("storage.put", { collection, id, data });
376
+ },
377
+ async get(collection, id) {
378
+ return sendRequest("storage.get", { collection, id });
379
+ },
380
+ async delete(collection, id) {
381
+ return sendRequest("storage.delete", { collection, id });
382
+ },
383
+ async find(collection, query, options) {
384
+ return sendRequest("storage.find", { collection, query, options });
385
+ },
386
+ async findOne(collection, query) {
387
+ return sendRequest("storage.findOne", { collection, query });
388
+ },
389
+ async count(collection, query) {
390
+ return sendRequest("storage.count", { collection, query });
391
+ },
392
+ async putMany(collection, docs) {
393
+ return sendRequest("storage.putMany", { collection, docs });
394
+ },
395
+ async deleteMany(collection, query) {
396
+ return sendRequest("storage.deleteMany", { collection, query });
397
+ },
398
+ async dropCollection(collection) {
399
+ return sendRequest("storage.dropCollection", { collection });
400
+ },
401
+ async listCollections() {
402
+ return sendRequest("storage.listCollections", {});
403
+ }
404
+ };
405
+ }
406
+ function buildUserStorageAPI(userId) {
407
+ return {
408
+ async put(collection, id, data) {
409
+ return sendRequest("storage.putForUser", { userId, collection, id, data });
410
+ },
411
+ async get(collection, id) {
412
+ return sendRequest("storage.getForUser", { userId, collection, id });
413
+ },
414
+ async delete(collection, id) {
415
+ return sendRequest("storage.deleteForUser", { userId, collection, id });
416
+ },
417
+ async find(collection, query, options) {
418
+ return sendRequest("storage.findForUser", { userId, collection, query, options });
419
+ },
420
+ async findOne(collection, query) {
421
+ return sendRequest("storage.findOneForUser", { userId, collection, query });
422
+ },
423
+ async count(collection, query) {
424
+ return sendRequest("storage.countForUser", { userId, collection, query });
425
+ },
426
+ async putMany(collection, docs) {
427
+ return sendRequest("storage.putManyForUser", { userId, collection, docs });
428
+ },
429
+ async deleteMany(collection, query) {
430
+ return sendRequest("storage.deleteManyForUser", { userId, collection, query });
431
+ },
432
+ async dropCollection(collection) {
433
+ return sendRequest("storage.dropCollectionForUser", { userId, collection });
434
+ },
435
+ async listCollections() {
436
+ return sendRequest("storage.listCollectionsForUser", { userId });
437
+ }
438
+ };
439
+ }
440
+ function buildExtensionSecretsAPI() {
441
+ return {
442
+ async set(key, value) {
443
+ return sendRequest("secrets.set", { key, value });
444
+ },
445
+ async get(key) {
446
+ return sendRequest("secrets.get", { key });
447
+ },
448
+ async delete(key) {
449
+ return sendRequest("secrets.delete", { key });
450
+ },
451
+ async list() {
452
+ return sendRequest("secrets.list", {});
453
+ }
454
+ };
455
+ }
456
+ function buildUserSecretsAPI(userId) {
457
+ return {
458
+ async set(key, value) {
459
+ return sendRequest("secrets.setForUser", { userId, key, value });
460
+ },
461
+ async get(key) {
462
+ return sendRequest("secrets.getForUser", { userId, key });
463
+ },
464
+ async delete(key) {
465
+ return sendRequest("secrets.deleteForUser", { userId, key });
466
+ },
467
+ async list() {
468
+ return sendRequest("secrets.listForUser", { userId });
469
+ }
470
+ };
471
+ }
364
472
  async function handleSchedulerFire(payload) {
365
473
  const execContext = {
366
474
  userId: payload.userId,
@@ -368,7 +476,11 @@ async function handleSchedulerFire(payload) {
368
476
  id: extensionContext.extension.id,
369
477
  version: extensionContext.extension.version,
370
478
  storagePath: extensionContext.extension.storagePath
371
- }
479
+ },
480
+ storage: buildExtensionStorageAPI(),
481
+ userStorage: payload.userId ? buildUserStorageAPI(payload.userId) : buildExtensionStorageAPI(),
482
+ secrets: buildExtensionSecretsAPI(),
483
+ userSecrets: payload.userId ? buildUserSecretsAPI(payload.userId) : buildExtensionSecretsAPI()
372
484
  };
373
485
  const results = await Promise.allSettled(
374
486
  schedulerCallbacks.map((callback) => callback(payload, execContext))
@@ -495,7 +607,11 @@ async function handleToolExecuteRequest(requestId, payload) {
495
607
  id: extensionContext.extension.id,
496
608
  version: extensionContext.extension.version,
497
609
  storagePath: extensionContext.extension.storagePath
498
- }
610
+ },
611
+ storage: buildExtensionStorageAPI(),
612
+ userStorage: payload.userId ? buildUserStorageAPI(payload.userId) : buildExtensionStorageAPI(),
613
+ secrets: buildExtensionSecretsAPI(),
614
+ userSecrets: payload.userId ? buildUserSecretsAPI(payload.userId) : buildExtensionSecretsAPI()
499
615
  };
500
616
  const result = await tool.execute(payload.params, execContext);
501
617
  postMessage({
@@ -537,7 +653,11 @@ async function handleActionExecuteRequest(requestId, payload) {
537
653
  id: extensionContext.extension.id,
538
654
  version: extensionContext.extension.version,
539
655
  storagePath: extensionContext.extension.storagePath
540
- }
656
+ },
657
+ storage: buildExtensionStorageAPI(),
658
+ userStorage: payload.userId ? buildUserStorageAPI(payload.userId) : buildExtensionStorageAPI(),
659
+ secrets: buildExtensionSecretsAPI(),
660
+ userSecrets: payload.userId ? buildUserSecretsAPI(payload.userId) : buildExtensionSecretsAPI()
541
661
  };
542
662
  const result = await action.execute(payload.params, execContext);
543
663
  postMessage({
@@ -757,44 +877,13 @@ function buildContext(extensionId, extensionVersion, storagePath, permissions) {
757
877
  };
758
878
  context.chat = chatApi;
759
879
  }
760
- if (hasPermission("database.own")) {
761
- const databaseApi = {
762
- async execute(sql, params) {
763
- return sendRequest("database.execute", { sql, params });
764
- }
765
- };
766
- context.database = databaseApi;
880
+ if (hasPermission("storage.collections")) {
881
+ ;
882
+ context.storage = buildExtensionStorageAPI();
767
883
  }
768
- if (hasPermission("storage.local")) {
769
- const storageApi = {
770
- // Global/extension-scoped storage
771
- async get(key) {
772
- return sendRequest("storage.get", { key });
773
- },
774
- async set(key, value) {
775
- return sendRequest("storage.set", { key, value });
776
- },
777
- async delete(key) {
778
- return sendRequest("storage.delete", { key });
779
- },
780
- async keys() {
781
- return sendRequest("storage.keys", {});
782
- },
783
- // User-scoped storage
784
- async getForUser(userId, key) {
785
- return sendRequest("storage.getForUser", { userId, key });
786
- },
787
- async setForUser(userId, key, value) {
788
- return sendRequest("storage.setForUser", { userId, key, value });
789
- },
790
- async deleteForUser(userId, key) {
791
- return sendRequest("storage.deleteForUser", { userId, key });
792
- },
793
- async keysForUser(userId) {
794
- return sendRequest("storage.keysForUser", { userId });
795
- }
796
- };
797
- context.storage = storageApi;
884
+ if (hasPermission("secrets.manage")) {
885
+ ;
886
+ context.secrets = buildExtensionSecretsAPI();
798
887
  }
799
888
  if (hasPermission("background.workers")) {
800
889
  if (!backgroundTaskManager) {
@@ -839,7 +928,11 @@ function buildContext(extensionId, extensionVersion, storagePath, permissions) {
839
928
  info: (message, data) => postMessage({ type: "log", payload: { level: "info", message: `[${taskId}] ${message}`, data } }),
840
929
  warn: (message, data) => postMessage({ type: "log", payload: { level: "warn", message: `[${taskId}] ${message}`, data } }),
841
930
  error: (message, data) => postMessage({ type: "log", payload: { level: "error", message: `[${taskId}] ${message}`, data } })
842
- })
931
+ }),
932
+ createStorageAPI: () => buildExtensionStorageAPI(),
933
+ createUserStorageAPI: (userId) => buildUserStorageAPI(userId),
934
+ createSecretsAPI: () => buildExtensionSecretsAPI(),
935
+ createUserSecretsAPI: (userId) => buildUserSecretsAPI(userId)
843
936
  });
844
937
  }
845
938
  const backgroundWorkersApi = {