@multiplayer-app/sandbox 0.0.11 → 0.0.14
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.
- package/dist/agents/blocknote.agent.d.ts +6 -0
- package/dist/agents/blocknote.agent.d.ts.map +1 -0
- package/dist/agents/blocknote.agent.js +18 -0
- package/dist/agents/blocknote.agent.js.map +1 -0
- package/dist/agents/shared/blocknote-system-prompt.d.ts +2 -0
- package/dist/agents/shared/blocknote-system-prompt.d.ts.map +1 -0
- package/dist/agents/shared/blocknote-system-prompt.js +40 -0
- package/dist/agents/shared/blocknote-system-prompt.js.map +1 -0
- package/dist/builder-api-config.d.ts +3 -2
- package/dist/builder-api-config.d.ts.map +1 -1
- package/dist/builder-api-config.js +4 -1
- package/dist/builder-api-config.js.map +1 -1
- package/dist/context.d.ts +4 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js.map +1 -1
- package/dist/create-builder-api.d.ts +4 -0
- package/dist/create-builder-api.d.ts.map +1 -1
- package/dist/create-builder-api.js +3 -1
- package/dist/create-builder-api.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/agent-ai-service.d.ts +3 -0
- package/dist/lib/ai/agent-ai-service.d.ts.map +1 -0
- package/dist/lib/ai/agent-ai-service.js +15 -0
- package/dist/lib/ai/agent-ai-service.js.map +1 -0
- package/dist/lib/ai/ai-error-details.d.ts +13 -0
- package/dist/lib/ai/ai-error-details.d.ts.map +1 -0
- package/dist/lib/ai/ai-error-details.js +84 -0
- package/dist/lib/ai/ai-error-details.js.map +1 -0
- package/dist/lib/ai/generate-ai-text.d.ts +12 -0
- package/dist/lib/ai/generate-ai-text.d.ts.map +1 -0
- package/dist/lib/ai/generate-ai-text.js +105 -0
- package/dist/lib/ai/generate-ai-text.js.map +1 -0
- package/dist/lib/ai/run-explicit-agent.d.ts +15 -0
- package/dist/lib/ai/run-explicit-agent.d.ts.map +1 -0
- package/dist/lib/ai/run-explicit-agent.js +30 -0
- package/dist/lib/ai/run-explicit-agent.js.map +1 -0
- package/dist/lib/notebooks/notebook-assistant-prompts.d.ts +6 -0
- package/dist/lib/notebooks/notebook-assistant-prompts.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-assistant-prompts.js +42 -0
- package/dist/lib/notebooks/notebook-assistant-prompts.js.map +1 -0
- package/dist/lib/notebooks/notebook-assistant.d.ts +15 -0
- package/dist/lib/notebooks/notebook-assistant.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-assistant.js +145 -0
- package/dist/lib/notebooks/notebook-assistant.js.map +1 -0
- package/dist/lib/notebooks/notebook-content.d.ts +16 -0
- package/dist/lib/notebooks/notebook-content.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-content.js +104 -0
- package/dist/lib/notebooks/notebook-content.js.map +1 -0
- package/dist/lib/notebooks/notebook-repository.d.ts +47 -0
- package/dist/lib/notebooks/notebook-repository.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-repository.js +3 -0
- package/dist/lib/notebooks/notebook-repository.js.map +1 -0
- package/dist/lib/notebooks/notebook-sql-client.d.ts +5 -0
- package/dist/lib/notebooks/notebook-sql-client.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-sql-client.js +37 -0
- package/dist/lib/notebooks/notebook-sql-client.js.map +1 -0
- package/dist/lib/notebooks/notebook-sql-schema.d.ts +16 -0
- package/dist/lib/notebooks/notebook-sql-schema.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-sql-schema.js +117 -0
- package/dist/lib/notebooks/notebook-sql-schema.js.map +1 -0
- package/dist/lib/notebooks/notebook-sql.d.ts +9 -0
- package/dist/lib/notebooks/notebook-sql.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-sql.js +36 -0
- package/dist/lib/notebooks/notebook-sql.js.map +1 -0
- package/dist/lib/sql-schema.d.ts +23 -0
- package/dist/lib/sql-schema.d.ts.map +1 -0
- package/dist/lib/sql-schema.js +3 -0
- package/dist/lib/sql-schema.js.map +1 -0
- package/dist/realtime/init-realtime.d.ts +2 -2
- package/dist/realtime/init-realtime.d.ts.map +1 -1
- package/dist/realtime/init-realtime.js +31 -12
- package/dist/realtime/init-realtime.js.map +1 -1
- package/dist/realtime/notebook-document-id.d.ts +6 -0
- package/dist/realtime/notebook-document-id.d.ts.map +1 -0
- package/dist/realtime/notebook-document-id.js +30 -0
- package/dist/realtime/notebook-document-id.js.map +1 -0
- package/dist/realtime/realtime-auth.d.ts +12 -0
- package/dist/realtime/realtime-auth.d.ts.map +1 -0
- package/dist/realtime/realtime-auth.js +25 -0
- package/dist/realtime/realtime-auth.js.map +1 -0
- package/dist/realtime/session-artifact-y-socket-io.d.ts +4 -11
- package/dist/realtime/session-artifact-y-socket-io.d.ts.map +1 -1
- package/dist/realtime/session-artifact-y-socket-io.js +30 -32
- package/dist/realtime/session-artifact-y-socket-io.js.map +1 -1
- package/dist/realtime/session-artifact-yjs-store.d.ts +9 -0
- package/dist/realtime/session-artifact-yjs-store.d.ts.map +1 -1
- package/dist/realtime/session-artifact-yjs-store.js +93 -9
- package/dist/realtime/session-artifact-yjs-store.js.map +1 -1
- package/dist/realtime/yjs-account-namespace.d.ts +5 -0
- package/dist/realtime/yjs-account-namespace.d.ts.map +1 -0
- package/dist/realtime/yjs-account-namespace.js +21 -0
- package/dist/realtime/yjs-account-namespace.js.map +1 -0
- package/dist/routes/notebooks/assistant-generate.d.ts +3 -0
- package/dist/routes/notebooks/assistant-generate.d.ts.map +1 -0
- package/dist/routes/notebooks/assistant-generate.js +45 -0
- package/dist/routes/notebooks/assistant-generate.js.map +1 -0
- package/dist/routes/notebooks/errors.d.ts +3 -0
- package/dist/routes/notebooks/errors.d.ts.map +1 -0
- package/dist/routes/notebooks/errors.js +28 -0
- package/dist/routes/notebooks/errors.js.map +1 -0
- package/dist/routes/notebooks/sql-execute.d.ts +3 -0
- package/dist/routes/notebooks/sql-execute.d.ts.map +1 -0
- package/dist/routes/notebooks/sql-execute.js +45 -0
- package/dist/routes/notebooks/sql-execute.js.map +1 -0
- package/dist/routes/notebooks.d.ts +2 -0
- package/dist/routes/notebooks.d.ts.map +1 -0
- package/dist/routes/notebooks.js +132 -0
- package/dist/routes/notebooks.js.map +1 -0
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +0 -11
- package/dist/routes/sessions.js.map +1 -1
- package/dist/routes/sql.d.ts +2 -0
- package/dist/routes/sql.d.ts.map +1 -0
- package/dist/routes/sql.js +50 -0
- package/dist/routes/sql.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/package.json +9 -5
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runExplicitAgentText = runExplicitAgentText;
|
|
4
|
+
const ai_agent_node_1 = require("@multiplayer-app/ai-agent-node");
|
|
5
|
+
const generate_ai_text_1 = require("./generate-ai-text");
|
|
6
|
+
function getExplicitAgentConfig(agentName) {
|
|
7
|
+
const agentConfig = ai_agent_node_1.ConfigStore.getInstance().getAgentConfigByName(agentName);
|
|
8
|
+
if (agentConfig.name === '__default') {
|
|
9
|
+
throw new Error(`Agent not found: ${agentName}`);
|
|
10
|
+
}
|
|
11
|
+
return agentConfig;
|
|
12
|
+
}
|
|
13
|
+
async function runExplicitAgentText(input) {
|
|
14
|
+
var _a;
|
|
15
|
+
const agentConfig = getExplicitAgentConfig(input.agentName);
|
|
16
|
+
const system = input.system
|
|
17
|
+
? `${agentConfig.systemPrompt}\n\n${input.system}`
|
|
18
|
+
: agentConfig.systemPrompt;
|
|
19
|
+
return (0, generate_ai_text_1.generateAiText)({
|
|
20
|
+
accountId: input.accountId,
|
|
21
|
+
model: (_a = input.model) !== null && _a !== void 0 ? _a : agentConfig.defaultModel,
|
|
22
|
+
system,
|
|
23
|
+
messages: input.messages,
|
|
24
|
+
signal: input.signal,
|
|
25
|
+
temperature: input.temperature,
|
|
26
|
+
maxOutputTokens: input.maxOutputTokens,
|
|
27
|
+
logLabel: input.logLabel,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=run-explicit-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-explicit-agent.js","sourceRoot":"","sources":["../../../src/lib/ai/run-explicit-agent.ts"],"names":[],"mappings":";;AA0BA,oDAgBC;AA1CD,kEAA4D;AAG5D,yDAAmD;AAenD,SAAS,sBAAsB,CAAC,SAAiB;IAC/C,MAAM,WAAW,GAAG,2BAAW,CAAC,WAAW,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;IAC7E,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,WAAW,CAAA;AACpB,CAAC;AAEM,KAAK,UAAU,oBAAoB,CAAC,KAAgC;;IACzE,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;QACzB,CAAC,CAAC,GAAG,WAAW,CAAC,YAAY,OAAO,KAAK,CAAC,MAAM,EAAE;QAClD,CAAC,CAAC,WAAW,CAAC,YAAY,CAAA;IAE5B,OAAO,IAAA,iCAAc,EAAC;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,MAAA,KAAK,CAAC,KAAK,mCAAI,WAAW,CAAC,YAAY;QAC9C,MAAM;QACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const categorizePrompt = "You're a Tiptap document assistant. A user is describing what kind of content they want to insert. Based on their input, choose the most appropriate Tiptap extension type from the list below.\nRespond with only the exact type name (e.g., paragraph, table, etc.)\u2014no explanation or extra text.\nAvailable generic TipTap extensions are:\nBlockquote, Bold, BulletList, Code, Document, Heading, History, HorizontalRule, Italic, ListItem, OrderedList, Paragraph, Strike, Text,\nHighlight, CharacterCount, Underline, Placeholder, Emoji, TextAlign, TextStyle, Typography, Color, Focus, Subscript, Superscript, TaskItem, TaskList, FileHandler, Selection, ImageUpload,\nTable, TableCell, TableHeader, TableRow, TrailingNode, SlashCommand, FontSize, Figure, Figcaption, BlockquoteFigure, Quote, QuoteCaption, Link, ImageBlock, Columns, Column,\nComment\n\nAvailable custom extensions are:\nrunnableCodeBlock, // stores executable JavaScript code\nchartBlock, // sandboxed HTML/CSS/JS UI blocks\nsqlBlock // PostgreSQL SELECT queries that return tabular results\n\nChoose sqlBlock when the user wants to query database tables, inspect SQL data, or run SELECT statements.\nChoose runnableCodeBlock for general executable JavaScript, not SQL.\nChoose chartBlock for custom visual UI, charts, or interactive HTML\u2014not tabular SQL results.";
|
|
2
|
+
export declare const generateTipTapBlockPrompt = "Generate a valid Tiptap JSON node for the selected block type below, using the user's content description.\nReturn a single valid JSON object representing the Tiptap block. The JSON must follow Tiptap's structure, with appropriate type, attrs, and content as needed.";
|
|
3
|
+
export declare const codeBlockPrompt = "Generate runnableCodeBlock attrs for the user request.\nReturn only a JSON object with _globalName, content, and language fields.";
|
|
4
|
+
export declare const generateChartPrompt = "Generate chartBlock attrs for the user request.\nReturn only a JSON object with _globalName, html, javascript, and css fields.";
|
|
5
|
+
export declare function buildGenerateSqlBlockPrompt(schemaDescription: string): string;
|
|
6
|
+
//# sourceMappingURL=notebook-assistant-prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-assistant-prompts.d.ts","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-assistant-prompts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,yzCAegE,CAAA;AAE7F,eAAO,MAAM,yBAAyB,+QACyH,CAAA;AAE/J,eAAO,MAAM,eAAe,sIAC8C,CAAA;AAE1E,eAAO,MAAM,mBAAmB,mIAC8C,CAAA;AAE9E,wBAAgB,2BAA2B,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAc7E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateChartPrompt = exports.codeBlockPrompt = exports.generateTipTapBlockPrompt = exports.categorizePrompt = void 0;
|
|
4
|
+
exports.buildGenerateSqlBlockPrompt = buildGenerateSqlBlockPrompt;
|
|
5
|
+
exports.categorizePrompt = `You're a Tiptap document assistant. A user is describing what kind of content they want to insert. Based on their input, choose the most appropriate Tiptap extension type from the list below.
|
|
6
|
+
Respond with only the exact type name (e.g., paragraph, table, etc.)—no explanation or extra text.
|
|
7
|
+
Available generic TipTap extensions are:
|
|
8
|
+
Blockquote, Bold, BulletList, Code, Document, Heading, History, HorizontalRule, Italic, ListItem, OrderedList, Paragraph, Strike, Text,
|
|
9
|
+
Highlight, CharacterCount, Underline, Placeholder, Emoji, TextAlign, TextStyle, Typography, Color, Focus, Subscript, Superscript, TaskItem, TaskList, FileHandler, Selection, ImageUpload,
|
|
10
|
+
Table, TableCell, TableHeader, TableRow, TrailingNode, SlashCommand, FontSize, Figure, Figcaption, BlockquoteFigure, Quote, QuoteCaption, Link, ImageBlock, Columns, Column,
|
|
11
|
+
Comment
|
|
12
|
+
|
|
13
|
+
Available custom extensions are:
|
|
14
|
+
runnableCodeBlock, // stores executable JavaScript code
|
|
15
|
+
chartBlock, // sandboxed HTML/CSS/JS UI blocks
|
|
16
|
+
sqlBlock // PostgreSQL SELECT queries that return tabular results
|
|
17
|
+
|
|
18
|
+
Choose sqlBlock when the user wants to query database tables, inspect SQL data, or run SELECT statements.
|
|
19
|
+
Choose runnableCodeBlock for general executable JavaScript, not SQL.
|
|
20
|
+
Choose chartBlock for custom visual UI, charts, or interactive HTML—not tabular SQL results.`;
|
|
21
|
+
exports.generateTipTapBlockPrompt = `Generate a valid Tiptap JSON node for the selected block type below, using the user's content description.
|
|
22
|
+
Return a single valid JSON object representing the Tiptap block. The JSON must follow Tiptap's structure, with appropriate type, attrs, and content as needed.`;
|
|
23
|
+
exports.codeBlockPrompt = `Generate runnableCodeBlock attrs for the user request.
|
|
24
|
+
Return only a JSON object with _globalName, content, and language fields.`;
|
|
25
|
+
exports.generateChartPrompt = `Generate chartBlock attrs for the user request.
|
|
26
|
+
Return only a JSON object with _globalName, html, javascript, and css fields.`;
|
|
27
|
+
function buildGenerateSqlBlockPrompt(schemaDescription) {
|
|
28
|
+
return `Generate sqlBlock attrs for the user request.
|
|
29
|
+
The block executes a single PostgreSQL SELECT query and displays rows in a table.
|
|
30
|
+
|
|
31
|
+
Database schema:
|
|
32
|
+
${schemaDescription}
|
|
33
|
+
|
|
34
|
+
Rules:
|
|
35
|
+
- Return only a JSON object with _globalName and query fields.
|
|
36
|
+
- query must be one valid PostgreSQL SELECT statement.
|
|
37
|
+
- Do not use INSERT, UPDATE, DELETE, DDL, or multiple statements.
|
|
38
|
+
- Prefer explicit column lists over SELECT * when the request is specific.
|
|
39
|
+
- Add LIMIT when returning row samples unless the user asks for aggregates only.
|
|
40
|
+
- Use table and column names from the schema above.`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=notebook-assistant-prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-assistant-prompts.js","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-assistant-prompts.ts"],"names":[],"mappings":";;;AA0BA,kEAcC;AAxCY,QAAA,gBAAgB,GAAG;;;;;;;;;;;;;;;6FAe6D,CAAA;AAEhF,QAAA,yBAAyB,GAAG;+JACsH,CAAA;AAElJ,QAAA,eAAe,GAAG;0EAC2C,CAAA;AAE7D,QAAA,mBAAmB,GAAG;8EAC2C,CAAA;AAE9E,SAAgB,2BAA2B,CAAC,iBAAyB;IACnE,OAAO;;;;EAIP,iBAAiB;;;;;;;;oDAQiC,CAAA;AACpD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface NotebookAssistantBlock {
|
|
2
|
+
type: string;
|
|
3
|
+
attrs?: Record<string, unknown>;
|
|
4
|
+
content?: unknown;
|
|
5
|
+
[key: string]: unknown;
|
|
6
|
+
}
|
|
7
|
+
export interface GenerateNotebookBlockInput {
|
|
8
|
+
accountId: string;
|
|
9
|
+
message?: string;
|
|
10
|
+
block?: NotebookAssistantBlock;
|
|
11
|
+
adjustmentMessage?: string;
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
}
|
|
14
|
+
export declare function generateNotebookAssistantBlock(input: GenerateNotebookBlockInput): Promise<NotebookAssistantBlock>;
|
|
15
|
+
//# sourceMappingURL=notebook-assistant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-assistant.d.ts","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-assistant.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,sBAAsB,CAAA;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAuKD,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,sBAAsB,CAAC,CAOjC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateNotebookAssistantBlock = generateNotebookAssistantBlock;
|
|
4
|
+
const ai_agent_types_1 = require("@multiplayer-app/ai-agent-types");
|
|
5
|
+
const builder_api_config_1 = require("../../builder-api-config");
|
|
6
|
+
const context_1 = require("../../context");
|
|
7
|
+
const notebook_assistant_prompts_1 = require("./notebook-assistant-prompts");
|
|
8
|
+
function parseJsonResponse(value) {
|
|
9
|
+
var _a, _b;
|
|
10
|
+
const trimmed = value.trim();
|
|
11
|
+
const fenced = trimmed.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i);
|
|
12
|
+
const candidate = (_b = (_a = fenced === null || fenced === void 0 ? void 0 : fenced[1]) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : trimmed;
|
|
13
|
+
return JSON.parse(candidate);
|
|
14
|
+
}
|
|
15
|
+
const FALLBACK_SQL_SCHEMA = `public.users (id integer PK, name text, email text, role text, created_at timestamptz)
|
|
16
|
+
public.orders (id integer PK, user_id integer, product text, amount numeric, status text, ordered_at timestamptz)`;
|
|
17
|
+
function formatSqlTableForPrompt(table) {
|
|
18
|
+
const columns = table.columns
|
|
19
|
+
.map((column) => {
|
|
20
|
+
const parts = [column.name, column.dataType];
|
|
21
|
+
if (column.isPrimaryKey) {
|
|
22
|
+
parts.push('PK');
|
|
23
|
+
}
|
|
24
|
+
if (!column.isNullable) {
|
|
25
|
+
parts.push('NOT NULL');
|
|
26
|
+
}
|
|
27
|
+
return parts.join(' ');
|
|
28
|
+
})
|
|
29
|
+
.join(', ');
|
|
30
|
+
return `${table.schema}.${table.name} (${columns})`;
|
|
31
|
+
}
|
|
32
|
+
async function getSqlSchemaDescription() {
|
|
33
|
+
const provider = (0, context_1.getBuilderApiContext)().sqlSchemaProvider;
|
|
34
|
+
if (!provider) {
|
|
35
|
+
return FALLBACK_SQL_SCHEMA;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const tables = await provider.listTables();
|
|
39
|
+
if (tables.length === 0) {
|
|
40
|
+
return FALLBACK_SQL_SCHEMA;
|
|
41
|
+
}
|
|
42
|
+
return tables.map(formatSqlTableForPrompt).join('\n');
|
|
43
|
+
}
|
|
44
|
+
catch (_a) {
|
|
45
|
+
return FALLBACK_SQL_SCHEMA;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function buildConversationMessages(input, userMessages) {
|
|
49
|
+
const messages = userMessages.map((content) => ({
|
|
50
|
+
role: ai_agent_types_1.MessageRole.User,
|
|
51
|
+
content,
|
|
52
|
+
}));
|
|
53
|
+
if (input.block) {
|
|
54
|
+
messages.push({
|
|
55
|
+
role: ai_agent_types_1.MessageRole.Assistant,
|
|
56
|
+
content: JSON.stringify(input.block),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (input.adjustmentMessage) {
|
|
60
|
+
messages.push({
|
|
61
|
+
role: ai_agent_types_1.MessageRole.User,
|
|
62
|
+
content: input.adjustmentMessage,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return messages;
|
|
66
|
+
}
|
|
67
|
+
async function getAiResults(input, userMessages, system) {
|
|
68
|
+
var _a;
|
|
69
|
+
const model = (_a = (0, context_1.getBuilderApiContext)().config.ai.defaultModel) !== null && _a !== void 0 ? _a : builder_api_config_1.DEFAULT_AI_MODEL;
|
|
70
|
+
return (0, context_1.getAgentService)().getChatProcessor().getAiResponse(buildConversationMessages(input, userMessages), {
|
|
71
|
+
system,
|
|
72
|
+
model,
|
|
73
|
+
signal: input.signal,
|
|
74
|
+
temperature: 0.1,
|
|
75
|
+
maxOutputTokens: 1500,
|
|
76
|
+
executionContext: {
|
|
77
|
+
tenants: { accountId: input.accountId },
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async function categorizeBlock(input) {
|
|
82
|
+
var _a, _b;
|
|
83
|
+
if ((_a = input.block) === null || _a === void 0 ? void 0 : _a.type) {
|
|
84
|
+
return input.block.type;
|
|
85
|
+
}
|
|
86
|
+
if (!((_b = input.message) === null || _b === void 0 ? void 0 : _b.trim())) {
|
|
87
|
+
return 'paragraph';
|
|
88
|
+
}
|
|
89
|
+
const category = await getAiResults(input, [input.message], notebook_assistant_prompts_1.categorizePrompt);
|
|
90
|
+
return category.trim() || 'paragraph';
|
|
91
|
+
}
|
|
92
|
+
async function generateTipTapBlock(input, category) {
|
|
93
|
+
var _a;
|
|
94
|
+
const response = await getAiResults(input, [`Block type: ${category}\nUser content description: ${(_a = input.message) !== null && _a !== void 0 ? _a : ''}`], notebook_assistant_prompts_1.generateTipTapBlockPrompt);
|
|
95
|
+
return parseJsonResponse(response);
|
|
96
|
+
}
|
|
97
|
+
async function generateCodeBlock(input) {
|
|
98
|
+
var _a, _b, _c;
|
|
99
|
+
const response = await getAiResults(input, [(_a = input.message) !== null && _a !== void 0 ? _a : ''], notebook_assistant_prompts_1.codeBlockPrompt);
|
|
100
|
+
const attrs = parseJsonResponse(response);
|
|
101
|
+
return {
|
|
102
|
+
type: 'runnableCodeBlock',
|
|
103
|
+
attrs: { ...((_c = (_b = input.block) === null || _b === void 0 ? void 0 : _b.attrs) !== null && _c !== void 0 ? _c : {}), ...attrs },
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async function generateChartBlock(input) {
|
|
107
|
+
var _a, _b, _c;
|
|
108
|
+
const response = await getAiResults(input, [(_a = input.message) !== null && _a !== void 0 ? _a : ''], notebook_assistant_prompts_1.generateChartPrompt);
|
|
109
|
+
const attrs = parseJsonResponse(response);
|
|
110
|
+
return {
|
|
111
|
+
type: 'chartBlock',
|
|
112
|
+
attrs: { ...((_c = (_b = input.block) === null || _b === void 0 ? void 0 : _b.attrs) !== null && _c !== void 0 ? _c : {}), ...attrs },
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
async function generateSqlBlock(input) {
|
|
116
|
+
var _a, _b, _c;
|
|
117
|
+
const schemaDescription = await getSqlSchemaDescription();
|
|
118
|
+
const response = await getAiResults(input, [(_a = input.message) !== null && _a !== void 0 ? _a : ''], (0, notebook_assistant_prompts_1.buildGenerateSqlBlockPrompt)(schemaDescription));
|
|
119
|
+
const attrs = parseJsonResponse(response);
|
|
120
|
+
return {
|
|
121
|
+
type: 'sqlBlock',
|
|
122
|
+
attrs: { ...((_c = (_b = input.block) === null || _b === void 0 ? void 0 : _b.attrs) !== null && _c !== void 0 ? _c : {}), ...attrs },
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
async function generateBlockByCategory(category, input) {
|
|
126
|
+
switch (category) {
|
|
127
|
+
case 'runnableCodeBlock':
|
|
128
|
+
return generateCodeBlock(input);
|
|
129
|
+
case 'chartBlock':
|
|
130
|
+
return generateChartBlock(input);
|
|
131
|
+
case 'sqlBlock':
|
|
132
|
+
return generateSqlBlock(input);
|
|
133
|
+
default:
|
|
134
|
+
return generateTipTapBlock(input, category);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function generateNotebookAssistantBlock(input) {
|
|
138
|
+
const category = await categorizeBlock(input);
|
|
139
|
+
const block = await generateBlockByCategory(category, input);
|
|
140
|
+
if (!(block === null || block === void 0 ? void 0 : block.type)) {
|
|
141
|
+
throw new Error('Invalid response from AI assistant');
|
|
142
|
+
}
|
|
143
|
+
return block;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=notebook-assistant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-assistant.js","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-assistant.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const NOTEBOOK_CONTENT_VERSION = 1;
|
|
2
|
+
export declare const NOTEBOOK_MAX_TITLE_LENGTH = 200;
|
|
3
|
+
export declare const NOTEBOOK_MAX_CONTENT_BYTES: number;
|
|
4
|
+
export interface NotebookContent {
|
|
5
|
+
version: number;
|
|
6
|
+
title: string;
|
|
7
|
+
blocks: unknown[];
|
|
8
|
+
metadata?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export declare function getDefaultNotebookTitle(date?: Date): string;
|
|
11
|
+
export declare function createEmptyNotebookContent(title: string): NotebookContent;
|
|
12
|
+
export declare function serializeNotebookContent(content: NotebookContent): string;
|
|
13
|
+
export declare function parseNotebookContent(raw: string): NotebookContent;
|
|
14
|
+
export declare function validateNotebookContentString(rawContent: string): string;
|
|
15
|
+
export declare function assertNotebookContentSize(rawContent: string): void;
|
|
16
|
+
//# sourceMappingURL=notebook-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-content.d.ts","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-content.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,IAAI,CAAA;AACzC,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAC5C,eAAO,MAAM,0BAA0B,QAAkB,CAAA;AAEzD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,OAAO,EAAE,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAOvE;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAOzE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAGzE;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAQjE;AAED,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAGxE;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAKlE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NOTEBOOK_MAX_CONTENT_BYTES = exports.NOTEBOOK_MAX_TITLE_LENGTH = exports.NOTEBOOK_CONTENT_VERSION = void 0;
|
|
4
|
+
exports.getDefaultNotebookTitle = getDefaultNotebookTitle;
|
|
5
|
+
exports.createEmptyNotebookContent = createEmptyNotebookContent;
|
|
6
|
+
exports.serializeNotebookContent = serializeNotebookContent;
|
|
7
|
+
exports.parseNotebookContent = parseNotebookContent;
|
|
8
|
+
exports.validateNotebookContentString = validateNotebookContentString;
|
|
9
|
+
exports.assertNotebookContentSize = assertNotebookContentSize;
|
|
10
|
+
exports.NOTEBOOK_CONTENT_VERSION = 1;
|
|
11
|
+
exports.NOTEBOOK_MAX_TITLE_LENGTH = 200;
|
|
12
|
+
exports.NOTEBOOK_MAX_CONTENT_BYTES = 2 * 1024 * 1024;
|
|
13
|
+
function getDefaultNotebookTitle(date = new Date()) {
|
|
14
|
+
const formatted = date.toLocaleDateString('en-US', {
|
|
15
|
+
month: 'short',
|
|
16
|
+
day: 'numeric',
|
|
17
|
+
year: 'numeric',
|
|
18
|
+
});
|
|
19
|
+
return `New Notebook ${formatted}`;
|
|
20
|
+
}
|
|
21
|
+
function createEmptyNotebookContent(title) {
|
|
22
|
+
const normalizedTitle = title.trim() || getDefaultNotebookTitle();
|
|
23
|
+
return {
|
|
24
|
+
version: exports.NOTEBOOK_CONTENT_VERSION,
|
|
25
|
+
title: normalizedTitle,
|
|
26
|
+
blocks: [],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function serializeNotebookContent(content) {
|
|
30
|
+
const validated = validateNotebookContentObject(content);
|
|
31
|
+
return JSON.stringify(validated);
|
|
32
|
+
}
|
|
33
|
+
function parseNotebookContent(raw) {
|
|
34
|
+
let parsed;
|
|
35
|
+
try {
|
|
36
|
+
parsed = JSON.parse(raw);
|
|
37
|
+
}
|
|
38
|
+
catch (_a) {
|
|
39
|
+
throw new Error('Notebook content must be valid JSON');
|
|
40
|
+
}
|
|
41
|
+
return validateNotebookContentObject(parsed);
|
|
42
|
+
}
|
|
43
|
+
function validateNotebookContentString(rawContent) {
|
|
44
|
+
assertNotebookContentSize(rawContent);
|
|
45
|
+
return serializeNotebookContent(parseNotebookContent(rawContent));
|
|
46
|
+
}
|
|
47
|
+
function assertNotebookContentSize(rawContent) {
|
|
48
|
+
const bytes = Buffer.byteLength(rawContent, 'utf8');
|
|
49
|
+
if (bytes > exports.NOTEBOOK_MAX_CONTENT_BYTES) {
|
|
50
|
+
throw new Error(`Notebook content exceeds ${exports.NOTEBOOK_MAX_CONTENT_BYTES} bytes`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function sanitizeNotebookTitle(title) {
|
|
54
|
+
return title
|
|
55
|
+
.replace(/\u0000/g, '')
|
|
56
|
+
.trim()
|
|
57
|
+
.slice(0, exports.NOTEBOOK_MAX_TITLE_LENGTH);
|
|
58
|
+
}
|
|
59
|
+
function validateNotebookBlock(block, index) {
|
|
60
|
+
if (!block || typeof block !== 'object' || Array.isArray(block)) {
|
|
61
|
+
throw new Error(`Notebook content.blocks[${index}] must be an object`);
|
|
62
|
+
}
|
|
63
|
+
const candidate = block;
|
|
64
|
+
if (typeof candidate.type !== 'string' || candidate.type.trim().length === 0) {
|
|
65
|
+
throw new Error(`Notebook content.blocks[${index}].type must be a non-empty string`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function validateNotebookMetadata(metadata) {
|
|
69
|
+
if (metadata === undefined) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) {
|
|
73
|
+
throw new Error('Notebook content.metadata must be an object');
|
|
74
|
+
}
|
|
75
|
+
return metadata;
|
|
76
|
+
}
|
|
77
|
+
function validateNotebookContentObject(value) {
|
|
78
|
+
if (!value || typeof value !== 'object') {
|
|
79
|
+
throw new Error('Notebook content must be a JSON object');
|
|
80
|
+
}
|
|
81
|
+
const candidate = value;
|
|
82
|
+
if (candidate.version !== exports.NOTEBOOK_CONTENT_VERSION) {
|
|
83
|
+
throw new Error(`Notebook content.version must be ${exports.NOTEBOOK_CONTENT_VERSION}`);
|
|
84
|
+
}
|
|
85
|
+
if (typeof candidate.title !== 'string' || candidate.title.trim().length === 0) {
|
|
86
|
+
throw new Error('Notebook content.title must be a non-empty string');
|
|
87
|
+
}
|
|
88
|
+
if (!Array.isArray(candidate.blocks)) {
|
|
89
|
+
throw new Error('Notebook content.blocks must be an array');
|
|
90
|
+
}
|
|
91
|
+
candidate.blocks.forEach((block, index) => validateNotebookBlock(block, index));
|
|
92
|
+
const metadata = validateNotebookMetadata(candidate.metadata);
|
|
93
|
+
const title = sanitizeNotebookTitle(candidate.title);
|
|
94
|
+
if (!title) {
|
|
95
|
+
throw new Error('Notebook content.title must be a non-empty string');
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
version: exports.NOTEBOOK_CONTENT_VERSION,
|
|
99
|
+
title,
|
|
100
|
+
blocks: candidate.blocks,
|
|
101
|
+
...(metadata ? { metadata } : {}),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=notebook-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-content.js","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface NotebookRecord {
|
|
2
|
+
notebookId: string;
|
|
3
|
+
accountId: string;
|
|
4
|
+
title: string;
|
|
5
|
+
content: string;
|
|
6
|
+
yjsState: Uint8Array | null;
|
|
7
|
+
createdBy: string;
|
|
8
|
+
updatedBy: string;
|
|
9
|
+
createdAt: string;
|
|
10
|
+
updatedAt: string;
|
|
11
|
+
deletedAt?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface NotebookSummary {
|
|
14
|
+
notebookId: string;
|
|
15
|
+
accountId: string;
|
|
16
|
+
title: string;
|
|
17
|
+
updatedAt: string;
|
|
18
|
+
createdAt: string;
|
|
19
|
+
}
|
|
20
|
+
export interface CreateNotebookInput {
|
|
21
|
+
accountId: string;
|
|
22
|
+
title: string;
|
|
23
|
+
content: string;
|
|
24
|
+
createdBy: string;
|
|
25
|
+
}
|
|
26
|
+
export interface UpdateNotebookInput {
|
|
27
|
+
accountId: string;
|
|
28
|
+
notebookId: string;
|
|
29
|
+
title?: string;
|
|
30
|
+
content?: string;
|
|
31
|
+
yjsState?: Uint8Array;
|
|
32
|
+
updatedBy: string;
|
|
33
|
+
}
|
|
34
|
+
export interface NotebookRealtimeState {
|
|
35
|
+
content: string;
|
|
36
|
+
yjsState: Uint8Array | null;
|
|
37
|
+
}
|
|
38
|
+
export interface NotebookRepository {
|
|
39
|
+
listByAccount(accountId: string): Promise<NotebookSummary[]>;
|
|
40
|
+
getById(accountId: string, notebookId: string): Promise<NotebookRecord | null>;
|
|
41
|
+
create(input: CreateNotebookInput): Promise<NotebookRecord>;
|
|
42
|
+
update(input: UpdateNotebookInput): Promise<NotebookRecord | null>;
|
|
43
|
+
delete(accountId: string, notebookId: string, deletedBy: string): Promise<boolean>;
|
|
44
|
+
readRealtimeState(accountId: string, notebookId: string): Promise<NotebookRealtimeState | null>;
|
|
45
|
+
writeRealtimeState(accountId: string, notebookId: string, state: Uint8Array): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=notebook-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-repository.d.ts","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-repository.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,UAAU,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAA;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IAC5D,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAC9E,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IAC3D,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAClE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClF,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAA;IAC/F,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-repository.js","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-repository.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import pg from 'pg';
|
|
2
|
+
export declare function getNotebookSqlPool(): pg.Pool;
|
|
3
|
+
export declare function closeNotebookSqlPool(): Promise<void>;
|
|
4
|
+
export declare function withNotebookSqlClient<T>(fn: (client: pg.PoolClient) => Promise<T>): Promise<T>;
|
|
5
|
+
//# sourceMappingURL=notebook-sql-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-sql-client.d.ts","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-sql-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAUnB,wBAAgB,kBAAkB,IAAI,EAAE,CAAC,IAAI,CAK5C;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAK1D;AAED,wBAAsB,qBAAqB,CAAC,CAAC,EAC3C,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAOZ"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getNotebookSqlPool = getNotebookSqlPool;
|
|
7
|
+
exports.closeNotebookSqlPool = closeNotebookSqlPool;
|
|
8
|
+
exports.withNotebookSqlClient = withNotebookSqlClient;
|
|
9
|
+
const pg_1 = __importDefault(require("pg"));
|
|
10
|
+
const DEFAULT_DATABASE_URL = 'postgresql://multiplayer:multiplayer@localhost:5432/multiplayer';
|
|
11
|
+
let pool = null;
|
|
12
|
+
function getConnectionString() {
|
|
13
|
+
var _a;
|
|
14
|
+
return ((_a = process.env.DATABASE_URL) === null || _a === void 0 ? void 0 : _a.trim()) || DEFAULT_DATABASE_URL;
|
|
15
|
+
}
|
|
16
|
+
function getNotebookSqlPool() {
|
|
17
|
+
if (!pool) {
|
|
18
|
+
pool = new pg_1.default.Pool({ connectionString: getConnectionString() });
|
|
19
|
+
}
|
|
20
|
+
return pool;
|
|
21
|
+
}
|
|
22
|
+
async function closeNotebookSqlPool() {
|
|
23
|
+
if (pool) {
|
|
24
|
+
await pool.end();
|
|
25
|
+
pool = null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function withNotebookSqlClient(fn) {
|
|
29
|
+
const client = await getNotebookSqlPool().connect();
|
|
30
|
+
try {
|
|
31
|
+
return await fn(client);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
client.release();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=notebook-sql-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-sql-client.js","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-sql-client.ts"],"names":[],"mappings":";;;;;AAUA,gDAKC;AAED,oDAKC;AAED,sDASC;AAjCD,4CAAmB;AAEnB,MAAM,oBAAoB,GAAG,iEAAiE,CAAA;AAE9F,IAAI,IAAI,GAAmB,IAAI,CAAA;AAE/B,SAAS,mBAAmB;;IAC1B,OAAO,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,YAAY,0CAAE,IAAI,EAAE,KAAI,oBAAoB,CAAA;AACjE,CAAC;AAED,SAAgB,kBAAkB;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,IAAI,YAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA;IACjE,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAEM,KAAK,UAAU,oBAAoB;IACxC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAA;QAChB,IAAI,GAAG,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,qBAAqB,CACzC,EAAyC;IAEzC,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,CAAA;IACnD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,CAAA;IACzB,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAA;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface SqlTableColumn {
|
|
2
|
+
name: string;
|
|
3
|
+
dataType: string;
|
|
4
|
+
isNullable: boolean;
|
|
5
|
+
defaultValue: string | null;
|
|
6
|
+
isPrimaryKey: boolean;
|
|
7
|
+
ordinalPosition: number;
|
|
8
|
+
}
|
|
9
|
+
export interface SqlTableSchema {
|
|
10
|
+
schema: string;
|
|
11
|
+
name: string;
|
|
12
|
+
columns: SqlTableColumn[];
|
|
13
|
+
}
|
|
14
|
+
export declare function listNotebookSqlTables(): Promise<SqlTableSchema[]>;
|
|
15
|
+
export declare function getNotebookSqlTableSchema(tableName: string): Promise<SqlTableSchema | null>;
|
|
16
|
+
//# sourceMappingURL=notebook-sql-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-sql-schema.d.ts","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-sql-schema.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,YAAY,EAAE,OAAO,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,cAAc,EAAE,CAAA;CAC1B;AAqFD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CASvE;AAED,wBAAsB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAqDjG"}
|