@soulcraft/sdk 1.6.2 → 2.0.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.
- package/dist/client/create-client-sdk.d.ts +16 -2
- package/dist/client/create-client-sdk.d.ts.map +1 -1
- package/dist/client/create-client-sdk.js +2 -7
- package/dist/client/create-client-sdk.js.map +1 -1
- package/dist/client/index.d.ts +48 -37
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +61 -42
- package/dist/client/index.js.map +1 -1
- package/dist/client/namespace-proxy.d.ts +108 -0
- package/dist/client/namespace-proxy.d.ts.map +1 -0
- package/dist/client/namespace-proxy.js +151 -0
- package/dist/client/namespace-proxy.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modules/app-context/index.d.ts +214 -0
- package/dist/modules/app-context/index.d.ts.map +1 -0
- package/dist/modules/app-context/index.js +569 -0
- package/dist/modules/app-context/index.js.map +1 -0
- package/dist/modules/auth/products.d.ts +208 -0
- package/dist/modules/auth/products.d.ts.map +1 -0
- package/dist/modules/auth/products.js +165 -0
- package/dist/modules/auth/products.js.map +1 -0
- package/dist/namespaces.d.ts +2942 -0
- package/dist/namespaces.d.ts.map +1 -0
- package/dist/namespaces.js +37 -0
- package/dist/namespaces.js.map +1 -0
- package/dist/rpc.d.ts +156 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +26 -0
- package/dist/rpc.js.map +1 -0
- package/dist/server/create-sdk.d.ts.map +1 -1
- package/dist/server/create-sdk.js +3 -13
- package/dist/server/create-sdk.js.map +1 -1
- package/dist/server/handlers/annotations.d.ts +52 -0
- package/dist/server/handlers/annotations.d.ts.map +1 -0
- package/dist/server/handlers/annotations.js +204 -0
- package/dist/server/handlers/annotations.js.map +1 -0
- package/dist/server/handlers/auth.d.ts +53 -0
- package/dist/server/handlers/auth.d.ts.map +1 -0
- package/dist/server/handlers/auth.js +66 -0
- package/dist/server/handlers/auth.js.map +1 -0
- package/dist/server/handlers/certification.d.ts +32 -0
- package/dist/server/handlers/certification.d.ts.map +1 -0
- package/dist/server/handlers/certification.js +253 -0
- package/dist/server/handlers/certification.js.map +1 -0
- package/dist/server/handlers/chat/conversations.d.ts +91 -0
- package/dist/server/handlers/chat/conversations.d.ts.map +1 -0
- package/dist/server/handlers/chat/conversations.js +314 -0
- package/dist/server/handlers/chat/conversations.js.map +1 -0
- package/dist/server/handlers/chat/delegator.d.ts +144 -0
- package/dist/server/handlers/chat/delegator.d.ts.map +1 -0
- package/dist/server/handlers/chat/delegator.js +431 -0
- package/dist/server/handlers/chat/delegator.js.map +1 -0
- package/dist/server/handlers/chat/engine.d.ts +81 -0
- package/dist/server/handlers/chat/engine.d.ts.map +1 -0
- package/dist/server/handlers/chat/engine.js +442 -0
- package/dist/server/handlers/chat/engine.js.map +1 -0
- package/dist/server/handlers/chat/executor.d.ts +65 -0
- package/dist/server/handlers/chat/executor.d.ts.map +1 -0
- package/dist/server/handlers/chat/executor.js +375 -0
- package/dist/server/handlers/chat/executor.js.map +1 -0
- package/dist/server/handlers/chat/index.d.ts +62 -0
- package/dist/server/handlers/chat/index.d.ts.map +1 -0
- package/dist/server/handlers/chat/index.js +182 -0
- package/dist/server/handlers/chat/index.js.map +1 -0
- package/dist/server/handlers/chat/memory.d.ts +91 -0
- package/dist/server/handlers/chat/memory.d.ts.map +1 -0
- package/dist/server/handlers/chat/memory.js +293 -0
- package/dist/server/handlers/chat/memory.js.map +1 -0
- package/dist/server/handlers/chat/models.d.ts +180 -0
- package/dist/server/handlers/chat/models.d.ts.map +1 -0
- package/dist/server/handlers/chat/models.js +304 -0
- package/dist/server/handlers/chat/models.js.map +1 -0
- package/dist/server/handlers/chat/planner.d.ts +116 -0
- package/dist/server/handlers/chat/planner.d.ts.map +1 -0
- package/dist/server/handlers/chat/planner.js +344 -0
- package/dist/server/handlers/chat/planner.js.map +1 -0
- package/dist/server/handlers/chat/types.d.ts +500 -0
- package/dist/server/handlers/chat/types.d.ts.map +1 -0
- package/dist/server/handlers/chat/types.js +11 -0
- package/dist/server/handlers/chat/types.js.map +1 -0
- package/dist/server/handlers/collections.d.ts +67 -0
- package/dist/server/handlers/collections.d.ts.map +1 -0
- package/dist/server/handlers/collections.js +484 -0
- package/dist/server/handlers/collections.js.map +1 -0
- package/dist/server/handlers/commerce.d.ts +106 -0
- package/dist/server/handlers/commerce.d.ts.map +1 -0
- package/dist/server/handlers/commerce.js +62 -0
- package/dist/server/handlers/commerce.js.map +1 -0
- package/dist/server/handlers/config.d.ts +112 -0
- package/dist/server/handlers/config.d.ts.map +1 -0
- package/dist/server/handlers/config.js +122 -0
- package/dist/server/handlers/config.js.map +1 -0
- package/dist/server/handlers/export.d.ts +72 -0
- package/dist/server/handlers/export.d.ts.map +1 -0
- package/dist/server/handlers/export.js +175 -0
- package/dist/server/handlers/export.js.map +1 -0
- package/dist/server/handlers/formats.d.ts +77 -0
- package/dist/server/handlers/formats.d.ts.map +1 -0
- package/dist/server/handlers/formats.js +65 -0
- package/dist/server/handlers/formats.js.map +1 -0
- package/dist/server/handlers/graph.d.ts +31 -0
- package/dist/server/handlers/graph.d.ts.map +1 -0
- package/dist/server/handlers/graph.js +490 -0
- package/dist/server/handlers/graph.js.map +1 -0
- package/dist/server/handlers/import.d.ts +96 -0
- package/dist/server/handlers/import.d.ts.map +1 -0
- package/dist/server/handlers/import.js +108 -0
- package/dist/server/handlers/import.js.map +1 -0
- package/dist/server/handlers/index.d.ts +68 -0
- package/dist/server/handlers/index.d.ts.map +1 -0
- package/dist/server/handlers/index.js +71 -0
- package/dist/server/handlers/index.js.map +1 -0
- package/dist/server/handlers/media.d.ts +76 -0
- package/dist/server/handlers/media.d.ts.map +1 -0
- package/dist/server/handlers/media.js +53 -0
- package/dist/server/handlers/media.js.map +1 -0
- package/dist/server/handlers/project.d.ts +45 -0
- package/dist/server/handlers/project.d.ts.map +1 -0
- package/dist/server/handlers/project.js +181 -0
- package/dist/server/handlers/project.js.map +1 -0
- package/dist/server/handlers/publish.d.ts +102 -0
- package/dist/server/handlers/publish.d.ts.map +1 -0
- package/dist/server/handlers/publish.js +130 -0
- package/dist/server/handlers/publish.js.map +1 -0
- package/dist/server/handlers/pulse.d.ts +39 -0
- package/dist/server/handlers/pulse.d.ts.map +1 -0
- package/dist/server/handlers/pulse.js +78 -0
- package/dist/server/handlers/pulse.js.map +1 -0
- package/dist/server/handlers/realtime.d.ts +55 -0
- package/dist/server/handlers/realtime.d.ts.map +1 -0
- package/dist/server/handlers/realtime.js +49 -0
- package/dist/server/handlers/realtime.js.map +1 -0
- package/dist/server/handlers/search.d.ts +21 -0
- package/dist/server/handlers/search.d.ts.map +1 -0
- package/dist/server/handlers/search.js +237 -0
- package/dist/server/handlers/search.js.map +1 -0
- package/dist/server/handlers/session.d.ts +47 -0
- package/dist/server/handlers/session.d.ts.map +1 -0
- package/dist/server/handlers/session.js +286 -0
- package/dist/server/handlers/session.js.map +1 -0
- package/dist/server/handlers/settings.d.ts +97 -0
- package/dist/server/handlers/settings.d.ts.map +1 -0
- package/dist/server/handlers/settings.js +131 -0
- package/dist/server/handlers/settings.js.map +1 -0
- package/dist/server/handlers/workspace.d.ts +78 -0
- package/dist/server/handlers/workspace.d.ts.map +1 -0
- package/dist/server/handlers/workspace.js +270 -0
- package/dist/server/handlers/workspace.js.map +1 -0
- package/dist/server/hono-router.d.ts +66 -0
- package/dist/server/hono-router.d.ts.map +1 -0
- package/dist/server/hono-router.js +203 -0
- package/dist/server/hono-router.js.map +1 -0
- package/dist/server/index.d.ts +29 -19
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +33 -19
- package/dist/server/index.js.map +1 -1
- package/dist/server/namespace-router.d.ts +204 -0
- package/dist/server/namespace-router.d.ts.map +1 -0
- package/dist/server/namespace-router.js +262 -0
- package/dist/server/namespace-router.js.map +1 -0
- package/dist/transports/http-namespace.d.ts +210 -0
- package/dist/transports/http-namespace.d.ts.map +1 -0
- package/dist/transports/http-namespace.js +514 -0
- package/dist/transports/http-namespace.js.map +1 -0
- package/dist/transports/workshop.d.ts +173 -0
- package/dist/transports/workshop.d.ts.map +1 -0
- package/dist/transports/workshop.js +307 -0
- package/dist/transports/workshop.js.map +1 -0
- package/dist/types.d.ts +65 -67
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -3
- package/dist/types.js.map +1 -1
- package/docs/ADR-004-product-registry.md +108 -0
- package/package.json +1 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module server/handlers/import
|
|
3
|
+
* @description Import namespace handler — smart file upload and structured data
|
|
4
|
+
* import with streaming progress.
|
|
5
|
+
*
|
|
6
|
+
* Absorbs Workshop `routes/import.ts` and `routes/import-data.ts`. Both
|
|
7
|
+
* `uploadFiles` and `importData` return async iterables that stream
|
|
8
|
+
* {@link ImportProgress} events as the import pipeline processes each phase.
|
|
9
|
+
*
|
|
10
|
+
* The handler delegates format parsing to an injected `ImportPipeline`
|
|
11
|
+
* interface, allowing products to register parsers for their supported formats.
|
|
12
|
+
*
|
|
13
|
+
* Methods:
|
|
14
|
+
* - `uploadFiles` — Smart file import with streaming progress
|
|
15
|
+
* - `importData` — Structured data import (JSON, CSV, GraphML, etc.)
|
|
16
|
+
* - `getFormats` — List supported import formats
|
|
17
|
+
* - `detectFormat` — Auto-detect data format
|
|
18
|
+
* - `getProgress` — Get progress of an ongoing import
|
|
19
|
+
* - `cancel` — Cancel an in-progress import
|
|
20
|
+
*/
|
|
21
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
22
|
+
// In-progress import tracking
|
|
23
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
24
|
+
/** Active import operations tracked by ID for progress/cancellation. */
|
|
25
|
+
const activeImports = new Map();
|
|
26
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
27
|
+
// Handler factory
|
|
28
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
29
|
+
/**
|
|
30
|
+
* Creates the `import` namespace handler.
|
|
31
|
+
*
|
|
32
|
+
* @param options - Import handler dependencies. If omitted, all methods throw.
|
|
33
|
+
* @returns A {@link NamespaceProvider} implementing {@link ImportNamespace}.
|
|
34
|
+
*/
|
|
35
|
+
export function createImportHandler(options) {
|
|
36
|
+
const pipeline = options?.pipeline;
|
|
37
|
+
function requirePipeline() {
|
|
38
|
+
if (!pipeline) {
|
|
39
|
+
throw new Error('import namespace is not configured — provide an ImportPipeline via providers.import');
|
|
40
|
+
}
|
|
41
|
+
return pipeline;
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
/**
|
|
45
|
+
* Upload files for smart import with streaming progress.
|
|
46
|
+
*
|
|
47
|
+
* @param files - Files to import.
|
|
48
|
+
* @param ctx - Handler context.
|
|
49
|
+
* @returns Async iterable of progress events.
|
|
50
|
+
*/
|
|
51
|
+
uploadFiles(files, ctx) {
|
|
52
|
+
return requirePipeline().importFiles(files, ctx.brain, ctx.user.id);
|
|
53
|
+
},
|
|
54
|
+
/**
|
|
55
|
+
* Import structured data in a knowledge graph format.
|
|
56
|
+
*
|
|
57
|
+
* @param importOptions - Import configuration.
|
|
58
|
+
* @param ctx - Handler context.
|
|
59
|
+
* @returns Async iterable of progress events.
|
|
60
|
+
*/
|
|
61
|
+
importData(importOptions, ctx) {
|
|
62
|
+
return requirePipeline().importData(importOptions, ctx.brain, ctx.user.id);
|
|
63
|
+
},
|
|
64
|
+
/**
|
|
65
|
+
* List all supported import formats.
|
|
66
|
+
*
|
|
67
|
+
* @returns Array of format descriptors.
|
|
68
|
+
*/
|
|
69
|
+
async getFormats() {
|
|
70
|
+
return requirePipeline().getFormats();
|
|
71
|
+
},
|
|
72
|
+
/**
|
|
73
|
+
* Auto-detect the format of uploaded data.
|
|
74
|
+
*
|
|
75
|
+
* @param data - Data to analyze.
|
|
76
|
+
* @returns Detected format and confidence.
|
|
77
|
+
*/
|
|
78
|
+
async detectFormat(data) {
|
|
79
|
+
return requirePipeline().detectFormat(data);
|
|
80
|
+
},
|
|
81
|
+
/**
|
|
82
|
+
* Get progress of an ongoing import.
|
|
83
|
+
*
|
|
84
|
+
* @param importId - Import operation ID.
|
|
85
|
+
* @returns Current progress state.
|
|
86
|
+
*/
|
|
87
|
+
async getProgress(importId) {
|
|
88
|
+
const active = activeImports.get(importId);
|
|
89
|
+
if (!active) {
|
|
90
|
+
return { phase: 'done', current: 0, total: 0, message: 'Import not found or completed' };
|
|
91
|
+
}
|
|
92
|
+
return active.progress;
|
|
93
|
+
},
|
|
94
|
+
/**
|
|
95
|
+
* Cancel an in-progress import.
|
|
96
|
+
*
|
|
97
|
+
* @param importId - Import to cancel.
|
|
98
|
+
*/
|
|
99
|
+
async cancel(importId) {
|
|
100
|
+
const active = activeImports.get(importId);
|
|
101
|
+
if (active) {
|
|
102
|
+
active.cancelled = true;
|
|
103
|
+
activeImports.delete(importId);
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../../src/server/handlers/import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA6EH,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAEhF,wEAAwE;AACxE,MAAM,aAAa,GAAG,IAAI,GAAG,EAGzB,CAAA;AAEJ,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA8B;IAChE,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAA;IAElC,SAAS,eAAe;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAA;QACH,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,OAAO;QACL;;;;;;WAMG;QACH,WAAW,CACT,KAA+E,EAC/E,GAAmB;YAEnB,OAAO,eAAe,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACrE,CAAC;QAED;;;;;;WAMG;QACH,UAAU,CACR,aAAgG,EAChG,GAAmB;YAEnB,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC5E,CAAC;QAED;;;;WAIG;QACH,KAAK,CAAC,UAAU;YACd,OAAO,eAAe,EAAE,CAAC,UAAU,EAAE,CAAA;QACvC,CAAC;QAED;;;;;WAKG;QACH,KAAK,CAAC,YAAY,CAAC,IAAY;YAC7B,OAAO,eAAe,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QAC7C,CAAC;QAED;;;;;WAKG;QACH,KAAK,CAAC,WAAW,CAAC,QAAgB;YAChC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAA;YAC1F,CAAC;YACD,OAAO,MAAM,CAAC,QAAQ,CAAA;QACxB,CAAC;QAED;;;;WAIG;QACH,KAAK,CAAC,MAAM,CAAC,QAAgB;YAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC1C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,SAAS,GAAG,IAAI,CAAA;gBACvB,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YAChC,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module server/handlers
|
|
3
|
+
* @description Barrel export for all SDK 2.0 namespace handler factories.
|
|
4
|
+
*
|
|
5
|
+
* Each handler factory takes its dependency interfaces as options and returns
|
|
6
|
+
* a {@link NamespaceProvider} — a plain object whose methods map 1:1 to the
|
|
7
|
+
* namespace contract in `namespaces.ts`.
|
|
8
|
+
*
|
|
9
|
+
* Products wire these into the namespace router's `providers` registry:
|
|
10
|
+
*
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import {
|
|
13
|
+
* createSoulcraftRouter,
|
|
14
|
+
* createGraphHandler,
|
|
15
|
+
* createSearchHandler,
|
|
16
|
+
* createExportHandler,
|
|
17
|
+
* } from '@soulcraft/sdk/server'
|
|
18
|
+
*
|
|
19
|
+
* const sdkRouter = createSoulcraftRouter({
|
|
20
|
+
* resolveBrain: ...,
|
|
21
|
+
* authenticate: ...,
|
|
22
|
+
* providers: {
|
|
23
|
+
* graph: createGraphHandler(),
|
|
24
|
+
* search: createSearchHandler(),
|
|
25
|
+
* export: createExportHandler({ pipeline: myExportPipeline }),
|
|
26
|
+
* },
|
|
27
|
+
* })
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export { createAnnotationsHandler } from './annotations.js';
|
|
31
|
+
export type { AnnotationAiClient, AnnotationsHandlerOptions } from './annotations.js';
|
|
32
|
+
export { createAuthHandler } from './auth.js';
|
|
33
|
+
export type { CapabilityTokenFactory, AuthHandlerOptions } from './auth.js';
|
|
34
|
+
export { createChatHandler } from './chat/index.js';
|
|
35
|
+
export type { ChatHandlerOptions, ChatAIClient, AnthropicStreamEvent, ToolDefinition, ToolExecutor, ToolExecutionContext, SystemPromptBuilder, SystemPromptContext, ChatBillingCheck, ChatEventEmitter, ModelSelector, TieredRouting, RetrievedMemory, UserExpertiseProfile, RoutingDecisionType, RoutingDecision, DelegatedTask, TriageResult, TaskExecutionResult, DelegationResult, AIPlan, PlanStep, StepProgress, PlanExecutionResult, ModelConfig, ComplexitySignals, CostEstimate, StreamMessageOptions, GeneratePlanOptions, ExecutePlanOptions, ProgressCallback, } from './chat/index.js';
|
|
36
|
+
export { analyzeComplexity, calculateComplexityScore, selectTieredRouting, createDefaultModelSelector, estimateCost, formatCost, DEFAULT_MODELS, DEFAULT_MODEL_TIERS, triageMessage, delegateAndExecute, generatePlan, storePlan, loadPlan, approvePlan, cancelPlan, executePlan, resumePlanExecution, streamMessage, sendMessage, } from './chat/index.js';
|
|
37
|
+
export { createCertificationHandler } from './certification.js';
|
|
38
|
+
export { createCollectionsHandler } from './collections.js';
|
|
39
|
+
export type { SampleDataProvider, CollectionsHandlerOptions } from './collections.js';
|
|
40
|
+
export { createCommerceHandler } from './commerce.js';
|
|
41
|
+
export type { PaymentProvider, CommerceHandlerOptions } from './commerce.js';
|
|
42
|
+
export { createConfigHandler } from './config.js';
|
|
43
|
+
export type { ConfigService, ConfigBillingService, ConfigHandlerOptions } from './config.js';
|
|
44
|
+
export { createExportHandler } from './export.js';
|
|
45
|
+
export type { ExportPipeline, ExportHandlerOptions } from './export.js';
|
|
46
|
+
export { createFormatsHandler } from './formats.js';
|
|
47
|
+
export type { FormatConverter, FormatsHandlerOptions } from './formats.js';
|
|
48
|
+
export { createGraphHandler } from './graph.js';
|
|
49
|
+
export { createImportHandler } from './import.js';
|
|
50
|
+
export type { ImportPipeline, ImportHandlerOptions } from './import.js';
|
|
51
|
+
export { createMediaHandler } from './media.js';
|
|
52
|
+
export type { MediaBackend, MediaHandlerOptions } from './media.js';
|
|
53
|
+
export { createProjectHandler } from './project.js';
|
|
54
|
+
export type { KitLoader, ProjectHandlerOptions } from './project.js';
|
|
55
|
+
export { createPublishHandler } from './publish.js';
|
|
56
|
+
export type { PublishBackend, VenueDeployService, AcademyPublishService, PublishHandlerOptions, } from './publish.js';
|
|
57
|
+
export { createPulseHandler } from './pulse.js';
|
|
58
|
+
export type { PulseHandlerOptions } from './pulse.js';
|
|
59
|
+
export { createRealtimeHandler } from './realtime.js';
|
|
60
|
+
export type { RealtimeBackend, RealtimeHandlerOptions } from './realtime.js';
|
|
61
|
+
export { createSearchHandler } from './search.js';
|
|
62
|
+
export { createSessionHandler } from './session.js';
|
|
63
|
+
export type { SessionEventEmitter, SessionHandlerOptions } from './session.js';
|
|
64
|
+
export { createSettingsHandler } from './settings.js';
|
|
65
|
+
export type { ApiKeyService, SettingsBillingService, StorageTracker, StorageLimitResolver, SettingsHandlerOptions, } from './settings.js';
|
|
66
|
+
export { createWorkspaceHandler } from './workspace.js';
|
|
67
|
+
export type { WorkspaceManager, WorkspaceHandlerOptions } from './workspace.js';
|
|
68
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module server/handlers
|
|
3
|
+
* @description Barrel export for all SDK 2.0 namespace handler factories.
|
|
4
|
+
*
|
|
5
|
+
* Each handler factory takes its dependency interfaces as options and returns
|
|
6
|
+
* a {@link NamespaceProvider} — a plain object whose methods map 1:1 to the
|
|
7
|
+
* namespace contract in `namespaces.ts`.
|
|
8
|
+
*
|
|
9
|
+
* Products wire these into the namespace router's `providers` registry:
|
|
10
|
+
*
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import {
|
|
13
|
+
* createSoulcraftRouter,
|
|
14
|
+
* createGraphHandler,
|
|
15
|
+
* createSearchHandler,
|
|
16
|
+
* createExportHandler,
|
|
17
|
+
* } from '@soulcraft/sdk/server'
|
|
18
|
+
*
|
|
19
|
+
* const sdkRouter = createSoulcraftRouter({
|
|
20
|
+
* resolveBrain: ...,
|
|
21
|
+
* authenticate: ...,
|
|
22
|
+
* providers: {
|
|
23
|
+
* graph: createGraphHandler(),
|
|
24
|
+
* search: createSearchHandler(),
|
|
25
|
+
* export: createExportHandler({ pipeline: myExportPipeline }),
|
|
26
|
+
* },
|
|
27
|
+
* })
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
// ── Annotations ──────────────────────────────────────────────────────────────
|
|
31
|
+
export { createAnnotationsHandler } from './annotations.js';
|
|
32
|
+
// ── Auth ─────────────────────────────────────────────────────────────────────
|
|
33
|
+
export { createAuthHandler } from './auth.js';
|
|
34
|
+
// ── Chat ────────────────────────────────────────────────────────────────────
|
|
35
|
+
export { createChatHandler } from './chat/index.js';
|
|
36
|
+
export { analyzeComplexity, calculateComplexityScore, selectTieredRouting, createDefaultModelSelector, estimateCost, formatCost, DEFAULT_MODELS, DEFAULT_MODEL_TIERS, triageMessage, delegateAndExecute, generatePlan, storePlan, loadPlan, approvePlan, cancelPlan, executePlan, resumePlanExecution, streamMessage, sendMessage, } from './chat/index.js';
|
|
37
|
+
// ── Certification ────────────────────────────────────────────────────────────
|
|
38
|
+
export { createCertificationHandler } from './certification.js';
|
|
39
|
+
// ── Collections ──────────────────────────────────────────────────────────────
|
|
40
|
+
export { createCollectionsHandler } from './collections.js';
|
|
41
|
+
// ── Commerce ─────────────────────────────────────────────────────────────────
|
|
42
|
+
export { createCommerceHandler } from './commerce.js';
|
|
43
|
+
// ── Config ───────────────────────────────────────────────────────────────────
|
|
44
|
+
export { createConfigHandler } from './config.js';
|
|
45
|
+
// ── Export ───────────────────────────────────────────────────────────────────
|
|
46
|
+
export { createExportHandler } from './export.js';
|
|
47
|
+
// ── Formats ──────────────────────────────────────────────────────────────────
|
|
48
|
+
export { createFormatsHandler } from './formats.js';
|
|
49
|
+
// ── Graph ────────────────────────────────────────────────────────────────────
|
|
50
|
+
export { createGraphHandler } from './graph.js';
|
|
51
|
+
// ── Import ───────────────────────────────────────────────────────────────────
|
|
52
|
+
export { createImportHandler } from './import.js';
|
|
53
|
+
// ── Media ────────────────────────────────────────────────────────────────────
|
|
54
|
+
export { createMediaHandler } from './media.js';
|
|
55
|
+
// ── Project ──────────────────────────────────────────────────────────────────
|
|
56
|
+
export { createProjectHandler } from './project.js';
|
|
57
|
+
// ── Publish ──────────────────────────────────────────────────────────────────
|
|
58
|
+
export { createPublishHandler } from './publish.js';
|
|
59
|
+
// ── Pulse ────────────────────────────────────────────────────────────────────
|
|
60
|
+
export { createPulseHandler } from './pulse.js';
|
|
61
|
+
// ── Realtime ─────────────────────────────────────────────────────────────────
|
|
62
|
+
export { createRealtimeHandler } from './realtime.js';
|
|
63
|
+
// ── Search ───────────────────────────────────────────────────────────────────
|
|
64
|
+
export { createSearchHandler } from './search.js';
|
|
65
|
+
// ── Session ──────────────────────────────────────────────────────────────────
|
|
66
|
+
export { createSessionHandler } from './session.js';
|
|
67
|
+
// ── Settings ─────────────────────────────────────────────────────────────────
|
|
68
|
+
export { createSettingsHandler } from './settings.js';
|
|
69
|
+
// ── Workspace ────────────────────────────────────────────────────────────────
|
|
70
|
+
export { createWorkspaceHandler } from './workspace.js';
|
|
71
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,gFAAgF;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAG3D,gFAAgF;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAG7C,+EAA+E;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAkCnD,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,0BAA0B,EAC1B,YAAY,EACZ,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,WAAW,EACX,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,WAAW,GACZ,MAAM,iBAAiB,CAAA;AAExB,gFAAgF;AAChF,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAA;AAE/D,gFAAgF;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAG3D,gFAAgF;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAGrD,gFAAgF;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,gFAAgF;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,gFAAgF;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAGnD,gFAAgF;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAE/C,gFAAgF;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGjD,gFAAgF;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAG/C,gFAAgF;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAGnD,gFAAgF;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAQnD,gFAAgF;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAG/C,gFAAgF;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAGrD,gFAAgF;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,gFAAgF;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAGnD,gFAAgF;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AASrD,gFAAgF;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module server/handlers/media
|
|
3
|
+
* @description Media namespace handler — upload, transcode, stream, and manage
|
|
4
|
+
* audio, video, and image assets.
|
|
5
|
+
*
|
|
6
|
+
* Backed by the Hall server (hall.soulcraft.com). The handler delegates all
|
|
7
|
+
* operations to an injected `MediaBackend` interface. When no backend is
|
|
8
|
+
* configured, all methods throw with a clear "not configured" error.
|
|
9
|
+
*
|
|
10
|
+
* Hall is working on their media pipeline implementation. This handler is
|
|
11
|
+
* the SDK-side contract — once Hall publishes their backend, products wire
|
|
12
|
+
* it in via `providers.media`.
|
|
13
|
+
*
|
|
14
|
+
* Methods:
|
|
15
|
+
* - `upload` — Upload media with optional transcoding
|
|
16
|
+
* - `stream` — Stream media by ID
|
|
17
|
+
* - `getInfo` — Get media metadata
|
|
18
|
+
* - `delete` — Delete media
|
|
19
|
+
*/
|
|
20
|
+
import type { NamespaceProvider } from '../namespace-router.js';
|
|
21
|
+
/**
|
|
22
|
+
* Media backend interface — implemented by Hall.
|
|
23
|
+
*
|
|
24
|
+
* Products inject their Hall media client via `providers.media` in the
|
|
25
|
+
* SDK server config.
|
|
26
|
+
*/
|
|
27
|
+
export interface MediaBackend {
|
|
28
|
+
/** Upload and optionally transcode a media file. */
|
|
29
|
+
upload(file: ArrayBuffer, options: {
|
|
30
|
+
filename?: string;
|
|
31
|
+
transcode?: string;
|
|
32
|
+
thumbnail?: boolean;
|
|
33
|
+
}, userId: string): Promise<{
|
|
34
|
+
mediaId: string;
|
|
35
|
+
url: string;
|
|
36
|
+
mimeType: string;
|
|
37
|
+
size: number;
|
|
38
|
+
duration?: number;
|
|
39
|
+
dimensions?: {
|
|
40
|
+
width: number;
|
|
41
|
+
height: number;
|
|
42
|
+
};
|
|
43
|
+
thumbnailUrl?: string;
|
|
44
|
+
}>;
|
|
45
|
+
/** Stream media by ID. Returns an async iterable of binary chunks. */
|
|
46
|
+
stream(mediaId: string): AsyncIterable<ArrayBuffer>;
|
|
47
|
+
/** Get metadata about a media item. */
|
|
48
|
+
getInfo(mediaId: string): Promise<{
|
|
49
|
+
mediaId: string;
|
|
50
|
+
mimeType: string;
|
|
51
|
+
size: number;
|
|
52
|
+
duration?: number;
|
|
53
|
+
dimensions?: {
|
|
54
|
+
width: number;
|
|
55
|
+
height: number;
|
|
56
|
+
};
|
|
57
|
+
createdAt: string;
|
|
58
|
+
} | null>;
|
|
59
|
+
/** Delete a media item. */
|
|
60
|
+
delete(mediaId: string): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Options for {@link createMediaHandler}.
|
|
64
|
+
*/
|
|
65
|
+
export interface MediaHandlerOptions {
|
|
66
|
+
/** Hall media backend. */
|
|
67
|
+
backend: MediaBackend;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Creates the `media` namespace handler.
|
|
71
|
+
*
|
|
72
|
+
* @param options - Media handler dependencies. If omitted, all methods throw.
|
|
73
|
+
* @returns A {@link NamespaceProvider} implementing {@link MediaNamespace}.
|
|
74
|
+
*/
|
|
75
|
+
export declare function createMediaHandler(options?: MediaHandlerOptions): NamespaceProvider;
|
|
76
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,wBAAwB,CAAA;AAM/E;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,MAAM,CACJ,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACvE,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QACT,OAAO,EAAE,MAAM,CAAA;QACf,GAAG,EAAE,MAAM,CAAA;QACX,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;QAC9C,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,CAAC,CAAA;IAEF,sEAAsE;IACtE,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC,CAAA;IAEnD,uCAAuC;IACvC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAChC,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;QAC9C,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,IAAI,CAAC,CAAA;IAET,2BAA2B;IAC3B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,0BAA0B;IAC1B,OAAO,EAAE,YAAY,CAAA;CACtB;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,iBAAiB,CAkCnF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module server/handlers/media
|
|
3
|
+
* @description Media namespace handler — upload, transcode, stream, and manage
|
|
4
|
+
* audio, video, and image assets.
|
|
5
|
+
*
|
|
6
|
+
* Backed by the Hall server (hall.soulcraft.com). The handler delegates all
|
|
7
|
+
* operations to an injected `MediaBackend` interface. When no backend is
|
|
8
|
+
* configured, all methods throw with a clear "not configured" error.
|
|
9
|
+
*
|
|
10
|
+
* Hall is working on their media pipeline implementation. This handler is
|
|
11
|
+
* the SDK-side contract — once Hall publishes their backend, products wire
|
|
12
|
+
* it in via `providers.media`.
|
|
13
|
+
*
|
|
14
|
+
* Methods:
|
|
15
|
+
* - `upload` — Upload media with optional transcoding
|
|
16
|
+
* - `stream` — Stream media by ID
|
|
17
|
+
* - `getInfo` — Get media metadata
|
|
18
|
+
* - `delete` — Delete media
|
|
19
|
+
*/
|
|
20
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
21
|
+
// Handler factory
|
|
22
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
23
|
+
/**
|
|
24
|
+
* Creates the `media` namespace handler.
|
|
25
|
+
*
|
|
26
|
+
* @param options - Media handler dependencies. If omitted, all methods throw.
|
|
27
|
+
* @returns A {@link NamespaceProvider} implementing {@link MediaNamespace}.
|
|
28
|
+
*/
|
|
29
|
+
export function createMediaHandler(options) {
|
|
30
|
+
const backend = options?.backend;
|
|
31
|
+
function requireBackend() {
|
|
32
|
+
if (!backend) {
|
|
33
|
+
throw new Error('media namespace is not configured — provide a MediaBackend via providers.media. ' +
|
|
34
|
+
'The media pipeline is implemented by the Hall server.');
|
|
35
|
+
}
|
|
36
|
+
return backend;
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
async upload(file, uploadOptions, ctx) {
|
|
40
|
+
return requireBackend().upload(file, uploadOptions ?? {}, ctx.user.id);
|
|
41
|
+
},
|
|
42
|
+
stream(mediaId) {
|
|
43
|
+
return requireBackend().stream(mediaId);
|
|
44
|
+
},
|
|
45
|
+
async getInfo(mediaId) {
|
|
46
|
+
return requireBackend().getInfo(mediaId);
|
|
47
|
+
},
|
|
48
|
+
async delete(mediaId) {
|
|
49
|
+
return requireBackend().delete(mediaId);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/server/handlers/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAuDH,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA6B;IAC9D,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,CAAA;IAEhC,SAAS,cAAc;QACrB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,kFAAkF;gBAClF,uDAAuD,CACxD,CAAA;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,MAAM,CACV,IAAiB,EACjB,aAAyF,EACzF,GAAmB;YAEnB,OAAO,cAAc,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,IAAI,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACxE,CAAC;QAED,MAAM,CAAC,OAAe;YACpB,OAAO,cAAc,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACzC,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,OAAe;YAC3B,OAAO,cAAc,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC1C,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,OAAe;YAC1B,OAAO,cAAc,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACzC,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module server/handlers/project
|
|
3
|
+
* @description Project namespace handler — Glass Box AI transparency context
|
|
4
|
+
* and metadata repair.
|
|
5
|
+
*
|
|
6
|
+
* Absorbs Workshop `routes/project.ts`. Uses Brainy's VFS extended attributes
|
|
7
|
+
* (`getxattr` / `setxattr`) to read and repair project metadata, and optionally
|
|
8
|
+
* loads kit context from the project's `kit-config.json`.
|
|
9
|
+
*
|
|
10
|
+
* Methods:
|
|
11
|
+
* - `getContext` — Full project context for AI transparency panel
|
|
12
|
+
* - `repairMetadata` — Fix metadata inconsistencies (missing kitId, etc.)
|
|
13
|
+
*/
|
|
14
|
+
import type { NamespaceProvider } from '../namespace-router.js';
|
|
15
|
+
/**
|
|
16
|
+
* Kit loader function for resolving kit details by ID.
|
|
17
|
+
*
|
|
18
|
+
* Products inject their own kit loader — Workshop uses `@soulcraft/kits`,
|
|
19
|
+
* Venue uses its own kit registry.
|
|
20
|
+
*/
|
|
21
|
+
export interface KitLoader {
|
|
22
|
+
/** Load a kit definition by ID. Returns `null` if not found. */
|
|
23
|
+
loadKit(kitId: string): Promise<{
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
} | null>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Options for {@link createProjectHandler}.
|
|
30
|
+
*/
|
|
31
|
+
export interface ProjectHandlerOptions {
|
|
32
|
+
/**
|
|
33
|
+
* Kit loader for resolving kit metadata.
|
|
34
|
+
* If not provided, `repairMetadata` will skip kit verification.
|
|
35
|
+
*/
|
|
36
|
+
kitLoader?: KitLoader;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Creates the `project` namespace handler.
|
|
40
|
+
*
|
|
41
|
+
* @param options - Optional project handler dependencies.
|
|
42
|
+
* @returns A {@link NamespaceProvider} implementing {@link ProjectNamespace}.
|
|
43
|
+
*/
|
|
44
|
+
export declare function createProjectHandler(options?: ProjectHandlerOptions): NamespaceProvider;
|
|
45
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/project.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,wBAAwB,CAAA;AAM/E;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,gEAAgE;IAChE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;CACrE;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAwCD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,iBAAiB,CA2JvF"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module server/handlers/project
|
|
3
|
+
* @description Project namespace handler — Glass Box AI transparency context
|
|
4
|
+
* and metadata repair.
|
|
5
|
+
*
|
|
6
|
+
* Absorbs Workshop `routes/project.ts`. Uses Brainy's VFS extended attributes
|
|
7
|
+
* (`getxattr` / `setxattr`) to read and repair project metadata, and optionally
|
|
8
|
+
* loads kit context from the project's `kit-config.json`.
|
|
9
|
+
*
|
|
10
|
+
* Methods:
|
|
11
|
+
* - `getContext` — Full project context for AI transparency panel
|
|
12
|
+
* - `repairMetadata` — Fix metadata inconsistencies (missing kitId, etc.)
|
|
13
|
+
*/
|
|
14
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
15
|
+
// Helpers
|
|
16
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Load kit context from a project's `kit-config.json` in VFS.
|
|
19
|
+
*
|
|
20
|
+
* @param brain - Brainy instance.
|
|
21
|
+
* @param projectPath - VFS path to the project directory.
|
|
22
|
+
* @returns Kit context if found, otherwise `null`.
|
|
23
|
+
*/
|
|
24
|
+
async function loadKitContext(brain, projectPath) {
|
|
25
|
+
try {
|
|
26
|
+
const configPath = projectPath.endsWith('/')
|
|
27
|
+
? `${projectPath}kit-config.json`
|
|
28
|
+
: `${projectPath}/kit-config.json`;
|
|
29
|
+
const content = await brain.vfs.readFile(configPath);
|
|
30
|
+
const config = JSON.parse(content);
|
|
31
|
+
if (config.kitId) {
|
|
32
|
+
return {
|
|
33
|
+
kitId: config.kitId,
|
|
34
|
+
kitName: config.kitName || config.kitId,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// No kit-config.json — not a kit project
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
44
|
+
// Handler factory
|
|
45
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
46
|
+
/**
|
|
47
|
+
* Creates the `project` namespace handler.
|
|
48
|
+
*
|
|
49
|
+
* @param options - Optional project handler dependencies.
|
|
50
|
+
* @returns A {@link NamespaceProvider} implementing {@link ProjectNamespace}.
|
|
51
|
+
*/
|
|
52
|
+
export function createProjectHandler(options) {
|
|
53
|
+
const kitLoader = options?.kitLoader;
|
|
54
|
+
return {
|
|
55
|
+
/**
|
|
56
|
+
* Get the project context for the AI transparency panel (Glass Box).
|
|
57
|
+
*
|
|
58
|
+
* Reads VFS extended attributes and kit-config.json to assemble:
|
|
59
|
+
* - Kit identity (kitId, kitName)
|
|
60
|
+
* - Entity type distribution
|
|
61
|
+
* - Relationship type distribution
|
|
62
|
+
* - File count
|
|
63
|
+
* - Total embedded tokens
|
|
64
|
+
*
|
|
65
|
+
* @param projectPath - VFS path to the project directory.
|
|
66
|
+
* @param ctx - Handler context with Brainy instance.
|
|
67
|
+
* @returns Project context payload.
|
|
68
|
+
*/
|
|
69
|
+
async getContext(projectPath, ctx) {
|
|
70
|
+
const { brain } = ctx;
|
|
71
|
+
// If no path provided, return empty context
|
|
72
|
+
if (!projectPath) {
|
|
73
|
+
return {
|
|
74
|
+
kitId: '',
|
|
75
|
+
kitName: '',
|
|
76
|
+
entityTypes: {},
|
|
77
|
+
relationTypes: {},
|
|
78
|
+
fileCount: 0,
|
|
79
|
+
totalTokens: 0,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Get project metadata from xattr
|
|
83
|
+
let metadata = null;
|
|
84
|
+
try {
|
|
85
|
+
metadata = await brain.vfs.getxattr(projectPath, 'workshop.project');
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// No metadata — not a recognized project
|
|
89
|
+
}
|
|
90
|
+
// Load kit context from kit-config.json
|
|
91
|
+
let kitContext = await loadKitContext(brain, projectPath);
|
|
92
|
+
// Fall back to metadata kitId
|
|
93
|
+
const metadataKitId = metadata?.kitId || metadata?.templateId;
|
|
94
|
+
if (!kitContext && metadataKitId) {
|
|
95
|
+
kitContext = {
|
|
96
|
+
kitId: metadataKitId,
|
|
97
|
+
kitName: metadataKitId
|
|
98
|
+
.split('-')
|
|
99
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
100
|
+
.join(' '),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// Get entity and relation distributions from index stats
|
|
104
|
+
const stats = await brain.indexStats();
|
|
105
|
+
const entityTypes = {};
|
|
106
|
+
const relationTypes = {};
|
|
107
|
+
// indexStats returns { entities, vectors, relationships, metadataFields, memoryUsage }
|
|
108
|
+
// Type/verb distribution requires scanning entities — provide aggregate counts
|
|
109
|
+
entityTypes['_total'] = stats.entities;
|
|
110
|
+
relationTypes['_total'] = stats.relationships;
|
|
111
|
+
// Count files in VFS
|
|
112
|
+
let fileCount = 0;
|
|
113
|
+
try {
|
|
114
|
+
const entries = await brain.vfs.readdir(projectPath || '/', { recursive: true });
|
|
115
|
+
fileCount = Array.isArray(entries) ? entries.length : 0;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// VFS may not have this path
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
kitId: kitContext?.kitId || '',
|
|
122
|
+
kitName: kitContext?.kitName || '',
|
|
123
|
+
entityTypes,
|
|
124
|
+
relationTypes,
|
|
125
|
+
fileCount,
|
|
126
|
+
totalTokens: stats.vectors ?? 0,
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
/**
|
|
130
|
+
* Repair project metadata inconsistencies.
|
|
131
|
+
*
|
|
132
|
+
* Updates VFS extended attributes to fix missing kitId and other
|
|
133
|
+
* metadata fields. If a kit loader is configured, verifies the kitId
|
|
134
|
+
* exists before saving.
|
|
135
|
+
*
|
|
136
|
+
* @param projectPath - VFS path to the project.
|
|
137
|
+
* @param kitId - Kit ID to associate with the project.
|
|
138
|
+
* @param ctx - Handler context with Brainy instance.
|
|
139
|
+
* @returns Counts of repaired entities and errors.
|
|
140
|
+
*/
|
|
141
|
+
async repairMetadata(projectPath, kitId, ctx) {
|
|
142
|
+
const { brain } = ctx;
|
|
143
|
+
if (!projectPath || !kitId) {
|
|
144
|
+
return { repaired: 0, errors: 0 };
|
|
145
|
+
}
|
|
146
|
+
let errors = 0;
|
|
147
|
+
// Verify kit exists (if loader is available)
|
|
148
|
+
if (kitLoader) {
|
|
149
|
+
const kit = await kitLoader.loadKit(kitId);
|
|
150
|
+
if (!kit) {
|
|
151
|
+
return { repaired: 0, errors: 1 };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Read existing metadata
|
|
155
|
+
let existingMetadata = {};
|
|
156
|
+
try {
|
|
157
|
+
existingMetadata = (await brain.vfs.getxattr(projectPath, 'workshop.project')) || {};
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// No existing metadata
|
|
161
|
+
}
|
|
162
|
+
// Update with kitId
|
|
163
|
+
const newMetadata = {
|
|
164
|
+
...existingMetadata,
|
|
165
|
+
kitId,
|
|
166
|
+
projectName: existingMetadata.projectName ||
|
|
167
|
+
projectPath.split('/').pop() || 'Untitled',
|
|
168
|
+
updatedAt: new Date().toISOString(),
|
|
169
|
+
};
|
|
170
|
+
try {
|
|
171
|
+
await brain.vfs.setxattr(projectPath, 'workshop.project', newMetadata);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
errors++;
|
|
175
|
+
return { repaired: 0, errors };
|
|
176
|
+
}
|
|
177
|
+
return { repaired: 1, errors };
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/server/handlers/project.ts"],"names":[],"mappings":"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"}
|