@bendyline/gezel 1.0.6 → 1.1.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/paths.js CHANGED
@@ -42,6 +42,280 @@ function assertSafeEntityId(value, label = "entity id") {
42
42
  }
43
43
  }
44
44
 
45
+ // src/schemas/knowledge.ts
46
+ import {
47
+ KnowledgeIdSchema,
48
+ KnowledgeVersionSchema,
49
+ Sha256HexSchema
50
+ } from "@bendyline/gezk";
51
+ import { z } from "zod";
52
+ import {
53
+ ArtifactDigestSchema,
54
+ CatalogDocumentSchema,
55
+ DEFAULT_EMBEDDING_ONNX_FILE,
56
+ DEFAULT_EMBEDDING_TOKENIZER_FILE,
57
+ GEZK_APPLICATION_ID,
58
+ GEZK_FORMAT_VERSION,
59
+ GEZK_INDEX_SCHEMA_VERSION,
60
+ GEZK_MANIFEST_KIND,
61
+ GEZK_MIME_TYPE,
62
+ GEZK_REGISTRY_KIND,
63
+ KNOWLEDGE_ID_PATTERN,
64
+ KNOWLEDGE_VERSION_PATTERN,
65
+ KnowledgeCatalogManifestSchema,
66
+ KnowledgeChunkUidSchema,
67
+ KnowledgeChunkingProfileSchema,
68
+ KnowledgeDocumentIdSchema,
69
+ KnowledgeEmbeddingProfileSchema,
70
+ KnowledgeIdSchema as KnowledgeIdSchema2,
71
+ KnowledgeManifestFileSchema,
72
+ KnowledgeRegistryEntrySchema as KnowledgeRegistryEntrySchema2,
73
+ KnowledgeRegistryIndexSchema,
74
+ KnowledgeSignatureSchema,
75
+ KnowledgeVectorEncodingSchema,
76
+ KnowledgeVersionSchema as KnowledgeVersionSchema2,
77
+ LICENSE_NOTICE_PATH,
78
+ MANIFEST_PATH,
79
+ MIMETYPE_PATH,
80
+ README_PATH,
81
+ ROUTER_DB_PATH,
82
+ RepoRelativePathSchema,
83
+ SOURCE_NOTICES_PATH,
84
+ Sha256HexSchema as Sha256HexSchema2,
85
+ SourceNoticesSchema,
86
+ embeddingProfileArtifacts,
87
+ formatKnowledgeUri,
88
+ parseKnowledgeUri,
89
+ sameVectorSpace
90
+ } from "@bendyline/gezk";
91
+ var KnowledgeStorageScopeSchema = z.enum(["machine-shared", "user"]);
92
+ var KnowledgeInstallSourceKindSchema = z.enum(["gilde", "file", "url"]);
93
+ var KnowledgeCatalogRefSchema = z.object({
94
+ publisherId: KnowledgeIdSchema,
95
+ catalogId: KnowledgeIdSchema,
96
+ version: KnowledgeVersionSchema,
97
+ contentDigest: Sha256HexSchema,
98
+ storageScope: KnowledgeStorageScopeSchema
99
+ });
100
+ var KnowledgeUserRegistrySchema = z.object({
101
+ version: z.literal(1),
102
+ catalogs: z.array(
103
+ z.object({
104
+ ref: KnowledgeCatalogRefSchema,
105
+ enabled: z.boolean(),
106
+ addedAt: z.string(),
107
+ autoUpdate: z.boolean().optional(),
108
+ /** Where the install came from; entries written before it was recorded carry none. */
109
+ source: KnowledgeInstallSourceKindSchema.optional(),
110
+ /** Set when the manager quarantined this catalog (with the reason). */
111
+ disabledReason: z.string().optional()
112
+ })
113
+ )
114
+ });
115
+ var KnowledgeMachineInventorySchema = z.object({
116
+ version: z.literal(1),
117
+ catalogs: z.array(
118
+ z.object({
119
+ publisherId: KnowledgeIdSchema,
120
+ catalogId: KnowledgeIdSchema,
121
+ version: KnowledgeVersionSchema,
122
+ contentDigest: Sha256HexSchema,
123
+ publishedAt: z.string(),
124
+ bytes: z.number().int().nonnegative()
125
+ })
126
+ )
127
+ });
128
+ var TrustedKnowledgeCoordinateSchema = z.object({
129
+ publisherId: KnowledgeIdSchema,
130
+ catalogId: KnowledgeIdSchema,
131
+ version: KnowledgeVersionSchema,
132
+ expectedDigest: Sha256HexSchema
133
+ });
134
+ var ProjectKnowledgeCatalogsSchema = z.object({
135
+ mode: z.enum(["inherit", "selected", "off"]),
136
+ /**
137
+ * Only for mode 'selected'. Unresolvable refs are RETAINED (not stripped)
138
+ * so a restored project regains its selection when the catalog returns.
139
+ */
140
+ refs: z.array(z.object({ publisherId: KnowledgeIdSchema, catalogId: KnowledgeIdSchema })).optional()
141
+ });
142
+ var KnowledgeHuggingfaceFileSchema = z.object({
143
+ repo: z.string(),
144
+ /** A 40-hex commit sha, so the pinned URL is immutable. */
145
+ revision: z.string(),
146
+ path: z.string()
147
+ });
148
+ var KnowledgeUpdateCandidateSchema = z.object({
149
+ publisherId: KnowledgeIdSchema,
150
+ catalogId: KnowledgeIdSchema,
151
+ name: z.string(),
152
+ installedVersion: z.string(),
153
+ availableVersion: z.string(),
154
+ releasedAt: z.string(),
155
+ archiveBytes: z.number().int().nonnegative(),
156
+ contentDigest: Sha256HexSchema,
157
+ huggingface: KnowledgeHuggingfaceFileSchema
158
+ });
159
+ var KnowledgeUpdatesResponseSchema = z.object({
160
+ source: z.literal("gilde"),
161
+ checkedAt: z.string(),
162
+ updates: z.array(KnowledgeUpdateCandidateSchema)
163
+ });
164
+ var KnowledgeSemanticSearchModeSchema = z.enum(["shared", "profile", "keyword-only"]);
165
+ var KnowledgeCatalogStatusSchema = z.object({
166
+ ref: KnowledgeCatalogRefSchema,
167
+ enabled: z.boolean(),
168
+ addedAt: z.string(),
169
+ disabledReason: z.string().optional(),
170
+ mounted: z.boolean(),
171
+ name: z.string().optional(),
172
+ description: z.string().optional(),
173
+ language: z.string().optional(),
174
+ license: z.string().optional(),
175
+ documents: z.number().int().nonnegative().optional(),
176
+ chunks: z.number().int().nonnegative().optional(),
177
+ sizeBytes: z.number().int().nonnegative().optional(),
178
+ /** False only for `keyword-only` catalogs (an unregistered embedding profile). */
179
+ vectorCompatible: z.boolean().optional(),
180
+ /**
181
+ * `shared` — queries reuse the daemon's own embedder; `profile` — the
182
+ * catalog's model is loaded to embed queries; `keyword-only` — no model
183
+ * gezel can run matches the profile, so only full-text search applies.
184
+ */
185
+ semanticSearch: KnowledgeSemanticSearchModeSchema.optional(),
186
+ source: KnowledgeInstallSourceKindSchema,
187
+ /** A strictly newer version exists in the shipped catalog content. */
188
+ updateAvailable: z.boolean(),
189
+ availableVersion: z.string().optional()
190
+ });
191
+ var KnowledgeAvailableCatalogSchema = z.object({
192
+ id: KnowledgeIdSchema,
193
+ publisherId: KnowledgeIdSchema,
194
+ name: z.string(),
195
+ description: z.string(),
196
+ tags: z.array(z.string()),
197
+ language: z.string(),
198
+ category: z.string().optional(),
199
+ license: z.string().optional(),
200
+ licenseUrl: z.string().optional(),
201
+ version: z.string(),
202
+ releasedAt: z.string(),
203
+ formatVersion: z.string(),
204
+ huggingface: KnowledgeHuggingfaceFileSchema,
205
+ upstream: z.string().optional(),
206
+ parquet: z.object({ repo: z.string(), revision: z.string(), dir: z.string() }).optional(),
207
+ sha256: Sha256HexSchema,
208
+ archiveBytes: z.number().int().nonnegative(),
209
+ uncompressedBytes: z.number().int().nonnegative(),
210
+ documents: z.number().int().nonnegative(),
211
+ chunks: z.number().int().nonnegative(),
212
+ embeddingProfile: z.object({ id: z.string(), modelRepo: z.string() }),
213
+ topics: z.array(z.object({ id: z.string(), name: z.string() })),
214
+ minGezelVersion: z.string().optional(),
215
+ /** Present when this user's registry holds a version of the catalog. */
216
+ installed: z.object({
217
+ version: z.string(),
218
+ contentDigest: Sha256HexSchema,
219
+ storageScope: KnowledgeStorageScopeSchema,
220
+ enabled: z.boolean(),
221
+ updateAvailable: z.boolean()
222
+ }).optional(),
223
+ /** The pinned bytes already sit in the machine-shared asset store. */
224
+ sharedOnDevice: z.boolean(),
225
+ installing: z.boolean(),
226
+ /** A resumable partial download of the pinned archive exists. */
227
+ incompleteDownload: z.boolean()
228
+ });
229
+ var KnowledgeInstallPhaseSchema = z.enum(["download", "extract", "embedder"]);
230
+ var KnowledgeInstallEventSchema = z.discriminatedUnion("type", [
231
+ z.object({
232
+ type: z.literal("progress"),
233
+ phase: KnowledgeInstallPhaseSchema,
234
+ bytesDone: z.number().nonnegative(),
235
+ bytesTotal: z.number().nonnegative()
236
+ }),
237
+ z.object({ type: z.literal("verifying") }),
238
+ z.object({
239
+ type: z.literal("retrying"),
240
+ attempt: z.number().int(),
241
+ maxAttempts: z.number().int(),
242
+ delayMs: z.number().nonnegative(),
243
+ reason: z.string()
244
+ }),
245
+ z.object({
246
+ type: z.literal("done"),
247
+ ref: KnowledgeCatalogRefSchema,
248
+ rootDir: z.string(),
249
+ storageScope: KnowledgeStorageScopeSchema,
250
+ /** Installed and mounted, but an optional step (the query embedder) did not complete. */
251
+ warning: z.string().optional()
252
+ }),
253
+ z.object({
254
+ type: z.literal("error"),
255
+ error: z.string(),
256
+ /** Set when the downloaded bytes did not match the pinned digest. */
257
+ mismatch: z.object({ expected: Sha256HexSchema, actual: Sha256HexSchema }).optional()
258
+ })
259
+ ]);
260
+ var KnowledgeInstallJobSchema = z.object({
261
+ id: z.string(),
262
+ startedAt: z.string(),
263
+ finished: z.boolean(),
264
+ error: z.string().optional(),
265
+ /** The latest progress event and, once finished, the terminal event. */
266
+ events: z.array(KnowledgeInstallEventSchema)
267
+ });
268
+ var KnowledgeActiveInstallSchema = z.object({
269
+ jobId: z.string(),
270
+ /** Known up front for catalog installs; a file/URL install learns it at `done`. */
271
+ catalogId: KnowledgeIdSchema.optional(),
272
+ startedAt: z.string(),
273
+ phase: z.enum(["download", "verifying", "extract", "embedder", "retrying"]),
274
+ bytesDone: z.number().nonnegative(),
275
+ bytesTotal: z.number().nonnegative()
276
+ });
277
+ var IncompleteKnowledgeDownloadSchema = z.object({
278
+ /** The temp-file stem: the pinned sha256's first 16 hex chars, or a hash of the URL. */
279
+ key: z.string().regex(/^[0-9a-f]{16}$/),
280
+ bytes: z.number().int().nonnegative(),
281
+ updatedAt: z.string(),
282
+ /** True when the key still matches a catalog entry, so a re-install resumes it. */
283
+ resumable: z.boolean(),
284
+ catalogId: KnowledgeIdSchema.optional(),
285
+ name: z.string().optional(),
286
+ archiveBytes: z.number().int().nonnegative().optional()
287
+ });
288
+ var KnowledgeInstallRequestSchema = z.object({
289
+ source: z.discriminatedUnion("kind", [
290
+ z.object({ kind: z.literal("file"), path: z.string().min(1) }),
291
+ z.object({
292
+ kind: z.literal("url"),
293
+ url: z.string().url(),
294
+ /** Optional out-of-band identity for remote imports. When present, the
295
+ * daemon rejects bytes that do not match before extracting the archive. */
296
+ expectedSha256: z.string().regex(/^[0-9a-fA-F]{64}$/).optional()
297
+ }),
298
+ z.object({
299
+ kind: z.literal("catalog"),
300
+ /** A gilde `knowledge-catalog` id; its pinned sha256 + commit are the trust root. */
301
+ id: KnowledgeIdSchema,
302
+ version: z.string().optional(),
303
+ /** `auto` (default) prefers the machine-shared store when a machine engine is adopted. */
304
+ placement: z.enum(["auto", "user"]).optional()
305
+ })
306
+ ])
307
+ });
308
+ var UpdateKnowledgeCatalogRequestSchema = z.object({
309
+ enabled: z.boolean().optional(),
310
+ autoUpdate: z.boolean().optional()
311
+ });
312
+ var KnowledgeSearchRequestSchema = z.object({
313
+ query: z.string().min(1),
314
+ maxResults: z.number().int().min(1).max(50).optional(),
315
+ /** Restrict to these catalog ids (default: every enabled catalog). */
316
+ catalogs: z.array(KnowledgeIdSchema).optional()
317
+ });
318
+
45
319
  // src/paths.ts
46
320
  var MACHINE_SHARED_MARKER = ".gezel-machine-shared-v1.json";
47
321
  function machineSharedHome(platform = process.platform, env = process.env) {
@@ -93,6 +367,9 @@ function userProjectDir(root, projectId) {
93
367
  function projectPrivateDir(root, projectId) {
94
368
  return userProjectDir(root, projectId);
95
369
  }
370
+ function projectTypeOverlayFile(root, projectId) {
371
+ return join(projectPrivateDir(root, projectId), "project-type-overlay.json");
372
+ }
96
373
  function machineSharedGezelDir(gezelId) {
97
374
  assertSafeEntityId(gezelId, "gezel id");
98
375
  const shared = activeMachineSharedHome();
@@ -222,6 +499,9 @@ function projectBoekwachterIssuesFile(root, projectId) {
222
499
  function projectCodeReviewsFile(root, projectId) {
223
500
  return join(projectPrivateDir(root, projectId), "code-reviews.json");
224
501
  }
502
+ function projectDiffpacksFile(root, projectId) {
503
+ return join(projectPrivateDir(root, projectId), "diffpacks.json");
504
+ }
225
505
  function projectReportActionsFile(root, projectId) {
226
506
  return join(projectPrivateDir(root, projectId), "report-actions.json");
227
507
  }
@@ -235,6 +515,29 @@ var PROJECT_SHADOW_DIR_NAME = "shadow";
235
515
  function projectShadowDir(root, projectId, external) {
236
516
  return join(projectArtifactsDir(root, projectId, external), PROJECT_SHADOW_DIR_NAME);
237
517
  }
518
+ var PROJECT_TABULAR_DIR_NAME = "tabular";
519
+ var TABULAR_COMPANION_SUFFIX = "_tables";
520
+ function projectTabularDir(root, projectId, external) {
521
+ return join(projectArtifactsDir(root, projectId, external), PROJECT_TABULAR_DIR_NAME);
522
+ }
523
+ var CONNECTOR_TABLES_DIR_NAME = "tables";
524
+ var CONNECTOR_ROLLUPS_DIR_NAME = "rollups";
525
+ var OBSERVATION_TABLE_MANIFEST_FILE = "manifest.json";
526
+ var OBSERVATION_TABLE_STATE_FILE = "state.json";
527
+ var PROJECT_DIFFPACKS_DIR_NAME = "diffpacks";
528
+ function projectDiffpacksDir(root, projectId, external) {
529
+ return join(projectArtifactsDir(root, projectId, external), PROJECT_DIFFPACKS_DIR_NAME);
530
+ }
531
+ function projectDiffpackDir(root, projectId, packId, external) {
532
+ return join(projectDiffpacksDir(root, projectId, external), packId);
533
+ }
534
+ var PROJECT_PROMPTS_DIR_NAME = "prompts";
535
+ function projectPromptsDir(root, projectId, external) {
536
+ return join(projectArtifactsDir(root, projectId, external), PROJECT_PROMPTS_DIR_NAME);
537
+ }
538
+ function projectPromptDraftDir(root, projectId, draftId, external) {
539
+ return join(projectPromptsDir(root, projectId, external), draftId);
540
+ }
238
541
  function projectMemoriesDir(root, projectId, external) {
239
542
  return join(projectDir(root, projectId, external), "memories");
240
543
  }
@@ -262,6 +565,9 @@ function projectTerminalFile(root, projectId, threadId) {
262
565
  function globalHistoryFile(root) {
263
566
  return join(root, "history.jsonl");
264
567
  }
568
+ function pendingHandoffsFile(root) {
569
+ return join(root, "pending-handoffs.json");
570
+ }
265
571
  function globalIndexDir(root) {
266
572
  return join(root, "index");
267
573
  }
@@ -271,6 +577,33 @@ function globalIndexDbFile(root) {
271
577
  function projectHistoryFile(root, projectId) {
272
578
  return join(projectPrivateDir(root, projectId), "history.jsonl");
273
579
  }
580
+ function knowledgeDir(root) {
581
+ return join(root, "knowledge");
582
+ }
583
+ function knowledgeRegistryFile(root) {
584
+ return join(knowledgeDir(root), "registry.json");
585
+ }
586
+ function knowledgeCatalogsDir(root) {
587
+ return join(knowledgeDir(root), "catalogs");
588
+ }
589
+ function knowledgeCatalogVersionDir(root, publisherId, catalogId, version, contentDigest) {
590
+ const publisher = KnowledgeIdSchema2.parse(publisherId);
591
+ const catalog = KnowledgeIdSchema2.parse(catalogId);
592
+ const catalogVersion = KnowledgeVersionSchema2.parse(version);
593
+ if (!/^[0-9a-f]{64}$/i.test(contentDigest)) {
594
+ throw new Error("knowledge catalog content digest must be a sha256");
595
+ }
596
+ return join(
597
+ knowledgeCatalogsDir(root),
598
+ publisher,
599
+ catalog,
600
+ catalogVersion,
601
+ contentDigest.slice(0, 16)
602
+ );
603
+ }
604
+ function knowledgeDownloadsDir(root) {
605
+ return join(knowledgeDir(root), "downloads");
606
+ }
274
607
  function projectQuestionsFile(root, projectId) {
275
608
  return join(projectPrivateDir(root, projectId), "questions.json");
276
609
  }
@@ -358,6 +691,21 @@ function craftbookTemplateScriptFile(root, prefix, id, version, name) {
358
691
  function craftbookShardPrefix(id) {
359
692
  return id.slice(0, 2).toLowerCase();
360
693
  }
694
+ function aiAppsRoot(root) {
695
+ return join(root, "ai-apps");
696
+ }
697
+ function aiAppsRegistryFile(root) {
698
+ return join(aiAppsRoot(root), "registry.json");
699
+ }
700
+ function aiAppVersionDir(root, appId, version) {
701
+ return join(aiAppsRoot(root), appId, version);
702
+ }
703
+ function aiAppItemsDir(root, appId, version) {
704
+ return join(aiAppVersionDir(root, appId, version), "items");
705
+ }
706
+ function aiAppReceiptFile(root, appId, version) {
707
+ return join(aiAppVersionDir(root, appId, version), "receipt.json");
708
+ }
361
709
  function projectTypesRoot(root) {
362
710
  return join(root, "project-types");
363
711
  }
@@ -525,9 +873,22 @@ async function readConfigRaw(root) {
525
873
  }
526
874
  }
527
875
  export {
876
+ CONNECTOR_ROLLUPS_DIR_NAME,
877
+ CONNECTOR_TABLES_DIR_NAME,
528
878
  MACHINE_SHARED_MARKER,
879
+ OBSERVATION_TABLE_MANIFEST_FILE,
880
+ OBSERVATION_TABLE_STATE_FILE,
881
+ PROJECT_DIFFPACKS_DIR_NAME,
882
+ PROJECT_PROMPTS_DIR_NAME,
529
883
  PROJECT_SHADOW_DIR_NAME,
884
+ PROJECT_TABULAR_DIR_NAME,
885
+ TABULAR_COMPANION_SUFFIX,
530
886
  activeMachineSharedHome,
887
+ aiAppItemsDir,
888
+ aiAppReceiptFile,
889
+ aiAppVersionDir,
890
+ aiAppsRegistryFile,
891
+ aiAppsRoot,
531
892
  ambientDashboardLatestFile,
532
893
  ambientDashboardStateFile,
533
894
  ambientDir,
@@ -573,6 +934,11 @@ export {
573
934
  keurmeesterDigestStatePath,
574
935
  keurmeesterDigestsDir,
575
936
  keurmeesterDir,
937
+ knowledgeCatalogVersionDir,
938
+ knowledgeCatalogsDir,
939
+ knowledgeDir,
940
+ knowledgeDownloadsDir,
941
+ knowledgeRegistryFile,
576
942
  machineSharedGezelDir,
577
943
  machineSharedHome,
578
944
  machineSharedMarkerFile,
@@ -581,6 +947,7 @@ export {
581
947
  meesterStatusFile,
582
948
  meesterStatusStateFile,
583
949
  pendingGrantsFile,
950
+ pendingHandoffsFile,
584
951
  playwrightBrowsersDir,
585
952
  projectActivityFile,
586
953
  projectArtifactsDir,
@@ -589,6 +956,9 @@ export {
589
956
  projectCodeReviewsFile,
590
957
  projectContentIndexDbFile,
591
958
  projectCreateTransactionsRoot,
959
+ projectDiffpackDir,
960
+ projectDiffpacksDir,
961
+ projectDiffpacksFile,
592
962
  projectDir,
593
963
  projectDocsDir,
594
964
  projectFindingLifecycleFile,
@@ -613,6 +983,8 @@ export {
613
983
  projectMemoryIndexDir,
614
984
  projectMetaFile,
615
985
  projectPrivateDir,
986
+ projectPromptDraftDir,
987
+ projectPromptsDir,
616
988
  projectQuestionsFile,
617
989
  projectReportActionsFile,
618
990
  projectScriptFile,
@@ -622,6 +994,7 @@ export {
622
994
  projectShadowDir,
623
995
  projectStorageDir,
624
996
  projectStorageScope,
997
+ projectTabularDir,
625
998
  projectTaskAboutFile,
626
999
  projectTaskDir,
627
1000
  projectTaskFile,
@@ -634,6 +1007,7 @@ export {
634
1007
  projectToolsetsInstallDir,
635
1008
  projectTypeDir,
636
1009
  projectTypeManifestFile,
1010
+ projectTypeOverlayFile,
637
1011
  projectTypeShardPrefix,
638
1012
  projectTypeVersionDir,
639
1013
  projectTypeVersionManifestFile,