@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.
Files changed (176) hide show
  1. package/dist/client/create-client-sdk.d.ts +16 -2
  2. package/dist/client/create-client-sdk.d.ts.map +1 -1
  3. package/dist/client/create-client-sdk.js +2 -7
  4. package/dist/client/create-client-sdk.js.map +1 -1
  5. package/dist/client/index.d.ts +48 -37
  6. package/dist/client/index.d.ts.map +1 -1
  7. package/dist/client/index.js +61 -42
  8. package/dist/client/index.js.map +1 -1
  9. package/dist/client/namespace-proxy.d.ts +108 -0
  10. package/dist/client/namespace-proxy.d.ts.map +1 -0
  11. package/dist/client/namespace-proxy.js +151 -0
  12. package/dist/client/namespace-proxy.js.map +1 -0
  13. package/dist/index.d.ts +3 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/modules/app-context/index.d.ts +214 -0
  17. package/dist/modules/app-context/index.d.ts.map +1 -0
  18. package/dist/modules/app-context/index.js +569 -0
  19. package/dist/modules/app-context/index.js.map +1 -0
  20. package/dist/modules/auth/products.d.ts +208 -0
  21. package/dist/modules/auth/products.d.ts.map +1 -0
  22. package/dist/modules/auth/products.js +165 -0
  23. package/dist/modules/auth/products.js.map +1 -0
  24. package/dist/namespaces.d.ts +2942 -0
  25. package/dist/namespaces.d.ts.map +1 -0
  26. package/dist/namespaces.js +37 -0
  27. package/dist/namespaces.js.map +1 -0
  28. package/dist/rpc.d.ts +156 -0
  29. package/dist/rpc.d.ts.map +1 -0
  30. package/dist/rpc.js +26 -0
  31. package/dist/rpc.js.map +1 -0
  32. package/dist/server/create-sdk.d.ts.map +1 -1
  33. package/dist/server/create-sdk.js +3 -13
  34. package/dist/server/create-sdk.js.map +1 -1
  35. package/dist/server/handlers/annotations.d.ts +52 -0
  36. package/dist/server/handlers/annotations.d.ts.map +1 -0
  37. package/dist/server/handlers/annotations.js +204 -0
  38. package/dist/server/handlers/annotations.js.map +1 -0
  39. package/dist/server/handlers/auth.d.ts +53 -0
  40. package/dist/server/handlers/auth.d.ts.map +1 -0
  41. package/dist/server/handlers/auth.js +66 -0
  42. package/dist/server/handlers/auth.js.map +1 -0
  43. package/dist/server/handlers/certification.d.ts +32 -0
  44. package/dist/server/handlers/certification.d.ts.map +1 -0
  45. package/dist/server/handlers/certification.js +253 -0
  46. package/dist/server/handlers/certification.js.map +1 -0
  47. package/dist/server/handlers/chat/conversations.d.ts +91 -0
  48. package/dist/server/handlers/chat/conversations.d.ts.map +1 -0
  49. package/dist/server/handlers/chat/conversations.js +314 -0
  50. package/dist/server/handlers/chat/conversations.js.map +1 -0
  51. package/dist/server/handlers/chat/delegator.d.ts +144 -0
  52. package/dist/server/handlers/chat/delegator.d.ts.map +1 -0
  53. package/dist/server/handlers/chat/delegator.js +431 -0
  54. package/dist/server/handlers/chat/delegator.js.map +1 -0
  55. package/dist/server/handlers/chat/engine.d.ts +81 -0
  56. package/dist/server/handlers/chat/engine.d.ts.map +1 -0
  57. package/dist/server/handlers/chat/engine.js +442 -0
  58. package/dist/server/handlers/chat/engine.js.map +1 -0
  59. package/dist/server/handlers/chat/executor.d.ts +65 -0
  60. package/dist/server/handlers/chat/executor.d.ts.map +1 -0
  61. package/dist/server/handlers/chat/executor.js +375 -0
  62. package/dist/server/handlers/chat/executor.js.map +1 -0
  63. package/dist/server/handlers/chat/index.d.ts +62 -0
  64. package/dist/server/handlers/chat/index.d.ts.map +1 -0
  65. package/dist/server/handlers/chat/index.js +182 -0
  66. package/dist/server/handlers/chat/index.js.map +1 -0
  67. package/dist/server/handlers/chat/memory.d.ts +91 -0
  68. package/dist/server/handlers/chat/memory.d.ts.map +1 -0
  69. package/dist/server/handlers/chat/memory.js +293 -0
  70. package/dist/server/handlers/chat/memory.js.map +1 -0
  71. package/dist/server/handlers/chat/models.d.ts +180 -0
  72. package/dist/server/handlers/chat/models.d.ts.map +1 -0
  73. package/dist/server/handlers/chat/models.js +304 -0
  74. package/dist/server/handlers/chat/models.js.map +1 -0
  75. package/dist/server/handlers/chat/planner.d.ts +116 -0
  76. package/dist/server/handlers/chat/planner.d.ts.map +1 -0
  77. package/dist/server/handlers/chat/planner.js +344 -0
  78. package/dist/server/handlers/chat/planner.js.map +1 -0
  79. package/dist/server/handlers/chat/types.d.ts +500 -0
  80. package/dist/server/handlers/chat/types.d.ts.map +1 -0
  81. package/dist/server/handlers/chat/types.js +11 -0
  82. package/dist/server/handlers/chat/types.js.map +1 -0
  83. package/dist/server/handlers/collections.d.ts +67 -0
  84. package/dist/server/handlers/collections.d.ts.map +1 -0
  85. package/dist/server/handlers/collections.js +484 -0
  86. package/dist/server/handlers/collections.js.map +1 -0
  87. package/dist/server/handlers/commerce.d.ts +106 -0
  88. package/dist/server/handlers/commerce.d.ts.map +1 -0
  89. package/dist/server/handlers/commerce.js +62 -0
  90. package/dist/server/handlers/commerce.js.map +1 -0
  91. package/dist/server/handlers/config.d.ts +112 -0
  92. package/dist/server/handlers/config.d.ts.map +1 -0
  93. package/dist/server/handlers/config.js +122 -0
  94. package/dist/server/handlers/config.js.map +1 -0
  95. package/dist/server/handlers/export.d.ts +72 -0
  96. package/dist/server/handlers/export.d.ts.map +1 -0
  97. package/dist/server/handlers/export.js +175 -0
  98. package/dist/server/handlers/export.js.map +1 -0
  99. package/dist/server/handlers/formats.d.ts +77 -0
  100. package/dist/server/handlers/formats.d.ts.map +1 -0
  101. package/dist/server/handlers/formats.js +65 -0
  102. package/dist/server/handlers/formats.js.map +1 -0
  103. package/dist/server/handlers/graph.d.ts +31 -0
  104. package/dist/server/handlers/graph.d.ts.map +1 -0
  105. package/dist/server/handlers/graph.js +490 -0
  106. package/dist/server/handlers/graph.js.map +1 -0
  107. package/dist/server/handlers/import.d.ts +96 -0
  108. package/dist/server/handlers/import.d.ts.map +1 -0
  109. package/dist/server/handlers/import.js +108 -0
  110. package/dist/server/handlers/import.js.map +1 -0
  111. package/dist/server/handlers/index.d.ts +68 -0
  112. package/dist/server/handlers/index.d.ts.map +1 -0
  113. package/dist/server/handlers/index.js +71 -0
  114. package/dist/server/handlers/index.js.map +1 -0
  115. package/dist/server/handlers/media.d.ts +76 -0
  116. package/dist/server/handlers/media.d.ts.map +1 -0
  117. package/dist/server/handlers/media.js +53 -0
  118. package/dist/server/handlers/media.js.map +1 -0
  119. package/dist/server/handlers/project.d.ts +45 -0
  120. package/dist/server/handlers/project.d.ts.map +1 -0
  121. package/dist/server/handlers/project.js +181 -0
  122. package/dist/server/handlers/project.js.map +1 -0
  123. package/dist/server/handlers/publish.d.ts +102 -0
  124. package/dist/server/handlers/publish.d.ts.map +1 -0
  125. package/dist/server/handlers/publish.js +130 -0
  126. package/dist/server/handlers/publish.js.map +1 -0
  127. package/dist/server/handlers/pulse.d.ts +39 -0
  128. package/dist/server/handlers/pulse.d.ts.map +1 -0
  129. package/dist/server/handlers/pulse.js +78 -0
  130. package/dist/server/handlers/pulse.js.map +1 -0
  131. package/dist/server/handlers/realtime.d.ts +55 -0
  132. package/dist/server/handlers/realtime.d.ts.map +1 -0
  133. package/dist/server/handlers/realtime.js +49 -0
  134. package/dist/server/handlers/realtime.js.map +1 -0
  135. package/dist/server/handlers/search.d.ts +21 -0
  136. package/dist/server/handlers/search.d.ts.map +1 -0
  137. package/dist/server/handlers/search.js +237 -0
  138. package/dist/server/handlers/search.js.map +1 -0
  139. package/dist/server/handlers/session.d.ts +47 -0
  140. package/dist/server/handlers/session.d.ts.map +1 -0
  141. package/dist/server/handlers/session.js +286 -0
  142. package/dist/server/handlers/session.js.map +1 -0
  143. package/dist/server/handlers/settings.d.ts +97 -0
  144. package/dist/server/handlers/settings.d.ts.map +1 -0
  145. package/dist/server/handlers/settings.js +131 -0
  146. package/dist/server/handlers/settings.js.map +1 -0
  147. package/dist/server/handlers/workspace.d.ts +78 -0
  148. package/dist/server/handlers/workspace.d.ts.map +1 -0
  149. package/dist/server/handlers/workspace.js +270 -0
  150. package/dist/server/handlers/workspace.js.map +1 -0
  151. package/dist/server/hono-router.d.ts +66 -0
  152. package/dist/server/hono-router.d.ts.map +1 -0
  153. package/dist/server/hono-router.js +203 -0
  154. package/dist/server/hono-router.js.map +1 -0
  155. package/dist/server/index.d.ts +29 -19
  156. package/dist/server/index.d.ts.map +1 -1
  157. package/dist/server/index.js +33 -19
  158. package/dist/server/index.js.map +1 -1
  159. package/dist/server/namespace-router.d.ts +204 -0
  160. package/dist/server/namespace-router.d.ts.map +1 -0
  161. package/dist/server/namespace-router.js +262 -0
  162. package/dist/server/namespace-router.js.map +1 -0
  163. package/dist/transports/http-namespace.d.ts +210 -0
  164. package/dist/transports/http-namespace.d.ts.map +1 -0
  165. package/dist/transports/http-namespace.js +514 -0
  166. package/dist/transports/http-namespace.js.map +1 -0
  167. package/dist/transports/workshop.d.ts +173 -0
  168. package/dist/transports/workshop.d.ts.map +1 -0
  169. package/dist/transports/workshop.js +307 -0
  170. package/dist/transports/workshop.js.map +1 -0
  171. package/dist/types.d.ts +65 -67
  172. package/dist/types.d.ts.map +1 -1
  173. package/dist/types.js +7 -3
  174. package/dist/types.js.map +1 -1
  175. package/docs/ADR-004-product-registry.md +108 -0
  176. 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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"}