@decocms/runtime 0.28.0 → 1.0.0-alpha-candy.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/package.json +11 -77
  2. package/scripts/generate-json-schema.ts +24 -0
  3. package/src/asset-server/dev-server-proxy.ts +16 -0
  4. package/src/asset-server/index.ts +44 -0
  5. package/src/bindings/README.md +1 -1
  6. package/src/bindings/binder.ts +2 -5
  7. package/src/bindings/channels.ts +1 -1
  8. package/src/bindings/index.ts +1 -32
  9. package/src/bindings/language-model/utils.ts +0 -91
  10. package/src/bindings.ts +30 -108
  11. package/src/client.ts +1 -145
  12. package/src/index.ts +46 -175
  13. package/src/mcp.ts +8 -165
  14. package/src/proxy.ts +3 -62
  15. package/src/state.ts +1 -30
  16. package/src/tools.ts +336 -0
  17. package/src/wrangler.ts +5 -5
  18. package/tsconfig.json +8 -0
  19. package/dist/admin.d.ts +0 -5
  20. package/dist/admin.js +0 -21
  21. package/dist/admin.js.map +0 -1
  22. package/dist/bindings/deconfig/index.d.ts +0 -12
  23. package/dist/bindings/deconfig/index.js +0 -10
  24. package/dist/bindings/deconfig/index.js.map +0 -1
  25. package/dist/bindings/index.d.ts +0 -2312
  26. package/dist/bindings/index.js +0 -135
  27. package/dist/bindings/index.js.map +0 -1
  28. package/dist/chunk-3AWMDSOH.js +0 -96
  29. package/dist/chunk-3AWMDSOH.js.map +0 -1
  30. package/dist/chunk-4XSQKJLU.js +0 -105
  31. package/dist/chunk-4XSQKJLU.js.map +0 -1
  32. package/dist/chunk-5EYZ2LVM.js +0 -158
  33. package/dist/chunk-5EYZ2LVM.js.map +0 -1
  34. package/dist/chunk-7ITSLORK.js +0 -128
  35. package/dist/chunk-7ITSLORK.js.map +0 -1
  36. package/dist/chunk-I7BWSAN6.js +0 -49
  37. package/dist/chunk-I7BWSAN6.js.map +0 -1
  38. package/dist/chunk-L4OT2YDO.js +0 -27
  39. package/dist/chunk-L4OT2YDO.js.map +0 -1
  40. package/dist/chunk-SHQSNOFL.js +0 -769
  41. package/dist/chunk-SHQSNOFL.js.map +0 -1
  42. package/dist/chunk-UHR3BLMF.js +0 -92
  43. package/dist/chunk-UHR3BLMF.js.map +0 -1
  44. package/dist/chunk-UIJGM3NV.js +0 -518
  45. package/dist/chunk-UIJGM3NV.js.map +0 -1
  46. package/dist/chunk-ZPUT6RN6.js +0 -32
  47. package/dist/chunk-ZPUT6RN6.js.map +0 -1
  48. package/dist/client.d.ts +0 -28
  49. package/dist/client.js +0 -5
  50. package/dist/client.js.map +0 -1
  51. package/dist/d1-store.d.ts +0 -9
  52. package/dist/d1-store.js +0 -4
  53. package/dist/d1-store.js.map +0 -1
  54. package/dist/drizzle.d.ts +0 -49
  55. package/dist/drizzle.js +0 -121
  56. package/dist/drizzle.js.map +0 -1
  57. package/dist/index-B7U9jXW4.d.ts +0 -530
  58. package/dist/index-uCMd27hU.d.ts +0 -471
  59. package/dist/index.d.ts +0 -10
  60. package/dist/index.js +0 -637
  61. package/dist/index.js.map +0 -1
  62. package/dist/mastra.d.ts +0 -10
  63. package/dist/mastra.js +0 -6
  64. package/dist/mastra.js.map +0 -1
  65. package/dist/mcp-DYmQ2RQf.d.ts +0 -105
  66. package/dist/mcp-client.d.ts +0 -232
  67. package/dist/mcp-client.js +0 -4
  68. package/dist/mcp-client.js.map +0 -1
  69. package/dist/proxy.d.ts +0 -11
  70. package/dist/proxy.js +0 -5
  71. package/dist/proxy.js.map +0 -1
  72. package/dist/resources.d.ts +0 -362
  73. package/dist/resources.js +0 -4
  74. package/dist/resources.js.map +0 -1
  75. package/dist/views.d.ts +0 -72
  76. package/dist/views.js +0 -4
  77. package/dist/views.js.map +0 -1
  78. package/src/admin.ts +0 -16
  79. package/src/auth.ts +0 -233
  80. package/src/bindings/deconfig/helpers.ts +0 -107
  81. package/src/bindings/deconfig/index.ts +0 -1
  82. package/src/bindings/deconfig/resources.ts +0 -659
  83. package/src/bindings/deconfig/types.ts +0 -106
  84. package/src/bindings/language-model/ai-sdk.ts +0 -87
  85. package/src/bindings/language-model/index.ts +0 -4
  86. package/src/bindings/resources/bindings.ts +0 -99
  87. package/src/bindings/resources/helpers.ts +0 -95
  88. package/src/bindings/resources/schemas.ts +0 -265
  89. package/src/bindings/views.ts +0 -14
  90. package/src/cf-imports.ts +0 -1
  91. package/src/d1-store.ts +0 -34
  92. package/src/deprecated.ts +0 -59
  93. package/src/drizzle.ts +0 -201
  94. package/src/mastra.ts +0 -898
  95. package/src/resources.ts +0 -168
  96. package/src/views.ts +0 -26
  97. package/src/workflow.ts +0 -193
package/dist/client.d.ts DELETED
@@ -1,28 +0,0 @@
1
- type ExtractResourceName<K> = K extends `DECO_RESOURCE_${infer Name}_READ` ? Name : never;
2
- type SubscribeMethodName<Name extends string> = `DECO_RESOURCE_${Name}_SUBSCRIBE`;
3
- type ExtractReadData<T> = T extends Promise<{
4
- data: infer D;
5
- }> ? D : T extends {
6
- data: infer D;
7
- } ? D : never;
8
- type SubscribeMethods<T> = {
9
- [K in keyof T as K extends `DECO_RESOURCE_${string}_READ` ? SubscribeMethodName<ExtractResourceName<K>> : never]: K extends `DECO_RESOURCE_${string}_READ` ? T[K] extends (...args: any) => any ? (args: {
10
- id: string;
11
- } | {
12
- uri: string;
13
- }) => AsyncIterableIterator<{
14
- uri: string;
15
- data: ExtractReadData<Awaited<ReturnType<T[K]>>>;
16
- }> : never : never;
17
- };
18
- type MCPClient<T> = {
19
- [K in keyof T]: T[K] extends (...args: any) => any ? (args: Parameters<T[K]>[0], init?: CustomInit) => Promise<Awaited<ReturnType<T[K]>>> : never;
20
- } & SubscribeMethods<T>;
21
- type CustomInit = RequestInit & {
22
- handleResponse?: (response: Response) => Promise<unknown>;
23
- };
24
- declare const DECO_MCP_CLIENT_HEADER = "X-Deco-MCP-Client";
25
- declare const DEFAULT_INIT: CustomInit;
26
- declare const createClient: <T>(init?: CustomInit) => MCPClient<T>;
27
-
28
- export { type CustomInit, DECO_MCP_CLIENT_HEADER, DEFAULT_INIT, type MCPClient, createClient };
package/dist/client.js DELETED
@@ -1,5 +0,0 @@
1
- export { DECO_MCP_CLIENT_HEADER, DEFAULT_INIT, createClient } from './chunk-4XSQKJLU.js';
2
- import './chunk-UHR3BLMF.js';
3
- import './chunk-I7BWSAN6.js';
4
- //# sourceMappingURL=client.js.map
5
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"client.js"}
@@ -1,9 +0,0 @@
1
- import { D1Store as D1Store$1, D1ClientConfig } from '@mastra/cloudflare-d1';
2
-
3
- declare class D1Store extends D1Store$1 {
4
- private config;
5
- constructor(config: D1ClientConfig);
6
- init(): Promise<void>;
7
- }
8
-
9
- export { D1Store };
package/dist/d1-store.js DELETED
@@ -1,4 +0,0 @@
1
- export { D1Store } from './chunk-ZPUT6RN6.js';
2
- import './chunk-I7BWSAN6.js';
3
- //# sourceMappingURL=d1-store.js.map
4
- //# sourceMappingURL=d1-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"d1-store.js"}
package/dist/drizzle.d.ts DELETED
@@ -1,49 +0,0 @@
1
- import { DrizzleConfig } from 'drizzle-orm';
2
- import * as drizzleOrm from 'drizzle-orm';
3
- export { drizzleOrm as orm };
4
- import { SqliteRemoteDatabase } from 'drizzle-orm/sqlite-proxy';
5
- export * from 'drizzle-orm/sqlite-core';
6
- import { D as DefaultEnv } from './index-uCMd27hU.js';
7
- import '@cloudflare/workers-types';
8
- import 'zod/v3';
9
- import '@mastra/core';
10
- import '@mastra/core/di';
11
- import '@mastra/core/workflows';
12
- import './resources.js';
13
- import './mcp-DYmQ2RQf.js';
14
- import '@decocms/bindings/connection';
15
- import '@decocms/bindings';
16
-
17
- declare function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>({ DECO_WORKSPACE_DB }: Pick<DefaultEnv, "DECO_WORKSPACE_DB">, config?: DrizzleConfig<TSchema>): SqliteRemoteDatabase<TSchema>;
18
- /**
19
- * The following code is a custom migration system tweaked
20
- * from the durable-sqlite original migrator.
21
- *
22
- * @see https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/durable-sqlite/migrator.ts
23
- *
24
- * It applies the migrations without transactions, as a workaround
25
- * while we don't have remote transactions support on the
26
- * workspace database durable object. Not ideal and we should
27
- * look into implementing some way of doing transactions soon.
28
- */
29
- interface MigrationMeta {
30
- sql: string[];
31
- folderMillis: number;
32
- hash: string;
33
- bps: boolean;
34
- }
35
- interface MigrationConfig {
36
- journal: {
37
- entries: {
38
- idx: number;
39
- when: number;
40
- tag: string;
41
- breakpoints: boolean;
42
- }[];
43
- };
44
- migrations: Record<string, string>;
45
- debug?: boolean;
46
- }
47
- declare function migrateWithoutTransaction(db: SqliteRemoteDatabase, config: MigrationConfig): Promise<void>;
48
-
49
- export { type MigrationConfig, type MigrationMeta, drizzle, migrateWithoutTransaction };
package/dist/drizzle.js DELETED
@@ -1,121 +0,0 @@
1
- import './chunk-I7BWSAN6.js';
2
- import { drizzle as drizzle$1 } from 'drizzle-orm/sqlite-proxy';
3
- export * from 'drizzle-orm/sqlite-core';
4
- import { sql } from 'drizzle-orm';
5
- import * as drizzleOrm from 'drizzle-orm';
6
- export { drizzleOrm as orm };
7
-
8
- var mapGetResult = ({ result: [page] }) => {
9
- return page.results ?? [];
10
- };
11
- var mapPostResult = ({ result }) => {
12
- return result.map((page) => page.results ?? []).flat().map(Object.values);
13
- };
14
- function drizzle({ DECO_WORKSPACE_DB }, config) {
15
- return drizzle$1((sql2, params, method) => {
16
- const asRows = method === "get" ? mapGetResult : mapPostResult;
17
- return DECO_WORKSPACE_DB.query({
18
- sql: sql2,
19
- params
20
- }).then((result) => ({ rows: asRows(result) }));
21
- }, config);
22
- }
23
- function readMigrationFiles({
24
- journal,
25
- migrations
26
- }) {
27
- const migrationQueries = [];
28
- for (const journalEntry of journal.entries) {
29
- const query = migrations[`m${journalEntry.idx.toString().padStart(4, "0")}`];
30
- if (!query) {
31
- throw new Error(`Missing migration: ${journalEntry.tag}`);
32
- }
33
- try {
34
- const result = query.split("--> statement-breakpoint").map((it) => {
35
- return it;
36
- });
37
- migrationQueries.push({
38
- sql: result,
39
- bps: journalEntry.breakpoints,
40
- folderMillis: journalEntry.when,
41
- hash: ""
42
- });
43
- } catch {
44
- throw new Error(`Failed to parse migration: ${journalEntry.tag}`);
45
- }
46
- }
47
- return migrationQueries;
48
- }
49
- async function migrateWithoutTransaction(db, config) {
50
- const debug = config.debug ?? false;
51
- if (debug) console.log("Migrating database");
52
- const migrations = readMigrationFiles(config);
53
- if (debug) console.log("Migrations", migrations);
54
- try {
55
- if (debug) console.log("Setting up migrations table");
56
- const migrationsTable = "__drizzle_migrations";
57
- const migrationTableCreate = sql`
58
- CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (
59
- id INTEGER PRIMARY KEY AUTOINCREMENT,
60
- hash text NOT NULL,
61
- created_at numeric
62
- )
63
- `;
64
- await db.run(migrationTableCreate);
65
- const dbMigrations = await db.values(
66
- sql`SELECT id, hash, created_at FROM ${sql.identifier(
67
- migrationsTable
68
- )} ORDER BY created_at DESC LIMIT 1`
69
- );
70
- const lastDbMigration = dbMigrations[0] ?? void 0;
71
- if (debug) console.log("Last applied migration:", lastDbMigration);
72
- for (const migration of migrations) {
73
- const hasNoMigrations = lastDbMigration === void 0 || !lastDbMigration.length;
74
- if (hasNoMigrations || Number(lastDbMigration[2]) < migration.folderMillis) {
75
- if (debug) console.log(`Applying migration: ${migration.folderMillis}`);
76
- try {
77
- for (const stmt of migration.sql) {
78
- if (stmt.trim()) {
79
- if (debug) {
80
- console.log("Executing:", stmt.substring(0, 100) + "...");
81
- }
82
- await db.run(sql.raw(stmt));
83
- }
84
- }
85
- await db.run(
86
- sql`INSERT INTO ${sql.identifier(
87
- migrationsTable
88
- )} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`
89
- );
90
- if (debug) {
91
- console.log(
92
- `\u2705 Migration ${migration.folderMillis} applied successfully`
93
- );
94
- }
95
- } catch (migrationError) {
96
- console.error(
97
- `\u274C Migration ${migration.folderMillis} failed:`,
98
- migrationError
99
- );
100
- throw new Error(
101
- `Migration failed at ${migration.folderMillis}: ${migrationError instanceof Error ? migrationError.message : String(migrationError)}`
102
- );
103
- }
104
- } else {
105
- if (debug) {
106
- console.log(
107
- `\u23ED\uFE0F Skipping already applied migration: ${migration.folderMillis}`
108
- );
109
- }
110
- }
111
- }
112
- if (debug) console.log("\u2705 All migrations completed successfully");
113
- } catch (error) {
114
- console.error("\u274C Migration process failed:", error);
115
- throw error;
116
- }
117
- }
118
-
119
- export { drizzle, migrateWithoutTransaction };
120
- //# sourceMappingURL=drizzle.js.map
121
- //# sourceMappingURL=drizzle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/drizzle.ts"],"names":["drizzleProxy","sql"],"mappings":"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","file":"drizzle.js","sourcesContent":["import type { DrizzleConfig } from \"drizzle-orm\";\nimport {\n drizzle as drizzleProxy,\n type SqliteRemoteDatabase,\n} from \"drizzle-orm/sqlite-proxy\";\nimport { QueryResult } from \"./mcp.ts\";\nexport * from \"drizzle-orm/sqlite-core\";\nexport * as orm from \"drizzle-orm\";\nimport { sql } from \"drizzle-orm\";\nimport { DefaultEnv } from \"./index.ts\";\n\nconst mapGetResult = ({ result: [page] }: { result: QueryResult[] }) => {\n return page.results ?? [];\n};\n\nconst mapPostResult = ({ result }: { result: QueryResult[] }) => {\n return (\n result\n .map((page) => page.results ?? [])\n .flat()\n // @ts-expect-error - this is ok, result comes as unknown\n .map(Object.values)\n );\n};\n\nexport function drizzle<\n TSchema extends Record<string, unknown> = Record<string, never>,\n>(\n { DECO_WORKSPACE_DB }: Pick<DefaultEnv, \"DECO_WORKSPACE_DB\">,\n config?: DrizzleConfig<TSchema>,\n) {\n return drizzleProxy((sql, params, method) => {\n // https://orm.drizzle.team/docs/connect-drizzle-proxy says\n // Drizzle always waits for {rows: string[][]} or {rows: string[]} for the return value.\n // When the method is get, you should return a value as {rows: string[]}.\n // Otherwise, you should return {rows: string[][]}.\n const asRows = method === \"get\" ? mapGetResult : mapPostResult;\n return DECO_WORKSPACE_DB.query({\n sql,\n params,\n }).then((result) => ({ rows: asRows(result) }));\n }, config);\n}\n\n/**\n * The following code is a custom migration system tweaked\n * from the durable-sqlite original migrator.\n *\n * @see https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/durable-sqlite/migrator.ts\n *\n * It applies the migrations without transactions, as a workaround\n * while we don't have remote transactions support on the\n * workspace database durable object. Not ideal and we should\n * look into implementing some way of doing transactions soon.\n */\n\nexport interface MigrationMeta {\n sql: string[];\n folderMillis: number;\n hash: string;\n bps: boolean;\n}\n\nexport interface MigrationConfig {\n journal: {\n entries: { idx: number; when: number; tag: string; breakpoints: boolean }[];\n };\n migrations: Record<string, string>;\n debug?: boolean;\n}\n\nfunction readMigrationFiles({\n journal,\n migrations,\n}: MigrationConfig): MigrationMeta[] {\n const migrationQueries: MigrationMeta[] = [];\n\n for (const journalEntry of journal.entries) {\n const query =\n migrations[`m${journalEntry.idx.toString().padStart(4, \"0\")}`];\n\n if (!query) {\n throw new Error(`Missing migration: ${journalEntry.tag}`);\n }\n\n try {\n const result = query.split(\"--> statement-breakpoint\").map((it) => {\n return it;\n });\n\n migrationQueries.push({\n sql: result,\n bps: journalEntry.breakpoints,\n folderMillis: journalEntry.when,\n hash: \"\",\n });\n } catch {\n throw new Error(`Failed to parse migration: ${journalEntry.tag}`);\n }\n }\n\n return migrationQueries;\n}\n\nexport async function migrateWithoutTransaction(\n db: SqliteRemoteDatabase,\n config: MigrationConfig,\n): Promise<void> {\n const debug = config.debug ?? false;\n\n if (debug) console.log(\"Migrating database\");\n const migrations = readMigrationFiles(config);\n if (debug) console.log(\"Migrations\", migrations);\n\n try {\n if (debug) console.log(\"Setting up migrations table\");\n const migrationsTable = \"__drizzle_migrations\";\n\n // Create migrations table if it doesn't exist\n // Note: Changed from SERIAL to INTEGER PRIMARY KEY AUTOINCREMENT for SQLite compatibility\n const migrationTableCreate = sql`\n CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n hash text NOT NULL,\n created_at numeric\n )\n `;\n await db.run(migrationTableCreate);\n\n // Get the last applied migration\n const dbMigrations = await db.values<[number, string, string]>(\n sql`SELECT id, hash, created_at FROM ${sql.identifier(\n migrationsTable,\n )} ORDER BY created_at DESC LIMIT 1`,\n );\n\n const lastDbMigration = dbMigrations[0] ?? undefined;\n if (debug) console.log(\"Last applied migration:\", lastDbMigration);\n\n // Apply pending migrations sequentially (without transaction wrapper)\n for (const migration of migrations) {\n const hasNoMigrations =\n lastDbMigration === undefined || !lastDbMigration.length;\n if (\n hasNoMigrations ||\n Number(lastDbMigration[2])! < migration.folderMillis\n ) {\n if (debug) console.log(`Applying migration: ${migration.folderMillis}`);\n\n try {\n // Execute all statements in the migration\n for (const stmt of migration.sql) {\n if (stmt.trim()) {\n // Skip empty statements\n if (debug) {\n console.log(\"Executing:\", stmt.substring(0, 100) + \"...\");\n }\n await db.run(sql.raw(stmt));\n }\n }\n\n // Record successful migration\n await db.run(\n sql`INSERT INTO ${sql.identifier(\n migrationsTable,\n )} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n );\n\n if (debug) {\n console.log(\n `✅ Migration ${migration.folderMillis} applied successfully`,\n );\n }\n } catch (migrationError: unknown) {\n console.error(\n `❌ Migration ${migration.folderMillis} failed:`,\n migrationError,\n );\n throw new Error(\n `Migration failed at ${migration.folderMillis}: ${\n migrationError instanceof Error\n ? migrationError.message\n : String(migrationError)\n }`,\n );\n }\n } else {\n if (debug) {\n console.log(\n `⏭️ Skipping already applied migration: ${migration.folderMillis}`,\n );\n }\n }\n }\n\n if (debug) console.log(\"✅ All migrations completed successfully\");\n } catch (error: unknown) {\n console.error(\"❌ Migration process failed:\", error);\n throw error;\n }\n}\n"]}