@contractspec/module.examples 1.57.0 → 1.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,328 +0,0 @@
1
- 'use client';
2
-
3
- import { getTemplateEngine } from "./engine.js";
4
- import { getTemplate } from "./registry.js";
5
- import { TemplateInstaller } from "./installer.js";
6
- import "@contractspec/lib.contracts/presentations";
7
- import { createAgentHandlers } from "@contractspec/example.agent-console";
8
- import { createSaasHandlers } from "@contractspec/example.saas-boilerplate";
9
- import { createCrmHandlers } from "@contractspec/example.crm-pipeline";
10
- import { createWorkflowHandlers } from "@contractspec/example.workflow-system";
11
- import { createMarketplaceHandlers } from "@contractspec/example.marketplace";
12
- import { createIntegrationHandlers } from "@contractspec/example.integration-hub";
13
- import { createAnalyticsHandlers } from "@contractspec/example.analytics-dashboard";
14
- import { web } from "@contractspec/lib.runtime-sandbox";
15
- import { useEffect, useMemo, useState } from "react";
16
- import { ApolloProvider } from "@apollo/client/react";
17
- import { jsx, jsxs } from "react/jsx-runtime";
18
- import { createPolicySafeKnowledgeAssistantHandlers } from "@contractspec/example.policy-safe-knowledge-assistant";
19
- import { TemplateRuntimeContext, useTemplateComponents, useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
20
-
21
- //#region src/runtime/context.tsx
22
- const { LocalRuntimeServices } = web;
23
- function logBootstrapFailure(error) {
24
- console.error(`
25
- [TemplateRuntime] Bootstrap Failed
26
- ==================================
27
-
28
- The runtime failed to initialize. This usually happens because:
29
- 1. The PostgreSQL Web environment (pglite) failed to load
30
- 2. The schema migration failed
31
- 3. The initial seed data could not be inserted
32
-
33
- Check the console for specific database errors.
34
- `.trim(), error);
35
- }
36
- /**
37
- * Template-specific handlers created from the runtime database
38
- */
39
- var TemplateHandlers = class {
40
- crm;
41
- saas;
42
- agent;
43
- workflow;
44
- marketplace;
45
- integration;
46
- analytics;
47
- policySafeKnowledgeAssistant;
48
- };
49
- function TemplateRuntimeProvider({ templateId, projectId = "default-project", lazy = false, children }) {
50
- const [context, setContext] = useState(null);
51
- const [error, setError] = useState(null);
52
- useEffect(() => {
53
- let mounted = true;
54
- async function bootstrap() {
55
- try {
56
- if (lazy) return;
57
- const template = getTemplate(templateId);
58
- if (!template) throw new Error(`Template not found: ${templateId}`);
59
- const runtime = new LocalRuntimeServices();
60
- await runtime.init({});
61
- const installer = new TemplateInstaller({ runtime });
62
- await installer.install(templateId, { projectId });
63
- const client = web.createLocalGraphqlClient(runtime);
64
- const engine = await getTemplateEngine();
65
- const handlers = new TemplateHandlers();
66
- handlers.crm = createCrmHandlers(runtime.db);
67
- handlers.saas = createSaasHandlers(runtime.db);
68
- handlers.agent = createAgentHandlers(runtime.db);
69
- handlers.workflow = createWorkflowHandlers(runtime.db);
70
- handlers.marketplace = createMarketplaceHandlers(runtime.db);
71
- handlers.integration = createIntegrationHandlers(runtime.db);
72
- handlers.analytics = createAnalyticsHandlers(runtime.db);
73
- handlers.policySafeKnowledgeAssistant = createPolicySafeKnowledgeAssistantHandlers(runtime.db);
74
- const fetchData = async (presentationName) => {
75
- if (presentationName === "crm-pipeline.dashboard") {
76
- const [dealsResult, stages] = await Promise.all([handlers.crm.listDeals({
77
- projectId,
78
- pipelineId: "pipeline-1",
79
- limit: 50
80
- }), handlers.crm.getPipelineStages({ pipelineId: "pipeline-1" })]);
81
- return {
82
- data: {
83
- deals: dealsResult.deals,
84
- stages,
85
- summary: {
86
- total: dealsResult.total,
87
- totalValue: dealsResult.totalValue
88
- }
89
- },
90
- metadata: {
91
- total: dealsResult.total,
92
- timestamp: /* @__PURE__ */ new Date(),
93
- source: "crm-pipeline"
94
- }
95
- };
96
- }
97
- if (presentationName === "crm-pipeline.deal.pipeline") {
98
- const [dealsResult, stages] = await Promise.all([handlers.crm.listDeals({
99
- projectId,
100
- pipelineId: "pipeline-1",
101
- limit: 100
102
- }), handlers.crm.getPipelineStages({ pipelineId: "pipeline-1" })]);
103
- return {
104
- data: {
105
- deals: dealsResult.deals,
106
- stages,
107
- total: dealsResult.total,
108
- totalValue: dealsResult.totalValue
109
- },
110
- metadata: {
111
- total: dealsResult.total,
112
- timestamp: /* @__PURE__ */ new Date(),
113
- source: "crm-pipeline"
114
- }
115
- };
116
- }
117
- if (presentationName === "saas-boilerplate.dashboard") {
118
- const [projectsResult, subscription] = await Promise.all([handlers.saas.listProjects({
119
- projectId,
120
- limit: 10
121
- }), handlers.saas.getSubscription({ projectId })]);
122
- return {
123
- data: {
124
- projects: projectsResult.items,
125
- subscription,
126
- summary: { totalProjects: projectsResult.total }
127
- },
128
- metadata: {
129
- total: projectsResult.total,
130
- timestamp: /* @__PURE__ */ new Date(),
131
- source: "saas-boilerplate"
132
- }
133
- };
134
- }
135
- if (presentationName === "saas-boilerplate.project.list") {
136
- const result = await handlers.saas.listProjects({
137
- projectId,
138
- limit: 50
139
- });
140
- return {
141
- data: result.items,
142
- metadata: {
143
- total: result.total,
144
- timestamp: /* @__PURE__ */ new Date(),
145
- source: "saas-boilerplate"
146
- }
147
- };
148
- }
149
- if (presentationName === "saas-boilerplate.billing.settings") return {
150
- data: await handlers.saas.getSubscription({ projectId }),
151
- metadata: {
152
- timestamp: /* @__PURE__ */ new Date(),
153
- source: "saas-boilerplate"
154
- }
155
- };
156
- if (presentationName === "agent-console.dashboard") {
157
- const [agentsResult, runsResult, toolsResult] = await Promise.all([
158
- handlers.agent.listAgents({
159
- projectId,
160
- organizationId: "demo-org",
161
- limit: 10
162
- }),
163
- handlers.agent.listRuns({
164
- projectId,
165
- limit: 10
166
- }),
167
- handlers.agent.listTools({
168
- projectId,
169
- organizationId: "demo-org",
170
- limit: 10
171
- })
172
- ]);
173
- return {
174
- data: {
175
- agents: agentsResult.items,
176
- runs: runsResult.items,
177
- tools: toolsResult.items,
178
- summary: {
179
- totalAgents: agentsResult.total,
180
- totalRuns: runsResult.total,
181
- totalTools: toolsResult.total
182
- }
183
- },
184
- metadata: {
185
- timestamp: /* @__PURE__ */ new Date(),
186
- source: "agent-console"
187
- }
188
- };
189
- }
190
- if (presentationName === "agent-console.agent.list") {
191
- const result = await handlers.agent.listAgents({
192
- projectId,
193
- organizationId: "demo-org",
194
- limit: 50
195
- });
196
- return {
197
- data: result.items,
198
- metadata: {
199
- total: result.total,
200
- timestamp: /* @__PURE__ */ new Date(),
201
- source: "agent-console"
202
- }
203
- };
204
- }
205
- if (presentationName === "agent-console.run.list") {
206
- const result = await handlers.agent.listRuns({
207
- projectId,
208
- limit: 50
209
- });
210
- return {
211
- data: result.items,
212
- metadata: {
213
- total: result.total,
214
- timestamp: /* @__PURE__ */ new Date(),
215
- source: "agent-console"
216
- }
217
- };
218
- }
219
- if (presentationName === "agent-console.tool.registry") {
220
- const result = await handlers.agent.listTools({
221
- projectId,
222
- organizationId: "demo-org",
223
- limit: 50
224
- });
225
- return {
226
- data: result.items,
227
- metadata: {
228
- total: result.total,
229
- timestamp: /* @__PURE__ */ new Date(),
230
- source: "agent-console"
231
- }
232
- };
233
- }
234
- console.warn(`No data fetcher found for presentation: ${presentationName}`);
235
- return {
236
- data: null,
237
- metadata: {
238
- timestamp: /* @__PURE__ */ new Date(),
239
- source: "unknown"
240
- }
241
- };
242
- };
243
- if (mounted) setContext({
244
- template,
245
- runtime,
246
- installer,
247
- client,
248
- templateId,
249
- projectId,
250
- engine,
251
- handlers,
252
- fetchData
253
- });
254
- } catch (err) {
255
- logBootstrapFailure(err);
256
- if (mounted) setError(err instanceof Error ? err : /* @__PURE__ */ new Error("Unknown runtime error"));
257
- }
258
- }
259
- bootstrap();
260
- return () => {
261
- mounted = false;
262
- };
263
- }, [
264
- templateId,
265
- projectId,
266
- lazy
267
- ]);
268
- const components = useTemplateComponents(templateId);
269
- const contextValue = useMemo(() => {
270
- if (!context) return null;
271
- return {
272
- ...context,
273
- components
274
- };
275
- }, [context, components]);
276
- if (error) return /* @__PURE__ */ jsxs("div", {
277
- className: "rounded border border-red-200 bg-red-50 p-4 text-red-500",
278
- children: [/* @__PURE__ */ jsx("h3", {
279
- className: "font-bold",
280
- children: "Runtime Error"
281
- }), /* @__PURE__ */ jsx("pre", {
282
- className: "mt-2 overflow-auto text-xs",
283
- children: error.message
284
- })]
285
- });
286
- if (!contextValue) return /* @__PURE__ */ jsx("div", {
287
- className: "animate-pulse p-12 text-center text-gray-400",
288
- children: "Initializing runtime environment..."
289
- });
290
- return /* @__PURE__ */ jsx(ApolloProvider, {
291
- client: contextValue.client,
292
- children: /* @__PURE__ */ jsx(TemplateRuntimeContext.Provider, {
293
- value: contextValue,
294
- children
295
- })
296
- });
297
- }
298
- function useTemplateEngine() {
299
- return useTemplateRuntime().engine;
300
- }
301
- function useTemplateHandlers() {
302
- return useTemplateRuntime().handlers;
303
- }
304
- function useCrmHandlers() {
305
- return useTemplateHandlers().crm;
306
- }
307
- function useSaasHandlers() {
308
- return useTemplateHandlers().saas;
309
- }
310
- function useAgentHandlers() {
311
- return useTemplateHandlers().agent;
312
- }
313
- function useWorkflowHandlers() {
314
- return useTemplateHandlers().workflow;
315
- }
316
- function useMarketplaceHandlers() {
317
- return useTemplateHandlers().marketplace;
318
- }
319
- function useIntegrationHandlers() {
320
- return useTemplateHandlers().integration;
321
- }
322
- function useAnalyticsHandlers() {
323
- return useTemplateHandlers().analytics;
324
- }
325
-
326
- //#endregion
327
- export { TemplateHandlers, TemplateRuntimeProvider, useAgentHandlers, useAnalyticsHandlers, useCrmHandlers, useIntegrationHandlers, useMarketplaceHandlers, useSaasHandlers, useTemplateEngine, useTemplateHandlers, useWorkflowHandlers };
328
- //# sourceMappingURL=context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../src/runtime/context.tsx"],"sourcesContent":["'use client';\n\nimport { type PropsWithChildren, useEffect, useMemo, useState } from 'react';\nimport { ApolloProvider } from '@apollo/client/react';\nimport { web } from '@contractspec/lib.runtime-sandbox';\n\nconst { LocalRuntimeServices } = web;\n\nimport { type TransformEngine } from '@contractspec/lib.contracts/presentations';\n\n// Import handlers from example packages\nimport {\n createCrmHandlers,\n type CrmHandlers,\n} from '@contractspec/example.crm-pipeline';\nimport {\n createSaasHandlers,\n type SaasHandlers,\n} from '@contractspec/example.saas-boilerplate';\nimport {\n createAgentHandlers,\n type AgentHandlers,\n} from '@contractspec/example.agent-console';\nimport {\n createWorkflowHandlers,\n type WorkflowHandlers,\n} from '@contractspec/example.workflow-system';\nimport {\n createMarketplaceHandlers,\n type MarketplaceHandlers,\n} from '@contractspec/example.marketplace';\nimport {\n createIntegrationHandlers,\n type IntegrationHandlers,\n} from '@contractspec/example.integration-hub';\nimport {\n createAnalyticsHandlers,\n type AnalyticsHandlers,\n} from '@contractspec/example.analytics-dashboard';\nimport {\n createPolicySafeKnowledgeAssistantHandlers,\n type PolicySafeKnowledgeAssistantHandlers,\n} from '@contractspec/example.policy-safe-knowledge-assistant';\n\nimport { TemplateInstaller } from './installer';\nimport { getTemplate } from './registry';\nimport { getTemplateEngine } from './engine';\n\nimport {\n TemplateRuntimeContext,\n type TemplateRuntimeContextValue,\n type TemplateRuntimeProviderProps,\n useTemplateRuntime,\n useTemplateComponents,\n} from '@contractspec/lib.example-shared-ui';\n\nfunction logBootstrapFailure(error: unknown) {\n console.error(\n `\n[TemplateRuntime] Bootstrap Failed\n==================================\n\nThe runtime failed to initialize. This usually happens because:\n1. The PostgreSQL Web environment (pglite) failed to load\n2. The schema migration failed\n3. The initial seed data could not be inserted\n\nCheck the console for specific database errors.\n `.trim(),\n error\n );\n}\n\n/**\n * Template-specific handlers created from the runtime database\n */\nexport class TemplateHandlers {\n crm!: CrmHandlers;\n saas!: SaasHandlers;\n agent!: AgentHandlers;\n workflow!: WorkflowHandlers;\n marketplace!: MarketplaceHandlers;\n integration!: IntegrationHandlers;\n analytics!: AnalyticsHandlers;\n policySafeKnowledgeAssistant!: PolicySafeKnowledgeAssistantHandlers;\n}\n\nexport function TemplateRuntimeProvider({\n templateId,\n projectId = 'default-project',\n lazy = false,\n children,\n}: PropsWithChildren<TemplateRuntimeProviderProps>) {\n const [context, setContext] = useState<TemplateRuntimeContextValue | null>(\n null\n );\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let mounted = true;\n\n async function bootstrap() {\n try {\n if (lazy) return;\n\n // Load definition\n const template = getTemplate(templateId);\n if (!template) {\n throw new Error(`Template not found: ${templateId}`);\n }\n\n // Initialize runtime\n const runtime = new LocalRuntimeServices();\n await runtime.init({\n // In real app, we might persist to IndexedDB\n // dataDir: projectId // If persistence needed\n });\n\n // Initialize installer and run migrations/seeds\n const installer = new TemplateInstaller({ runtime });\n await installer.install(templateId, { projectId });\n\n // Create Apollo Client linked to local schema\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const client = (web as any).createLocalGraphqlClient(runtime);\n\n // Get or create transform engine\n const engine = await getTemplateEngine();\n\n // Initialize Handlers\n const handlers = new TemplateHandlers();\n handlers.crm = createCrmHandlers(runtime.db);\n handlers.saas = createSaasHandlers(runtime.db);\n handlers.agent = createAgentHandlers(runtime.db);\n handlers.workflow = createWorkflowHandlers(runtime.db);\n handlers.marketplace = createMarketplaceHandlers(runtime.db);\n handlers.integration = createIntegrationHandlers(runtime.db);\n handlers.analytics = createAnalyticsHandlers(runtime.db);\n handlers.policySafeKnowledgeAssistant =\n createPolicySafeKnowledgeAssistantHandlers(runtime.db);\n\n // Create data fetcher using the initialized handlers\n const fetchData = async (presentationName: string) => {\n // CRM Pipeline\n if (presentationName === 'crm-pipeline.dashboard') {\n const [dealsResult, stages] = await Promise.all([\n handlers.crm.listDeals({\n projectId,\n pipelineId: 'pipeline-1',\n limit: 50,\n }),\n handlers.crm.getPipelineStages({ pipelineId: 'pipeline-1' }),\n ]);\n return {\n data: {\n deals: dealsResult.deals,\n stages,\n summary: {\n total: dealsResult.total,\n totalValue: dealsResult.totalValue,\n },\n },\n metadata: {\n total: dealsResult.total,\n timestamp: new Date(),\n source: 'crm-pipeline',\n },\n };\n }\n if (presentationName === 'crm-pipeline.deal.pipeline') {\n const [dealsResult, stages] = await Promise.all([\n handlers.crm.listDeals({\n projectId,\n pipelineId: 'pipeline-1',\n limit: 100,\n }),\n handlers.crm.getPipelineStages({ pipelineId: 'pipeline-1' }),\n ]);\n return {\n data: {\n deals: dealsResult.deals,\n stages,\n total: dealsResult.total,\n totalValue: dealsResult.totalValue,\n },\n metadata: {\n total: dealsResult.total,\n timestamp: new Date(),\n source: 'crm-pipeline',\n },\n };\n }\n\n // SaaS Boilerplate\n if (presentationName === 'saas-boilerplate.dashboard') {\n const [projectsResult, subscription] = await Promise.all([\n handlers.saas.listProjects({ projectId, limit: 10 }),\n handlers.saas.getSubscription({ projectId }),\n ]);\n return {\n data: {\n projects: projectsResult.items,\n subscription,\n summary: { totalProjects: projectsResult.total },\n },\n metadata: {\n total: projectsResult.total,\n timestamp: new Date(),\n source: 'saas-boilerplate',\n },\n };\n }\n if (presentationName === 'saas-boilerplate.project.list') {\n const result = await handlers.saas.listProjects({\n projectId,\n limit: 50,\n });\n return {\n data: result.items,\n metadata: {\n total: result.total,\n timestamp: new Date(),\n source: 'saas-boilerplate',\n },\n };\n }\n if (presentationName === 'saas-boilerplate.billing.settings') {\n const subscription = await handlers.saas.getSubscription({\n projectId,\n });\n return {\n data: subscription,\n metadata: { timestamp: new Date(), source: 'saas-boilerplate' },\n };\n }\n\n // Agent Console\n if (presentationName === 'agent-console.dashboard') {\n const [agentsResult, runsResult, toolsResult] = await Promise.all([\n handlers.agent.listAgents({\n projectId,\n organizationId: 'demo-org',\n limit: 10,\n }),\n handlers.agent.listRuns({ projectId, limit: 10 }),\n handlers.agent.listTools({\n projectId,\n organizationId: 'demo-org',\n limit: 10,\n }),\n ]);\n return {\n data: {\n agents: agentsResult.items,\n runs: runsResult.items,\n tools: toolsResult.items,\n summary: {\n totalAgents: agentsResult.total,\n totalRuns: runsResult.total,\n totalTools: toolsResult.total,\n },\n },\n metadata: { timestamp: new Date(), source: 'agent-console' },\n };\n }\n if (presentationName === 'agent-console.agent.list') {\n const result = await handlers.agent.listAgents({\n projectId,\n organizationId: 'demo-org',\n limit: 50,\n });\n return {\n data: result.items,\n metadata: {\n total: result.total,\n timestamp: new Date(),\n source: 'agent-console',\n },\n };\n }\n if (presentationName === 'agent-console.run.list') {\n const result = await handlers.agent.listRuns({\n projectId,\n limit: 50,\n });\n return {\n data: result.items,\n metadata: {\n total: result.total,\n timestamp: new Date(),\n source: 'agent-console',\n },\n };\n }\n if (presentationName === 'agent-console.tool.registry') {\n const result = await handlers.agent.listTools({\n projectId,\n organizationId: 'demo-org',\n limit: 50,\n });\n return {\n data: result.items,\n metadata: {\n total: result.total,\n timestamp: new Date(),\n source: 'agent-console',\n },\n };\n }\n\n // Default fallback\n console.warn(\n `No data fetcher found for presentation: ${presentationName}`\n );\n return {\n data: null,\n metadata: { timestamp: new Date(), source: 'unknown' },\n };\n };\n\n if (mounted) {\n setContext({\n template,\n runtime,\n installer,\n client,\n templateId,\n projectId,\n engine,\n handlers,\n fetchData,\n });\n }\n } catch (err) {\n logBootstrapFailure(err);\n if (mounted) {\n setError(\n err instanceof Error ? err : new Error('Unknown runtime error')\n );\n }\n }\n }\n\n bootstrap();\n\n return () => {\n mounted = false;\n };\n }, [templateId, projectId, lazy]);\n\n // Load registered components\n const components = useTemplateComponents(templateId);\n\n // Combine context with components\n const contextValue = useMemo(() => {\n if (!context) return null;\n return {\n ...context,\n components,\n };\n }, [context, components]);\n\n if (error) {\n return (\n <div className=\"rounded border border-red-200 bg-red-50 p-4 text-red-500\">\n <h3 className=\"font-bold\">Runtime Error</h3>\n <pre className=\"mt-2 overflow-auto text-xs\">{error.message}</pre>\n </div>\n );\n }\n\n if (!contextValue) {\n return (\n <div className=\"animate-pulse p-12 text-center text-gray-400\">\n Initializing runtime environment...\n </div>\n );\n }\n\n return (\n <ApolloProvider client={contextValue.client}>\n <TemplateRuntimeContext.Provider value={contextValue}>\n {children}\n </TemplateRuntimeContext.Provider>\n </ApolloProvider>\n );\n}\n\n// Hook to access the TransformEngine for rendering presentations\nexport function useTemplateEngine(): TransformEngine {\n return useTemplateRuntime().engine;\n}\n\n// Hook to access the database-backed template handlers\nexport function useTemplateHandlers(): TemplateHandlers {\n return useTemplateRuntime<TemplateHandlers>().handlers;\n}\n\n// Hook to access CRM-specific handlers\nexport function useCrmHandlers(): CrmHandlers {\n return useTemplateHandlers().crm;\n}\n\n// Hook to access SaaS-specific handlers\nexport function useSaasHandlers(): SaasHandlers {\n return useTemplateHandlers().saas;\n}\n\n// Hook to access Agent Console-specific handlers\nexport function useAgentHandlers(): AgentHandlers {\n return useTemplateHandlers().agent;\n}\n\n// Hook to access Workflow-specific handlers\nexport function useWorkflowHandlers(): WorkflowHandlers {\n return useTemplateHandlers().workflow;\n}\n\n// Hook to access Marketplace-specific handlers\nexport function useMarketplaceHandlers(): MarketplaceHandlers {\n return useTemplateHandlers().marketplace;\n}\n\n// Hook to access Integration Hub-specific handlers\nexport function useIntegrationHandlers(): IntegrationHandlers {\n return useTemplateHandlers().integration;\n}\n\n// Hook to access Analytics Dashboard-specific handlers\nexport function useAnalyticsHandlers(): AnalyticsHandlers {\n return useTemplateHandlers().analytics;\n}\n\n// End of file\n"],"mappings":"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"}
@@ -1,81 +0,0 @@
1
- import { createDefaultTransformEngine, registerBasicValidation, registerDefaultReactRenderer } from "@contractspec/lib.contracts/presentations";
2
- import { agentDashboardMarkdownRenderer, agentListMarkdownRenderer, agentListReactRenderer, runListMarkdownRenderer, toolRegistryMarkdownRenderer } from "@contractspec/example.agent-console";
3
- import { projectListMarkdownRenderer, projectListReactRenderer, saasBillingMarkdownRenderer, saasDashboardMarkdownRenderer } from "@contractspec/example.saas-boilerplate";
4
- import { crmDashboardMarkdownRenderer, crmPipelineMarkdownRenderer, crmPipelineReactRenderer } from "@contractspec/example.crm-pipeline";
5
- import { workflowDashboardMarkdownRenderer, workflowDefinitionListMarkdownRenderer, workflowInstanceDetailMarkdownRenderer } from "@contractspec/example.workflow-system";
6
- import { marketplaceDashboardMarkdownRenderer, orderListMarkdownRenderer, productCatalogMarkdownRenderer } from "@contractspec/example.marketplace";
7
- import { connectionListMarkdownRenderer, integrationDashboardMarkdownRenderer, syncConfigMarkdownRenderer } from "@contractspec/example.integration-hub";
8
- import { analyticsDashboardMarkdownRenderer, dashboardListMarkdownRenderer, queryBuilderMarkdownRenderer } from "@contractspec/example.analytics-dashboard";
9
-
10
- //#region src/runtime/engine.ts
11
- /**
12
- * Template TransformEngine Setup
13
- *
14
- * Creates and configures a TransformEngine instance with all template-specific
15
- * renderers for React and Markdown targets.
16
- */
17
- /**
18
- * Create a TransformEngine configured for template rendering
19
- */
20
- function createTemplateTransformEngine() {
21
- const engine = createDefaultTransformEngine();
22
- registerDefaultReactRenderer(engine);
23
- registerBasicValidation(engine);
24
- registerTemplateRenderers(engine);
25
- return engine;
26
- }
27
- /**
28
- * Register all template-specific renderers
29
- *
30
- * Custom markdown renderers are registered here and will be tried AFTER
31
- * the default schema-driven renderer. Each custom renderer is responsible
32
- * for checking if it handles the specific presentation (via componentKey)
33
- * and throwing if not, allowing the next renderer in the chain to try.
34
- */
35
- function registerTemplateRenderers(engine) {
36
- engine.register(agentListReactRenderer);
37
- engine.register(agentListMarkdownRenderer);
38
- engine.register(runListMarkdownRenderer);
39
- engine.register(toolRegistryMarkdownRenderer);
40
- engine.register(agentDashboardMarkdownRenderer);
41
- engine.register(projectListReactRenderer);
42
- engine.register(projectListMarkdownRenderer);
43
- engine.register(saasDashboardMarkdownRenderer);
44
- engine.register(saasBillingMarkdownRenderer);
45
- engine.register(crmPipelineReactRenderer);
46
- engine.register(crmPipelineMarkdownRenderer);
47
- engine.register(crmDashboardMarkdownRenderer);
48
- engine.register(workflowDashboardMarkdownRenderer);
49
- engine.register(workflowDefinitionListMarkdownRenderer);
50
- engine.register(workflowInstanceDetailMarkdownRenderer);
51
- engine.register(marketplaceDashboardMarkdownRenderer);
52
- engine.register(productCatalogMarkdownRenderer);
53
- engine.register(orderListMarkdownRenderer);
54
- engine.register(integrationDashboardMarkdownRenderer);
55
- engine.register(connectionListMarkdownRenderer);
56
- engine.register(syncConfigMarkdownRenderer);
57
- engine.register(analyticsDashboardMarkdownRenderer);
58
- engine.register(dashboardListMarkdownRenderer);
59
- engine.register(queryBuilderMarkdownRenderer);
60
- }
61
- /**
62
- * Singleton instance for shared engine
63
- */
64
- let templateEngine = null;
65
- /**
66
- * Get or create the shared template engine instance
67
- */
68
- function getTemplateEngine() {
69
- if (!templateEngine) templateEngine = createTemplateTransformEngine();
70
- return templateEngine;
71
- }
72
- /**
73
- * Reset the shared engine (useful for testing)
74
- */
75
- function resetTemplateEngine() {
76
- templateEngine = null;
77
- }
78
-
79
- //#endregion
80
- export { createTemplateTransformEngine, getTemplateEngine, resetTemplateEngine };
81
- //# sourceMappingURL=engine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.js","names":[],"sources":["../../src/runtime/engine.ts"],"sourcesContent":["/**\n * Template TransformEngine Setup\n *\n * Creates and configures a TransformEngine instance with all template-specific\n * renderers for React and Markdown targets.\n */\nimport {\n createDefaultTransformEngine,\n registerBasicValidation,\n registerDefaultReactRenderer,\n type TransformEngine,\n} from '@contractspec/lib.contracts/presentations';\n\n// Import template renderers from example packages\nimport {\n agentDashboardMarkdownRenderer,\n agentListMarkdownRenderer,\n agentListReactRenderer,\n runListMarkdownRenderer,\n toolRegistryMarkdownRenderer,\n} from '@contractspec/example.agent-console';\n\nimport {\n projectListMarkdownRenderer,\n projectListReactRenderer,\n saasBillingMarkdownRenderer,\n saasDashboardMarkdownRenderer,\n} from '@contractspec/example.saas-boilerplate';\n\nimport {\n crmDashboardMarkdownRenderer,\n crmPipelineMarkdownRenderer,\n crmPipelineReactRenderer,\n} from '@contractspec/example.crm-pipeline';\n\nimport {\n workflowDashboardMarkdownRenderer,\n workflowDefinitionListMarkdownRenderer,\n workflowInstanceDetailMarkdownRenderer,\n} from '@contractspec/example.workflow-system';\n\nimport {\n marketplaceDashboardMarkdownRenderer,\n orderListMarkdownRenderer,\n productCatalogMarkdownRenderer,\n} from '@contractspec/example.marketplace';\n\nimport {\n connectionListMarkdownRenderer,\n integrationDashboardMarkdownRenderer,\n syncConfigMarkdownRenderer,\n} from '@contractspec/example.integration-hub';\n\nimport {\n analyticsDashboardMarkdownRenderer,\n dashboardListMarkdownRenderer,\n queryBuilderMarkdownRenderer,\n} from '@contractspec/example.analytics-dashboard';\n\n/**\n * Create a TransformEngine configured for template rendering\n */\nexport function createTemplateTransformEngine(): TransformEngine {\n const engine = createDefaultTransformEngine();\n\n // Register default renderers\n registerDefaultReactRenderer(engine);\n registerBasicValidation(engine);\n\n // Register template-specific renderers\n registerTemplateRenderers(engine);\n\n return engine;\n}\n\n/**\n * Register all template-specific renderers\n *\n * Custom markdown renderers are registered here and will be tried AFTER\n * the default schema-driven renderer. Each custom renderer is responsible\n * for checking if it handles the specific presentation (via componentKey)\n * and throwing if not, allowing the next renderer in the chain to try.\n */\nfunction registerTemplateRenderers(engine: TransformEngine): void {\n // Agent Console renderers\n engine.register(agentListReactRenderer);\n engine.register(agentListMarkdownRenderer);\n engine.register(runListMarkdownRenderer);\n engine.register(toolRegistryMarkdownRenderer);\n engine.register(agentDashboardMarkdownRenderer);\n\n // SaaS Boilerplate renderers\n engine.register(projectListReactRenderer);\n engine.register(projectListMarkdownRenderer);\n engine.register(saasDashboardMarkdownRenderer);\n engine.register(saasBillingMarkdownRenderer);\n\n // CRM Pipeline renderers\n engine.register(crmPipelineReactRenderer);\n engine.register(crmPipelineMarkdownRenderer);\n engine.register(crmDashboardMarkdownRenderer);\n\n // Workflow System renderers\n engine.register(workflowDashboardMarkdownRenderer);\n engine.register(workflowDefinitionListMarkdownRenderer);\n engine.register(workflowInstanceDetailMarkdownRenderer);\n\n // Marketplace renderers\n engine.register(marketplaceDashboardMarkdownRenderer);\n engine.register(productCatalogMarkdownRenderer);\n engine.register(orderListMarkdownRenderer);\n\n // Integration Hub renderers\n engine.register(integrationDashboardMarkdownRenderer);\n engine.register(connectionListMarkdownRenderer);\n engine.register(syncConfigMarkdownRenderer);\n\n // Analytics Dashboard renderers\n engine.register(analyticsDashboardMarkdownRenderer);\n engine.register(dashboardListMarkdownRenderer);\n engine.register(queryBuilderMarkdownRenderer);\n}\n\n/**\n * Singleton instance for shared engine\n */\nlet templateEngine: TransformEngine | null = null;\n\n/**\n * Get or create the shared template engine instance\n */\nexport function getTemplateEngine(): TransformEngine {\n if (!templateEngine) {\n templateEngine = createTemplateTransformEngine();\n }\n return templateEngine;\n}\n\n/**\n * Reset the shared engine (useful for testing)\n */\nexport function resetTemplateEngine(): void {\n templateEngine = null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA8DA,SAAgB,gCAAiD;CAC/D,MAAM,SAAS,8BAA8B;AAG7C,8BAA6B,OAAO;AACpC,yBAAwB,OAAO;AAG/B,2BAA0B,OAAO;AAEjC,QAAO;;;;;;;;;;AAWT,SAAS,0BAA0B,QAA+B;AAEhE,QAAO,SAAS,uBAAuB;AACvC,QAAO,SAAS,0BAA0B;AAC1C,QAAO,SAAS,wBAAwB;AACxC,QAAO,SAAS,6BAA6B;AAC7C,QAAO,SAAS,+BAA+B;AAG/C,QAAO,SAAS,yBAAyB;AACzC,QAAO,SAAS,4BAA4B;AAC5C,QAAO,SAAS,8BAA8B;AAC9C,QAAO,SAAS,4BAA4B;AAG5C,QAAO,SAAS,yBAAyB;AACzC,QAAO,SAAS,4BAA4B;AAC5C,QAAO,SAAS,6BAA6B;AAG7C,QAAO,SAAS,kCAAkC;AAClD,QAAO,SAAS,uCAAuC;AACvD,QAAO,SAAS,uCAAuC;AAGvD,QAAO,SAAS,qCAAqC;AACrD,QAAO,SAAS,+BAA+B;AAC/C,QAAO,SAAS,0BAA0B;AAG1C,QAAO,SAAS,qCAAqC;AACrD,QAAO,SAAS,+BAA+B;AAC/C,QAAO,SAAS,2BAA2B;AAG3C,QAAO,SAAS,mCAAmC;AACnD,QAAO,SAAS,8BAA8B;AAC9C,QAAO,SAAS,6BAA6B;;;;;AAM/C,IAAI,iBAAyC;;;;AAK7C,SAAgB,oBAAqC;AACnD,KAAI,CAAC,eACH,kBAAiB,+BAA+B;AAElD,QAAO;;;;;AAMT,SAAgB,sBAA4B;AAC1C,kBAAiB"}
@@ -1,103 +0,0 @@
1
- 'use client';
2
-
3
- import { TEMPLATE_REGISTRY, getTemplate } from "./registry.js";
4
- import { ContractSpecRegistryClient } from "./registry-client.js";
5
- import { web } from "@contractspec/lib.runtime-sandbox";
6
-
7
- //#region src/runtime/installer.ts
8
- const { LocalRuntimeServices } = web;
9
- const SAVE_TEMPLATE_MUTATION = `
10
- mutation SaveTemplateToStudio($input: SaveTemplateInput!) {
11
- saveTemplateToStudio(input: $input) {
12
- projectId
13
- status
14
- }
15
- }
16
- `;
17
- var TemplateInstaller = class {
18
- runtime;
19
- endpoint;
20
- registryUrl;
21
- fetchImpl;
22
- constructor(options = {}) {
23
- this.runtime = options.runtime ?? new LocalRuntimeServices();
24
- this.endpoint = options.endpoint ?? "/api/graphql";
25
- this.registryUrl = options.registryUrl ? options.registryUrl.replace(/\/+$/, "") : null;
26
- this.fetchImpl = options.fetchImpl ?? fetch;
27
- }
28
- async init() {
29
- await this.runtime.init();
30
- }
31
- list(filter) {
32
- return filter ? TEMPLATE_REGISTRY.filter((template) => {
33
- if (filter.category && filter.category !== template.category) return false;
34
- if (filter.complexity && filter.complexity !== template.complexity) return false;
35
- if (filter.tag && !template.tags.includes(filter.tag)) return false;
36
- return true;
37
- }) : TEMPLATE_REGISTRY;
38
- }
39
- /**
40
- * List templates published to the ContractSpec Registry.
41
- *
42
- * Note: this returns *metadata* only. Installing still requires a local template
43
- * implementation unless/until we support seeding templates from registry payloads.
44
- */
45
- async listRemoteTemplates() {
46
- if (!this.registryUrl) return [];
47
- return await new ContractSpecRegistryClient({
48
- registryUrl: this.registryUrl,
49
- fetchImpl: this.fetchImpl
50
- }).listTemplateSummaries();
51
- }
52
- /**
53
- * Resolve a registry template id to a local TemplateId if available.
54
- */
55
- resolveLocalTemplateId(id) {
56
- return getTemplate(id) ? id : null;
57
- }
58
- get(templateId) {
59
- return getTemplate(templateId);
60
- }
61
- async install(templateId, options = {}) {
62
- await this.runtime.seedTemplate({
63
- templateId,
64
- projectId: options.projectId
65
- });
66
- }
67
- async saveToStudio(options) {
68
- const payload = toBase64(await this.runtime.db.export());
69
- const response = await this.fetchImpl(options.endpoint ?? this.endpoint, {
70
- method: "POST",
71
- headers: {
72
- "Content-Type": "application/json",
73
- ...options.token ? { Authorization: `Bearer ${options.token}` } : {}
74
- },
75
- body: JSON.stringify({
76
- query: SAVE_TEMPLATE_MUTATION,
77
- variables: { input: {
78
- templateId: options.templateId,
79
- projectName: options.projectName,
80
- organizationId: options.organizationId,
81
- payload
82
- } }
83
- })
84
- });
85
- if (!response.ok) throw new Error(`Failed to save template: ${response.status} ${response.statusText}`);
86
- const json = await response.json();
87
- if (json.errors?.length) throw new Error(json.errors[0]?.message ?? "Unknown error");
88
- if (!json.data?.saveTemplateToStudio) throw new Error("Invalid response from Studio API");
89
- return json.data.saveTemplateToStudio;
90
- }
91
- };
92
- function toBase64(bytes) {
93
- if (typeof Buffer !== "undefined") return Buffer.from(bytes).toString("base64");
94
- let binary = "";
95
- bytes.forEach((value) => {
96
- binary += String.fromCharCode(value);
97
- });
98
- return btoa(binary);
99
- }
100
-
101
- //#endregion
102
- export { TemplateInstaller };
103
- //# sourceMappingURL=installer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"installer.js","names":[],"sources":["../../src/runtime/installer.ts"],"sourcesContent":["'use client';\n\nimport { getTemplate, TEMPLATE_REGISTRY } from './registry';\nimport type {\n TemplateDefinition,\n TemplateFilter,\n TemplateId,\n InstallTemplateOptions,\n SaveTemplateOptions,\n SaveTemplateResult,\n} from '@contractspec/lib.example-shared-ui';\nimport {\n ContractSpecRegistryClient,\n type RegistryTemplateSummary,\n} from './registry-client';\nimport { web } from '@contractspec/lib.runtime-sandbox';\n\nconst { LocalRuntimeServices } = web;\ntype LocalRuntimeServices = InstanceType<typeof LocalRuntimeServices>;\n\nconst SAVE_TEMPLATE_MUTATION = `\n mutation SaveTemplateToStudio($input: SaveTemplateInput!) {\n saveTemplateToStudio(input: $input) {\n projectId\n status\n }\n }\n`;\n\nexport interface TemplateInstallerOptions {\n runtime?: LocalRuntimeServices;\n endpoint?: string;\n /** Optional registry server base URL (enables listing remote/community templates) */\n registryUrl?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport class TemplateInstaller {\n private readonly runtime: LocalRuntimeServices;\n private readonly endpoint: string;\n private readonly registryUrl: string | null;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: TemplateInstallerOptions = {}) {\n this.runtime = options.runtime ?? new LocalRuntimeServices();\n this.endpoint = options.endpoint ?? '/api/graphql';\n this.registryUrl = options.registryUrl\n ? options.registryUrl.replace(/\\/+$/, '')\n : null;\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n async init(): Promise<void> {\n await this.runtime.init();\n }\n\n list(filter?: TemplateFilter): TemplateDefinition[] {\n return filter\n ? TEMPLATE_REGISTRY.filter((template) => {\n if (filter.category && filter.category !== template.category) {\n return false;\n }\n if (filter.complexity && filter.complexity !== template.complexity) {\n return false;\n }\n if (filter.tag && !template.tags.includes(filter.tag)) {\n return false;\n }\n return true;\n })\n : TEMPLATE_REGISTRY;\n }\n\n /**\n * List templates published to the ContractSpec Registry.\n *\n * Note: this returns *metadata* only. Installing still requires a local template\n * implementation unless/until we support seeding templates from registry payloads.\n */\n async listRemoteTemplates(): Promise<RegistryTemplateSummary[]> {\n if (!this.registryUrl) return [];\n const client = new ContractSpecRegistryClient({\n registryUrl: this.registryUrl,\n fetchImpl: this.fetchImpl,\n });\n return await client.listTemplateSummaries();\n }\n\n /**\n * Resolve a registry template id to a local TemplateId if available.\n */\n resolveLocalTemplateId(id: string): TemplateId | null {\n const found = getTemplate(id as TemplateId);\n return found ? (id as TemplateId) : null;\n }\n\n get(templateId: TemplateId): TemplateDefinition | undefined {\n return getTemplate(templateId);\n }\n\n async install(\n templateId: TemplateId,\n options: InstallTemplateOptions = {}\n ): Promise<void> {\n await this.runtime.seedTemplate({\n templateId,\n projectId: options.projectId,\n });\n }\n\n async saveToStudio(\n options: SaveTemplateOptions\n ): Promise<SaveTemplateResult> {\n const snapshot = await this.runtime.db.export();\n const payload = toBase64(snapshot);\n const response = await this.fetchImpl(options.endpoint ?? this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(options.token ? { Authorization: `Bearer ${options.token}` } : {}),\n },\n body: JSON.stringify({\n query: SAVE_TEMPLATE_MUTATION,\n variables: {\n input: {\n templateId: options.templateId,\n projectName: options.projectName,\n organizationId: options.organizationId,\n payload,\n },\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to save template: ${response.status} ${response.statusText}`\n );\n }\n\n const json = (await response.json()) as {\n data?: {\n saveTemplateToStudio: SaveTemplateResult;\n };\n errors?: { message: string }[];\n };\n\n if (json.errors?.length) {\n throw new Error(json.errors[0]?.message ?? 'Unknown error');\n }\n\n if (!json.data?.saveTemplateToStudio) {\n throw new Error('Invalid response from Studio API');\n }\n\n return json.data.saveTemplateToStudio;\n }\n}\n\nfunction toBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(bytes).toString('base64');\n }\n let binary = '';\n bytes.forEach((value) => {\n binary += String.fromCharCode(value);\n });\n return btoa(binary);\n}\n"],"mappings":";;;;;;;AAiBA,MAAM,EAAE,yBAAyB;AAGjC,MAAM,yBAAyB;;;;;;;;AAiB/B,IAAa,oBAAb,MAA+B;CAC7B,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,UAAoC,EAAE,EAAE;AAClD,OAAK,UAAU,QAAQ,WAAW,IAAI,sBAAsB;AAC5D,OAAK,WAAW,QAAQ,YAAY;AACpC,OAAK,cAAc,QAAQ,cACvB,QAAQ,YAAY,QAAQ,QAAQ,GAAG,GACvC;AACJ,OAAK,YAAY,QAAQ,aAAa;;CAGxC,MAAM,OAAsB;AAC1B,QAAM,KAAK,QAAQ,MAAM;;CAG3B,KAAK,QAA+C;AAClD,SAAO,SACH,kBAAkB,QAAQ,aAAa;AACrC,OAAI,OAAO,YAAY,OAAO,aAAa,SAAS,SAClD,QAAO;AAET,OAAI,OAAO,cAAc,OAAO,eAAe,SAAS,WACtD,QAAO;AAET,OAAI,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,IAAI,CACnD,QAAO;AAET,UAAO;IACP,GACF;;;;;;;;CASN,MAAM,sBAA0D;AAC9D,MAAI,CAAC,KAAK,YAAa,QAAO,EAAE;AAKhC,SAAO,MAJQ,IAAI,2BAA2B;GAC5C,aAAa,KAAK;GAClB,WAAW,KAAK;GACjB,CAAC,CACkB,uBAAuB;;;;;CAM7C,uBAAuB,IAA+B;AAEpD,SADc,YAAY,GAAiB,GAC3B,KAAoB;;CAGtC,IAAI,YAAwD;AAC1D,SAAO,YAAY,WAAW;;CAGhC,MAAM,QACJ,YACA,UAAkC,EAAE,EACrB;AACf,QAAM,KAAK,QAAQ,aAAa;GAC9B;GACA,WAAW,QAAQ;GACpB,CAAC;;CAGJ,MAAM,aACJ,SAC6B;EAE7B,MAAM,UAAU,SADC,MAAM,KAAK,QAAQ,GAAG,QAAQ,CACb;EAClC,MAAM,WAAW,MAAM,KAAK,UAAU,QAAQ,YAAY,KAAK,UAAU;GACvE,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,GAAI,QAAQ,QAAQ,EAAE,eAAe,UAAU,QAAQ,SAAS,GAAG,EAAE;IACtE;GACD,MAAM,KAAK,UAAU;IACnB,OAAO;IACP,WAAW,EACT,OAAO;KACL,YAAY,QAAQ;KACpB,aAAa,QAAQ;KACrB,gBAAgB,QAAQ;KACxB;KACD,EACF;IACF,CAAC;GACH,CAAC;AAEF,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MACR,4BAA4B,SAAS,OAAO,GAAG,SAAS,aACzD;EAGH,MAAM,OAAQ,MAAM,SAAS,MAAM;AAOnC,MAAI,KAAK,QAAQ,OACf,OAAM,IAAI,MAAM,KAAK,OAAO,IAAI,WAAW,gBAAgB;AAG7D,MAAI,CAAC,KAAK,MAAM,qBACd,OAAM,IAAI,MAAM,mCAAmC;AAGrD,SAAO,KAAK,KAAK;;;AAIrB,SAAS,SAAS,OAA2B;AAC3C,KAAI,OAAO,WAAW,YACpB,QAAO,OAAO,KAAK,MAAM,CAAC,SAAS,SAAS;CAE9C,IAAI,SAAS;AACb,OAAM,SAAS,UAAU;AACvB,YAAU,OAAO,aAAa,MAAM;GACpC;AACF,QAAO,KAAK,OAAO"}
@@ -1,42 +0,0 @@
1
- //#region src/runtime/registry-client.ts
2
- var ContractSpecRegistryClient = class {
3
- baseUrl;
4
- fetchImpl;
5
- constructor(options) {
6
- this.baseUrl = options.registryUrl.replace(/\/+$/, "");
7
- this.fetchImpl = options.fetchImpl ?? fetch;
8
- }
9
- async getManifest() {
10
- const res = await this.fetchImpl(`${this.baseUrl}/r/contractspec.json`, {
11
- method: "GET",
12
- headers: { Accept: "application/json" }
13
- });
14
- if (!res.ok) throw new Error(`Registry manifest fetch failed: ${res.status} ${res.statusText}`);
15
- return await res.json();
16
- }
17
- async listByType(type) {
18
- return (await this.getManifest()).items.filter((i) => i.type === type);
19
- }
20
- async listTemplateSummaries() {
21
- return (await this.listByType("contractspec:template")).map((t) => ({
22
- id: t.key,
23
- title: t.title,
24
- description: t.description,
25
- version: t.version,
26
- tags: t.meta.tags,
27
- source: "registry"
28
- }));
29
- }
30
- async getItem(typeSegment, name) {
31
- const res = await this.fetchImpl(`${this.baseUrl}/r/contractspec/${typeSegment}/${name}.json`, {
32
- method: "GET",
33
- headers: { Accept: "application/json" }
34
- });
35
- if (!res.ok) throw new Error(`Registry item fetch failed: ${res.status} ${res.statusText}`);
36
- return await res.json();
37
- }
38
- };
39
-
40
- //#endregion
41
- export { ContractSpecRegistryClient };
42
- //# sourceMappingURL=registry-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry-client.js","names":[],"sources":["../../src/runtime/registry-client.ts"],"sourcesContent":["import type {\n ContractRegistryItem,\n ContractRegistryItemType,\n ContractRegistryManifest,\n} from '@contractspec/lib.contracts';\n\nexport interface RegistryTemplateSummary {\n id: string;\n title: string;\n description: string;\n version: string;\n tags: string[];\n source: 'registry';\n}\n\nexport interface RegistryClientOptions {\n registryUrl: string;\n fetchImpl?: typeof fetch;\n}\n\nexport class ContractSpecRegistryClient {\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: RegistryClientOptions) {\n this.baseUrl = options.registryUrl.replace(/\\/+$/, '');\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n async getManifest(): Promise<ContractRegistryManifest> {\n const res = await this.fetchImpl(`${this.baseUrl}/r/contractspec.json`, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) {\n throw new Error(\n `Registry manifest fetch failed: ${res.status} ${res.statusText}`\n );\n }\n return (await res.json()) as ContractRegistryManifest;\n }\n\n async listByType(\n type: ContractRegistryItemType\n ): Promise<ContractRegistryItem[]> {\n const manifest = await this.getManifest();\n return manifest.items.filter((i) => i.type === type);\n }\n\n async listTemplateSummaries(): Promise<RegistryTemplateSummary[]> {\n const templates = await this.listByType('contractspec:template');\n return templates.map((t) => ({\n id: t.key,\n title: t.title,\n description: t.description,\n version: t.version,\n tags: t.meta.tags,\n source: 'registry',\n }));\n }\n\n async getItem(\n typeSegment: string,\n name: string\n ): Promise<ContractRegistryItem> {\n const res = await this.fetchImpl(\n `${this.baseUrl}/r/contractspec/${typeSegment}/${name}.json`,\n {\n method: 'GET',\n headers: { Accept: 'application/json' },\n }\n );\n if (!res.ok) {\n throw new Error(\n `Registry item fetch failed: ${res.status} ${res.statusText}`\n );\n }\n return (await res.json()) as ContractRegistryItem;\n }\n}\n"],"mappings":";AAoBA,IAAa,6BAAb,MAAwC;CACtC,AAAiB;CACjB,AAAiB;CAEjB,YAAY,SAAgC;AAC1C,OAAK,UAAU,QAAQ,YAAY,QAAQ,QAAQ,GAAG;AACtD,OAAK,YAAY,QAAQ,aAAa;;CAGxC,MAAM,cAAiD;EACrD,MAAM,MAAM,MAAM,KAAK,UAAU,GAAG,KAAK,QAAQ,uBAAuB;GACtE,QAAQ;GACR,SAAS,EAAE,QAAQ,oBAAoB;GACxC,CAAC;AACF,MAAI,CAAC,IAAI,GACP,OAAM,IAAI,MACR,mCAAmC,IAAI,OAAO,GAAG,IAAI,aACtD;AAEH,SAAQ,MAAM,IAAI,MAAM;;CAG1B,MAAM,WACJ,MACiC;AAEjC,UADiB,MAAM,KAAK,aAAa,EACzB,MAAM,QAAQ,MAAM,EAAE,SAAS,KAAK;;CAGtD,MAAM,wBAA4D;AAEhE,UADkB,MAAM,KAAK,WAAW,wBAAwB,EAC/C,KAAK,OAAO;GAC3B,IAAI,EAAE;GACN,OAAO,EAAE;GACT,aAAa,EAAE;GACf,SAAS,EAAE;GACX,MAAM,EAAE,KAAK;GACb,QAAQ;GACT,EAAE;;CAGL,MAAM,QACJ,aACA,MAC+B;EAC/B,MAAM,MAAM,MAAM,KAAK,UACrB,GAAG,KAAK,QAAQ,kBAAkB,YAAY,GAAG,KAAK,QACtD;GACE,QAAQ;GACR,SAAS,EAAE,QAAQ,oBAAoB;GACxC,CACF;AACD,MAAI,CAAC,IAAI,GACP,OAAM,IAAI,MACR,+BAA+B,IAAI,OAAO,GAAG,IAAI,aAClD;AAEH,SAAQ,MAAM,IAAI,MAAM"}