@exellix/ai-skills 6.2.2 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analysis/analyze-skill-request.d.ts +13 -0
- package/dist/analysis/analyze-skill-request.d.ts.map +1 -0
- package/dist/analysis/analyze-skill-request.js +103 -0
- package/dist/analysis/analyze-skill-request.js.map +1 -0
- package/dist/analysis/build-skill-request-analysis-packet.d.ts +14 -0
- package/dist/analysis/build-skill-request-analysis-packet.d.ts.map +1 -0
- package/dist/analysis/build-skill-request-analysis-packet.js +106 -0
- package/dist/analysis/build-skill-request-analysis-packet.js.map +1 -0
- package/dist/analysis/collect-deterministic-findings.d.ts +14 -0
- package/dist/analysis/collect-deterministic-findings.d.ts.map +1 -0
- package/dist/analysis/collect-deterministic-findings.js +245 -0
- package/dist/analysis/collect-deterministic-findings.js.map +1 -0
- package/dist/analysis/constants.d.ts +5 -0
- package/dist/analysis/constants.d.ts.map +1 -0
- package/dist/analysis/constants.js +5 -0
- package/dist/analysis/constants.js.map +1 -0
- package/dist/analysis/format-skill-request-analysis-markdown.d.ts +8 -0
- package/dist/analysis/format-skill-request-analysis-markdown.d.ts.map +1 -0
- package/dist/analysis/format-skill-request-analysis-markdown.js +121 -0
- package/dist/analysis/format-skill-request-analysis-markdown.js.map +1 -0
- package/dist/analysis/path-utils.d.ts +11 -0
- package/dist/analysis/path-utils.d.ts.map +1 -0
- package/dist/analysis/path-utils.js +69 -0
- package/dist/analysis/path-utils.js.map +1 -0
- package/dist/analysis/sanitize-for-packet.d.ts +28 -0
- package/dist/analysis/sanitize-for-packet.d.ts.map +1 -0
- package/dist/analysis/sanitize-for-packet.js +107 -0
- package/dist/analysis/sanitize-for-packet.js.map +1 -0
- package/dist/analysis/types.d.ts +124 -0
- package/dist/analysis/types.d.ts.map +1 -0
- package/dist/analysis/types.js +2 -0
- package/dist/analysis/types.js.map +1 -0
- package/dist/catalog/canonical-skill-key.d.ts +5 -0
- package/dist/catalog/canonical-skill-key.d.ts.map +1 -0
- package/dist/catalog/canonical-skill-key.js +16 -0
- package/dist/catalog/canonical-skill-key.js.map +1 -0
- package/dist/catalog/constants.d.ts +7 -0
- package/dist/catalog/constants.d.ts.map +1 -0
- package/dist/catalog/constants.js +7 -0
- package/dist/catalog/constants.js.map +1 -0
- package/dist/catalog/env.d.ts +4 -0
- package/dist/catalog/env.d.ts.map +1 -0
- package/dist/catalog/env.js +15 -0
- package/dist/catalog/env.js.map +1 -0
- package/dist/catalog/gateway-template.d.ts +6 -0
- package/dist/catalog/gateway-template.d.ts.map +1 -0
- package/dist/catalog/gateway-template.js +15 -0
- package/dist/catalog/gateway-template.js.map +1 -0
- package/dist/catalog/index.d.ts +3 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +3 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/seed.d.ts +12 -0
- package/dist/catalog/seed.d.ts.map +1 -0
- package/dist/catalog/seed.js +45 -0
- package/dist/catalog/seed.js.map +1 -0
- package/dist/catalog/skill-catalog.d.ts +28 -0
- package/dist/catalog/skill-catalog.d.ts.map +1 -0
- package/dist/catalog/skill-catalog.js +139 -0
- package/dist/catalog/skill-catalog.js.map +1 -0
- package/dist/catalog/store-factory.d.ts +18 -0
- package/dist/catalog/store-factory.d.ts.map +1 -0
- package/dist/catalog/store-factory.js +36 -0
- package/dist/catalog/store-factory.js.map +1 -0
- package/dist/catalog/types.d.ts +61 -0
- package/dist/catalog/types.d.ts.map +1 -0
- package/dist/catalog/types.js +22 -0
- package/dist/catalog/types.js.map +1 -0
- package/dist/client/audit-manager.d.ts +27 -0
- package/dist/client/audit-manager.d.ts.map +1 -0
- package/dist/client/audit-manager.js +260 -0
- package/dist/client/audit-manager.js.map +1 -0
- package/dist/client/invoke-skill-via-funcx.d.ts +11 -0
- package/dist/client/invoke-skill-via-funcx.d.ts.map +1 -0
- package/dist/client/invoke-skill-via-funcx.js +51 -0
- package/dist/client/invoke-skill-via-funcx.js.map +1 -0
- package/dist/client/skill-executor.d.ts.map +1 -1
- package/dist/client/skill-executor.js +3 -9
- package/dist/client/skill-executor.js.map +1 -1
- package/dist/client/task-executor.d.ts +21 -0
- package/dist/client/task-executor.d.ts.map +1 -0
- package/dist/client/task-executor.js +50 -0
- package/dist/client/task-executor.js.map +1 -0
- package/dist/errors/skillModelResolutionError.d.ts +28 -0
- package/dist/errors/skillModelResolutionError.d.ts.map +1 -0
- package/dist/errors/{skill-model-resolution-error.js → skillModelResolutionError.js} +12 -15
- package/dist/errors/skillModelResolutionError.js.map +1 -0
- package/dist/index.d.ts +7 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/invocation/resolveModelConfigForSkillInvoke.d.ts +6 -11
- package/dist/invocation/resolveModelConfigForSkillInvoke.d.ts.map +1 -1
- package/dist/invocation/resolveModelConfigForSkillInvoke.js +11 -23
- package/dist/invocation/resolveModelConfigForSkillInvoke.js.map +1 -1
- package/dist/invocation/resolveSkillProfileToWireModel.d.ts +14 -2
- package/dist/invocation/resolveSkillProfileToWireModel.d.ts.map +1 -1
- package/dist/invocation/resolveSkillProfileToWireModel.js +93 -2
- package/dist/invocation/resolveSkillProfileToWireModel.js.map +1 -1
- package/dist/metadata.d.ts +7 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +65 -0
- package/dist/metadata.js.map +1 -0
- package/dist/optimixer/build-optimixer-model-profile.d.ts +18 -0
- package/dist/optimixer/build-optimixer-model-profile.d.ts.map +1 -0
- package/dist/optimixer/build-optimixer-model-profile.js +69 -0
- package/dist/optimixer/build-optimixer-model-profile.js.map +1 -0
- package/dist/optimixer/skills-optimixer.d.ts +2 -3
- package/dist/optimixer/skills-optimixer.d.ts.map +1 -1
- package/dist/optimixer/skills-optimixer.js +8 -11
- package/dist/optimixer/skills-optimixer.js.map +1 -1
- package/erc-manifest.json +10 -10
- package/package.json +1 -1
- package/dist/errors/skill-model-resolution-error.d.ts +0 -28
- package/dist/errors/skill-model-resolution-error.d.ts.map +0 -1
- package/dist/errors/skill-model-resolution-error.js.map +0 -1
- package/dist/invocation/optimixerModelProfileFromResolved.d.ts +0 -5
- package/dist/invocation/optimixerModelProfileFromResolved.d.ts.map +0 -1
- package/dist/invocation/optimixerModelProfileFromResolved.js +0 -76
- package/dist/invocation/optimixerModelProfileFromResolved.js.map +0 -1
- package/dist/invocation/resolveSkillModelReference.d.ts +0 -18
- package/dist/invocation/resolveSkillModelReference.d.ts.map +0 -1
- package/dist/invocation/resolveSkillModelReference.js +0 -93
- package/dist/invocation/resolveSkillModelReference.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SkillCatalog } from "./skill-catalog.js";
|
|
2
|
+
/** Canonical Mongo / xillix keys for skills that ship template seeds (subset of the Catalox catalog). */
|
|
3
|
+
export declare const SEED_CANONICAL_SKILL_KEYS: `skills/${string}`[];
|
|
4
|
+
export interface SeedXillixCatalogOptions {
|
|
5
|
+
/** Root folder containing `<id>.instructions.md` and `<id>.prompt.md` (default: `.metadata/skills`). */
|
|
6
|
+
templatesRoot?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Idempotent upsert of built-in skills; loads template bodies from disk when present.
|
|
10
|
+
*/
|
|
11
|
+
export declare function seedXillixCatalog(catalog: SkillCatalog, options?: SeedXillixCatalogOptions): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/catalog/seed.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,yGAAyG;AACzG,eAAO,MAAM,yBAAyB,sBAA+D,CAAC;AAEtG,MAAM,WAAW,wBAAwB;IACrC,wGAAwG;IACxG,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAUD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BpH"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { AI_SKILLS_CATALOG_ITEMS, AI_SKILLS_MONGO_SEED_KEYS } from "../catalox/ai-skills-catalog.js";
|
|
4
|
+
/** Canonical Mongo / xillix keys for skills that ship template seeds (subset of the Catalox catalog). */
|
|
5
|
+
export const SEED_CANONICAL_SKILL_KEYS = AI_SKILLS_MONGO_SEED_KEYS.map((k) => `skills/${k}`);
|
|
6
|
+
function readOptionalUtf8(filePath) {
|
|
7
|
+
try {
|
|
8
|
+
return fs.readFileSync(filePath, "utf8");
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Idempotent upsert of built-in skills; loads template bodies from disk when present.
|
|
16
|
+
*/
|
|
17
|
+
export async function seedXillixCatalog(catalog, options = {}) {
|
|
18
|
+
const root = options.templatesRoot ?? path.join(process.cwd(), ".metadata", "skills");
|
|
19
|
+
for (const spec of AI_SKILLS_CATALOG_ITEMS) {
|
|
20
|
+
if (!spec.xillixSeed)
|
|
21
|
+
continue;
|
|
22
|
+
const skillKey = `skills/${spec.skillKey}`;
|
|
23
|
+
const xs = spec.xillixSeed;
|
|
24
|
+
const id = spec.skillKey;
|
|
25
|
+
const instructionsText = readOptionalUtf8(path.join(root, `${id}.instructions.md`));
|
|
26
|
+
const promptText = readOptionalUtf8(path.join(root, `${id}.prompt.md`));
|
|
27
|
+
await catalog.upsert({
|
|
28
|
+
skillKey,
|
|
29
|
+
displayName: spec.title,
|
|
30
|
+
description: spec.description,
|
|
31
|
+
lifecycle: "active",
|
|
32
|
+
tags: ["xeonox", "seed"],
|
|
33
|
+
deletedAt: null,
|
|
34
|
+
outputFrame: xs.outputFrame,
|
|
35
|
+
requiredVariables: xs.requiredVariables,
|
|
36
|
+
optionalVariables: xs.optionalVariables,
|
|
37
|
+
outputSchema: xs.outputSchema,
|
|
38
|
+
inputHints: { variables: { required: xs.requiredVariables, optional: xs.optionalVariables } },
|
|
39
|
+
outputHints: { frame: xs.outputFrame },
|
|
40
|
+
...(instructionsText !== undefined ? { instructionsText } : {}),
|
|
41
|
+
...(promptText !== undefined ? { promptText } : {}),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/catalog/seed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAGrG,yGAAyG;AACzG,MAAM,CAAC,MAAM,yBAAyB,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,EAAW,CAAC,CAAC;AAOtG,SAAS,gBAAgB,CAAC,QAAgB;IACtC,IAAI,CAAC;QACD,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAqB,EAAE,UAAoC,EAAE;IACjG,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEtF,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,SAAS;QAC/B,MAAM,QAAQ,GAAG,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;QAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzB,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACpF,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;QACxE,MAAM,OAAO,CAAC,MAAM,CAAC;YACjB,QAAQ;YACR,WAAW,EAAE,IAAI,CAAC,KAAK;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;YACxB,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,EAAE,CAAC,WAAW;YAC3B,iBAAiB,EAAE,EAAE,CAAC,iBAAiB;YACvC,iBAAiB,EAAE,EAAE,CAAC,iBAAiB;YACvC,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,iBAAiB,EAAE,QAAQ,EAAE,EAAE,CAAC,iBAAiB,EAAE,EAAE;YAC7F,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,EAAE;YACtC,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;IACP,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { XronoxStore } from "@xronoces/xronox-store";
|
|
2
|
+
import type { AiSkillCatalogDocument, SkillCatalogListOptions, SkillCatalogPatchOptions } from "./types.js";
|
|
3
|
+
export declare class SkillCatalog {
|
|
4
|
+
private readonly store;
|
|
5
|
+
constructor(store: XronoxStore);
|
|
6
|
+
private col;
|
|
7
|
+
create(doc: Omit<AiSkillCatalogDocument, "catalogVersion" | "createdAt" | "updatedAt" | "deletedAt"> & {
|
|
8
|
+
deletedAt?: null;
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
get(skillKey: string, opts?: {
|
|
11
|
+
includeHidden?: boolean;
|
|
12
|
+
}): Promise<AiSkillCatalogDocument | null>;
|
|
13
|
+
patch(skillKey: string, fields: Partial<AiSkillCatalogDocument>, opts?: SkillCatalogPatchOptions): Promise<void>;
|
|
14
|
+
/** Soft-delete: sets `deletedAt` and optional lifecycle. */
|
|
15
|
+
archive(skillKey: string, opts?: SkillCatalogPatchOptions & {
|
|
16
|
+
lifecycle?: "deprecated";
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Hard-remove catalog row. Only when not production and `XILLIX_ALLOW_HARD_DELETE=true`.
|
|
20
|
+
*/
|
|
21
|
+
hardDelete(skillKey: string): Promise<void>;
|
|
22
|
+
list(options?: SkillCatalogListOptions): Promise<AiSkillCatalogDocument[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Insert or full replace by `skillKey` (upsert). Used by seeds and migrations.
|
|
25
|
+
*/
|
|
26
|
+
upsert(doc: Omit<AiSkillCatalogDocument, "catalogVersion" | "createdAt" | "updatedAt"> & Partial<Pick<AiSkillCatalogDocument, "catalogVersion" | "createdAt" | "updatedAt">>): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=skill-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-catalog.d.ts","sourceRoot":"","sources":["../../src/catalog/skill-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAsB5G,qBAAa,YAAY;IACT,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,WAAW;IAE/C,OAAO,CAAC,GAAG;IAIL,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,sBAAsB,EAAE,gBAAgB,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3I,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IASjG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBtH,4DAA4D;IACtD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,wBAAwB,GAAG;QAAE,SAAS,CAAC,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9G;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,IAAI,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAiCpF;;OAEG;IACG,MAAM,CACR,GAAG,EAAE,IAAI,CAAC,sBAAsB,EAAE,gBAAgB,GAAG,WAAW,GAAG,WAAW,CAAC,GAC3E,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,gBAAgB,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,GACxF,OAAO,CAAC,IAAI,CAAC;CAmBnB"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { AI_SKILL_CATALOG_COLLECTION } from "./constants.js";
|
|
2
|
+
import { isXillixHardDeleteAllowed } from "./env.js";
|
|
3
|
+
import { SkillCatalogDuplicateKeyError, SkillCatalogNotFoundError, SkillCatalogVersionConflictError, } from "./types.js";
|
|
4
|
+
function isDuplicateKeyError(err) {
|
|
5
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
6
|
+
if (msg.includes("E11000") || msg.includes("11000"))
|
|
7
|
+
return true;
|
|
8
|
+
const code = err?.code;
|
|
9
|
+
return code === 11000;
|
|
10
|
+
}
|
|
11
|
+
function stripUndefined(o) {
|
|
12
|
+
const out = { ...o };
|
|
13
|
+
for (const k of Object.keys(out)) {
|
|
14
|
+
if (out[k] === undefined)
|
|
15
|
+
delete out[k];
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
19
|
+
export class SkillCatalog {
|
|
20
|
+
store;
|
|
21
|
+
constructor(store) {
|
|
22
|
+
this.store = store;
|
|
23
|
+
}
|
|
24
|
+
col() {
|
|
25
|
+
return this.store.collection(AI_SKILL_CATALOG_COLLECTION);
|
|
26
|
+
}
|
|
27
|
+
async create(doc) {
|
|
28
|
+
const now = new Date().toISOString();
|
|
29
|
+
const row = {
|
|
30
|
+
...doc,
|
|
31
|
+
catalogVersion: 1,
|
|
32
|
+
createdAt: now,
|
|
33
|
+
updatedAt: now,
|
|
34
|
+
deletedAt: doc.deletedAt ?? null,
|
|
35
|
+
};
|
|
36
|
+
try {
|
|
37
|
+
await this.col().insert(stripUndefined(row));
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
if (isDuplicateKeyError(err)) {
|
|
41
|
+
throw new SkillCatalogDuplicateKeyError(doc.skillKey);
|
|
42
|
+
}
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async get(skillKey, opts) {
|
|
47
|
+
if (opts?.includeHidden) {
|
|
48
|
+
const r = await this.col().readMany({ skillKey }, { includeHidden: true, limit: 1 });
|
|
49
|
+
return r[0] ?? null;
|
|
50
|
+
}
|
|
51
|
+
const row = await this.col().getByKey(skillKey);
|
|
52
|
+
return row;
|
|
53
|
+
}
|
|
54
|
+
async patch(skillKey, fields, opts) {
|
|
55
|
+
const cur = await this.get(skillKey, { includeHidden: true });
|
|
56
|
+
if (!cur)
|
|
57
|
+
throw new SkillCatalogNotFoundError(skillKey);
|
|
58
|
+
if (opts?.expectedVersion !== undefined && cur.catalogVersion !== opts.expectedVersion) {
|
|
59
|
+
throw new SkillCatalogVersionConflictError(skillKey);
|
|
60
|
+
}
|
|
61
|
+
const nextVersion = (cur.catalogVersion ?? 0) + 1;
|
|
62
|
+
const { skillKey: _sk, catalogVersion: _cv, createdAt: _ca, ...rest } = fields;
|
|
63
|
+
const patch = stripUndefined({
|
|
64
|
+
...rest,
|
|
65
|
+
catalogVersion: nextVersion,
|
|
66
|
+
updatedAt: new Date().toISOString(),
|
|
67
|
+
});
|
|
68
|
+
await this.col().patchByKey(skillKey, patch);
|
|
69
|
+
}
|
|
70
|
+
/** Soft-delete: sets `deletedAt` and optional lifecycle. */
|
|
71
|
+
async archive(skillKey, opts) {
|
|
72
|
+
await this.patch(skillKey, {
|
|
73
|
+
deletedAt: new Date().toISOString(),
|
|
74
|
+
lifecycle: opts?.lifecycle ?? "deprecated",
|
|
75
|
+
}, opts);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Hard-remove catalog row. Only when not production and `XILLIX_ALLOW_HARD_DELETE=true`.
|
|
79
|
+
*/
|
|
80
|
+
async hardDelete(skillKey) {
|
|
81
|
+
if (!isXillixHardDeleteAllowed()) {
|
|
82
|
+
throw new Error("[AI-SKILLS] hardDelete is only allowed when NODE_ENV !== 'production' and XILLIX_ALLOW_HARD_DELETE=true");
|
|
83
|
+
}
|
|
84
|
+
const n = await this.col().deleteMany({ skillKey }, { includeHidden: true, clearCache: "all" });
|
|
85
|
+
if (n < 1)
|
|
86
|
+
throw new SkillCatalogNotFoundError(skillKey);
|
|
87
|
+
}
|
|
88
|
+
async list(options = {}) {
|
|
89
|
+
const scanLimit = options.scanLimit ?? 10_000;
|
|
90
|
+
const rows = await this.col().readMany({}, { includeHidden: options.includeHidden === true, limit: scanLimit, sort: { skillKey: 1 } });
|
|
91
|
+
let out = rows;
|
|
92
|
+
if (options.activeOnly) {
|
|
93
|
+
out = out.filter((r) => r.lifecycle === "active" && (r.deletedAt === null || r.deletedAt === undefined));
|
|
94
|
+
}
|
|
95
|
+
if (options.tag) {
|
|
96
|
+
out = out.filter((r) => Array.isArray(r.tags) && r.tags.includes(options.tag));
|
|
97
|
+
}
|
|
98
|
+
if (options.skillKeyPrefix) {
|
|
99
|
+
const p = options.skillKeyPrefix;
|
|
100
|
+
out = out.filter((r) => typeof r.skillKey === "string" && r.skillKey.startsWith(p));
|
|
101
|
+
}
|
|
102
|
+
if (options.updatedAfter) {
|
|
103
|
+
const after = new Date(options.updatedAfter).getTime();
|
|
104
|
+
out = out.filter((r) => {
|
|
105
|
+
const t = Date.parse(r.updatedAt);
|
|
106
|
+
return !Number.isNaN(t) && t > after;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
const offset = options.offset ?? 0;
|
|
110
|
+
const limit = options.limit;
|
|
111
|
+
if (offset > 0 || limit !== undefined) {
|
|
112
|
+
const end = limit === undefined ? undefined : offset + limit;
|
|
113
|
+
out = out.slice(offset, end);
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Insert or full replace by `skillKey` (upsert). Used by seeds and migrations.
|
|
119
|
+
*/
|
|
120
|
+
async upsert(doc) {
|
|
121
|
+
const existing = await this.get(doc.skillKey, { includeHidden: true });
|
|
122
|
+
const now = new Date().toISOString();
|
|
123
|
+
if (!existing) {
|
|
124
|
+
const { catalogVersion: _cv, createdAt: _c, updatedAt: _u, ...forCreate } = doc;
|
|
125
|
+
await this.create(forCreate);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const nextVersion = doc.catalogVersion !== undefined ? doc.catalogVersion : (existing.catalogVersion ?? 0) + 1;
|
|
129
|
+
const merged = {
|
|
130
|
+
...existing,
|
|
131
|
+
...doc,
|
|
132
|
+
catalogVersion: nextVersion,
|
|
133
|
+
updatedAt: doc.updatedAt ?? now,
|
|
134
|
+
createdAt: existing.createdAt,
|
|
135
|
+
};
|
|
136
|
+
await this.col().update(doc.skillKey, stripUndefined(merged));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=skill-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-catalog.js","sourceRoot":"","sources":["../../src/catalog/skill-catalog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAErD,OAAO,EACH,6BAA6B,EAC7B,yBAAyB,EACzB,gCAAgC,GACnC,MAAM,YAAY,CAAC;AAEpB,SAAS,mBAAmB,CAAC,GAAY;IACrC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,MAAM,IAAI,GAAI,GAAyB,EAAE,IAAI,CAAC;IAC9C,OAAO,IAAI,KAAK,KAAK,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAoC,CAAI;IAC3D,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,MAAM,OAAO,YAAY;IACQ;IAA7B,YAA6B,KAAkB;QAAlB,UAAK,GAAL,KAAK,CAAa;IAAG,CAAC;IAE3C,GAAG;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAmD,2BAA2B,CAAC,CAAC;IAChH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAoH;QAC7H,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,GAAG,GAAqD;YAC1D,GAAG,GAAG;YACN,cAAc,EAAE,CAAC;YACjB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI;SACnC,CAAC;QACF,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,GAA8B,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,6BAA6B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1D,CAAC;YACD,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,IAAkC;QAC1D,IAAI,IAAI,EAAE,aAAa,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACrF,OAAQ,CAAC,CAAC,CAAC,CAA4B,IAAI,IAAI,CAAC;QACpD,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChD,OAAO,GAAoC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,MAAuC,EAAE,IAA+B;QAClG,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,IAAI,EAAE,eAAe,KAAK,SAAS,IAAI,GAAG,CAAC,cAAc,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YACrF,MAAM,IAAI,gCAAgC,CAAC,QAAQ,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QAC/E,MAAM,KAAK,GAAG,cAAc,CAAC;YACzB,GAAG,IAAI;YACP,cAAc,EAAE,WAAW;YAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACX,CAAC,CAAC;QAC9B,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,IAA8D;QAC1F,MAAM,IAAI,CAAC,KAAK,CACZ,QAAQ,EACR;YACI,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,YAAY;SAC7C,EACD,IAAI,CACP,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC7B,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,yGAAyG,CAAC,CAAC;QAC/H,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAmC,EAAE;QAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAClC,EAAE,EACF,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,KAAK,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAC7F,CAAC;QACF,IAAI,GAAG,GAAG,IAAgC,CAAC;QAC3C,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC;QAC7G,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAI,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;YACjC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;YACvD,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBACnB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACzC,CAAC,CAAC,CAAC;QACP,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;YAC7D,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACR,GACuF;QAEvF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,GAA8B,CAAC;YAC3G,MAAM,IAAI,CAAC,MAAM,CAAC,SAA4H,CAAC,CAAC;YAChJ,OAAO;QACX,CAAC;QACD,MAAM,WAAW,GACb,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/F,MAAM,MAAM,GAAqD;YAC7D,GAAG,QAAQ;YACX,GAAG,GAAG;YACN,cAAc,EAAE,WAAW;YAC3B,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG;YAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;SAChC,CAAC;QACF,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,MAAiC,CAAC,CAAC,CAAC;IAC7F,CAAC;CACJ"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { XronoxStore } from "@xronoces/xronox-store";
|
|
2
|
+
import { SkillCatalog } from "./skill-catalog.js";
|
|
3
|
+
export interface CreateSkillCatalogStoreOptions {
|
|
4
|
+
mongoUri?: string;
|
|
5
|
+
mongoDb?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SkillCatalogStoreBundle {
|
|
8
|
+
store: XronoxStore;
|
|
9
|
+
catalog: SkillCatalog;
|
|
10
|
+
init: () => Promise<void>;
|
|
11
|
+
close: () => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Creates an `XronoxStore` scoped to `XILLIX_META_DB` (or `mongoDb`) and a {@link SkillCatalog} facade.
|
|
15
|
+
* Call `init()` before CRUD; call `close()` when finished.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createSkillCatalogStore(options?: CreateSkillCatalogStoreOptions): SkillCatalogStoreBundle;
|
|
18
|
+
//# sourceMappingURL=store-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-factory.d.ts","sourceRoot":"","sources":["../../src/catalog/store-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAIrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASlD,MAAM,WAAW,8BAA8B;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACpC,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,8BAAmC,GAAG,uBAAuB,CAoB7G"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { XronoxStore } from "@xronoces/xronox-store";
|
|
2
|
+
import { AI_SKILL_CATALOG_COLLECTION } from "./constants.js";
|
|
3
|
+
import { getXillixMetaDbName } from "./env.js";
|
|
4
|
+
import { SkillCatalog } from "./skill-catalog.js";
|
|
5
|
+
const catalogCollectionDefinition = {
|
|
6
|
+
name: AI_SKILL_CATALOG_COLLECTION,
|
|
7
|
+
primaryKey: "skillKey",
|
|
8
|
+
indexes: [{ keys: { skillKey: 1 }, options: { unique: true, name: "uniq_skillKey" } }],
|
|
9
|
+
visibility: { field: "deletedAt", mode: "hiddenIfNonNull" },
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Creates an `XronoxStore` scoped to `XILLIX_META_DB` (or `mongoDb`) and a {@link SkillCatalog} facade.
|
|
13
|
+
* Call `init()` before CRUD; call `close()` when finished.
|
|
14
|
+
*/
|
|
15
|
+
export function createSkillCatalogStore(options = {}) {
|
|
16
|
+
const mongoUri = options.mongoUri ?? process.env.MONGO_URI?.trim();
|
|
17
|
+
if (!mongoUri) {
|
|
18
|
+
throw new Error("[AI-SKILLS] createSkillCatalogStore: MONGO_URI is required (or pass mongoUri).");
|
|
19
|
+
}
|
|
20
|
+
const mongoDb = options.mongoDb ?? getXillixMetaDbName();
|
|
21
|
+
const store = new XronoxStore({
|
|
22
|
+
mongoUri,
|
|
23
|
+
mongoDb,
|
|
24
|
+
collections: [catalogCollectionDefinition],
|
|
25
|
+
// Surface duplicate key and other persist errors to callers (catalog API maps E11000).
|
|
26
|
+
errorHandling: { onPersistError: "throw" },
|
|
27
|
+
});
|
|
28
|
+
const catalog = new SkillCatalog(store);
|
|
29
|
+
return {
|
|
30
|
+
store,
|
|
31
|
+
catalog,
|
|
32
|
+
init: () => store.init(),
|
|
33
|
+
close: () => store.close(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=store-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-factory.js","sourceRoot":"","sources":["../../src/catalog/store-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,2BAA2B,GAAyB;IACtD,IAAI,EAAE,2BAA2B;IACjC,UAAU,EAAE,UAAU;IACtB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,CAAC;IACtF,UAAU,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,EAAE;CAC9D,CAAC;AAcF;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAA0C,EAAE;IAChF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;IACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;IACtG,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,mBAAmB,EAAE,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC;QAC1B,QAAQ;QACR,OAAO;QACP,WAAW,EAAE,CAAC,2BAA2B,CAAC;QAC1C,uFAAuF;QACvF,aAAa,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE;KAC7C,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO;QACH,KAAK;QACL,OAAO;QACP,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE;QACxB,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE;KAC7B,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export type SkillLifecycle = "active" | "deprecated";
|
|
2
|
+
/**
|
|
3
|
+
* Authoritative catalog row for a remote AI task skill (`skills/...` key).
|
|
4
|
+
* Template fields back optional xillix content mode (inline gateway templates).
|
|
5
|
+
*/
|
|
6
|
+
export interface AiSkillCatalogDocument {
|
|
7
|
+
skillKey: string;
|
|
8
|
+
displayName?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
inputHints?: Record<string, unknown>;
|
|
11
|
+
outputHints?: Record<string, unknown>;
|
|
12
|
+
/** System / instruction template body (FlexMD + tokens). */
|
|
13
|
+
instructionsText?: string;
|
|
14
|
+
/** User prompt template body (typically contains `{{input}}`). */
|
|
15
|
+
promptText?: string;
|
|
16
|
+
lifecycle: SkillLifecycle;
|
|
17
|
+
tags?: string[];
|
|
18
|
+
/** Monotonic document version for optimistic concurrency. */
|
|
19
|
+
catalogVersion: number;
|
|
20
|
+
createdAt: string;
|
|
21
|
+
updatedAt: string;
|
|
22
|
+
deletedAt?: string | null;
|
|
23
|
+
/** FlexMD frame name after successful run (e.g. professional-answer). */
|
|
24
|
+
outputFrame?: string;
|
|
25
|
+
/** Optional JSON-schema-shaped hint for parsed output. */
|
|
26
|
+
outputSchema?: Record<string, unknown>;
|
|
27
|
+
requiredVariables?: string[];
|
|
28
|
+
optionalVariables?: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface SkillCatalogListOptions {
|
|
31
|
+
/** Only `lifecycle === 'active'` and not soft-deleted. */
|
|
32
|
+
activeOnly?: boolean;
|
|
33
|
+
/** Match any catalog whose `tags` contains this string. */
|
|
34
|
+
tag?: string;
|
|
35
|
+
/** `skillKey.startsWith(prefix)` */
|
|
36
|
+
skillKeyPrefix?: string;
|
|
37
|
+
/** ISO date string — keep rows with `updatedAt` strictly after this instant. */
|
|
38
|
+
updatedAfter?: string;
|
|
39
|
+
/** Include soft-deleted rows (admin). */
|
|
40
|
+
includeHidden?: boolean;
|
|
41
|
+
/** Max rows to scan from store before in-memory filtering (catalog-sized). */
|
|
42
|
+
scanLimit?: number;
|
|
43
|
+
offset?: number;
|
|
44
|
+
limit?: number;
|
|
45
|
+
}
|
|
46
|
+
export interface SkillCatalogPatchOptions {
|
|
47
|
+
expectedVersion?: number;
|
|
48
|
+
}
|
|
49
|
+
export declare class SkillCatalogDuplicateKeyError extends Error {
|
|
50
|
+
readonly code: "SKILL_CATALOG_DUPLICATE_KEY";
|
|
51
|
+
constructor(skillKey: string);
|
|
52
|
+
}
|
|
53
|
+
export declare class SkillCatalogVersionConflictError extends Error {
|
|
54
|
+
readonly code: "SKILL_CATALOG_VERSION_CONFLICT";
|
|
55
|
+
constructor(skillKey: string);
|
|
56
|
+
}
|
|
57
|
+
export declare class SkillCatalogNotFoundError extends Error {
|
|
58
|
+
readonly code: "SKILL_CATALOG_NOT_FOUND";
|
|
59
|
+
constructor(skillKey: string);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/catalog/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAC;AAErD;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACpC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACpD,QAAQ,CAAC,IAAI,EAAG,6BAA6B,CAAU;gBAC3C,QAAQ,EAAE,MAAM;CAI/B;AAED,qBAAa,gCAAiC,SAAQ,KAAK;IACvD,QAAQ,CAAC,IAAI,EAAG,gCAAgC,CAAU;gBAC9C,QAAQ,EAAE,MAAM;CAI/B;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAG,yBAAyB,CAAU;gBACvC,QAAQ,EAAE,MAAM;CAI/B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export class SkillCatalogDuplicateKeyError extends Error {
|
|
2
|
+
code = "SKILL_CATALOG_DUPLICATE_KEY";
|
|
3
|
+
constructor(skillKey) {
|
|
4
|
+
super(`Skill catalog already has an entry for skillKey: ${skillKey}`);
|
|
5
|
+
this.name = "SkillCatalogDuplicateKeyError";
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class SkillCatalogVersionConflictError extends Error {
|
|
9
|
+
code = "SKILL_CATALOG_VERSION_CONFLICT";
|
|
10
|
+
constructor(skillKey) {
|
|
11
|
+
super(`Skill catalog version conflict for skillKey: ${skillKey}`);
|
|
12
|
+
this.name = "SkillCatalogVersionConflictError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class SkillCatalogNotFoundError extends Error {
|
|
16
|
+
code = "SKILL_CATALOG_NOT_FOUND";
|
|
17
|
+
constructor(skillKey) {
|
|
18
|
+
super(`Skill catalog entry not found: ${skillKey}`);
|
|
19
|
+
this.name = "SkillCatalogNotFoundError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/catalog/types.ts"],"names":[],"mappings":"AAoDA,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IAC3C,IAAI,GAAG,6BAAsC,CAAC;IACvD,YAAY,QAAgB;QACxB,KAAK,CAAC,oDAAoD,QAAQ,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAChD,CAAC;CACJ;AAED,MAAM,OAAO,gCAAiC,SAAQ,KAAK;IAC9C,IAAI,GAAG,gCAAyC,CAAC;IAC1D,YAAY,QAAgB;QACxB,KAAK,CAAC,gDAAgD,QAAQ,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,kCAAkC,CAAC;IACnD,CAAC;CACJ;AAED,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACvC,IAAI,GAAG,yBAAkC,CAAC;IACnD,YAAY,QAAgB;QACxB,KAAK,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC5C,CAAC;CACJ"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AIGateway } from "@x12i/ai-gateway";
|
|
2
|
+
import { type Logxer } from "@x12i/logxer";
|
|
3
|
+
import { BaseClient } from "./base-client.js";
|
|
4
|
+
import { RunAuditInput, RunAuditOutput } from "../types.js";
|
|
5
|
+
import type { Catalox } from "@x12i/catalox";
|
|
6
|
+
export type AuditManagerContentOptions = {
|
|
7
|
+
catalox: Catalox;
|
|
8
|
+
cataloxAppId?: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* AuditManager
|
|
12
|
+
*
|
|
13
|
+
* WHY: This class handles the "Verification" or "Auditing" logic.
|
|
14
|
+
* After a skill runs, we often want another LLM pass to check if the
|
|
15
|
+
* results meet certain quality or safety criteria. This manager
|
|
16
|
+
* encapsulates that specific interaction.
|
|
17
|
+
*
|
|
18
|
+
* Audit templates are loaded by **catalog skill key** via Catalox
|
|
19
|
+
* (`fetchSkillTemplatesFromCatalox`); **`AIGateway` is not used to resolve keys**.
|
|
20
|
+
*/
|
|
21
|
+
export declare class AuditManager extends BaseClient {
|
|
22
|
+
private readonly contentOptions;
|
|
23
|
+
constructor(gateway: AIGateway, logger: Logxer, contentOptions: AuditManagerContentOptions);
|
|
24
|
+
audit(input: RunAuditInput): Promise<RunAuditOutput>;
|
|
25
|
+
private mapAuditPayloads;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=audit-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-manager.d.ts","sourceRoot":"","sources":["../../src/client/audit-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAoB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAe,MAAM,aAAa,CAAC;AASzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAO7C,MAAM,MAAM,0BAA0B,GAAG;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,SAAQ,UAAU;IAIpC,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAF/B,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE,MAAM,EACG,cAAc,EAAE,0BAA0B;IAQzD,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAuQ1D,OAAO,CAAC,gBAAgB;CAW3B"}
|