@weave-apps/sdk 0.1.11 → 0.1.12

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.
@@ -56,8 +56,14 @@
56
56
  * customElements.define('my-app', MyApp);
57
57
  * ```
58
58
  */
59
- import { WeaveBackgroundAPI } from './WeaveBackgroundAPI';
60
- export type { PendingOperation } from './WeaveBackgroundAPI';
59
+ /**
60
+ * Pending operation for multi-page flows
61
+ */
62
+ export interface PendingOperation {
63
+ type: string;
64
+ data: any;
65
+ targetUrl?: string;
66
+ }
61
67
  /**
62
68
  * App metadata configuration
63
69
  */
@@ -108,6 +114,8 @@ export declare abstract class WeaveBaseApp<TSettings = Record<string, any>, TSta
108
114
  protected weaveAPI: any;
109
115
  /** Background API for state persistence */
110
116
  private _backgroundAPI;
117
+ /** Cron API for scheduled tasks */
118
+ private _cronAPI;
111
119
  /** Debounced persist function */
112
120
  private _debouncedPersist;
113
121
  /** Flag to track if state has been restored */
@@ -123,7 +131,43 @@ export declare abstract class WeaveBaseApp<TSettings = Record<string, any>, TSta
123
131
  * Get the background API for state persistence and pending operations
124
132
  * Use this for manual state management or multi-page flows
125
133
  */
126
- protected get background(): WeaveBackgroundAPI | null;
134
+ protected get background(): any;
135
+ /**
136
+ * Get the cron API for scheduled tasks
137
+ */
138
+ protected get cron(): any;
139
+ /**
140
+ * Register a cron job with a callback
141
+ *
142
+ * @param cronExpression - Standard cron expression (5 or 6 fields)
143
+ * - 5 fields: minute hour dayOfMonth month dayOfWeek
144
+ * - 6 fields: second minute hour dayOfMonth month dayOfWeek
145
+ * @param callback - Function to call when cron triggers
146
+ * @param jobName - Optional unique name for the job
147
+ * @returns Job ID if successful, null otherwise
148
+ *
149
+ * @example
150
+ * // Every second
151
+ * this.cronTab('* * * * * *', this.handleEverySecond);
152
+ *
153
+ * // Every minute
154
+ * this.cronTab('* * * * *', this.handleEveryMinute);
155
+ *
156
+ * // Every 5 seconds
157
+ * this.cronTab('0/5 * * * * *', this.handleEvery5Seconds);
158
+ *
159
+ * // Every hour at minute 0
160
+ * this.cronTab('0 * * * *', this.handleEveryHour);
161
+ */
162
+ protected cronTab(cronExpression: string, callback: () => void | Promise<void>, jobName?: string): Promise<string | null>;
163
+ /**
164
+ * Unregister a cron job by name
165
+ */
166
+ protected cronUnregister(jobName: string): Promise<boolean>;
167
+ /**
168
+ * Unregister all cron jobs for this app
169
+ */
170
+ protected cronUnregisterAll(): Promise<number>;
127
171
  /**
128
172
  * Get shadow root (override native property)
129
173
  */
@@ -1 +1 @@
1
- {"version":3,"file":"WeaveBaseApp.d.ts","sourceRoot":"","sources":["../src/WeaveBaseApp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WeaveBaseApp.d.ts","sourceRoot":"","sources":["../src/WeaveBaseApp.ts"],"names":[],"mappings":"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"}
@@ -56,7 +56,6 @@
56
56
  * customElements.define('my-app', MyApp);
57
57
  * ```
58
58
  */
59
- import { WeaveBackgroundAPI } from './WeaveBackgroundAPI';
60
59
  /**
61
60
  * Simple debounce utility
62
61
  */
@@ -88,6 +87,8 @@ export class WeaveBaseApp extends HTMLElement {
88
87
  this.state = {};
89
88
  /** Background API for state persistence */
90
89
  this._backgroundAPI = null;
90
+ /** Cron API for scheduled tasks */
91
+ this._cronAPI = null;
91
92
  /** Debounced persist function */
92
93
  this._debouncedPersist = null;
93
94
  /** Flag to track if state has been restored */
@@ -120,7 +121,14 @@ export class WeaveBaseApp extends HTMLElement {
120
121
  this.weaveAPI = new window.WeaveAPIClient();
121
122
  this.weaveAPI.setAppId(this._appUuid);
122
123
  // Create background API instance for state persistence
123
- this._backgroundAPI = new WeaveBackgroundAPI(this._appUuid);
124
+ if (window.WeaveBackgroundAPI) {
125
+ this._backgroundAPI = new window.WeaveBackgroundAPI(this._appUuid);
126
+ }
127
+ // Create cron API instance for scheduled tasks
128
+ if (window.WeaveCronAPI) {
129
+ this._cronAPI = new window.WeaveCronAPI(this._appUuid);
130
+ this._cronAPI.initialize();
131
+ }
124
132
  // Set up debounced persist if enabled
125
133
  if (appInfo.persistState) {
126
134
  const delay = appInfo.persistDebounce ?? 100;
@@ -143,6 +151,60 @@ export class WeaveBaseApp extends HTMLElement {
143
151
  get background() {
144
152
  return this._backgroundAPI;
145
153
  }
154
+ /**
155
+ * Get the cron API for scheduled tasks
156
+ */
157
+ get cron() {
158
+ return this._cronAPI;
159
+ }
160
+ /**
161
+ * Register a cron job with a callback
162
+ *
163
+ * @param cronExpression - Standard cron expression (5 or 6 fields)
164
+ * - 5 fields: minute hour dayOfMonth month dayOfWeek
165
+ * - 6 fields: second minute hour dayOfMonth month dayOfWeek
166
+ * @param callback - Function to call when cron triggers
167
+ * @param jobName - Optional unique name for the job
168
+ * @returns Job ID if successful, null otherwise
169
+ *
170
+ * @example
171
+ * // Every second
172
+ * this.cronTab('* * * * * *', this.handleEverySecond);
173
+ *
174
+ * // Every minute
175
+ * this.cronTab('* * * * *', this.handleEveryMinute);
176
+ *
177
+ * // Every 5 seconds
178
+ * this.cronTab('0/5 * * * * *', this.handleEvery5Seconds);
179
+ *
180
+ * // Every hour at minute 0
181
+ * this.cronTab('0 * * * *', this.handleEveryHour);
182
+ */
183
+ async cronTab(cronExpression, callback, jobName) {
184
+ if (!this._cronAPI) {
185
+ console.error('Cron API not available - app UUID may be missing');
186
+ return null;
187
+ }
188
+ // Bind callback to this instance
189
+ const boundCallback = callback.bind(this);
190
+ return this._cronAPI.register(cronExpression, boundCallback, jobName);
191
+ }
192
+ /**
193
+ * Unregister a cron job by name
194
+ */
195
+ async cronUnregister(jobName) {
196
+ if (!this._cronAPI)
197
+ return false;
198
+ return this._cronAPI.unregister(jobName);
199
+ }
200
+ /**
201
+ * Unregister all cron jobs for this app
202
+ */
203
+ async cronUnregisterAll() {
204
+ if (!this._cronAPI)
205
+ return 0;
206
+ return this._cronAPI.unregisterAll();
207
+ }
146
208
  /**
147
209
  * Get shadow root (override native property)
148
210
  */
@@ -0,0 +1,68 @@
1
+ /**
2
+ * WeaveCronAPI - Client API for apps to register cron jobs
3
+ *
4
+ * Apps can register callbacks to be executed on a schedule using standard cron syntax.
5
+ * The browser extension's background script acts as the master clock.
6
+ *
7
+ * Cron syntax (5 or 6 fields):
8
+ * - 5 fields: minute hour dayOfMonth month dayOfWeek
9
+ * - 6 fields: second minute hour dayOfMonth month dayOfWeek
10
+ *
11
+ * Special characters: asterisk (any), comma (list), dash (range), slash (step)
12
+ */
13
+ interface CronJob {
14
+ id: string;
15
+ appId: string;
16
+ tabId: number;
17
+ cronExpression: string;
18
+ jobName: string;
19
+ createdAt: number;
20
+ }
21
+ type CronCallback = () => void | Promise<void>;
22
+ export declare class WeaveCronAPI {
23
+ private appId;
24
+ private callbacks;
25
+ private jobIds;
26
+ private pendingRequests;
27
+ private messageListener;
28
+ private isInitialized;
29
+ constructor(appId: string);
30
+ /**
31
+ * Initialize the cron API (sets up message listener)
32
+ */
33
+ initialize(): void;
34
+ /**
35
+ * Cleanup - unregister all jobs and remove listener
36
+ */
37
+ destroy(): Promise<void>;
38
+ /**
39
+ * Register a cron job
40
+ * @param cronExpression - Cron expression (5 or 6 fields)
41
+ * @param callback - Function to call when cron triggers
42
+ * @param jobName - Optional unique name for the job (defaults to callback name or random)
43
+ * @returns Job ID if successful
44
+ */
45
+ register(cronExpression: string, callback: CronCallback, jobName?: string): Promise<string | null>;
46
+ /**
47
+ * Unregister a cron job by name
48
+ */
49
+ unregister(jobName: string): Promise<boolean>;
50
+ /**
51
+ * Unregister all cron jobs for this app
52
+ */
53
+ unregisterAll(): Promise<number>;
54
+ /**
55
+ * List all cron jobs for this app
56
+ */
57
+ list(): Promise<CronJob[]>;
58
+ /**
59
+ * Handle incoming messages
60
+ */
61
+ private handleMessage;
62
+ /**
63
+ * Send request to content script bridge
64
+ */
65
+ private sendRequest;
66
+ }
67
+ export default WeaveCronAPI;
68
+ //# sourceMappingURL=WeaveCronAPI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WeaveCronAPI.d.ts","sourceRoot":"","sources":["../src/WeaveCronAPI.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,KAAK,YAAY,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE/C,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,eAAe,CAA2F;IAClH,OAAO,CAAC,eAAe,CAAgD;IACvE,OAAO,CAAC,aAAa,CAAS;gBAElB,KAAK,EAAE,MAAM;IAIzB;;OAEG;IACH,UAAU,IAAI,IAAI;IAUlB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAe9B;;;;;;OAMG;IACG,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAwBzB;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBnD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IActC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAQhC;;OAEG;IACH,OAAO,CAAC,aAAa;IAmCrB;;OAEG;IACH,OAAO,CAAC,WAAW;CAqBpB;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * WeaveCronAPI - Client API for apps to register cron jobs
3
+ *
4
+ * Apps can register callbacks to be executed on a schedule using standard cron syntax.
5
+ * The browser extension's background script acts as the master clock.
6
+ *
7
+ * Cron syntax (5 or 6 fields):
8
+ * - 5 fields: minute hour dayOfMonth month dayOfWeek
9
+ * - 6 fields: second minute hour dayOfMonth month dayOfWeek
10
+ *
11
+ * Special characters: asterisk (any), comma (list), dash (range), slash (step)
12
+ */
13
+ export class WeaveCronAPI {
14
+ constructor(appId) {
15
+ this.callbacks = new Map();
16
+ this.jobIds = new Map(); // jobName -> jobId
17
+ this.pendingRequests = new Map();
18
+ this.messageListener = null;
19
+ this.isInitialized = false;
20
+ this.appId = appId;
21
+ }
22
+ /**
23
+ * Initialize the cron API (sets up message listener)
24
+ */
25
+ initialize() {
26
+ if (this.isInitialized)
27
+ return;
28
+ this.messageListener = (event) => {
29
+ this.handleMessage(event);
30
+ };
31
+ window.addEventListener('message', this.messageListener);
32
+ this.isInitialized = true;
33
+ }
34
+ /**
35
+ * Cleanup - unregister all jobs and remove listener
36
+ */
37
+ async destroy() {
38
+ // Unregister all jobs for this app
39
+ await this.unregisterAll();
40
+ // Remove message listener
41
+ if (this.messageListener) {
42
+ window.removeEventListener('message', this.messageListener);
43
+ this.messageListener = null;
44
+ }
45
+ this.callbacks.clear();
46
+ this.jobIds.clear();
47
+ this.isInitialized = false;
48
+ }
49
+ /**
50
+ * Register a cron job
51
+ * @param cronExpression - Cron expression (5 or 6 fields)
52
+ * @param callback - Function to call when cron triggers
53
+ * @param jobName - Optional unique name for the job (defaults to callback name or random)
54
+ * @returns Job ID if successful
55
+ */
56
+ async register(cronExpression, callback, jobName) {
57
+ const name = jobName || callback.name || `job_${Date.now()}`;
58
+ // Store callback locally
59
+ this.callbacks.set(name, callback);
60
+ // Send registration request to background
61
+ const response = await this.sendRequest('CRON_REGISTER', {
62
+ appId: this.appId,
63
+ cronExpression,
64
+ jobName: name,
65
+ });
66
+ if (response.success && response.jobId) {
67
+ this.jobIds.set(name, response.jobId);
68
+ return response.jobId;
69
+ }
70
+ // Registration failed, remove callback
71
+ this.callbacks.delete(name);
72
+ console.error(`Failed to register cron job: ${response.error}`);
73
+ return null;
74
+ }
75
+ /**
76
+ * Unregister a cron job by name
77
+ */
78
+ async unregister(jobName) {
79
+ const jobId = this.jobIds.get(jobName);
80
+ if (!jobId) {
81
+ return false;
82
+ }
83
+ const response = await this.sendRequest('CRON_UNREGISTER', {
84
+ jobId,
85
+ });
86
+ if (response.success) {
87
+ this.callbacks.delete(jobName);
88
+ this.jobIds.delete(jobName);
89
+ }
90
+ return response.success;
91
+ }
92
+ /**
93
+ * Unregister all cron jobs for this app
94
+ */
95
+ async unregisterAll() {
96
+ const response = await this.sendRequest('CRON_UNREGISTER_APP', {
97
+ appId: this.appId,
98
+ });
99
+ if (response.success) {
100
+ this.callbacks.clear();
101
+ this.jobIds.clear();
102
+ return response.count;
103
+ }
104
+ return 0;
105
+ }
106
+ /**
107
+ * List all cron jobs for this app
108
+ */
109
+ async list() {
110
+ const response = await this.sendRequest('CRON_LIST', {
111
+ appId: this.appId,
112
+ });
113
+ return response.jobs || [];
114
+ }
115
+ /**
116
+ * Handle incoming messages
117
+ */
118
+ handleMessage(event) {
119
+ const { data } = event;
120
+ // Handle cron tick
121
+ if (data?.type === 'CRON_TICK') {
122
+ const { appId, jobName } = data.payload;
123
+ // Only handle ticks for this app
124
+ if (appId !== this.appId)
125
+ return;
126
+ const callback = this.callbacks.get(jobName);
127
+ if (callback) {
128
+ try {
129
+ const result = callback();
130
+ // Handle async callbacks
131
+ if (result instanceof Promise) {
132
+ result.catch(err => console.error(`Cron job ${jobName} error:`, err));
133
+ }
134
+ }
135
+ catch (error) {
136
+ console.error(`Cron job ${jobName} error:`, error);
137
+ }
138
+ }
139
+ return;
140
+ }
141
+ // Handle responses
142
+ if (data?.type?.endsWith('_RESPONSE') && data.requestId) {
143
+ const pending = this.pendingRequests.get(data.requestId);
144
+ if (pending) {
145
+ this.pendingRequests.delete(data.requestId);
146
+ pending.resolve(data.payload);
147
+ }
148
+ }
149
+ }
150
+ /**
151
+ * Send request to content script bridge
152
+ */
153
+ sendRequest(type, payload) {
154
+ return new Promise((resolve, reject) => {
155
+ const requestId = `cron_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
156
+ this.pendingRequests.set(requestId, { resolve, reject });
157
+ // Timeout after 5 seconds
158
+ setTimeout(() => {
159
+ if (this.pendingRequests.has(requestId)) {
160
+ this.pendingRequests.delete(requestId);
161
+ reject(new Error('Cron request timeout'));
162
+ }
163
+ }, 5000);
164
+ window.parent.postMessage({
165
+ type,
166
+ requestId,
167
+ payload,
168
+ }, '*');
169
+ });
170
+ }
171
+ }
172
+ export default WeaveCronAPI;
package/dist/global.d.ts CHANGED
@@ -8,6 +8,7 @@ import { WeaveBaseApp } from './WeaveBaseApp';
8
8
  import { WeaveDOMAPI } from './WeaveDOMAPI';
9
9
  import { WeaveAPIClient } from './WeaveAPIClient';
10
10
  import { WeaveBackgroundAPI } from './WeaveBackgroundAPI';
11
+ import { WeaveCronAPI } from './WeaveCronAPI';
11
12
  declare global {
12
13
  interface Window {
13
14
  WeaveBaseApp: typeof WeaveBaseApp;
@@ -16,6 +17,7 @@ declare global {
16
17
  WeaveAPIClient: typeof WeaveAPIClient;
17
18
  weaveAPI: WeaveAPIClient;
18
19
  WeaveBackgroundAPI: typeof WeaveBackgroundAPI;
20
+ WeaveCronAPI: typeof WeaveCronAPI;
19
21
  }
20
22
  }
21
23
  //# sourceMappingURL=global.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,YAAY,EAAE,OAAO,YAAY,CAAC;QAClC,WAAW,EAAE,OAAO,WAAW,CAAC;QAChC,QAAQ,EAAE,WAAW,CAAC;QACtB,cAAc,EAAE,OAAO,cAAc,CAAC;QACtC,QAAQ,EAAE,cAAc,CAAC;QACzB,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;KAAG;CACpD"}
1
+ {"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,YAAY,EAAE,OAAO,YAAY,CAAC;QAClC,WAAW,EAAE,OAAO,WAAW,CAAC;QAChC,QAAQ,EAAE,WAAW,CAAC;QACtB,cAAc,EAAE,OAAO,cAAc,CAAC;QACtC,QAAQ,EAAE,cAAc,CAAC;QACzB,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;QAC9C,YAAY,EAAE,OAAO,YAAY,CAAC;KAAG;CACxC"}
package/dist/global.js CHANGED
@@ -10,6 +10,7 @@ import weavekDOM from './WeaveDOMAPI';
10
10
  import { WeaveAPIClient } from './WeaveAPIClient';
11
11
  import weaveAPI from './WeaveAPIClient';
12
12
  import { WeaveBackgroundAPI } from './WeaveBackgroundAPI';
13
+ import { WeaveCronAPI } from './WeaveCronAPI';
13
14
  // Make SDK available globally
14
15
  window.WeaveBaseApp = WeaveBaseApp;
15
16
  window.WeaveDOMAPI = WeaveDOMAPI;
@@ -17,3 +18,4 @@ window.weaveDOM = weavekDOM;
17
18
  window.WeaveAPIClient = WeaveAPIClient;
18
19
  window.weaveAPI = weaveAPI;
19
20
  window.WeaveBackgroundAPI = WeaveBackgroundAPI;
21
+ window.WeaveCronAPI = WeaveCronAPI;
package/dist/index.d.ts CHANGED
@@ -9,5 +9,6 @@ export { default as weaveDOM } from './WeaveDOMAPI';
9
9
  export { WeaveAPIClient, type AIChatRequest, type AIChatResponse, type AppData, type CreateAppDataRequest, type UpdateAppDataRequest } from './WeaveAPIClient';
10
10
  export { default as weaveAPI } from './WeaveAPIClient';
11
11
  export { WeaveBackgroundAPI } from './WeaveBackgroundAPI';
12
+ export { WeaveCronAPI } from './WeaveCronAPI';
12
13
  import './global';
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -9,5 +9,6 @@ export { default as weaveDOM } from './WeaveDOMAPI';
9
9
  export { WeaveAPIClient } from './WeaveAPIClient';
10
10
  export { default as weaveAPI } from './WeaveAPIClient';
11
11
  export { WeaveBackgroundAPI } from './WeaveBackgroundAPI';
12
+ export { WeaveCronAPI } from './WeaveCronAPI';
12
13
  // Import global.ts to ensure Window interface augmentation is included
13
14
  import './global';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weave-apps/sdk",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "description": "SDK for building Weave Micro Apps",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -17,6 +17,7 @@ const filesToCopy = [
17
17
  'WeaveDOMAPI.ts',
18
18
  'WeaveAPIClient.ts',
19
19
  'WeaveBackgroundAPI.ts',
20
+ 'WeaveCronAPI.ts',
20
21
  'global.ts',
21
22
  'app-template.js',
22
23
  'README.md',