History

Fix local SQLite import retry

Rhys Sullivan committed 5 months agov1.4.31

Commit bc70f841 parent cb6c3f026 files · +126 −61Browse files

Unified · Split

26 files
  1. apps/cli/package.json +1 −1
  2. apps/cloud/package.json +1 −1
  3. apps/desktop/package.json +1 −1
  4. apps/local/src/server/executor.ts +26 −14
  5. apps/local/src/server/sqlite-import.test.ts +54 −1
  6. bun.lock +23 −23
  7. examples/all-plugins/package.json +1 −1
  8. examples/docs-sdk-quickstart/package.json +1 −1
  9. packages/core/api/package.json +1 −1
  10. packages/core/cli/package.json +1 −1
  11. packages/core/config/package.json +1 −1
  12. packages/core/execution/package.json +1 −1
  13. packages/core/sdk/package.json +1 −1
  14. packages/core/vite-plugin/package.json +1 −1
  15. packages/kernel/core/package.json +1 −1
  16. packages/kernel/runtime-quickjs/package.json +1 −1
  17. packages/plugins/desktop-settings/package.json +1 −1
  18. packages/plugins/example/package.json +1 −1
  19. packages/plugins/file-secrets/package.json +1 −1
  20. packages/plugins/google-discovery/package.json +1 −1
  21. packages/plugins/graphql/package.json +1 −1
  22. packages/plugins/keychain/package.json +1 −1
  23. packages/plugins/mcp/package.json +1 −1
  24. packages/plugins/onepassword/package.json +1 −1
  25. packages/plugins/openapi/package.json +1 −1
  26. packages/react/package.json +1 −1
apps/cli/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "executor",2 "name": "executor",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "private": true,4 "private": true,
5 "bin": {5 "bin": {
6 "executor": "./bin/executor.ts"6 "executor": "./bin/executor.ts"
apps/cloud/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/cloud",2 "name": "@executor-js/cloud",
3 "version": "1.4.16",3 "version": "1.4.17",
4 "private": true,4 "private": true,
5 "type": "module",5 "type": "module",
6 "scripts": {6 "scripts": {
apps/desktop/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/desktop",2 "name": "@executor-js/desktop",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "private": true,4 "private": true,
5 "homepage": "https://github.com/RhysSullivan/executor",5 "homepage": "https://github.com/RhysSullivan/executor",
6 "license": "MIT",6 "license": "MIT",
apps/local/src/server/executor.ts+26−14
@@ -129,6 +129,7 @@ export type LocalExecutor = LocalExecutorBundle["executor"]; · 128 unmodified lines
129 129
130class LocalExecutorCreateError extends Data.TaggedError("LocalExecutorCreateError")<{130class LocalExecutorCreateError extends Data.TaggedError("LocalExecutorCreateError")<{
131 readonly operation: "createSqlite" | "importSqlite";131 readonly operation: "createSqlite" | "importSqlite";
132 readonly message: string;
132 readonly cause: unknown;133 readonly cause: unknown;
133}> {}134}> {}
134 135
@@ -137,6 +138,19 @@ class LocalExecutorDisposeError extends Data.TaggedError("LocalExecutorDisposeEr · 2 unmodified lines
137 readonly cause: unknown;138 readonly cause: unknown;
138}> {}139}> {}
139 140
141const localExecutorCreateError = (
142 operation: LocalExecutorCreateError["operation"],
143 cause: unknown,
144) =>
145 new LocalExecutorCreateError({
146 operation,
147 cause,
148 message:
149 operation === "importSqlite"
150 ? "Failed to prepare local SQLite data. Close other Executor processes and retry, or run with --log-level debug for details."
151 : "Failed to open local SQLite data. Close other Executor processes and retry, or run with --log-level debug for details.",
152 });
153
140const ignorePromiseFailure = (154const ignorePromiseFailure = (
141 operation: LocalExecutorDisposeError["operation"],155 operation: LocalExecutorDisposeError["operation"],
142 try_: () => Promise<unknown>,156 try_: () => Promise<unknown>,
@@ -460,19 +474,17 @@ const importMissingMarkedTables = async (input: { · 317 unmodified lines
460 await target.close();474 await target.close();
461 removeSqliteSidecars(input.storage.sqlitePath);475 removeSqliteSidecars(input.storage.sqlitePath);
462 476
463 if (result.imported) {477 const importedTables = [...new Set([...input.marker.importedTables, ...missingTables])];
464 const importedTables = [478 writeSqliteImportMarker(input.storage.importMarkerPath, {
465 ...new Set([...input.marker.importedTables, ...result.importedTables]),479 importedRows: input.marker.importedRows + result.importedRows,
466 ];480 importedTables,
467 writeSqliteImportMarker(input.storage.importMarkerPath, {481 backupPath: input.marker.backupPath,
468 importedRows: input.marker.importedRows + result.importedRows,482 recovered: input.marker.recovered,
469 importedTables,483 });
470 backupPath: input.marker.backupPath,
471 recovered: input.marker.recovered,
472 });
473 }
474 484
475 return result;485 return result.importedRows > 0 || result.importedTables.length > 0
486 ? result
487 : { imported: false, importedRows: 0, importedTables: [] };
476 } catch (cause) {488 } catch (cause) {
477 await target.close();489 await target.close();
478 // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: preserve late plugin-table import failure after closing SQLite490 // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: preserve late plugin-table import failure after closing SQLite
@@ -633,7 +645,7 @@ const createLocalExecutorLayer = () => { · 154 unmodified lines
633 tables,645 tables,
634 scopeId,646 scopeId,
635 }),647 }),
636 catch: (cause) => new LocalExecutorCreateError({ operation: "importSqlite", cause }),648 catch: (cause) => localExecutorCreateError("importSqlite", cause),
637 });649 });
638 650
639 const sqlite = yield* Effect.acquireRelease(651 const sqlite = yield* Effect.acquireRelease(
@@ -644,7 +656,7 @@ const createLocalExecutorLayer = () => { · 4 unmodified lines
644 namespace: localNamespace,656 namespace: localNamespace,
645 path: storage.sqlitePath,657 path: storage.sqlitePath,
646 }),658 }),
647 catch: (cause) => new LocalExecutorCreateError({ operation: "createSqlite", cause }),659 catch: (cause) => localExecutorCreateError("createSqlite", cause),
648 }),660 }),
649 (db) => Effect.promise(() => db.close()).pipe(Effect.ignore),661 (db) => Effect.promise(() => db.close()).pipe(Effect.ignore),
650 );662 );
apps/local/src/server/sqlite-import.test.ts+54−1
@@ -1,6 +1,7 @@
1import { afterEach, beforeEach, describe, expect, it } from "@effect/vitest";1import { afterEach, beforeEach, describe, expect, it } from "@effect/vitest";
2import { Database } from "bun:sqlite";2import { Database } from "bun:sqlite";
3import { existsSync, mkdtempSync, rmSync } from "node:fs";3import { Schema } from "effect";
4import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
4import { tmpdir } from "node:os";5import { tmpdir } from "node:os";
5import { join } from "node:path";6import { join } from "node:path";
6 7
@@ -166,6 +167,13 @@ const latePlugin = definePlugin(() => ({ · 159 unmodified lines
166 storage: () => ({}),167 storage: () => ({}),
167}))();168}))();
168 169
170const ImportMarkerForTest = Schema.Struct({
171 importedTables: Schema.Array(Schema.String),
172});
173const decodeImportMarkerForTest = Schema.decodeUnknownSync(
174 Schema.fromJsonString(ImportMarkerForTest),
175);
176
169const legacyShapeSchema = {177const legacyShapeSchema = {
170 legacy_shape: scopedExecutorTable("legacy_shape", {178 legacy_shape: scopedExecutorTable("legacy_shape", {
171 payload: jsonColumn("payload"),179 payload: jsonColumn("payload"),
@@ -497,4 +505,49 @@ describe("importSqliteDataToFuma", () => { · 325 unmodified lines
497 }),505 }),
498 ).resolves.toEqual([{ id: "late_1", value: "from-backup" }]);506 ).resolves.toEqual([{ id: "late_1", value: "from-backup" }]);
499 });507 });
508
509 it("marks newly-loaded empty plugin tables so startup does not retry backup imports", async () => {
510 const sqlitePath = join(workDir, "data.db");
511 const markerPath = join(workDir, "fumadb-sqlite-imported");
512 seedMigratedSqlite(sqlitePath);
513
514 const firstResult = await importLegacySqliteIfNeeded({
515 storage: {
516 dataDir: workDir,
517 sqlitePath,
518 importMarkerPath: markerPath,
519 },
520 tables: collectTables([]),
521 scopeId: "scope_a",
522 });
523 expect(firstResult.importedTables).not.toContain("late_item");
524
525 const allTables = collectTables([latePlugin]);
526 const secondResult = await importLegacySqliteIfNeeded({
527 storage: {
528 dataDir: workDir,
529 sqlitePath,
530 importMarkerPath: markerPath,
531 },
532 tables: allTables,
533 scopeId: "scope_a",
534 });
535
536 expect(secondResult.imported).toBe(false);
537 expect(secondResult.importedRows).toBe(0);
538 expect(decodeImportMarkerForTest(readFileSync(markerPath, "utf8")).importedTables).toContain(
539 "late_item",
540 );
541
542 const thirdResult = await importLegacySqliteIfNeeded({
543 storage: {
544 dataDir: workDir,
545 sqlitePath,
546 importMarkerPath: markerPath,
547 },
548 tables: allTables,
549 scopeId: "scope_a",
550 });
551 expect(thirdResult.imported).toBe(false);
552 });
500});553});
bun.lock+23−23
@@ -29,7 +29,7 @@ · 28 unmodified lines
29 },29 },
30 "apps/cli": {30 "apps/cli": {
31 "name": "executor",31 "name": "executor",
32 "version": "1.4.30",32 "version": "1.4.31",
33 "bin": {33 "bin": {
34 "executor": "./bin/executor.ts",34 "executor": "./bin/executor.ts",
35 },35 },
@@ -50,7 +50,7 @@ · 14 unmodified lines
50 },50 },
51 "apps/cloud": {51 "apps/cloud": {
52 "name": "@executor-js/cloud",52 "name": "@executor-js/cloud",
53 "version": "1.4.16",53 "version": "1.4.17",
54 "dependencies": {54 "dependencies": {
55 "@cloudflare/vite-plugin": "^1.31.1",55 "@cloudflare/vite-plugin": "^1.31.1",
56 "@effect/atom-react": "catalog:",56 "@effect/atom-react": "catalog:",
@@ -117,7 +117,7 @@ · 60 unmodified lines
117 },117 },
118 "apps/desktop": {118 "apps/desktop": {
119 "name": "@executor-js/desktop",119 "name": "@executor-js/desktop",
120 "version": "1.4.30",120 "version": "1.4.31",
121 "dependencies": {121 "dependencies": {
122 "electron-log": "^5",122 "electron-log": "^5",
123 "electron-store": "^10",123 "electron-store": "^10",
@@ -231,7 +231,7 @@ · 107 unmodified lines
231 },231 },
232 "examples/all-plugins": {232 "examples/all-plugins": {
233 "name": "@executor-js/example-all-plugins",233 "name": "@executor-js/example-all-plugins",
234 "version": "0.0.16",234 "version": "0.0.17",
235 "dependencies": {235 "dependencies": {
236 "@executor-js/plugin-file-secrets": "workspace:*",236 "@executor-js/plugin-file-secrets": "workspace:*",
237 "@executor-js/plugin-google-discovery": "workspace:*",237 "@executor-js/plugin-google-discovery": "workspace:*",
@@ -251,7 +251,7 @@ · 13 unmodified lines
251 },251 },
252 "examples/docs-sdk-quickstart": {252 "examples/docs-sdk-quickstart": {
253 "name": "@executor-js/example-docs-sdk-quickstart",253 "name": "@executor-js/example-docs-sdk-quickstart",
254 "version": "0.0.1",254 "version": "0.0.2",
255 "dependencies": {255 "dependencies": {
256 "@executor-js/plugin-openapi": "workspace:*",256 "@executor-js/plugin-openapi": "workspace:*",
257 "@executor-js/sdk": "workspace:*",257 "@executor-js/sdk": "workspace:*",
@@ -301,7 +301,7 @@ · 43 unmodified lines
301 },301 },
302 "packages/core/api": {302 "packages/core/api": {
303 "name": "@executor-js/api",303 "name": "@executor-js/api",
304 "version": "1.4.18",304 "version": "1.4.19",
305 "dependencies": {305 "dependencies": {
306 "@executor-js/execution": "workspace:*",306 "@executor-js/execution": "workspace:*",
307 "@executor-js/sdk": "workspace:*",307 "@executor-js/sdk": "workspace:*",
@@ -317,7 +317,7 @@ · 9 unmodified lines
317 },317 },
318 "packages/core/cli": {318 "packages/core/cli": {
319 "name": "@executor-js/cli",319 "name": "@executor-js/cli",
320 "version": "0.2.2",320 "version": "0.2.3",
321 "bin": {321 "bin": {
322 "executor-sdk": "./dist/index.js",322 "executor-sdk": "./dist/index.js",
323 },323 },
@@ -338,7 +338,7 @@ · 14 unmodified lines
338 },338 },
339 "packages/core/config": {339 "packages/core/config": {
340 "name": "@executor-js/config",340 "name": "@executor-js/config",
341 "version": "1.4.30",341 "version": "1.4.31",
342 "dependencies": {342 "dependencies": {
343 "@executor-js/sdk": "workspace:*",343 "@executor-js/sdk": "workspace:*",
344 "effect": "catalog:",344 "effect": "catalog:",
@@ -356,7 +356,7 @@ · 11 unmodified lines
356 },356 },
357 "packages/core/execution": {357 "packages/core/execution": {
358 "name": "@executor-js/execution",358 "name": "@executor-js/execution",
359 "version": "1.4.30",359 "version": "1.4.31",
360 "dependencies": {360 "dependencies": {
361 "@executor-js/codemode-core": "workspace:*",361 "@executor-js/codemode-core": "workspace:*",
362 "@executor-js/sdk": "workspace:*",362 "@executor-js/sdk": "workspace:*",
@@ -418,7 +418,7 @@ · 55 unmodified lines
418 },418 },
419 "packages/core/sdk": {419 "packages/core/sdk": {
420 "name": "@executor-js/sdk",420 "name": "@executor-js/sdk",
421 "version": "1.4.30",421 "version": "1.4.31",
422 "dependencies": {422 "dependencies": {
423 "@standard-schema/spec": "^1.1.0",423 "@standard-schema/spec": "^1.1.0",
424 "effect": "catalog:",424 "effect": "catalog:",
@@ -470,7 +470,7 @@ · 45 unmodified lines
470 },470 },
471 "packages/core/vite-plugin": {471 "packages/core/vite-plugin": {
472 "name": "@executor-js/vite-plugin",472 "name": "@executor-js/vite-plugin",
473 "version": "0.0.15",473 "version": "0.0.16",
474 "dependencies": {474 "dependencies": {
475 "@executor-js/sdk": "workspace:*",475 "@executor-js/sdk": "workspace:*",
476 "jiti": "^2.6.1",476 "jiti": "^2.6.1",
@@ -508,7 +508,7 @@ · 31 unmodified lines
508 },508 },
509 "packages/kernel/core": {509 "packages/kernel/core": {
510 "name": "@executor-js/codemode-core",510 "name": "@executor-js/codemode-core",
511 "version": "1.4.30",511 "version": "1.4.31",
512 "dependencies": {512 "dependencies": {
513 "@babel/parser": "^7.29.2",513 "@babel/parser": "^7.29.2",
514 "@standard-schema/spec": "^1.0.0",514 "@standard-schema/spec": "^1.0.0",
@@ -578,7 +578,7 @@ · 63 unmodified lines
578 },578 },
579 "packages/kernel/runtime-quickjs": {579 "packages/kernel/runtime-quickjs": {
580 "name": "@executor-js/runtime-quickjs",580 "name": "@executor-js/runtime-quickjs",
581 "version": "1.4.30",581 "version": "1.4.31",
582 "dependencies": {582 "dependencies": {
583 "@executor-js/codemode-core": "workspace:*",583 "@executor-js/codemode-core": "workspace:*",
584 "effect": "catalog:",584 "effect": "catalog:",
@@ -595,7 +595,7 @@ · 10 unmodified lines
595 },595 },
596 "packages/plugins/desktop-settings": {596 "packages/plugins/desktop-settings": {
597 "name": "@executor-js/plugin-desktop-settings",597 "name": "@executor-js/plugin-desktop-settings",
598 "version": "1.4.30",598 "version": "1.4.31",
599 "dependencies": {599 "dependencies": {
600 "@executor-js/sdk": "workspace:*",600 "@executor-js/sdk": "workspace:*",
601 "react": "catalog:",601 "react": "catalog:",
@@ -608,7 +608,7 @@ · 6 unmodified lines
608 },608 },
609 "packages/plugins/example": {609 "packages/plugins/example": {
610 "name": "@executor-js/plugin-example",610 "name": "@executor-js/plugin-example",
611 "version": "1.4.30",611 "version": "1.4.31",
612 "dependencies": {612 "dependencies": {
613 "@executor-js/sdk": "workspace:*",613 "@executor-js/sdk": "workspace:*",
614 },614 },
@@ -631,7 +631,7 @@ · 16 unmodified lines
631 },631 },
632 "packages/plugins/file-secrets": {632 "packages/plugins/file-secrets": {
633 "name": "@executor-js/plugin-file-secrets",633 "name": "@executor-js/plugin-file-secrets",
634 "version": "1.4.30",634 "version": "1.4.31",
635 "dependencies": {635 "dependencies": {
636 "@executor-js/sdk": "workspace:*",636 "@executor-js/sdk": "workspace:*",
637 "effect": "catalog:",637 "effect": "catalog:",
@@ -645,7 +645,7 @@ · 7 unmodified lines
645 },645 },
646 "packages/plugins/google-discovery": {646 "packages/plugins/google-discovery": {
647 "name": "@executor-js/plugin-google-discovery",647 "name": "@executor-js/plugin-google-discovery",
648 "version": "1.4.30",648 "version": "1.4.31",
649 "dependencies": {649 "dependencies": {
650 "@executor-js/sdk": "workspace:*",650 "@executor-js/sdk": "workspace:*",
651 "effect": "catalog:",651 "effect": "catalog:",
@@ -680,7 +680,7 @@ · 28 unmodified lines
680 },680 },
681 "packages/plugins/graphql": {681 "packages/plugins/graphql": {
682 "name": "@executor-js/plugin-graphql",682 "name": "@executor-js/plugin-graphql",
683 "version": "1.4.30",683 "version": "1.4.31",
684 "dependencies": {684 "dependencies": {
685 "@effect/platform-node": "catalog:",685 "@effect/platform-node": "catalog:",
686 "@executor-js/config": "workspace:*",686 "@executor-js/config": "workspace:*",
@@ -718,7 +718,7 @@ · 31 unmodified lines
718 },718 },
719 "packages/plugins/keychain": {719 "packages/plugins/keychain": {
720 "name": "@executor-js/plugin-keychain",720 "name": "@executor-js/plugin-keychain",
721 "version": "1.4.30",721 "version": "1.4.31",
722 "dependencies": {722 "dependencies": {
723 "@executor-js/sdk": "workspace:*",723 "@executor-js/sdk": "workspace:*",
724 "@napi-rs/keyring": "^1.2.0",724 "@napi-rs/keyring": "^1.2.0",
@@ -734,7 +734,7 @@ · 9 unmodified lines
734 },734 },
735 "packages/plugins/mcp": {735 "packages/plugins/mcp": {
736 "name": "@executor-js/plugin-mcp",736 "name": "@executor-js/plugin-mcp",
737 "version": "1.4.30",737 "version": "1.4.31",
738 "dependencies": {738 "dependencies": {
739 "@cfworker/json-schema": "^4.1.1",739 "@cfworker/json-schema": "^4.1.1",
740 "@effect/platform-node": "catalog:",740 "@effect/platform-node": "catalog:",
@@ -773,7 +773,7 @@ · 32 unmodified lines
773 },773 },
774 "packages/plugins/onepassword": {774 "packages/plugins/onepassword": {
775 "name": "@executor-js/plugin-onepassword",775 "name": "@executor-js/plugin-onepassword",
776 "version": "1.4.30",776 "version": "1.4.31",
777 "dependencies": {777 "dependencies": {
778 "@1password/op-js": "^0.1.13",778 "@1password/op-js": "^0.1.13",
779 "@1password/sdk": "^0.4.1-beta.1",779 "@1password/sdk": "^0.4.1-beta.1",
@@ -806,7 +806,7 @@ · 26 unmodified lines
806 },806 },
807 "packages/plugins/openapi": {807 "packages/plugins/openapi": {
808 "name": "@executor-js/plugin-openapi",808 "name": "@executor-js/plugin-openapi",
809 "version": "1.4.30",809 "version": "1.4.31",
810 "dependencies": {810 "dependencies": {
811 "@effect/platform-node": "catalog:",811 "@effect/platform-node": "catalog:",
812 "@executor-js/config": "workspace:*",812 "@executor-js/config": "workspace:*",
@@ -869,7 +869,7 @@ · 56 unmodified lines
869 },869 },
870 "packages/react": {870 "packages/react": {
871 "name": "@executor-js/react",871 "name": "@executor-js/react",
872 "version": "1.4.18",872 "version": "1.4.19",
873 "dependencies": {873 "dependencies": {
874 "@base-ui/react": "^1.3.0",874 "@base-ui/react": "^1.3.0",
875 "@effect/atom-react": "catalog:",875 "@effect/atom-react": "catalog:",
examples/all-plugins/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/example-all-plugins",2 "name": "@executor-js/example-all-plugins",
3 "version": "0.0.16",3 "version": "0.0.17",
4 "private": true,4 "private": true,
5 "type": "module",5 "type": "module",
6 "scripts": {6 "scripts": {
examples/docs-sdk-quickstart/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/example-docs-sdk-quickstart",2 "name": "@executor-js/example-docs-sdk-quickstart",
3 "version": "0.0.1",3 "version": "0.0.2",
4 "private": true,4 "private": true,
5 "type": "module",5 "type": "module",
6 "scripts": {6 "scripts": {
packages/core/api/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/api",2 "name": "@executor-js/api",
3 "version": "1.4.18",3 "version": "1.4.19",
4 "private": true,4 "private": true,
5 "type": "module",5 "type": "module",
6 "exports": {6 "exports": {
packages/core/cli/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/cli",2 "name": "@executor-js/cli",
3 "version": "0.2.2",3 "version": "0.2.3",
4 "description": "CLI for the executor SDK — schema generation, migrations",4 "description": "CLI for the executor SDK — schema generation, migrations",
5 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/core/cli",5 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/core/cli",
6 "bugs": {6 "bugs": {
packages/core/config/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/config",2 "name": "@executor-js/config",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/core/config",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/core/config",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/core/execution/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/execution",2 "name": "@executor-js/execution",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/core/execution",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/core/execution",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/core/sdk/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/sdk",2 "name": "@executor-js/sdk",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/core/sdk",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/core/sdk",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/core/vite-plugin/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/vite-plugin",2 "name": "@executor-js/vite-plugin",
3 "version": "0.0.15",3 "version": "0.0.16",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/core/vite-plugin",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/core/vite-plugin",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/kernel/core/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/codemode-core",2 "name": "@executor-js/codemode-core",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/kernel/core",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/kernel/core",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/kernel/runtime-quickjs/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/runtime-quickjs",2 "name": "@executor-js/runtime-quickjs",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/kernel/runtime-quickjs",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/kernel/runtime-quickjs",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/plugins/desktop-settings/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/plugin-desktop-settings",2 "name": "@executor-js/plugin-desktop-settings",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/desktop-settings",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/desktop-settings",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/plugins/example/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/plugin-example",2 "name": "@executor-js/plugin-example",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/example",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/example",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/plugins/file-secrets/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/plugin-file-secrets",2 "name": "@executor-js/plugin-file-secrets",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/file-secrets",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/file-secrets",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/plugins/google-discovery/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/plugin-google-discovery",2 "name": "@executor-js/plugin-google-discovery",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/google-discovery",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/google-discovery",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/plugins/graphql/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/plugin-graphql",2 "name": "@executor-js/plugin-graphql",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/graphql",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/graphql",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/plugins/keychain/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/plugin-keychain",2 "name": "@executor-js/plugin-keychain",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/keychain",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/keychain",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/plugins/mcp/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/plugin-mcp",2 "name": "@executor-js/plugin-mcp",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/mcp",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/mcp",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/plugins/onepassword/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/plugin-onepassword",2 "name": "@executor-js/plugin-onepassword",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/onepassword",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/onepassword",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/plugins/openapi/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/plugin-openapi",2 "name": "@executor-js/plugin-openapi",
3 "version": "1.4.30",3 "version": "1.4.31",
4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/openapi",4 "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/openapi",
5 "bugs": {5 "bugs": {
6 "url": "https://github.com/RhysSullivan/executor/issues"6 "url": "https://github.com/RhysSullivan/executor/issues"
packages/react/package.json+1−1
@@ -1,6 +1,6 @@
1{1{
2 "name": "@executor-js/react",2 "name": "@executor-js/react",
3 "version": "1.4.18",3 "version": "1.4.19",
4 "private": true,4 "private": true,
5 "type": "module",5 "type": "module",
6 "exports": {6 "exports": {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t