@redaksjon/context 0.0.7 → 0.0.8-dev.20260217185259.0299d30

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/index10.cjs CHANGED
@@ -9,6 +9,8 @@ const content = require('./index11.cjs');
9
9
 
10
10
  const CompanySchema = overcontext.BaseEntitySchema.merge(zod.z.object({
11
11
  type: zod.z.literal("company"),
12
+ slug: zod.z.string().optional(),
13
+ // Human-readable identifier
12
14
  fullName: zod.z.string().optional(),
13
15
  industry: zod.z.string().optional(),
14
16
  sounds_like: zod.z.array(zod.z.string()).optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"index10.cjs","sources":["../src/schemas/company.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Company entity - organizations referenced in notes.\n */\nexport const CompanySchema = BaseEntitySchema.merge(z.object({\n type: z.literal('company'),\n \n fullName: z.string().optional(),\n industry: z.string().optional(),\n sounds_like: z.array(z.string()).optional(),\n relationships: RelationshipsSchema, // Relationships to other entities\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n}));\n"],"names":["BaseEntitySchema","z","RelationshipsSchema","EntityContentSchema"],"mappings":";;;;;;;;;AAQO,MAAM,aAAA,GAAgBA,4BAAA,CAAiB,KAAA,CAAMC,KAAA,CAAE,MAAA,CAAO;AAAA,EACzD,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EAEzB,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,aAAaA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,aAAA,EAAeC,iCAAA;AAAA;AAAA,EACf,OAAA,EAASC;AAAA;AACb,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"index10.cjs","sources":["../src/schemas/company.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Company entity - organizations referenced in notes.\n */\nexport const CompanySchema = BaseEntitySchema.merge(z.object({\n type: z.literal('company'),\n slug: z.string().optional(), // Human-readable identifier\n \n fullName: z.string().optional(),\n industry: z.string().optional(),\n sounds_like: z.array(z.string()).optional(),\n relationships: RelationshipsSchema, // Relationships to other entities\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n}));\n"],"names":["BaseEntitySchema","z","RelationshipsSchema","EntityContentSchema"],"mappings":";;;;;;;;;AAQO,MAAM,aAAA,GAAgBA,4BAAA,CAAiB,KAAA,CAAMC,KAAA,CAAE,MAAA,CAAO;AAAA,EACzD,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EACzB,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,aAAaA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,aAAA,EAAeC,iCAAA;AAAA;AAAA,EACf,OAAA,EAASC;AAAA;AACb,CAAC,CAAC;;;;"}
package/dist/index10.js CHANGED
@@ -5,6 +5,8 @@ import { EntityContentSchema } from './index11.js';
5
5
 
6
6
  const CompanySchema = BaseEntitySchema.merge(z.object({
7
7
  type: z.literal("company"),
8
+ slug: z.string().optional(),
9
+ // Human-readable identifier
8
10
  fullName: z.string().optional(),
9
11
  industry: z.string().optional(),
10
12
  sounds_like: z.array(z.string()).optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"index10.js","sources":["../src/schemas/company.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Company entity - organizations referenced in notes.\n */\nexport const CompanySchema = BaseEntitySchema.merge(z.object({\n type: z.literal('company'),\n \n fullName: z.string().optional(),\n industry: z.string().optional(),\n sounds_like: z.array(z.string()).optional(),\n relationships: RelationshipsSchema, // Relationships to other entities\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n}));\n"],"names":[],"mappings":";;;;;AAQO,MAAM,aAAA,GAAgB,gBAAA,CAAiB,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,EACzD,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EAEzB,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,aAAa,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,aAAA,EAAe,mBAAA;AAAA;AAAA,EACf,OAAA,EAAS;AAAA;AACb,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"index10.js","sources":["../src/schemas/company.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Company entity - organizations referenced in notes.\n */\nexport const CompanySchema = BaseEntitySchema.merge(z.object({\n type: z.literal('company'),\n slug: z.string().optional(), // Human-readable identifier\n \n fullName: z.string().optional(),\n industry: z.string().optional(),\n sounds_like: z.array(z.string()).optional(),\n relationships: RelationshipsSchema, // Relationships to other entities\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n}));\n"],"names":[],"mappings":";;;;;AAQO,MAAM,aAAA,GAAgB,gBAAA,CAAiB,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,EACzD,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EACzB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,aAAa,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,aAAA,EAAe,mBAAA;AAAA;AAAA,EACf,OAAA,EAAS;AAAA;AACb,CAAC,CAAC;;;;"}
package/dist/index13.cjs CHANGED
@@ -7,6 +7,8 @@ const overcontext = require('@utilarium/overcontext');
7
7
 
8
8
  const IgnoredTermSchema = overcontext.BaseEntitySchema.merge(zod.z.object({
9
9
  type: zod.z.literal("ignored"),
10
+ slug: zod.z.string().optional(),
11
+ // Human-readable identifier
10
12
  reason: zod.z.string().optional(),
11
13
  ignoredAt: zod.z.string().optional()
12
14
  // ISO date string
@@ -1 +1 @@
1
- {"version":3,"file":"index13.cjs","sources":["../src/schemas/ignored.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\n\n/**\n * Ignored term - phrases the user doesn't want to be prompted about.\n */\nexport const IgnoredTermSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('ignored'),\n \n reason: z.string().optional(),\n ignoredAt: z.string().optional(), // ISO date string\n}));\n"],"names":["BaseEntitySchema","z"],"mappings":";;;;;;;AAMO,MAAM,iBAAA,GAAoBA,4BAAA,CAAiB,KAAA,CAAMC,KAAA,CAAE,MAAA,CAAO;AAAA,EAC7D,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EAEzB,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AACnC,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"index13.cjs","sources":["../src/schemas/ignored.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\n\n/**\n * Ignored term - phrases the user doesn't want to be prompted about.\n */\nexport const IgnoredTermSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('ignored'),\n slug: z.string().optional(), // Human-readable identifier\n \n reason: z.string().optional(),\n ignoredAt: z.string().optional(), // ISO date string\n}));\n"],"names":["BaseEntitySchema","z"],"mappings":";;;;;;;AAMO,MAAM,iBAAA,GAAoBA,4BAAA,CAAiB,KAAA,CAAMC,KAAA,CAAE,MAAA,CAAO;AAAA,EAC7D,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EACzB,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AACnC,CAAC,CAAC;;;;"}
package/dist/index13.js CHANGED
@@ -3,6 +3,8 @@ import { BaseEntitySchema } from '@utilarium/overcontext';
3
3
 
4
4
  const IgnoredTermSchema = BaseEntitySchema.merge(z.object({
5
5
  type: z.literal("ignored"),
6
+ slug: z.string().optional(),
7
+ // Human-readable identifier
6
8
  reason: z.string().optional(),
7
9
  ignoredAt: z.string().optional()
8
10
  // ISO date string
@@ -1 +1 @@
1
- {"version":3,"file":"index13.js","sources":["../src/schemas/ignored.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\n\n/**\n * Ignored term - phrases the user doesn't want to be prompted about.\n */\nexport const IgnoredTermSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('ignored'),\n \n reason: z.string().optional(),\n ignoredAt: z.string().optional(), // ISO date string\n}));\n"],"names":[],"mappings":";;;AAMO,MAAM,iBAAA,GAAoB,gBAAA,CAAiB,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,EAC7D,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EAEzB,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AACnC,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"index13.js","sources":["../src/schemas/ignored.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\n\n/**\n * Ignored term - phrases the user doesn't want to be prompted about.\n */\nexport const IgnoredTermSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('ignored'),\n slug: z.string().optional(), // Human-readable identifier\n \n reason: z.string().optional(),\n ignoredAt: z.string().optional(), // ISO date string\n}));\n"],"names":[],"mappings":";;;AAMO,MAAM,iBAAA,GAAoB,gBAAA,CAAiB,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,EAC7D,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EACzB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AACnC,CAAC,CAAC;;;;"}
package/dist/index14.cjs CHANGED
@@ -9,6 +9,8 @@ const content = require('./index11.cjs');
9
9
 
10
10
  const PersonSchema = overcontext.BaseEntitySchema.merge(zod.z.object({
11
11
  type: zod.z.literal("person"),
12
+ slug: zod.z.string().optional(),
13
+ // Human-readable identifier
12
14
  firstName: zod.z.string().optional(),
13
15
  lastName: zod.z.string().optional(),
14
16
  company: zod.z.string().optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"index14.cjs","sources":["../src/schemas/person.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Person entity - named individuals the user frequently mentions.\n */\nexport const PersonSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('person'),\n \n firstName: z.string().optional(),\n lastName: z.string().optional(),\n company: z.string().optional(), // DEPRECATED: Use relationships instead\n role: z.string().optional(), // e.g., \"Manager\", \"Developer\"\n sounds_like: z.array(z.string()).optional(), // Common mishearings\n context: z.string().optional(), // How user knows them\n relationships: RelationshipsSchema, // Relationships to other entities\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n}));\n"],"names":["BaseEntitySchema","z","RelationshipsSchema","EntityContentSchema"],"mappings":";;;;;;;;;AAQO,MAAM,YAAA,GAAeA,4BAAA,CAAiB,KAAA,CAAMC,KAAA,CAAE,MAAA,CAAO;AAAA,EACxD,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EAExB,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC7B,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC1B,aAAaA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EAC1C,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC7B,aAAA,EAAeC,iCAAA;AAAA;AAAA,EACf,OAAA,EAASC;AAAA;AACb,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"index14.cjs","sources":["../src/schemas/person.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Person entity - named individuals the user frequently mentions.\n */\nexport const PersonSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('person'),\n slug: z.string().optional(), // Human-readable identifier\n \n firstName: z.string().optional(),\n lastName: z.string().optional(),\n company: z.string().optional(), // DEPRECATED: Use relationships instead\n role: z.string().optional(), // e.g., \"Manager\", \"Developer\"\n sounds_like: z.array(z.string()).optional(), // Common mishearings\n context: z.string().optional(), // How user knows them\n relationships: RelationshipsSchema, // Relationships to other entities\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n}));\n"],"names":["BaseEntitySchema","z","RelationshipsSchema","EntityContentSchema"],"mappings":";;;;;;;;;AAQO,MAAM,YAAA,GAAeA,4BAAA,CAAiB,KAAA,CAAMC,KAAA,CAAE,MAAA,CAAO;AAAA,EACxD,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACxB,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC7B,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC1B,aAAaA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EAC1C,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC7B,aAAA,EAAeC,iCAAA;AAAA;AAAA,EACf,OAAA,EAASC;AAAA;AACb,CAAC,CAAC;;;;"}
package/dist/index14.js CHANGED
@@ -5,6 +5,8 @@ import { EntityContentSchema } from './index11.js';
5
5
 
6
6
  const PersonSchema = BaseEntitySchema.merge(z.object({
7
7
  type: z.literal("person"),
8
+ slug: z.string().optional(),
9
+ // Human-readable identifier
8
10
  firstName: z.string().optional(),
9
11
  lastName: z.string().optional(),
10
12
  company: z.string().optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"index14.js","sources":["../src/schemas/person.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Person entity - named individuals the user frequently mentions.\n */\nexport const PersonSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('person'),\n \n firstName: z.string().optional(),\n lastName: z.string().optional(),\n company: z.string().optional(), // DEPRECATED: Use relationships instead\n role: z.string().optional(), // e.g., \"Manager\", \"Developer\"\n sounds_like: z.array(z.string()).optional(), // Common mishearings\n context: z.string().optional(), // How user knows them\n relationships: RelationshipsSchema, // Relationships to other entities\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n}));\n"],"names":[],"mappings":";;;;;AAQO,MAAM,YAAA,GAAe,gBAAA,CAAiB,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,EACxD,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EAExB,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC7B,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC1B,aAAa,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EAC1C,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC7B,aAAA,EAAe,mBAAA;AAAA;AAAA,EACf,OAAA,EAAS;AAAA;AACb,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"index14.js","sources":["../src/schemas/person.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Person entity - named individuals the user frequently mentions.\n */\nexport const PersonSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('person'),\n slug: z.string().optional(), // Human-readable identifier\n \n firstName: z.string().optional(),\n lastName: z.string().optional(),\n company: z.string().optional(), // DEPRECATED: Use relationships instead\n role: z.string().optional(), // e.g., \"Manager\", \"Developer\"\n sounds_like: z.array(z.string()).optional(), // Common mishearings\n context: z.string().optional(), // How user knows them\n relationships: RelationshipsSchema, // Relationships to other entities\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n}));\n"],"names":[],"mappings":";;;;;AAQO,MAAM,YAAA,GAAe,gBAAA,CAAiB,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,EACxD,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACxB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC7B,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC1B,aAAa,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EAC1C,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC7B,aAAA,EAAe,mBAAA;AAAA;AAAA,EACf,OAAA,EAAS;AAAA;AACb,CAAC,CAAC;;;;"}
package/dist/index15.cjs CHANGED
@@ -24,6 +24,8 @@ const ProjectRoutingSchema = zod.z.object({
24
24
  });
25
25
  const ProjectSchema = overcontext.BaseEntitySchema.merge(zod.z.object({
26
26
  type: zod.z.literal("project"),
27
+ slug: zod.z.string().optional(),
28
+ // Human-readable identifier
27
29
  description: zod.z.string().optional(),
28
30
  classification: ProjectClassificationSchema,
29
31
  routing: ProjectRoutingSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"index15.cjs","sources":["../src/schemas/project.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Project classification signals.\n */\nexport const ProjectClassificationSchema = z.object({\n context_type: z.enum(['work', 'personal', 'mixed']),\n associated_people: z.array(z.string()).optional(), // DEPRECATED: Use relationships instead\n associated_companies: z.array(z.string()).optional(), // DEPRECATED: Use relationships instead\n topics: z.array(z.string()).optional(),\n explicit_phrases: z.array(z.string()).optional(),\n});\n\n/**\n * Project routing configuration.\n */\nexport const ProjectRoutingSchema = z.object({\n destination: z.string().optional(),\n structure: z.enum(['none', 'year', 'month', 'day']),\n filename_options: z.array(z.enum(['date', 'time', 'subject'])),\n auto_tags: z.array(z.string()).optional(),\n});\n\n/**\n * Project entity - work contexts that affect routing and understanding.\n */\nexport const ProjectSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('project'),\n \n description: z.string().optional(),\n classification: ProjectClassificationSchema,\n routing: ProjectRoutingSchema,\n sounds_like: z.array(z.string()).optional(),\n relationships: RelationshipsSchema, // Unified relationships\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n active: z.boolean().optional(),\n}));\n"],"names":["z","BaseEntitySchema","RelationshipsSchema","EntityContentSchema"],"mappings":";;;;;;;;;AAQO,MAAM,2BAAA,GAA8BA,MAAE,MAAA,CAAO;AAAA,EAChD,cAAcA,KAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,EAClD,mBAAmBA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EAChD,sBAAsBA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EACnD,QAAQA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,kBAAkBA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA;AAC1C,CAAC;AAKM,MAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EACzC,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,SAAA,EAAWA,MAAE,IAAA,CAAK,CAAC,QAAQ,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,EAClD,gBAAA,EAAkBA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAC,CAAC,CAAA;AAAA,EAC7D,WAAWA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA;AACnC,CAAC;AAKM,MAAM,aAAA,GAAgBC,4BAAA,CAAiB,KAAA,CAAMD,KAAA,CAAE,MAAA,CAAO;AAAA,EACzD,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EAEzB,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,cAAA,EAAgB,2BAAA;AAAA,EAChB,OAAA,EAAS,oBAAA;AAAA,EACT,aAAaA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,aAAA,EAAeE,iCAAA;AAAA;AAAA,EACf,OAAA,EAASC,2BAAA;AAAA;AAAA,EACT,MAAA,EAAQH,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACxB,CAAC,CAAC;;;;;;"}
1
+ {"version":3,"file":"index15.cjs","sources":["../src/schemas/project.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Project classification signals.\n */\nexport const ProjectClassificationSchema = z.object({\n context_type: z.enum(['work', 'personal', 'mixed']),\n associated_people: z.array(z.string()).optional(), // DEPRECATED: Use relationships instead\n associated_companies: z.array(z.string()).optional(), // DEPRECATED: Use relationships instead\n topics: z.array(z.string()).optional(),\n explicit_phrases: z.array(z.string()).optional(),\n});\n\n/**\n * Project routing configuration.\n */\nexport const ProjectRoutingSchema = z.object({\n destination: z.string().optional(),\n structure: z.enum(['none', 'year', 'month', 'day']),\n filename_options: z.array(z.enum(['date', 'time', 'subject'])),\n auto_tags: z.array(z.string()).optional(),\n});\n\n/**\n * Project entity - work contexts that affect routing and understanding.\n */\nexport const ProjectSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('project'),\n slug: z.string().optional(), // Human-readable identifier\n \n description: z.string().optional(),\n classification: ProjectClassificationSchema,\n routing: ProjectRoutingSchema,\n sounds_like: z.array(z.string()).optional(),\n relationships: RelationshipsSchema, // Unified relationships\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n active: z.boolean().optional(),\n}));\n"],"names":["z","BaseEntitySchema","RelationshipsSchema","EntityContentSchema"],"mappings":";;;;;;;;;AAQO,MAAM,2BAAA,GAA8BA,MAAE,MAAA,CAAO;AAAA,EAChD,cAAcA,KAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,EAClD,mBAAmBA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EAChD,sBAAsBA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EACnD,QAAQA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,kBAAkBA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA;AAC1C,CAAC;AAKM,MAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EACzC,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,SAAA,EAAWA,MAAE,IAAA,CAAK,CAAC,QAAQ,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,EAClD,gBAAA,EAAkBA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAC,CAAC,CAAA;AAAA,EAC7D,WAAWA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA;AACnC,CAAC;AAKM,MAAM,aAAA,GAAgBC,4BAAA,CAAiB,KAAA,CAAMD,KAAA,CAAE,MAAA,CAAO;AAAA,EACzD,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EACzB,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,cAAA,EAAgB,2BAAA;AAAA,EAChB,OAAA,EAAS,oBAAA;AAAA,EACT,aAAaA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,aAAA,EAAeE,iCAAA;AAAA;AAAA,EACf,OAAA,EAASC,2BAAA;AAAA;AAAA,EACT,MAAA,EAAQH,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACxB,CAAC,CAAC;;;;;;"}
package/dist/index15.js CHANGED
@@ -20,6 +20,8 @@ const ProjectRoutingSchema = z.object({
20
20
  });
21
21
  const ProjectSchema = BaseEntitySchema.merge(z.object({
22
22
  type: z.literal("project"),
23
+ slug: z.string().optional(),
24
+ // Human-readable identifier
23
25
  description: z.string().optional(),
24
26
  classification: ProjectClassificationSchema,
25
27
  routing: ProjectRoutingSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"index15.js","sources":["../src/schemas/project.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Project classification signals.\n */\nexport const ProjectClassificationSchema = z.object({\n context_type: z.enum(['work', 'personal', 'mixed']),\n associated_people: z.array(z.string()).optional(), // DEPRECATED: Use relationships instead\n associated_companies: z.array(z.string()).optional(), // DEPRECATED: Use relationships instead\n topics: z.array(z.string()).optional(),\n explicit_phrases: z.array(z.string()).optional(),\n});\n\n/**\n * Project routing configuration.\n */\nexport const ProjectRoutingSchema = z.object({\n destination: z.string().optional(),\n structure: z.enum(['none', 'year', 'month', 'day']),\n filename_options: z.array(z.enum(['date', 'time', 'subject'])),\n auto_tags: z.array(z.string()).optional(),\n});\n\n/**\n * Project entity - work contexts that affect routing and understanding.\n */\nexport const ProjectSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('project'),\n \n description: z.string().optional(),\n classification: ProjectClassificationSchema,\n routing: ProjectRoutingSchema,\n sounds_like: z.array(z.string()).optional(),\n relationships: RelationshipsSchema, // Unified relationships\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n active: z.boolean().optional(),\n}));\n"],"names":[],"mappings":";;;;;AAQO,MAAM,2BAAA,GAA8B,EAAE,MAAA,CAAO;AAAA,EAChD,cAAc,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,EAClD,mBAAmB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EAChD,sBAAsB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EACnD,QAAQ,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,kBAAkB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAC1C,CAAC;AAKM,MAAM,oBAAA,GAAuB,EAAE,MAAA,CAAO;AAAA,EACzC,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,SAAA,EAAW,EAAE,IAAA,CAAK,CAAC,QAAQ,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,EAClD,gBAAA,EAAkB,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAC,CAAC,CAAA;AAAA,EAC7D,WAAW,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AACnC,CAAC;AAKM,MAAM,aAAA,GAAgB,gBAAA,CAAiB,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,EACzD,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EAEzB,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,cAAA,EAAgB,2BAAA;AAAA,EAChB,OAAA,EAAS,oBAAA;AAAA,EACT,aAAa,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,aAAA,EAAe,mBAAA;AAAA;AAAA,EACf,OAAA,EAAS,mBAAA;AAAA;AAAA,EACT,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACxB,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"index15.js","sources":["../src/schemas/project.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Project classification signals.\n */\nexport const ProjectClassificationSchema = z.object({\n context_type: z.enum(['work', 'personal', 'mixed']),\n associated_people: z.array(z.string()).optional(), // DEPRECATED: Use relationships instead\n associated_companies: z.array(z.string()).optional(), // DEPRECATED: Use relationships instead\n topics: z.array(z.string()).optional(),\n explicit_phrases: z.array(z.string()).optional(),\n});\n\n/**\n * Project routing configuration.\n */\nexport const ProjectRoutingSchema = z.object({\n destination: z.string().optional(),\n structure: z.enum(['none', 'year', 'month', 'day']),\n filename_options: z.array(z.enum(['date', 'time', 'subject'])),\n auto_tags: z.array(z.string()).optional(),\n});\n\n/**\n * Project entity - work contexts that affect routing and understanding.\n */\nexport const ProjectSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('project'),\n slug: z.string().optional(), // Human-readable identifier\n \n description: z.string().optional(),\n classification: ProjectClassificationSchema,\n routing: ProjectRoutingSchema,\n sounds_like: z.array(z.string()).optional(),\n relationships: RelationshipsSchema, // Unified relationships\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n active: z.boolean().optional(),\n}));\n"],"names":[],"mappings":";;;;;AAQO,MAAM,2BAAA,GAA8B,EAAE,MAAA,CAAO;AAAA,EAChD,cAAc,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,EAClD,mBAAmB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EAChD,sBAAsB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EACnD,QAAQ,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,kBAAkB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAC1C,CAAC;AAKM,MAAM,oBAAA,GAAuB,EAAE,MAAA,CAAO;AAAA,EACzC,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,SAAA,EAAW,EAAE,IAAA,CAAK,CAAC,QAAQ,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,EAClD,gBAAA,EAAkB,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAC,CAAC,CAAA;AAAA,EAC7D,WAAW,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AACnC,CAAC;AAKM,MAAM,aAAA,GAAgB,gBAAA,CAAiB,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,EACzD,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EACzB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,cAAA,EAAgB,2BAAA;AAAA,EAChB,OAAA,EAAS,oBAAA;AAAA,EACT,aAAa,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,aAAA,EAAe,mBAAA;AAAA;AAAA,EACf,OAAA,EAAS,mBAAA;AAAA;AAAA,EACT,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACxB,CAAC,CAAC;;;;"}
package/dist/index16.cjs CHANGED
@@ -9,6 +9,8 @@ const content = require('./index11.cjs');
9
9
 
10
10
  const TermSchema = overcontext.BaseEntitySchema.merge(zod.z.object({
11
11
  type: zod.z.literal("term"),
12
+ slug: zod.z.string().optional(),
13
+ // Human-readable identifier
12
14
  expansion: zod.z.string().optional(),
13
15
  // Full form if acronym
14
16
  domain: zod.z.string().optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"index16.cjs","sources":["../src/schemas/term.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Term entity - domain-specific terminology and acronyms.\n */\nexport const TermSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('term'),\n \n expansion: z.string().optional(), // Full form if acronym\n domain: z.string().optional(), // E.g., \"engineering\", \"finance\"\n sounds_like: z.array(z.string()).optional(),\n projects: z.array(z.string()).optional(), // DEPRECATED: Use relationships instead\n description: z.string().optional(),\n topics: z.array(z.string()).optional(),\n relationships: RelationshipsSchema, // Relationships to other entities\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n}));\n"],"names":["BaseEntitySchema","z","RelationshipsSchema","EntityContentSchema"],"mappings":";;;;;;;;;AAQO,MAAM,UAAA,GAAaA,4BAAA,CAAiB,KAAA,CAAMC,KAAA,CAAE,MAAA,CAAO;AAAA,EACtD,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EAEtB,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC/B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC5B,aAAaA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,UAAUA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EACvC,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,QAAQA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,aAAA,EAAeC,iCAAA;AAAA;AAAA,EACf,OAAA,EAASC;AAAA;AACb,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"index16.cjs","sources":["../src/schemas/term.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Term entity - domain-specific terminology and acronyms.\n */\nexport const TermSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('term'),\n slug: z.string().optional(), // Human-readable identifier\n \n expansion: z.string().optional(), // Full form if acronym\n domain: z.string().optional(), // E.g., \"engineering\", \"finance\"\n sounds_like: z.array(z.string()).optional(),\n projects: z.array(z.string()).optional(), // DEPRECATED: Use relationships instead\n description: z.string().optional(),\n topics: z.array(z.string()).optional(),\n relationships: RelationshipsSchema, // Relationships to other entities\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n}));\n"],"names":["BaseEntitySchema","z","RelationshipsSchema","EntityContentSchema"],"mappings":";;;;;;;;;AAQO,MAAM,UAAA,GAAaA,4BAAA,CAAiB,KAAA,CAAMC,KAAA,CAAE,MAAA,CAAO;AAAA,EACtD,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC/B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC5B,aAAaA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,UAAUA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EACvC,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,QAAQA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,aAAA,EAAeC,iCAAA;AAAA;AAAA,EACf,OAAA,EAASC;AAAA;AACb,CAAC,CAAC;;;;"}
package/dist/index16.js CHANGED
@@ -5,6 +5,8 @@ import { EntityContentSchema } from './index11.js';
5
5
 
6
6
  const TermSchema = BaseEntitySchema.merge(z.object({
7
7
  type: z.literal("term"),
8
+ slug: z.string().optional(),
9
+ // Human-readable identifier
8
10
  expansion: z.string().optional(),
9
11
  // Full form if acronym
10
12
  domain: z.string().optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"index16.js","sources":["../src/schemas/term.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Term entity - domain-specific terminology and acronyms.\n */\nexport const TermSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('term'),\n \n expansion: z.string().optional(), // Full form if acronym\n domain: z.string().optional(), // E.g., \"engineering\", \"finance\"\n sounds_like: z.array(z.string()).optional(),\n projects: z.array(z.string()).optional(), // DEPRECATED: Use relationships instead\n description: z.string().optional(),\n topics: z.array(z.string()).optional(),\n relationships: RelationshipsSchema, // Relationships to other entities\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n}));\n"],"names":[],"mappings":";;;;;AAQO,MAAM,UAAA,GAAa,gBAAA,CAAiB,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,EACtD,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EAEtB,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC/B,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC5B,aAAa,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,UAAU,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EACvC,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,QAAQ,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,aAAA,EAAe,mBAAA;AAAA;AAAA,EACf,OAAA,EAAS;AAAA;AACb,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"index16.js","sources":["../src/schemas/term.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseEntitySchema } from '@utilarium/overcontext';\nimport { RelationshipsSchema } from './relationships';\nimport { EntityContentSchema } from './content';\n\n/**\n * Term entity - domain-specific terminology and acronyms.\n */\nexport const TermSchema = BaseEntitySchema.merge(z.object({\n type: z.literal('term'),\n slug: z.string().optional(), // Human-readable identifier\n \n expansion: z.string().optional(), // Full form if acronym\n domain: z.string().optional(), // E.g., \"engineering\", \"finance\"\n sounds_like: z.array(z.string()).optional(),\n projects: z.array(z.string()).optional(), // DEPRECATED: Use relationships instead\n description: z.string().optional(),\n topics: z.array(z.string()).optional(),\n relationships: RelationshipsSchema, // Relationships to other entities\n content: EntityContentSchema, // Attached content (URLs, text, documents)\n}));\n"],"names":[],"mappings":";;;;;AAQO,MAAM,UAAA,GAAa,gBAAA,CAAiB,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,EACtD,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC/B,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC5B,aAAa,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,UAAU,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EACvC,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,QAAQ,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,aAAA,EAAe,mBAAA;AAAA;AAAA,EACf,OAAA,EAAS;AAAA;AACb,CAAC,CAAC;;;;"}
package/dist/index6.cjs CHANGED
@@ -42,6 +42,9 @@ const TYPE_TO_DIRECTORY = {
42
42
  "term": "terms",
43
43
  "ignored": "ignored"
44
44
  };
45
+ function slugify(text) {
46
+ return text.toLowerCase().trim().replace(/[^\w\s-]/g, "").replace(/[\s_-]+/g, "-").replace(/^-+|-+$/g, "");
47
+ }
45
48
  const create = () => {
46
49
  const entities = /* @__PURE__ */ new Map([
47
50
  ["person", /* @__PURE__ */ new Map()],
@@ -77,24 +80,48 @@ const create = () => {
77
80
  const dirName = TYPE_TO_DIRECTORY[entity.type];
78
81
  const dirPath = path__namespace.join(targetDir, "context", dirName);
79
82
  await fs__namespace.mkdir(dirPath, { recursive: true });
80
- const filePath = path__namespace.join(dirPath, `${entity.id}.yaml`);
83
+ const entityWithSlug = entity;
84
+ const uuidPrefix = entity.id.substring(0, 10);
85
+ const slug = entityWithSlug.slug || slugify(entity.name);
86
+ const filename = `${uuidPrefix}-${slug}.yaml`;
87
+ const filePath = path__namespace.join(dirPath, filename);
81
88
  const { type: _entityType, ...entityWithoutType } = entity;
82
- const content = yaml__namespace.dump(entityWithoutType, { lineWidth: -1 });
89
+ const content = yaml__namespace.dump(entityWithoutType, { lineWidth: -1, noRefs: true });
83
90
  await fs__namespace.writeFile(filePath, content, "utf-8");
84
91
  entities.get(entity.type)?.set(entity.id, entity);
85
92
  };
86
93
  const deleteEntity = async (type, id, targetDir) => {
87
94
  const dirName = TYPE_TO_DIRECTORY[type];
95
+ const resolvedId = resolveEntityId(type, id);
96
+ if (!resolvedId) return false;
97
+ const uuidPrefix = resolvedId.substring(0, 10);
98
+ const possibleDirs = [
99
+ path__namespace.join(targetDir, dirName),
100
+ path__namespace.join(targetDir, "context", dirName)
101
+ ];
102
+ for (const dir of possibleDirs) {
103
+ try {
104
+ const files = await fs__namespace.readdir(dir);
105
+ for (const file of files) {
106
+ if (file.startsWith(uuidPrefix) && (file.endsWith(".yaml") || file.endsWith(".yml"))) {
107
+ await fs__namespace.unlink(path__namespace.join(dir, file));
108
+ entities.get(type)?.delete(resolvedId);
109
+ return true;
110
+ }
111
+ }
112
+ } catch {
113
+ }
114
+ }
88
115
  const possiblePaths = [
89
- path__namespace.join(targetDir, dirName, `${id}.yaml`),
90
- path__namespace.join(targetDir, dirName, `${id}.yml`),
91
- path__namespace.join(targetDir, "context", dirName, `${id}.yaml`),
92
- path__namespace.join(targetDir, "context", dirName, `${id}.yml`)
116
+ path__namespace.join(targetDir, dirName, `${resolvedId}.yaml`),
117
+ path__namespace.join(targetDir, dirName, `${resolvedId}.yml`),
118
+ path__namespace.join(targetDir, "context", dirName, `${resolvedId}.yaml`),
119
+ path__namespace.join(targetDir, "context", dirName, `${resolvedId}.yml`)
93
120
  ];
94
121
  for (const filePath of possiblePaths) {
95
122
  try {
96
123
  await fs__namespace.unlink(filePath);
97
- entities.get(type)?.delete(id);
124
+ entities.get(type)?.delete(resolvedId);
98
125
  return true;
99
126
  } catch {
100
127
  }
@@ -103,10 +130,28 @@ const create = () => {
103
130
  };
104
131
  const getEntityFilePath = (type, id, contextDirs) => {
105
132
  const dirName = TYPE_TO_DIRECTORY[type];
133
+ const resolvedId = resolveEntityId(type, id);
134
+ if (!resolvedId) return void 0;
106
135
  for (const contextDir of [...contextDirs].reverse()) {
136
+ const typeDir = path__namespace.join(contextDir, dirName);
137
+ if (!fs.existsSync(typeDir)) continue;
138
+ try {
139
+ const files = fs.readdirSync(typeDir);
140
+ const uuidPrefix = resolvedId.substring(0, 10);
141
+ for (const file of files) {
142
+ if (file.startsWith(uuidPrefix) && (file.endsWith(".yaml") || file.endsWith(".yml"))) {
143
+ const filePath = path__namespace.join(typeDir, file);
144
+ const stat = fs.statSync(filePath);
145
+ if (stat.isFile()) {
146
+ return filePath;
147
+ }
148
+ }
149
+ }
150
+ } catch {
151
+ }
107
152
  const possiblePaths = [
108
- path__namespace.join(contextDir, dirName, `${id}.yaml`),
109
- path__namespace.join(contextDir, dirName, `${id}.yml`)
153
+ path__namespace.join(contextDir, dirName, `${resolvedId}.yaml`),
154
+ path__namespace.join(contextDir, dirName, `${resolvedId}.yml`)
110
155
  ];
111
156
  for (const filePath of possiblePaths) {
112
157
  if (fs.existsSync(filePath)) {
@@ -119,8 +164,24 @@ const create = () => {
119
164
  }
120
165
  return void 0;
121
166
  };
167
+ const resolveEntityId = (type, identifier) => {
168
+ if (entities.get(type)?.has(identifier)) {
169
+ return identifier;
170
+ }
171
+ const entityMap = entities.get(type);
172
+ if (entityMap) {
173
+ for (const entity of entityMap.values()) {
174
+ const entityWithSlug = entity;
175
+ if (entityWithSlug.slug === identifier) {
176
+ return entity.id;
177
+ }
178
+ }
179
+ }
180
+ return void 0;
181
+ };
122
182
  const get = (type, id) => {
123
- return entities.get(type)?.get(id);
183
+ const resolvedId = resolveEntityId(type, id);
184
+ return resolvedId ? entities.get(type)?.get(resolvedId) : void 0;
124
185
  };
125
186
  const getAll = (type) => {
126
187
  return Array.from(entities.get(type)?.values() ?? []);
@@ -1 +1 @@
1
- {"version":3,"file":"index6.cjs","sources":["../src/storage/storage.ts"],"sourcesContent":["/**\n * Context Storage\n * \n * Handles loading and saving entity YAML files from context directories.\n * Supports hierarchical loading where later directories override earlier ones.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport * as yaml from 'js-yaml';\nimport * as fs from 'fs/promises';\n// eslint-disable-next-line no-restricted-imports\nimport { existsSync, statSync } from 'fs';\nimport * as path from 'node:path';\nimport { RedaksjonEntity as Entity, RedaksjonEntityType as EntityType } from '../types';\n\nexport interface StorageInstance {\n load(contextDirs: string[]): Promise<void>;\n save(entity: Entity, targetDir: string): Promise<void>;\n delete(type: EntityType, id: string, targetDir: string): Promise<boolean>;\n get<T extends Entity>(type: EntityType, id: string): T | undefined;\n getAll<T extends Entity>(type: EntityType): T[];\n search(query: string): Entity[];\n findBySoundsLike(phonetic: string): Entity | undefined;\n clear(): void;\n getEntityFilePath(type: EntityType, id: string, contextDirs: string[]): string | undefined;\n}\n\ntype DirectoryName = 'people' | 'projects' | 'companies' | 'terms' | 'ignored';\n\nconst DIRECTORY_TO_TYPE: Record<DirectoryName, EntityType> = {\n 'people': 'person',\n 'projects': 'project',\n 'companies': 'company',\n 'terms': 'term',\n 'ignored': 'ignored',\n};\n\nconst TYPE_TO_DIRECTORY: Record<EntityType, DirectoryName> = {\n 'person': 'people',\n 'project': 'projects',\n 'company': 'companies',\n 'term': 'terms',\n 'ignored': 'ignored',\n};\n\nexport const create = (): StorageInstance => {\n const entities: Map<EntityType, Map<string, Entity>> = new Map([\n ['person', new Map()],\n ['project', new Map()],\n ['company', new Map()],\n ['term', new Map()],\n ['ignored', new Map()],\n ]);\n\n const load = async (contextDirs: string[]): Promise<void> => {\n // Load from all context directories (later directories override)\n for (const contextDir of contextDirs) {\n for (const dirName of Object.keys(DIRECTORY_TO_TYPE) as DirectoryName[]) {\n const typeDir = path.join(contextDir, dirName);\n const entityType = DIRECTORY_TO_TYPE[dirName];\n \n try {\n const files = await fs.readdir(typeDir);\n for (const file of files) {\n if (!file.endsWith('.yaml') && !file.endsWith('.yml')) continue;\n \n const content = await fs.readFile(path.join(typeDir, file), 'utf-8');\n const parsed = yaml.load(content) as Partial<Entity>;\n \n if (parsed && parsed.id) {\n entities.get(entityType)?.set(parsed.id, {\n ...parsed,\n type: entityType,\n } as Entity);\n }\n }\n } catch {\n // Directory doesn't exist, skip\n }\n }\n }\n };\n\n const save = async (entity: Entity, targetDir: string): Promise<void> => {\n const dirName = TYPE_TO_DIRECTORY[entity.type];\n // Save to context subdirectory (context/people/, context/projects/, etc.)\n const dirPath = path.join(targetDir, 'context', dirName);\n await fs.mkdir(dirPath, { recursive: true });\n \n const filePath = path.join(dirPath, `${entity.id}.yaml`);\n \n // Remove type from saved YAML (it's inferred from directory)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { type: _entityType, ...entityWithoutType } = entity;\n const content = yaml.dump(entityWithoutType, { lineWidth: -1 });\n await fs.writeFile(filePath, content, 'utf-8');\n \n entities.get(entity.type)?.set(entity.id, entity);\n };\n\n const deleteEntity = async (type: EntityType, id: string, targetDir: string): Promise<boolean> => {\n const dirName = TYPE_TO_DIRECTORY[type];\n \n // Try both possible locations (with and without 'context' subdirectory)\n const possiblePaths = [\n path.join(targetDir, dirName, `${id}.yaml`),\n path.join(targetDir, dirName, `${id}.yml`),\n path.join(targetDir, 'context', dirName, `${id}.yaml`),\n path.join(targetDir, 'context', dirName, `${id}.yml`),\n ];\n \n for (const filePath of possiblePaths) {\n try {\n await fs.unlink(filePath);\n entities.get(type)?.delete(id);\n return true;\n } catch {\n // File doesn't exist at this path, try next\n }\n }\n \n return false;\n };\n\n const getEntityFilePath = (type: EntityType, id: string, contextDirs: string[]): string | undefined => {\n const dirName = TYPE_TO_DIRECTORY[type];\n \n // Search in reverse order (closest first) to find where the entity is defined\n for (const contextDir of [...contextDirs].reverse()) {\n const possiblePaths = [\n path.join(contextDir, dirName, `${id}.yaml`),\n path.join(contextDir, dirName, `${id}.yml`),\n ];\n \n for (const filePath of possiblePaths) {\n // Use sync access check - this is only for CLI, not hot path\n if (existsSync(filePath)) {\n const stat = statSync(filePath);\n if (stat.isFile()) {\n return filePath;\n }\n }\n }\n }\n \n return undefined;\n };\n\n const get = <T extends Entity>(type: EntityType, id: string): T | undefined => {\n return entities.get(type)?.get(id) as T | undefined;\n };\n\n const getAll = <T extends Entity>(type: EntityType): T[] => {\n return Array.from(entities.get(type)?.values() ?? []) as T[];\n };\n\n const search = (query: string): Entity[] => {\n const normalizedQuery = query.toLowerCase();\n const results: Entity[] = [];\n const seen = new Set<string>(); // Track by ID to avoid duplicates\n \n for (const entityMap of entities.values()) {\n for (const entity of entityMap.values()) {\n let matched = false;\n \n // Check name\n if (entity.name.toLowerCase().includes(normalizedQuery)) {\n matched = true;\n }\n \n // Also check sounds_like field\n if (!matched) {\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase().includes(normalizedQuery))) {\n matched = true;\n }\n }\n \n // Also check exact match in sounds_like (for full phrase matching)\n if (!matched) {\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase() === normalizedQuery)) {\n matched = true;\n }\n }\n \n if (matched && !seen.has(entity.id)) {\n results.push(entity);\n seen.add(entity.id);\n }\n }\n }\n \n return results;\n };\n\n const findBySoundsLike = (phonetic: string): Entity | undefined => {\n const normalized = phonetic.toLowerCase().trim();\n \n for (const entityMap of entities.values()) {\n for (const entity of entityMap.values()) {\n // Check sounds_like field on entities that have it\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase() === normalized)) {\n return entity;\n }\n }\n }\n \n return undefined;\n };\n\n const clear = (): void => {\n for (const entityMap of entities.values()) {\n entityMap.clear();\n }\n };\n\n return { load, save, delete: deleteEntity, get, getAll, search, findBySoundsLike, clear, getEntityFilePath };\n};\n\n"],"names":["path","fs","yaml","existsSync","statSync"],"mappings":"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"}
1
+ {"version":3,"file":"index6.cjs","sources":["../src/storage/storage.ts"],"sourcesContent":["/**\n * Context Storage\n * \n * Handles loading and saving entity YAML files from context directories.\n * Supports hierarchical loading where later directories override earlier ones.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport * as yaml from 'js-yaml';\nimport * as fs from 'fs/promises';\n// eslint-disable-next-line no-restricted-imports\nimport { existsSync, statSync, readdirSync } from 'fs';\nimport * as path from 'node:path';\nimport { RedaksjonEntity as Entity, RedaksjonEntityType as EntityType } from '../types';\n\nexport interface StorageInstance {\n load(contextDirs: string[]): Promise<void>;\n save(entity: Entity, targetDir: string): Promise<void>;\n delete(type: EntityType, id: string, targetDir: string): Promise<boolean>;\n get<T extends Entity>(type: EntityType, id: string): T | undefined;\n getAll<T extends Entity>(type: EntityType): T[];\n search(query: string): Entity[];\n findBySoundsLike(phonetic: string): Entity | undefined;\n clear(): void;\n getEntityFilePath(type: EntityType, id: string, contextDirs: string[]): string | undefined;\n}\n\ntype DirectoryName = 'people' | 'projects' | 'companies' | 'terms' | 'ignored';\n\nconst DIRECTORY_TO_TYPE: Record<DirectoryName, EntityType> = {\n 'people': 'person',\n 'projects': 'project',\n 'companies': 'company',\n 'terms': 'term',\n 'ignored': 'ignored',\n};\n\nconst TYPE_TO_DIRECTORY: Record<EntityType, DirectoryName> = {\n 'person': 'people',\n 'project': 'projects',\n 'company': 'companies',\n 'term': 'terms',\n 'ignored': 'ignored',\n};\n\n/**\n * Simple slugify function for generating slugs from names\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/[\\s_-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nexport const create = (): StorageInstance => {\n const entities: Map<EntityType, Map<string, Entity>> = new Map([\n ['person', new Map()],\n ['project', new Map()],\n ['company', new Map()],\n ['term', new Map()],\n ['ignored', new Map()],\n ]);\n\n const load = async (contextDirs: string[]): Promise<void> => {\n // Load from all context directories (later directories override)\n for (const contextDir of contextDirs) {\n for (const dirName of Object.keys(DIRECTORY_TO_TYPE) as DirectoryName[]) {\n const typeDir = path.join(contextDir, dirName);\n const entityType = DIRECTORY_TO_TYPE[dirName];\n \n try {\n const files = await fs.readdir(typeDir);\n for (const file of files) {\n if (!file.endsWith('.yaml') && !file.endsWith('.yml')) continue;\n \n const content = await fs.readFile(path.join(typeDir, file), 'utf-8');\n const parsed = yaml.load(content) as Partial<Entity>;\n \n if (parsed && parsed.id) {\n entities.get(entityType)?.set(parsed.id, {\n ...parsed,\n type: entityType,\n } as Entity);\n }\n }\n } catch {\n // Directory doesn't exist, skip\n }\n }\n }\n };\n\n const save = async (entity: Entity, targetDir: string): Promise<void> => {\n const dirName = TYPE_TO_DIRECTORY[entity.type];\n // Save to context subdirectory (context/people/, context/projects/, etc.)\n const dirPath = path.join(targetDir, 'context', dirName);\n await fs.mkdir(dirPath, { recursive: true });\n \n // Generate filename: {uuid-prefix}-{slug}.yaml\n const entityWithSlug = entity as Entity & { slug?: string };\n const uuidPrefix = entity.id.substring(0, 10);\n const slug = entityWithSlug.slug || slugify(entity.name);\n const filename = `${uuidPrefix}-${slug}.yaml`;\n const filePath = path.join(dirPath, filename);\n \n // Remove type from saved YAML (it's inferred from directory)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { type: _entityType, ...entityWithoutType } = entity;\n const content = yaml.dump(entityWithoutType, { lineWidth: -1, noRefs: true });\n await fs.writeFile(filePath, content, 'utf-8');\n \n entities.get(entity.type)?.set(entity.id, entity);\n };\n\n const deleteEntity = async (type: EntityType, id: string, targetDir: string): Promise<boolean> => {\n const dirName = TYPE_TO_DIRECTORY[type];\n \n // Resolve ID to UUID if it's a slug\n const resolvedId = resolveEntityId(type, id);\n if (!resolvedId) return false;\n \n // Try to find file with UUID prefix\n const uuidPrefix = resolvedId.substring(0, 10);\n const possibleDirs = [\n path.join(targetDir, dirName),\n path.join(targetDir, 'context', dirName),\n ];\n \n for (const dir of possibleDirs) {\n try {\n const files = await fs.readdir(dir);\n for (const file of files) {\n if (file.startsWith(uuidPrefix) && (file.endsWith('.yaml') || file.endsWith('.yml'))) {\n await fs.unlink(path.join(dir, file));\n entities.get(type)?.delete(resolvedId);\n return true;\n }\n }\n } catch {\n // Directory doesn't exist or can't be read, try next\n }\n }\n \n // Fallback: try legacy slug-based filenames\n const possiblePaths = [\n path.join(targetDir, dirName, `${resolvedId}.yaml`),\n path.join(targetDir, dirName, `${resolvedId}.yml`),\n path.join(targetDir, 'context', dirName, `${resolvedId}.yaml`),\n path.join(targetDir, 'context', dirName, `${resolvedId}.yml`),\n ];\n \n for (const filePath of possiblePaths) {\n try {\n await fs.unlink(filePath);\n entities.get(type)?.delete(resolvedId);\n return true;\n } catch {\n // File doesn't exist at this path, try next\n }\n }\n \n return false;\n };\n\n const getEntityFilePath = (type: EntityType, id: string, contextDirs: string[]): string | undefined => {\n const dirName = TYPE_TO_DIRECTORY[type];\n \n // Resolve ID to UUID if it's a slug\n const resolvedId = resolveEntityId(type, id);\n if (!resolvedId) return undefined;\n \n // Search in reverse order (closest first) to find where the entity is defined\n for (const contextDir of [...contextDirs].reverse()) {\n const typeDir = path.join(contextDir, dirName);\n \n // Check if directory exists\n if (!existsSync(typeDir)) continue;\n \n try {\n // List all files in directory and find matching UUID prefix\n const files = readdirSync(typeDir);\n const uuidPrefix = resolvedId.substring(0, 10);\n \n for (const file of files) {\n if (file.startsWith(uuidPrefix) && (file.endsWith('.yaml') || file.endsWith('.yml'))) {\n const filePath = path.join(typeDir, file);\n const stat = statSync(filePath);\n if (stat.isFile()) {\n return filePath;\n }\n }\n }\n } catch {\n // Directory read failed, continue\n }\n \n // Fallback: try legacy slug-based filenames\n const possiblePaths = [\n path.join(contextDir, dirName, `${resolvedId}.yaml`),\n path.join(contextDir, dirName, `${resolvedId}.yml`),\n ];\n \n for (const filePath of possiblePaths) {\n if (existsSync(filePath)) {\n const stat = statSync(filePath);\n if (stat.isFile()) {\n return filePath;\n }\n }\n }\n }\n \n return undefined;\n };\n\n /**\n * Resolve entity ID from UUID or slug\n * Tries UUID first, then slug lookup\n */\n const resolveEntityId = (type: EntityType, identifier: string): string | undefined => {\n // Try direct UUID lookup first\n if (entities.get(type)?.has(identifier)) {\n return identifier;\n }\n \n // Try slug lookup\n const entityMap = entities.get(type);\n if (entityMap) {\n for (const entity of entityMap.values()) {\n const entityWithSlug = entity as Entity & { slug?: string };\n if (entityWithSlug.slug === identifier) {\n return entity.id;\n }\n }\n }\n \n return undefined;\n };\n\n const get = <T extends Entity>(type: EntityType, id: string): T | undefined => {\n // Support both UUID and slug lookup\n const resolvedId = resolveEntityId(type, id);\n return resolvedId ? entities.get(type)?.get(resolvedId) as T | undefined : undefined;\n };\n\n const getAll = <T extends Entity>(type: EntityType): T[] => {\n return Array.from(entities.get(type)?.values() ?? []) as T[];\n };\n\n const search = (query: string): Entity[] => {\n const normalizedQuery = query.toLowerCase();\n const results: Entity[] = [];\n const seen = new Set<string>(); // Track by ID to avoid duplicates\n \n for (const entityMap of entities.values()) {\n for (const entity of entityMap.values()) {\n let matched = false;\n \n // Check name\n if (entity.name.toLowerCase().includes(normalizedQuery)) {\n matched = true;\n }\n \n // Also check sounds_like field\n if (!matched) {\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase().includes(normalizedQuery))) {\n matched = true;\n }\n }\n \n // Also check exact match in sounds_like (for full phrase matching)\n if (!matched) {\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase() === normalizedQuery)) {\n matched = true;\n }\n }\n \n if (matched && !seen.has(entity.id)) {\n results.push(entity);\n seen.add(entity.id);\n }\n }\n }\n \n return results;\n };\n\n const findBySoundsLike = (phonetic: string): Entity | undefined => {\n const normalized = phonetic.toLowerCase().trim();\n \n for (const entityMap of entities.values()) {\n for (const entity of entityMap.values()) {\n // Check sounds_like field on entities that have it\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase() === normalized)) {\n return entity;\n }\n }\n }\n \n return undefined;\n };\n\n const clear = (): void => {\n for (const entityMap of entities.values()) {\n entityMap.clear();\n }\n };\n\n return { load, save, delete: deleteEntity, get, getAll, search, findBySoundsLike, clear, getEntityFilePath };\n};\n\n"],"names":["path","fs","yaml","existsSync","readdirSync","statSync"],"mappings":"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"}
package/dist/index6.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as yaml from 'js-yaml';
2
2
  import * as fs from 'fs/promises';
3
- import { existsSync, statSync } from 'fs';
3
+ import { existsSync, readdirSync, statSync } from 'fs';
4
4
  import * as path from 'node:path';
5
5
 
6
6
  const DIRECTORY_TO_TYPE = {
@@ -17,6 +17,9 @@ const TYPE_TO_DIRECTORY = {
17
17
  "term": "terms",
18
18
  "ignored": "ignored"
19
19
  };
20
+ function slugify(text) {
21
+ return text.toLowerCase().trim().replace(/[^\w\s-]/g, "").replace(/[\s_-]+/g, "-").replace(/^-+|-+$/g, "");
22
+ }
20
23
  const create = () => {
21
24
  const entities = /* @__PURE__ */ new Map([
22
25
  ["person", /* @__PURE__ */ new Map()],
@@ -52,24 +55,48 @@ const create = () => {
52
55
  const dirName = TYPE_TO_DIRECTORY[entity.type];
53
56
  const dirPath = path.join(targetDir, "context", dirName);
54
57
  await fs.mkdir(dirPath, { recursive: true });
55
- const filePath = path.join(dirPath, `${entity.id}.yaml`);
58
+ const entityWithSlug = entity;
59
+ const uuidPrefix = entity.id.substring(0, 10);
60
+ const slug = entityWithSlug.slug || slugify(entity.name);
61
+ const filename = `${uuidPrefix}-${slug}.yaml`;
62
+ const filePath = path.join(dirPath, filename);
56
63
  const { type: _entityType, ...entityWithoutType } = entity;
57
- const content = yaml.dump(entityWithoutType, { lineWidth: -1 });
64
+ const content = yaml.dump(entityWithoutType, { lineWidth: -1, noRefs: true });
58
65
  await fs.writeFile(filePath, content, "utf-8");
59
66
  entities.get(entity.type)?.set(entity.id, entity);
60
67
  };
61
68
  const deleteEntity = async (type, id, targetDir) => {
62
69
  const dirName = TYPE_TO_DIRECTORY[type];
70
+ const resolvedId = resolveEntityId(type, id);
71
+ if (!resolvedId) return false;
72
+ const uuidPrefix = resolvedId.substring(0, 10);
73
+ const possibleDirs = [
74
+ path.join(targetDir, dirName),
75
+ path.join(targetDir, "context", dirName)
76
+ ];
77
+ for (const dir of possibleDirs) {
78
+ try {
79
+ const files = await fs.readdir(dir);
80
+ for (const file of files) {
81
+ if (file.startsWith(uuidPrefix) && (file.endsWith(".yaml") || file.endsWith(".yml"))) {
82
+ await fs.unlink(path.join(dir, file));
83
+ entities.get(type)?.delete(resolvedId);
84
+ return true;
85
+ }
86
+ }
87
+ } catch {
88
+ }
89
+ }
63
90
  const possiblePaths = [
64
- path.join(targetDir, dirName, `${id}.yaml`),
65
- path.join(targetDir, dirName, `${id}.yml`),
66
- path.join(targetDir, "context", dirName, `${id}.yaml`),
67
- path.join(targetDir, "context", dirName, `${id}.yml`)
91
+ path.join(targetDir, dirName, `${resolvedId}.yaml`),
92
+ path.join(targetDir, dirName, `${resolvedId}.yml`),
93
+ path.join(targetDir, "context", dirName, `${resolvedId}.yaml`),
94
+ path.join(targetDir, "context", dirName, `${resolvedId}.yml`)
68
95
  ];
69
96
  for (const filePath of possiblePaths) {
70
97
  try {
71
98
  await fs.unlink(filePath);
72
- entities.get(type)?.delete(id);
99
+ entities.get(type)?.delete(resolvedId);
73
100
  return true;
74
101
  } catch {
75
102
  }
@@ -78,10 +105,28 @@ const create = () => {
78
105
  };
79
106
  const getEntityFilePath = (type, id, contextDirs) => {
80
107
  const dirName = TYPE_TO_DIRECTORY[type];
108
+ const resolvedId = resolveEntityId(type, id);
109
+ if (!resolvedId) return void 0;
81
110
  for (const contextDir of [...contextDirs].reverse()) {
111
+ const typeDir = path.join(contextDir, dirName);
112
+ if (!existsSync(typeDir)) continue;
113
+ try {
114
+ const files = readdirSync(typeDir);
115
+ const uuidPrefix = resolvedId.substring(0, 10);
116
+ for (const file of files) {
117
+ if (file.startsWith(uuidPrefix) && (file.endsWith(".yaml") || file.endsWith(".yml"))) {
118
+ const filePath = path.join(typeDir, file);
119
+ const stat = statSync(filePath);
120
+ if (stat.isFile()) {
121
+ return filePath;
122
+ }
123
+ }
124
+ }
125
+ } catch {
126
+ }
82
127
  const possiblePaths = [
83
- path.join(contextDir, dirName, `${id}.yaml`),
84
- path.join(contextDir, dirName, `${id}.yml`)
128
+ path.join(contextDir, dirName, `${resolvedId}.yaml`),
129
+ path.join(contextDir, dirName, `${resolvedId}.yml`)
85
130
  ];
86
131
  for (const filePath of possiblePaths) {
87
132
  if (existsSync(filePath)) {
@@ -94,8 +139,24 @@ const create = () => {
94
139
  }
95
140
  return void 0;
96
141
  };
142
+ const resolveEntityId = (type, identifier) => {
143
+ if (entities.get(type)?.has(identifier)) {
144
+ return identifier;
145
+ }
146
+ const entityMap = entities.get(type);
147
+ if (entityMap) {
148
+ for (const entity of entityMap.values()) {
149
+ const entityWithSlug = entity;
150
+ if (entityWithSlug.slug === identifier) {
151
+ return entity.id;
152
+ }
153
+ }
154
+ }
155
+ return void 0;
156
+ };
97
157
  const get = (type, id) => {
98
- return entities.get(type)?.get(id);
158
+ const resolvedId = resolveEntityId(type, id);
159
+ return resolvedId ? entities.get(type)?.get(resolvedId) : void 0;
99
160
  };
100
161
  const getAll = (type) => {
101
162
  return Array.from(entities.get(type)?.values() ?? []);
@@ -1 +1 @@
1
- {"version":3,"file":"index6.js","sources":["../src/storage/storage.ts"],"sourcesContent":["/**\n * Context Storage\n * \n * Handles loading and saving entity YAML files from context directories.\n * Supports hierarchical loading where later directories override earlier ones.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport * as yaml from 'js-yaml';\nimport * as fs from 'fs/promises';\n// eslint-disable-next-line no-restricted-imports\nimport { existsSync, statSync } from 'fs';\nimport * as path from 'node:path';\nimport { RedaksjonEntity as Entity, RedaksjonEntityType as EntityType } from '../types';\n\nexport interface StorageInstance {\n load(contextDirs: string[]): Promise<void>;\n save(entity: Entity, targetDir: string): Promise<void>;\n delete(type: EntityType, id: string, targetDir: string): Promise<boolean>;\n get<T extends Entity>(type: EntityType, id: string): T | undefined;\n getAll<T extends Entity>(type: EntityType): T[];\n search(query: string): Entity[];\n findBySoundsLike(phonetic: string): Entity | undefined;\n clear(): void;\n getEntityFilePath(type: EntityType, id: string, contextDirs: string[]): string | undefined;\n}\n\ntype DirectoryName = 'people' | 'projects' | 'companies' | 'terms' | 'ignored';\n\nconst DIRECTORY_TO_TYPE: Record<DirectoryName, EntityType> = {\n 'people': 'person',\n 'projects': 'project',\n 'companies': 'company',\n 'terms': 'term',\n 'ignored': 'ignored',\n};\n\nconst TYPE_TO_DIRECTORY: Record<EntityType, DirectoryName> = {\n 'person': 'people',\n 'project': 'projects',\n 'company': 'companies',\n 'term': 'terms',\n 'ignored': 'ignored',\n};\n\nexport const create = (): StorageInstance => {\n const entities: Map<EntityType, Map<string, Entity>> = new Map([\n ['person', new Map()],\n ['project', new Map()],\n ['company', new Map()],\n ['term', new Map()],\n ['ignored', new Map()],\n ]);\n\n const load = async (contextDirs: string[]): Promise<void> => {\n // Load from all context directories (later directories override)\n for (const contextDir of contextDirs) {\n for (const dirName of Object.keys(DIRECTORY_TO_TYPE) as DirectoryName[]) {\n const typeDir = path.join(contextDir, dirName);\n const entityType = DIRECTORY_TO_TYPE[dirName];\n \n try {\n const files = await fs.readdir(typeDir);\n for (const file of files) {\n if (!file.endsWith('.yaml') && !file.endsWith('.yml')) continue;\n \n const content = await fs.readFile(path.join(typeDir, file), 'utf-8');\n const parsed = yaml.load(content) as Partial<Entity>;\n \n if (parsed && parsed.id) {\n entities.get(entityType)?.set(parsed.id, {\n ...parsed,\n type: entityType,\n } as Entity);\n }\n }\n } catch {\n // Directory doesn't exist, skip\n }\n }\n }\n };\n\n const save = async (entity: Entity, targetDir: string): Promise<void> => {\n const dirName = TYPE_TO_DIRECTORY[entity.type];\n // Save to context subdirectory (context/people/, context/projects/, etc.)\n const dirPath = path.join(targetDir, 'context', dirName);\n await fs.mkdir(dirPath, { recursive: true });\n \n const filePath = path.join(dirPath, `${entity.id}.yaml`);\n \n // Remove type from saved YAML (it's inferred from directory)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { type: _entityType, ...entityWithoutType } = entity;\n const content = yaml.dump(entityWithoutType, { lineWidth: -1 });\n await fs.writeFile(filePath, content, 'utf-8');\n \n entities.get(entity.type)?.set(entity.id, entity);\n };\n\n const deleteEntity = async (type: EntityType, id: string, targetDir: string): Promise<boolean> => {\n const dirName = TYPE_TO_DIRECTORY[type];\n \n // Try both possible locations (with and without 'context' subdirectory)\n const possiblePaths = [\n path.join(targetDir, dirName, `${id}.yaml`),\n path.join(targetDir, dirName, `${id}.yml`),\n path.join(targetDir, 'context', dirName, `${id}.yaml`),\n path.join(targetDir, 'context', dirName, `${id}.yml`),\n ];\n \n for (const filePath of possiblePaths) {\n try {\n await fs.unlink(filePath);\n entities.get(type)?.delete(id);\n return true;\n } catch {\n // File doesn't exist at this path, try next\n }\n }\n \n return false;\n };\n\n const getEntityFilePath = (type: EntityType, id: string, contextDirs: string[]): string | undefined => {\n const dirName = TYPE_TO_DIRECTORY[type];\n \n // Search in reverse order (closest first) to find where the entity is defined\n for (const contextDir of [...contextDirs].reverse()) {\n const possiblePaths = [\n path.join(contextDir, dirName, `${id}.yaml`),\n path.join(contextDir, dirName, `${id}.yml`),\n ];\n \n for (const filePath of possiblePaths) {\n // Use sync access check - this is only for CLI, not hot path\n if (existsSync(filePath)) {\n const stat = statSync(filePath);\n if (stat.isFile()) {\n return filePath;\n }\n }\n }\n }\n \n return undefined;\n };\n\n const get = <T extends Entity>(type: EntityType, id: string): T | undefined => {\n return entities.get(type)?.get(id) as T | undefined;\n };\n\n const getAll = <T extends Entity>(type: EntityType): T[] => {\n return Array.from(entities.get(type)?.values() ?? []) as T[];\n };\n\n const search = (query: string): Entity[] => {\n const normalizedQuery = query.toLowerCase();\n const results: Entity[] = [];\n const seen = new Set<string>(); // Track by ID to avoid duplicates\n \n for (const entityMap of entities.values()) {\n for (const entity of entityMap.values()) {\n let matched = false;\n \n // Check name\n if (entity.name.toLowerCase().includes(normalizedQuery)) {\n matched = true;\n }\n \n // Also check sounds_like field\n if (!matched) {\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase().includes(normalizedQuery))) {\n matched = true;\n }\n }\n \n // Also check exact match in sounds_like (for full phrase matching)\n if (!matched) {\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase() === normalizedQuery)) {\n matched = true;\n }\n }\n \n if (matched && !seen.has(entity.id)) {\n results.push(entity);\n seen.add(entity.id);\n }\n }\n }\n \n return results;\n };\n\n const findBySoundsLike = (phonetic: string): Entity | undefined => {\n const normalized = phonetic.toLowerCase().trim();\n \n for (const entityMap of entities.values()) {\n for (const entity of entityMap.values()) {\n // Check sounds_like field on entities that have it\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase() === normalized)) {\n return entity;\n }\n }\n }\n \n return undefined;\n };\n\n const clear = (): void => {\n for (const entityMap of entities.values()) {\n entityMap.clear();\n }\n };\n\n return { load, save, delete: deleteEntity, get, getAll, search, findBySoundsLike, clear, getEntityFilePath };\n};\n\n"],"names":[],"mappings":";;;;;AA+BA,MAAM,iBAAA,GAAuD;AAAA,EACzD,QAAA,EAAU,QAAA;AAAA,EACV,UAAA,EAAY,SAAA;AAAA,EACZ,WAAA,EAAa,SAAA;AAAA,EACb,OAAA,EAAS,MAAA;AAAA,EACT,SAAA,EAAW;AACf,CAAA;AAEA,MAAM,iBAAA,GAAuD;AAAA,EACzD,QAAA,EAAU,QAAA;AAAA,EACV,SAAA,EAAW,UAAA;AAAA,EACX,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ,OAAA;AAAA,EACR,SAAA,EAAW;AACf,CAAA;AAEO,MAAM,SAAS,MAAuB;AACzC,EAAA,MAAM,QAAA,uBAAqD,GAAA,CAAI;AAAA,IAC3D,CAAC,QAAA,kBAAU,IAAI,GAAA,EAAK,CAAA;AAAA,IACpB,CAAC,SAAA,kBAAW,IAAI,GAAA,EAAK,CAAA;AAAA,IACrB,CAAC,SAAA,kBAAW,IAAI,GAAA,EAAK,CAAA;AAAA,IACrB,CAAC,MAAA,kBAAQ,IAAI,GAAA,EAAK,CAAA;AAAA,IAClB,CAAC,SAAA,kBAAW,IAAI,GAAA,EAAK;AAAA,GACxB,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,OAAO,WAAA,KAAyC;AAEzD,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AAClC,MAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA,EAAsB;AACrE,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AAC7C,QAAA,MAAM,UAAA,GAAa,kBAAkB,OAAO,CAAA;AAE5C,QAAA,IAAI;AACA,UAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,OAAA,CAAQ,OAAO,CAAA;AACtC,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,YAAA,IAAI,CAAC,KAAK,QAAA,CAAS,OAAO,KAAK,CAAC,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AAEvD,YAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,QAAA,CAAS,KAAK,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA,EAAG,OAAO,CAAA;AACnE,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAEhC,YAAA,IAAI,MAAA,IAAU,OAAO,EAAA,EAAI;AACrB,cAAA,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA,EAAG,GAAA,CAAI,OAAO,EAAA,EAAI;AAAA,gBACrC,GAAG,MAAA;AAAA,gBACH,IAAA,EAAM;AAAA,eACC,CAAA;AAAA,YACf;AAAA,UACJ;AAAA,QACJ,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,OAAO,MAAA,EAAgB,SAAA,KAAqC;AACrE,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,MAAA,CAAO,IAAI,CAAA;AAE7C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,WAAW,OAAO,CAAA;AACvD,IAAA,MAAM,GAAG,KAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAE3C,IAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA,KAAA,CAAO,CAAA;AAIvD,IAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,GAAG,mBAAkB,GAAI,MAAA;AACpD,IAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,mBAAmB,EAAE,SAAA,EAAW,IAAI,CAAA;AAC9D,IAAA,MAAM,EAAA,CAAG,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAE7C,IAAA,QAAA,CAAS,IAAI,MAAA,CAAO,IAAI,GAAG,GAAA,CAAI,MAAA,CAAO,IAAI,MAAM,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,OAAO,IAAA,EAAkB,EAAA,EAAY,SAAA,KAAwC;AAC9F,IAAA,MAAM,OAAA,GAAU,kBAAkB,IAAI,CAAA;AAGtC,IAAA,MAAM,aAAA,GAAgB;AAAA,MAClB,KAAK,IAAA,CAAK,SAAA,EAAW,OAAA,EAAS,CAAA,EAAG,EAAE,CAAA,KAAA,CAAO,CAAA;AAAA,MAC1C,KAAK,IAAA,CAAK,SAAA,EAAW,OAAA,EAAS,CAAA,EAAG,EAAE,CAAA,IAAA,CAAM,CAAA;AAAA,MACzC,KAAK,IAAA,CAAK,SAAA,EAAW,WAAW,OAAA,EAAS,CAAA,EAAG,EAAE,CAAA,KAAA,CAAO,CAAA;AAAA,MACrD,KAAK,IAAA,CAAK,SAAA,EAAW,WAAW,OAAA,EAAS,CAAA,EAAG,EAAE,CAAA,IAAA,CAAM;AAAA,KACxD;AAEA,IAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AAClC,MAAA,IAAI;AACA,QAAA,MAAM,EAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,QAAA,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA;AAC7B,QAAA,OAAO,IAAA;AAAA,MACX,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACJ;AAEA,IAAA,OAAO,KAAA;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,EAAkB,EAAA,EAAY,WAAA,KAA8C;AACnG,IAAA,MAAM,OAAA,GAAU,kBAAkB,IAAI,CAAA;AAGtC,IAAA,KAAA,MAAW,cAAc,CAAC,GAAG,WAAW,CAAA,CAAE,SAAQ,EAAG;AACjD,MAAA,MAAM,aAAA,GAAgB;AAAA,QAClB,KAAK,IAAA,CAAK,UAAA,EAAY,OAAA,EAAS,CAAA,EAAG,EAAE,CAAA,KAAA,CAAO,CAAA;AAAA,QAC3C,KAAK,IAAA,CAAK,UAAA,EAAY,OAAA,EAAS,CAAA,EAAG,EAAE,CAAA,IAAA,CAAM;AAAA,OAC9C;AAEA,MAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AAElC,QAAA,IAAI,UAAA,CAAW,QAAQ,CAAA,EAAG;AACtB,UAAA,MAAM,IAAA,GAAO,SAAS,QAAQ,CAAA;AAC9B,UAAA,IAAI,IAAA,CAAK,QAAO,EAAG;AACf,YAAA,OAAO,QAAA;AAAA,UACX;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,OAAO,MAAA;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CAAmB,IAAA,EAAkB,EAAA,KAA8B;AAC3E,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG,IAAI,EAAE,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAmB,IAAA,KAA0B;AACxD,IAAA,OAAO,KAAA,CAAM,KAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG,MAAA,EAAO,IAAK,EAAE,CAAA;AAAA,EACxD,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAA4B;AACxC,IAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAC1C,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,IAAA,KAAA,MAAW,SAAA,IAAa,QAAA,CAAS,MAAA,EAAO,EAAG;AACvC,MAAA,KAAA,MAAW,MAAA,IAAU,SAAA,CAAU,MAAA,EAAO,EAAG;AACrC,QAAA,IAAI,OAAA,GAAU,KAAA;AAGd,QAAA,IAAI,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,eAAe,CAAA,EAAG;AACrD,UAAA,OAAA,GAAU,IAAA;AAAA,QACd;AAGA,QAAA,IAAI,CAAC,OAAA,EAAS;AACV,UAAA,MAAM,oBAAA,GAAuB,MAAA;AAC7B,UAAA,MAAM,WAAW,oBAAA,CAAqB,WAAA;AACtC,UAAA,IAAI,QAAA,EAAU,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,aAAY,CAAE,QAAA,CAAS,eAAe,CAAC,CAAA,EAAG;AAChE,YAAA,OAAA,GAAU,IAAA;AAAA,UACd;AAAA,QACJ;AAGA,QAAA,IAAI,CAAC,OAAA,EAAS;AACV,UAAA,MAAM,oBAAA,GAAuB,MAAA;AAC7B,UAAA,MAAM,WAAW,oBAAA,CAAqB,WAAA;AACtC,UAAA,IAAI,UAAU,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,WAAA,EAAY,KAAM,eAAe,CAAA,EAAG;AAC1D,YAAA,OAAA,GAAU,IAAA;AAAA,UACd;AAAA,QACJ;AAEA,QAAA,IAAI,WAAW,CAAC,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAG;AACjC,UAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,UAAA,IAAA,CAAK,GAAA,CAAI,OAAO,EAAE,CAAA;AAAA,QACtB;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,OAAO,OAAA;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAAyC;AAC/D,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,WAAA,EAAY,CAAE,IAAA,EAAK;AAE/C,IAAA,KAAA,MAAW,SAAA,IAAa,QAAA,CAAS,MAAA,EAAO,EAAG;AACvC,MAAA,KAAA,MAAW,MAAA,IAAU,SAAA,CAAU,MAAA,EAAO,EAAG;AAErC,QAAA,MAAM,oBAAA,GAAuB,MAAA;AAC7B,QAAA,MAAM,WAAW,oBAAA,CAAqB,WAAA;AACtC,QAAA,IAAI,UAAU,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,WAAA,EAAY,KAAM,UAAU,CAAA,EAAG;AACrD,UAAA,OAAO,MAAA;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,OAAO,MAAA;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAY;AACtB,IAAA,KAAA,MAAW,SAAA,IAAa,QAAA,CAAS,MAAA,EAAO,EAAG;AACvC,MAAA,SAAA,CAAU,KAAA,EAAM;AAAA,IACpB;AAAA,EACJ,CAAA;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,YAAA,EAAc,KAAK,MAAA,EAAQ,MAAA,EAAQ,gBAAA,EAAkB,KAAA,EAAO,iBAAA,EAAkB;AAC/G;;;;"}
1
+ {"version":3,"file":"index6.js","sources":["../src/storage/storage.ts"],"sourcesContent":["/**\n * Context Storage\n * \n * Handles loading and saving entity YAML files from context directories.\n * Supports hierarchical loading where later directories override earlier ones.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport * as yaml from 'js-yaml';\nimport * as fs from 'fs/promises';\n// eslint-disable-next-line no-restricted-imports\nimport { existsSync, statSync, readdirSync } from 'fs';\nimport * as path from 'node:path';\nimport { RedaksjonEntity as Entity, RedaksjonEntityType as EntityType } from '../types';\n\nexport interface StorageInstance {\n load(contextDirs: string[]): Promise<void>;\n save(entity: Entity, targetDir: string): Promise<void>;\n delete(type: EntityType, id: string, targetDir: string): Promise<boolean>;\n get<T extends Entity>(type: EntityType, id: string): T | undefined;\n getAll<T extends Entity>(type: EntityType): T[];\n search(query: string): Entity[];\n findBySoundsLike(phonetic: string): Entity | undefined;\n clear(): void;\n getEntityFilePath(type: EntityType, id: string, contextDirs: string[]): string | undefined;\n}\n\ntype DirectoryName = 'people' | 'projects' | 'companies' | 'terms' | 'ignored';\n\nconst DIRECTORY_TO_TYPE: Record<DirectoryName, EntityType> = {\n 'people': 'person',\n 'projects': 'project',\n 'companies': 'company',\n 'terms': 'term',\n 'ignored': 'ignored',\n};\n\nconst TYPE_TO_DIRECTORY: Record<EntityType, DirectoryName> = {\n 'person': 'people',\n 'project': 'projects',\n 'company': 'companies',\n 'term': 'terms',\n 'ignored': 'ignored',\n};\n\n/**\n * Simple slugify function for generating slugs from names\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/[\\s_-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nexport const create = (): StorageInstance => {\n const entities: Map<EntityType, Map<string, Entity>> = new Map([\n ['person', new Map()],\n ['project', new Map()],\n ['company', new Map()],\n ['term', new Map()],\n ['ignored', new Map()],\n ]);\n\n const load = async (contextDirs: string[]): Promise<void> => {\n // Load from all context directories (later directories override)\n for (const contextDir of contextDirs) {\n for (const dirName of Object.keys(DIRECTORY_TO_TYPE) as DirectoryName[]) {\n const typeDir = path.join(contextDir, dirName);\n const entityType = DIRECTORY_TO_TYPE[dirName];\n \n try {\n const files = await fs.readdir(typeDir);\n for (const file of files) {\n if (!file.endsWith('.yaml') && !file.endsWith('.yml')) continue;\n \n const content = await fs.readFile(path.join(typeDir, file), 'utf-8');\n const parsed = yaml.load(content) as Partial<Entity>;\n \n if (parsed && parsed.id) {\n entities.get(entityType)?.set(parsed.id, {\n ...parsed,\n type: entityType,\n } as Entity);\n }\n }\n } catch {\n // Directory doesn't exist, skip\n }\n }\n }\n };\n\n const save = async (entity: Entity, targetDir: string): Promise<void> => {\n const dirName = TYPE_TO_DIRECTORY[entity.type];\n // Save to context subdirectory (context/people/, context/projects/, etc.)\n const dirPath = path.join(targetDir, 'context', dirName);\n await fs.mkdir(dirPath, { recursive: true });\n \n // Generate filename: {uuid-prefix}-{slug}.yaml\n const entityWithSlug = entity as Entity & { slug?: string };\n const uuidPrefix = entity.id.substring(0, 10);\n const slug = entityWithSlug.slug || slugify(entity.name);\n const filename = `${uuidPrefix}-${slug}.yaml`;\n const filePath = path.join(dirPath, filename);\n \n // Remove type from saved YAML (it's inferred from directory)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { type: _entityType, ...entityWithoutType } = entity;\n const content = yaml.dump(entityWithoutType, { lineWidth: -1, noRefs: true });\n await fs.writeFile(filePath, content, 'utf-8');\n \n entities.get(entity.type)?.set(entity.id, entity);\n };\n\n const deleteEntity = async (type: EntityType, id: string, targetDir: string): Promise<boolean> => {\n const dirName = TYPE_TO_DIRECTORY[type];\n \n // Resolve ID to UUID if it's a slug\n const resolvedId = resolveEntityId(type, id);\n if (!resolvedId) return false;\n \n // Try to find file with UUID prefix\n const uuidPrefix = resolvedId.substring(0, 10);\n const possibleDirs = [\n path.join(targetDir, dirName),\n path.join(targetDir, 'context', dirName),\n ];\n \n for (const dir of possibleDirs) {\n try {\n const files = await fs.readdir(dir);\n for (const file of files) {\n if (file.startsWith(uuidPrefix) && (file.endsWith('.yaml') || file.endsWith('.yml'))) {\n await fs.unlink(path.join(dir, file));\n entities.get(type)?.delete(resolvedId);\n return true;\n }\n }\n } catch {\n // Directory doesn't exist or can't be read, try next\n }\n }\n \n // Fallback: try legacy slug-based filenames\n const possiblePaths = [\n path.join(targetDir, dirName, `${resolvedId}.yaml`),\n path.join(targetDir, dirName, `${resolvedId}.yml`),\n path.join(targetDir, 'context', dirName, `${resolvedId}.yaml`),\n path.join(targetDir, 'context', dirName, `${resolvedId}.yml`),\n ];\n \n for (const filePath of possiblePaths) {\n try {\n await fs.unlink(filePath);\n entities.get(type)?.delete(resolvedId);\n return true;\n } catch {\n // File doesn't exist at this path, try next\n }\n }\n \n return false;\n };\n\n const getEntityFilePath = (type: EntityType, id: string, contextDirs: string[]): string | undefined => {\n const dirName = TYPE_TO_DIRECTORY[type];\n \n // Resolve ID to UUID if it's a slug\n const resolvedId = resolveEntityId(type, id);\n if (!resolvedId) return undefined;\n \n // Search in reverse order (closest first) to find where the entity is defined\n for (const contextDir of [...contextDirs].reverse()) {\n const typeDir = path.join(contextDir, dirName);\n \n // Check if directory exists\n if (!existsSync(typeDir)) continue;\n \n try {\n // List all files in directory and find matching UUID prefix\n const files = readdirSync(typeDir);\n const uuidPrefix = resolvedId.substring(0, 10);\n \n for (const file of files) {\n if (file.startsWith(uuidPrefix) && (file.endsWith('.yaml') || file.endsWith('.yml'))) {\n const filePath = path.join(typeDir, file);\n const stat = statSync(filePath);\n if (stat.isFile()) {\n return filePath;\n }\n }\n }\n } catch {\n // Directory read failed, continue\n }\n \n // Fallback: try legacy slug-based filenames\n const possiblePaths = [\n path.join(contextDir, dirName, `${resolvedId}.yaml`),\n path.join(contextDir, dirName, `${resolvedId}.yml`),\n ];\n \n for (const filePath of possiblePaths) {\n if (existsSync(filePath)) {\n const stat = statSync(filePath);\n if (stat.isFile()) {\n return filePath;\n }\n }\n }\n }\n \n return undefined;\n };\n\n /**\n * Resolve entity ID from UUID or slug\n * Tries UUID first, then slug lookup\n */\n const resolveEntityId = (type: EntityType, identifier: string): string | undefined => {\n // Try direct UUID lookup first\n if (entities.get(type)?.has(identifier)) {\n return identifier;\n }\n \n // Try slug lookup\n const entityMap = entities.get(type);\n if (entityMap) {\n for (const entity of entityMap.values()) {\n const entityWithSlug = entity as Entity & { slug?: string };\n if (entityWithSlug.slug === identifier) {\n return entity.id;\n }\n }\n }\n \n return undefined;\n };\n\n const get = <T extends Entity>(type: EntityType, id: string): T | undefined => {\n // Support both UUID and slug lookup\n const resolvedId = resolveEntityId(type, id);\n return resolvedId ? entities.get(type)?.get(resolvedId) as T | undefined : undefined;\n };\n\n const getAll = <T extends Entity>(type: EntityType): T[] => {\n return Array.from(entities.get(type)?.values() ?? []) as T[];\n };\n\n const search = (query: string): Entity[] => {\n const normalizedQuery = query.toLowerCase();\n const results: Entity[] = [];\n const seen = new Set<string>(); // Track by ID to avoid duplicates\n \n for (const entityMap of entities.values()) {\n for (const entity of entityMap.values()) {\n let matched = false;\n \n // Check name\n if (entity.name.toLowerCase().includes(normalizedQuery)) {\n matched = true;\n }\n \n // Also check sounds_like field\n if (!matched) {\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase().includes(normalizedQuery))) {\n matched = true;\n }\n }\n \n // Also check exact match in sounds_like (for full phrase matching)\n if (!matched) {\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase() === normalizedQuery)) {\n matched = true;\n }\n }\n \n if (matched && !seen.has(entity.id)) {\n results.push(entity);\n seen.add(entity.id);\n }\n }\n }\n \n return results;\n };\n\n const findBySoundsLike = (phonetic: string): Entity | undefined => {\n const normalized = phonetic.toLowerCase().trim();\n \n for (const entityMap of entities.values()) {\n for (const entity of entityMap.values()) {\n // Check sounds_like field on entities that have it\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase() === normalized)) {\n return entity;\n }\n }\n }\n \n return undefined;\n };\n\n const clear = (): void => {\n for (const entityMap of entities.values()) {\n entityMap.clear();\n }\n };\n\n return { load, save, delete: deleteEntity, get, getAll, search, findBySoundsLike, clear, getEntityFilePath };\n};\n\n"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ export declare const CompanySchema: z.ZodObject<{
12
12
  namespace: z.ZodOptional<z.ZodString>;
13
13
  source: z.ZodOptional<z.ZodString>;
14
14
  type: z.ZodLiteral<"company">;
15
+ slug: z.ZodOptional<z.ZodString>;
15
16
  fullName: z.ZodOptional<z.ZodString>;
16
17
  industry: z.ZodOptional<z.ZodString>;
17
18
  sounds_like: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -1 +1 @@
1
- {"version":3,"file":"company.d.ts","sourceRoot":"","sources":["../../src/schemas/company.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQvB,CAAC"}
1
+ {"version":3,"file":"company.d.ts","sourceRoot":"","sources":["../../src/schemas/company.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBASvB,CAAC"}
@@ -12,6 +12,7 @@ export declare const IgnoredTermSchema: z.ZodObject<{
12
12
  namespace: z.ZodOptional<z.ZodString>;
13
13
  source: z.ZodOptional<z.ZodString>;
14
14
  type: z.ZodLiteral<"ignored">;
15
+ slug: z.ZodOptional<z.ZodString>;
15
16
  reason: z.ZodOptional<z.ZodString>;
16
17
  ignoredAt: z.ZodOptional<z.ZodString>;
17
18
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"ignored.d.ts","sourceRoot":"","sources":["../../src/schemas/ignored.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;iBAK3B,CAAC"}
1
+ {"version":3,"file":"ignored.d.ts","sourceRoot":"","sources":["../../src/schemas/ignored.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;iBAM3B,CAAC"}
@@ -30,6 +30,7 @@ export declare const redaksjonSchemas: {
30
30
  namespace: import('zod').ZodOptional<import('zod').ZodString>;
31
31
  source: import('zod').ZodOptional<import('zod').ZodString>;
32
32
  type: import('zod').ZodLiteral<"person">;
33
+ slug: import('zod').ZodOptional<import('zod').ZodString>;
33
34
  firstName: import('zod').ZodOptional<import('zod').ZodString>;
34
35
  lastName: import('zod').ZodOptional<import('zod').ZodString>;
35
36
  company: import('zod').ZodOptional<import('zod').ZodString>;
@@ -63,6 +64,7 @@ export declare const redaksjonSchemas: {
63
64
  namespace: import('zod').ZodOptional<import('zod').ZodString>;
64
65
  source: import('zod').ZodOptional<import('zod').ZodString>;
65
66
  type: import('zod').ZodLiteral<"project">;
67
+ slug: import('zod').ZodOptional<import('zod').ZodString>;
66
68
  description: import('zod').ZodOptional<import('zod').ZodString>;
67
69
  classification: import('zod').ZodObject<{
68
70
  context_type: import('zod').ZodEnum<{
@@ -119,6 +121,7 @@ export declare const redaksjonSchemas: {
119
121
  namespace: import('zod').ZodOptional<import('zod').ZodString>;
120
122
  source: import('zod').ZodOptional<import('zod').ZodString>;
121
123
  type: import('zod').ZodLiteral<"company">;
124
+ slug: import('zod').ZodOptional<import('zod').ZodString>;
122
125
  fullName: import('zod').ZodOptional<import('zod').ZodString>;
123
126
  industry: import('zod').ZodOptional<import('zod').ZodString>;
124
127
  sounds_like: import('zod').ZodOptional<import('zod').ZodArray<import('zod').ZodString>>;
@@ -149,6 +152,7 @@ export declare const redaksjonSchemas: {
149
152
  namespace: import('zod').ZodOptional<import('zod').ZodString>;
150
153
  source: import('zod').ZodOptional<import('zod').ZodString>;
151
154
  type: import('zod').ZodLiteral<"term">;
155
+ slug: import('zod').ZodOptional<import('zod').ZodString>;
152
156
  expansion: import('zod').ZodOptional<import('zod').ZodString>;
153
157
  domain: import('zod').ZodOptional<import('zod').ZodString>;
154
158
  sounds_like: import('zod').ZodOptional<import('zod').ZodArray<import('zod').ZodString>>;
@@ -182,6 +186,7 @@ export declare const redaksjonSchemas: {
182
186
  namespace: import('zod').ZodOptional<import('zod').ZodString>;
183
187
  source: import('zod').ZodOptional<import('zod').ZodString>;
184
188
  type: import('zod').ZodLiteral<"ignored">;
189
+ slug: import('zod').ZodOptional<import('zod').ZodString>;
185
190
  reason: import('zod').ZodOptional<import('zod').ZodString>;
186
191
  ignoredAt: import('zod').ZodOptional<import('zod').ZodString>;
187
192
  }, import('zod/v4/core').$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAQ1B;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;CAMhC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAQ1B;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;CAMhC,CAAC"}
@@ -12,6 +12,7 @@ export declare const PersonSchema: z.ZodObject<{
12
12
  namespace: z.ZodOptional<z.ZodString>;
13
13
  source: z.ZodOptional<z.ZodString>;
14
14
  type: z.ZodLiteral<"person">;
15
+ slug: z.ZodOptional<z.ZodString>;
15
16
  firstName: z.ZodOptional<z.ZodString>;
16
17
  lastName: z.ZodOptional<z.ZodString>;
17
18
  company: z.ZodOptional<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"person.d.ts","sourceRoot":"","sources":["../../src/schemas/person.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAWtB,CAAC"}
1
+ {"version":3,"file":"person.d.ts","sourceRoot":"","sources":["../../src/schemas/person.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAYtB,CAAC"}
@@ -44,6 +44,7 @@ export declare const ProjectSchema: z.ZodObject<{
44
44
  namespace: z.ZodOptional<z.ZodString>;
45
45
  source: z.ZodOptional<z.ZodString>;
46
46
  type: z.ZodLiteral<"project">;
47
+ slug: z.ZodOptional<z.ZodString>;
47
48
  description: z.ZodOptional<z.ZodString>;
48
49
  classification: z.ZodObject<{
49
50
  context_type: z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/schemas/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;iBAMtC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;iBAK/B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAUvB,CAAC"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/schemas/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;iBAMtC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;iBAK/B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAWvB,CAAC"}
@@ -12,6 +12,7 @@ export declare const TermSchema: z.ZodObject<{
12
12
  namespace: z.ZodOptional<z.ZodString>;
13
13
  source: z.ZodOptional<z.ZodString>;
14
14
  type: z.ZodLiteral<"term">;
15
+ slug: z.ZodOptional<z.ZodString>;
15
16
  expansion: z.ZodOptional<z.ZodString>;
16
17
  domain: z.ZodOptional<z.ZodString>;
17
18
  sounds_like: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -1 +1 @@
1
- {"version":3,"file":"term.d.ts","sourceRoot":"","sources":["../../src/schemas/term.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAWpB,CAAC"}
1
+ {"version":3,"file":"term.d.ts","sourceRoot":"","sources":["../../src/schemas/term.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAYpB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/storage/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,EAAE,eAAe,IAAI,MAAM,EAAE,mBAAmB,IAAI,UAAU,EAAE,MAAM,UAAU,CAAC;AAExF,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1E,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IACnE,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACvD,KAAK,IAAI,IAAI,CAAC;IACd,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC;CAC5F;AAoBD,eAAO,MAAM,MAAM,QAAO,eAiLzB,CAAC"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/storage/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,EAAE,eAAe,IAAI,MAAM,EAAE,mBAAmB,IAAI,UAAU,EAAE,MAAM,UAAU,CAAC;AAExF,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1E,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IACnE,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACvD,KAAK,IAAI,IAAI,CAAC;IACd,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC;CAC5F;AAgCD,eAAO,MAAM,MAAM,QAAO,eAqQzB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redaksjon/context",
3
- "version": "0.0.7",
3
+ "version": "0.0.8-dev.20260217185259.0299d30",
4
4
  "description": "Shared context schemas for redaksjon tools",
5
5
  "type": "module",
6
6
  "repository": {