@rt-tools/agent-kit 0.8.2 → 0.9.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/README.md +13 -0
- package/assets/agents/rules-reviewer.md +83 -0
- package/assets/checks/board.github.mjs +48 -1
- package/assets/checks/check-board.github.mjs +84 -1
- package/assets/checks/check-dupes.mjs +66 -6
- package/assets/checks/check-lib-layers.mjs +13 -524
- package/assets/checks/check-specs.mjs +61 -747
- package/assets/checks/check-styles.mjs +185 -15
- package/assets/checks/lib-boundaries.mjs +143 -0
- package/assets/checks/lib-common.mjs +149 -0
- package/assets/checks/lib-domains.mjs +205 -0
- package/assets/checks/lib-manifests.mjs +60 -0
- package/assets/checks/lib-reexports.mjs +101 -0
- package/assets/checks/rt-kit-checks.config.mjs +26 -0
- package/assets/checks/spec-anchors.mjs +297 -0
- package/assets/checks/spec-common.mjs +222 -0
- package/assets/checks/spec-contract.mjs +152 -0
- package/assets/checks/spec-scenarios.mjs +201 -0
- package/assets/commands/feedback.md +95 -0
- package/assets/commands/rules-review.md +98 -0
- package/assets/commands/skill-curator.md +39 -22
- package/assets/defaults/project.sh +8 -0
- package/assets/docs/GLOSSARY.md +21 -20
- package/assets/hooks/git-guard-push-tests.sh +8 -4
- package/assets/hooks/reuse-first-guard.sh +16 -2
- package/assets/hooks/skill-gate.sh +1 -1
- package/assets/hooks/sql-guard-parse.sh +187 -0
- package/assets/hooks/sql-guard-request.sh +117 -0
- package/assets/hooks/sql-guard-target.sh +134 -0
- package/assets/hooks/sql-guard-write.sh +212 -0
- package/assets/hooks/sql-guard.sh +26 -596
- package/assets/hooks/task-flow-guard.sh +16 -2
- package/assets/hooks/waiting-turn-guard.sh +116 -0
- package/assets/laws/delivery.md +35 -0
- package/assets/laws/project-documentation.md +18 -0
- package/assets/laws/work-conduct.md +25 -0
- package/assets/patterns/admin-lists-screen.md +25 -14
- package/assets/patterns/admin-nav-item.md +1 -1
- package/assets/patterns/component-structure-new.md +1 -1
- package/assets/patterns/entity-aside.md +4 -2
- package/assets/patterns/git-workflow-commit.azure.md +74 -2
- package/assets/patterns/git-workflow-commit.github.md +75 -2
- package/assets/patterns/git-workflow-commit.gitlab.md +75 -4
- package/assets/patterns/git-workflow-docker.md +30 -0
- package/assets/patterns/observability-record.md +9 -0
- package/assets/patterns/shared-code-new.md +2 -2
- package/assets/patterns/task-flow-close.md +160 -47
- package/assets/patterns/task-flow-handoff.md +1 -1
- package/assets/patterns/task-flow-resume.md +3 -3
- package/assets/patterns/task-flow-start.md +32 -5
- package/assets/rules/angular-patterns.md +22 -0
- package/assets/rules/api-layer.md +25 -0
- package/assets/rules/browser-verification.md +32 -0
- package/assets/rules/component-structure.md +21 -0
- package/assets/rules/dependencies.md +22 -0
- package/assets/rules/doc-style.md +24 -0
- package/assets/rules/entity-conventions.needs-admin.md +21 -0
- package/assets/rules/entity-models.md +21 -0
- package/assets/rules/git-workflow.azure.md +57 -1
- package/assets/rules/git-workflow.github.md +89 -2
- package/assets/rules/git-workflow.gitlab.md +56 -1
- package/assets/rules/lib-layers.md +29 -0
- package/assets/rules/lists.md +37 -10
- package/assets/rules/navigation.md +21 -0
- package/assets/rules/observability.needs-app.md +23 -0
- package/assets/rules/permissions.md +23 -0
- package/assets/rules/platform-access.md +21 -0
- package/assets/rules/reuse-first.md +20 -0
- package/assets/rules/seo.md +19 -0
- package/assets/rules/shared-code.md +20 -1
- package/assets/rules/spec-driven.md +32 -0
- package/assets/rules/styling-bem.md +19 -0
- package/assets/rules/task-flow.md +148 -18
- package/assets/rules/testing.md +62 -0
- package/assets/rules/translations.md +21 -0
- package/assets/rules/typescript-conventions.md +28 -0
- package/assets/samples/specs/_template/spec.md +83 -0
- package/assets/samples/tasks/_template/grill.md +28 -0
- package/assets/samples/tasks/_template/plan.md +39 -0
- package/assets/samples/tasks/_template/progress.md +23 -0
- package/assets/skills/agent-kit.md +52 -2
- package/assets/templates/proposal.md +21 -0
- package/assets/templates/rule.md +31 -2
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +115 -87
- package/bin/agent-kit.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/lib/argv.d.ts.map +1 -1
- package/lib/argv.js +6 -4
- package/lib/argv.js.map +1 -1
- package/lib/assets.d.ts.map +1 -1
- package/lib/assets.js +2 -1
- package/lib/assets.js.map +1 -1
- package/lib/cargo.d.ts +20 -0
- package/lib/cargo.d.ts.map +1 -1
- package/lib/cargo.js.map +1 -1
- package/lib/cascade.d.ts +55 -0
- package/lib/cascade.d.ts.map +1 -0
- package/lib/cascade.js +131 -0
- package/lib/cascade.js.map +1 -0
- package/lib/catalog.d.ts +0 -75
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +44 -127
- package/lib/catalog.js.map +1 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +153 -85
- package/lib/commands.js.map +1 -1
- package/lib/companion.d.ts.map +1 -1
- package/lib/companion.js +5 -5
- package/lib/companion.js.map +1 -1
- package/lib/config.d.ts +12 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +11 -5
- package/lib/config.js.map +1 -1
- package/lib/enroll.d.ts +56 -0
- package/lib/enroll.d.ts.map +1 -0
- package/lib/enroll.js +123 -0
- package/lib/enroll.js.map +1 -0
- package/lib/freshness.d.ts.map +1 -1
- package/lib/freshness.js +31 -17
- package/lib/freshness.js.map +1 -1
- package/lib/hooks-map.d.ts +30 -0
- package/lib/hooks-map.d.ts.map +1 -1
- package/lib/hooks-map.js +80 -18
- package/lib/hooks-map.js.map +1 -1
- package/lib/integrity.d.ts +1 -2
- package/lib/integrity.d.ts.map +1 -1
- package/lib/integrity.js +0 -1
- package/lib/integrity.js.map +1 -1
- package/lib/observations.d.ts.map +1 -1
- package/lib/observations.js +25 -12
- package/lib/observations.js.map +1 -1
- package/lib/order.d.ts +10 -0
- package/lib/order.d.ts.map +1 -0
- package/lib/order.js +14 -0
- package/lib/order.js.map +1 -0
- package/lib/picker.d.ts.map +1 -1
- package/lib/picker.js +8 -2
- package/lib/picker.js.map +1 -1
- package/lib/plan.js +1 -1
- package/lib/plan.js.map +1 -1
- package/lib/proposals.d.ts.map +1 -1
- package/lib/proposals.js +25 -8
- package/lib/proposals.js.map +1 -1
- package/lib/sections.js +1 -1
- package/lib/sections.js.map +1 -1
- package/lib/ship.d.ts.map +1 -1
- package/lib/ship.js +9 -1
- package/lib/ship.js.map +1 -1
- package/lib/shipment.d.ts.map +1 -1
- package/lib/shipment.js +14 -10
- package/lib/shipment.js.map +1 -1
- package/lib/snapshot.d.ts.map +1 -1
- package/lib/snapshot.js +2 -1
- package/lib/snapshot.js.map +1 -1
- package/lib/stamp.js +1 -1
- package/lib/stamp.js.map +1 -1
- package/lib/sync.d.ts +12 -2
- package/lib/sync.d.ts.map +1 -1
- package/lib/sync.js +11 -10
- package/lib/sync.js.map +1 -1
- package/lib/vars.d.ts.map +1 -1
- package/lib/vars.js +2 -3
- package/lib/vars.js.map +1 -1
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.9.0.tgz +0 -0
- package/rt-tools-agent-kit-0.8.2.tgz +0 -0
package/lib/argv.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argv.js","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/argv.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+FAA+F;AAC/F,MAAM,IAAI,GAAW,IAAI,CAAC;AAE1B,gFAAgF;AAChF,MAAM,WAAW,GAAW,KAAK,CAAC;AAElC;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAuB,EAAE,KAAwB;IAC5E,MAAM,SAAS,GAAwB,IAAI,GAAG,CAC1C,KAAK;SACA,MAAM,CAAC,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;SAC7D,GAAG,CAAC,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CACzE,CAAC;IACF,MAAM,KAAK,GAAwB,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/G,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,IAAI,KAAK,GAAW,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAW,IAAI,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"argv.js","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/argv.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+FAA+F;AAC/F,MAAM,IAAI,GAAW,IAAI,CAAC;AAE1B,gFAAgF;AAChF,MAAM,WAAW,GAAW,KAAK,CAAC;AAElC;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAuB,EAAE,KAAwB;IAC5E,MAAM,SAAS,GAAwB,IAAI,GAAG,CAC1C,KAAK;SACA,MAAM,CAAC,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;SAC7D,GAAG,CAAC,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CACzE,CAAC;IACF,MAAM,KAAK,GAAwB,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/G,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,IAAI,KAAK,GAAW,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAW,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,SAAS;QACb,CAAC;QAED,MAAM,IAAI,GAAW,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,sFAAsF;YACtF,sDAAsD;YACtD,KAAK,IAAI,CAAC,CAAC;QACf,CAAC;aAAM,CAAC;YACJ,2EAA2E;QAC/E,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC","sourcesContent":["/**\n * Разбор доводов командной строки.\n *\n * Команда, которая молча пропускает незнакомый довод, отвечает одинаково на «довод лишний» и на\n * «команда ничего не сделала». Там, где единственное действие обратимо, разница стоит повторного\n * запуска; там, где оно необратимо и уходит наружу, — стоит отправленного груза: вызов с\n * доводом справки, сделанный ради списка режимов, отправил в приём всё накопленное.\n */\n\n/** Довод — то, что начинается с дефиса. Всё остальное команда читает как значение или путь. */\nconst FLAG: RegExp = /^-/;\n\n/** Пометка довода, за которым идёт значение: `--root <>` против `--dry-run`. */\nconst TAKES_VALUE: string = ' <>';\n\n/**\n * Доводы вызова, которых команда не знает.\n *\n * Значение, стоящее за доводом с параметром, доводом не считается: `--root /путь` — это один\n * довод и его значение, а не два незнакомых. Набор известных перечисляет и те доводы, что\n * значение принимают, и те, что нет: у пустого набора незнакомо всё, начинающееся с дефиса.\n */\nexport function unknownFlagsIn(argv: readonly string[], known: readonly string[]): readonly string[] {\n const withValue: ReadonlySet<string> = new Set(\n known\n .filter((flag: string): boolean => flag.endsWith(TAKES_VALUE))\n .map((flag: string): string => flag.slice(0, -TAKES_VALUE.length))\n );\n const names: ReadonlySet<string> = new Set(known.map((flag: string): string => flag.replace(TAKES_VALUE, '')));\n const unknown: string[] = [];\n\n for (let index: number = 0; index < argv.length; index += 1) {\n const spoken: string = argv[index];\n\n if (!FLAG.test(spoken)) {\n continue;\n }\n\n const name: string = spoken.split('=')[0];\n\n if (!names.has(name)) {\n unknown.push(name);\n } else if (withValue.has(name) && !spoken.includes('=')) {\n // Значение через пробел пропускается вместе со своим доводом: без этого путь, начатый\n // с дефиса, читался бы как ещё один незнакомый довод.\n index += 1;\n } else {\n // Знакомый довод, у которого значения нет или оно написано через равенство\n }\n }\n\n return unknown;\n}\n"]}
|
package/lib/assets.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/assets.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/assets.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAe,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,OAAO,EAA2B,KAAK,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,WAAW,MAAM;IACnB,kGAAkG;IAClG,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,8FAA8F;IAC9F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAChC;AAUD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAI9H;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CASnF"}
|
package/lib/assets.js
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* показывает и то, от чего проект отказался, — обоим нужен набор до отбора.
|
|
7
7
|
*/
|
|
8
8
|
import { join } from 'node:path';
|
|
9
|
-
import { chosenEntries
|
|
9
|
+
import { chosenEntries } from './cascade.js';
|
|
10
|
+
import { readCatalog } from './catalog.js';
|
|
10
11
|
import { SKILL_FILE, SKILL_KINDS } from './config.js';
|
|
11
12
|
/** Расширение ресурса вместе с точкой; у файла без расширения — пустая строка. */
|
|
12
13
|
const extensionOf = (id) => {
|
package/lib/assets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/assets.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAmB,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/assets.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAmB,WAAW,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAW,UAAU,EAAE,WAAW,EAAS,MAAM,aAAa,CAAC;AAetE,kFAAkF;AAClF,MAAM,WAAW,GAA2B,CAAC,EAAU,EAAU,EAAE;IAC/D,MAAM,GAAG,GAAW,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,KAAK,GAAW,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAE1C,OAAO,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAoD,EAAE,MAAuC;IAClH,OAAO,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC;QAClD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAe,EAAE,SAAiB;IAC5D,OAAO,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAsB,EAAU,EAAE,CAAC,CAAC;QAC1F,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACtC,UAAU,EAAE,KAAK,CAAC,UAAU;KAC/B,CAAC,CAAC,CAAC;AACR,CAAC","sourcesContent":["/**\n * Что из везомого пакетом взял этот проект и куда оно ложится.\n *\n * Полный набор читает `catalog.ts`, здесь из него остаётся выбранное. Разделено потому, что\n * выбирать приходится раньше, чем раскладывать: `init` спрашивает, какие законы взять, а `list`\n * показывает и то, от чего проект отказался, — обоим нужен набор до отбора.\n */\nimport { join } from 'node:path';\n\nimport { chosenEntries } from './cascade.js';\nimport { IEntryOfCatalog, readCatalog } from './catalog.js';\nimport { IConfig, SKILL_FILE, SKILL_KINDS, TKind } from './config.js';\n\nexport interface IAsset {\n /** Идентификатор: `laws/application/money.md`. Он же путь надстройки и ключ в `only` и `skip`. */\n readonly id: string;\n readonly kind: TKind;\n /** Имя без рода, вида и расширения: `delivery`. У скила — имя каталога, которым его зовут. */\n readonly name: string;\n readonly text: string;\n /** Путь в дереве проекта, куда ресурс ложится. */\n readonly target: string;\n /** Запускается ли файл сам по себе: гарда без права на запуск не существует. */\n readonly executable: boolean;\n}\n\n/** Расширение ресурса вместе с точкой; у файла без расширения — пустая строка. */\nconst extensionOf: (id: string) => string = (id: string): string => {\n const dot: number = id.lastIndexOf('.');\n const slash: number = id.lastIndexOf('/');\n\n return dot > slash ? id.slice(dot) : '';\n};\n\n/**\n * Куда ложится ресурс. Скил читается агентом как `<имя>/SKILL.md`, и другого имени у него быть\n * не может: файл, названный по ресурсу, агент не найдёт вовсе. Остальные роды ложатся файлом —\n * по имени, а не по идентификатору: слой законов из идентификатора в путь переезжает, а вид\n * ресурса нет. У разложенного `git-workflow` хостинга в имени не остаётся: второго вида в этом\n * дереве нет, а агенту, который правило читает, различать их незачем.\n */\nexport function targetOf(entry: Pick<IEntryOfCatalog, 'id' | 'kind' | 'name'>, layout: Readonly<Record<TKind, string>>): string {\n return SKILL_KINDS.includes(entry.kind)\n ? join(layout[entry.kind], entry.name, SKILL_FILE)\n : join(layout[entry.kind], `${entry.name}${extensionOf(entry.id)}`);\n}\n\nexport function collectAssets(config: IConfig, assetsDir: string): readonly IAsset[] {\n return chosenEntries(readCatalog(assetsDir), config).map((entry: IEntryOfCatalog): IAsset => ({\n id: entry.id,\n kind: entry.kind,\n name: entry.name,\n text: entry.text,\n target: targetOf(entry, config.layout),\n executable: entry.executable,\n }));\n}\n"]}
|
package/lib/cargo.d.ts
CHANGED
|
@@ -68,6 +68,26 @@ export interface IPostmortemItem {
|
|
|
68
68
|
export interface IPostmortemsCargo extends ICargoHead {
|
|
69
69
|
readonly items: readonly IPostmortemItem[];
|
|
70
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Обращение дерева за токеном.
|
|
73
|
+
*
|
|
74
|
+
* Имени дерева в нём нет вовсе: его приём берёт из приглашения — принятое из обращения, оно
|
|
75
|
+
* позволило бы назваться чужим именем тому, кто добыл код.
|
|
76
|
+
*/
|
|
77
|
+
export interface IEnrollCargo {
|
|
78
|
+
readonly schema: string;
|
|
79
|
+
/** Признак дерева: его дерево считает у себя, а приём только сверяет. */
|
|
80
|
+
readonly tree: string;
|
|
81
|
+
/** Код приглашения, выданный владельцем. Уходит один раз и в журнал не попадает. */
|
|
82
|
+
readonly code: string;
|
|
83
|
+
}
|
|
84
|
+
/** Ответ приёма на годное обращение: токен уходит дереву единственным этим ответом. */
|
|
85
|
+
export interface IEnrollGranted {
|
|
86
|
+
readonly tree: string;
|
|
87
|
+
/** Имя дерева, как его назвал владелец в приглашении. */
|
|
88
|
+
readonly name: string;
|
|
89
|
+
readonly token: string;
|
|
90
|
+
}
|
|
71
91
|
/** Ответ приёма на принятый груз: дерево и месяц печатаются владельцу отправляющей стороной. */
|
|
72
92
|
export interface IIntakeAccepted {
|
|
73
93
|
readonly tree: string;
|
package/lib/cargo.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cargo.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/cargo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,yFAAyF;AACzF,eAAO,MAAM,oBAAoB,EAAE,MAAY,CAAC;AAEhD,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,EAAE,MAAuB,CAAC;AAExD,kGAAkG;AAClG,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1D,wDAAwD;AACxD,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAChC;AAED,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAED,4EAA4E;AAC5E,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAED,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAgB,SAAQ,UAAU;IAC/C,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;CAC5C;AAED,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACjD,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;CAC9C;AAED,gGAAgG;AAChG,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CAC3B"}
|
|
1
|
+
{"version":3,"file":"cargo.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/cargo.ts"],"names":[],"mappings":"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"}
|
package/lib/cargo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cargo.js","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/cargo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,yFAAyF;AACzF,MAAM,CAAC,MAAM,oBAAoB,GAAW,GAAG,CAAC;AAEhD,uDAAuD;AACvD,MAAM,CAAC,MAAM,iBAAiB,GAAW,cAAc,CAAC","sourcesContent":["/**\n * Форма груза: то, что уезжает с дерева в приём.\n *\n * Место объявления одно на обе стороны — правило договорённости приёма. Объявляет его\n * отправляющая сторона: пакет уходит в реестр, и импорт внутренней либы приёма уехал бы в\n * описания его типов и сломал бы установку. Приём берёт форму отсюда, а своей копии не заводит:\n * из двух копий компилируется только одна, а расходятся они молча.\n *\n * Файл держится без единого импорта намеренно: его читает и приём, и всякий, кто ставит пакет,\n * — а всё остальное в пакете написано под запуск из строки запуска.\n */\n\n/** Версия формата запроса приёма. Меняется, когда меняется состав полей самого груза. */\nexport const CARGO_SCHEMA_VERSION: string = '1';\n\n/** Заголовок, которым дерево представляется приёму. */\nexport const TREE_TOKEN_HEADER: string = 'x-tree-token';\n\n/** Род правки надстройки: дерево замещает раздел пакета, дописывает свой или снимает пакетный. */\nexport type TOverrideKind = 'replace' | 'append' | 'drop';\n\n/** Сколько раз что-то встретилось за отрезок сводки. */\nexport interface ICargoCount {\n readonly name: string;\n readonly count: number;\n}\n\n/**\n * Одна правка надстройки. У замещения и снятия заголовок раздела пакетный и общий у всех, потому\n * называется; у своего раздела заголовок придумало дерево — он не уезжает вовсе.\n */\nexport interface ICargoOverride {\n readonly resource: string;\n readonly section: string | null;\n readonly kind: TOverrideKind;\n}\n\n/** Общее у всякого груза: чем разбирать и от какого дерева приехало. */\nexport interface ICargoHead {\n readonly schema: string;\n readonly tree: string;\n}\n\n/** Сводка наблюдений дерева за отрезок дней вместе со снимком надстроек. */\nexport interface ISummaryCargo extends ICargoHead {\n readonly days: number;\n readonly sessions: number;\n readonly loads: readonly ICargoCount[];\n readonly denials: readonly ICargoCount[];\n readonly kinds: readonly ICargoCount[];\n readonly guards: readonly ICargoCount[];\n /** Ресурсы, разложенные в дерево и не загруженные за отрезок ни разу. */\n readonly unused: readonly string[];\n /** Ресурсы пакета, которых дерево не разложило вовсе. */\n readonly unpicked: readonly string[];\n readonly overrides: readonly ICargoOverride[];\n /** Версии схемы строк наблюдения, встреченные за отрезок. Приём их не судит. */\n readonly versions: readonly string[];\n readonly total: number;\n}\n\n/** Одно предложение по слою правил. */\nexport interface IProposalItem {\n readonly text: string;\n readonly address: string;\n readonly resource: string;\n}\n\nexport interface IProposalsCargo extends ICargoHead {\n readonly items: readonly IProposalItem[];\n}\n\n/** Один разбор происшествия: имя файла на дереве и текст целиком. */\nexport interface IPostmortemItem {\n readonly file: string;\n readonly text: string;\n}\n\nexport interface IPostmortemsCargo extends ICargoHead {\n readonly items: readonly IPostmortemItem[];\n}\n\n/** Ответ приёма на принятый груз: дерево и месяц печатаются владельцу отправляющей стороной. */\nexport interface IIntakeAccepted {\n readonly tree: string;\n /** Месяц записи в форме `2026-08`, по всемирному времени приёма. */\n readonly month: string;\n /** Запись месяца заведена этим запросом, а не обновлена. */\n readonly created: boolean;\n /**\n * Сколько записей легло этим запросом и сколько приехало повторно.\n *\n * Есть только у предложений: у них приём отбирает уже приехавшее по признаку, и без этих\n * двух чисел отправитель печатает «уехало» в том числе тогда, когда нового не уехало ничего.\n * Приём прежней редакции их не присылает вовсе — отсюда необязательность.\n */\n readonly added?: number;\n readonly known?: number;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cargo.js","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/cargo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,yFAAyF;AACzF,MAAM,CAAC,MAAM,oBAAoB,GAAW,GAAG,CAAC;AAEhD,uDAAuD;AACvD,MAAM,CAAC,MAAM,iBAAiB,GAAW,cAAc,CAAC","sourcesContent":["/**\n * Форма груза: то, что уезжает с дерева в приём.\n *\n * Место объявления одно на обе стороны — правило договорённости приёма. Объявляет его\n * отправляющая сторона: пакет уходит в реестр, и импорт внутренней либы приёма уехал бы в\n * описания его типов и сломал бы установку. Приём берёт форму отсюда, а своей копии не заводит:\n * из двух копий компилируется только одна, а расходятся они молча.\n *\n * Файл держится без единого импорта намеренно: его читает и приём, и всякий, кто ставит пакет,\n * — а всё остальное в пакете написано под запуск из строки запуска.\n */\n\n/** Версия формата запроса приёма. Меняется, когда меняется состав полей самого груза. */\nexport const CARGO_SCHEMA_VERSION: string = '1';\n\n/** Заголовок, которым дерево представляется приёму. */\nexport const TREE_TOKEN_HEADER: string = 'x-tree-token';\n\n/** Род правки надстройки: дерево замещает раздел пакета, дописывает свой или снимает пакетный. */\nexport type TOverrideKind = 'replace' | 'append' | 'drop';\n\n/** Сколько раз что-то встретилось за отрезок сводки. */\nexport interface ICargoCount {\n readonly name: string;\n readonly count: number;\n}\n\n/**\n * Одна правка надстройки. У замещения и снятия заголовок раздела пакетный и общий у всех, потому\n * называется; у своего раздела заголовок придумало дерево — он не уезжает вовсе.\n */\nexport interface ICargoOverride {\n readonly resource: string;\n readonly section: string | null;\n readonly kind: TOverrideKind;\n}\n\n/** Общее у всякого груза: чем разбирать и от какого дерева приехало. */\nexport interface ICargoHead {\n readonly schema: string;\n readonly tree: string;\n}\n\n/** Сводка наблюдений дерева за отрезок дней вместе со снимком надстроек. */\nexport interface ISummaryCargo extends ICargoHead {\n readonly days: number;\n readonly sessions: number;\n readonly loads: readonly ICargoCount[];\n readonly denials: readonly ICargoCount[];\n readonly kinds: readonly ICargoCount[];\n readonly guards: readonly ICargoCount[];\n /** Ресурсы, разложенные в дерево и не загруженные за отрезок ни разу. */\n readonly unused: readonly string[];\n /** Ресурсы пакета, которых дерево не разложило вовсе. */\n readonly unpicked: readonly string[];\n readonly overrides: readonly ICargoOverride[];\n /** Версии схемы строк наблюдения, встреченные за отрезок. Приём их не судит. */\n readonly versions: readonly string[];\n readonly total: number;\n}\n\n/** Одно предложение по слою правил. */\nexport interface IProposalItem {\n readonly text: string;\n readonly address: string;\n readonly resource: string;\n}\n\nexport interface IProposalsCargo extends ICargoHead {\n readonly items: readonly IProposalItem[];\n}\n\n/** Один разбор происшествия: имя файла на дереве и текст целиком. */\nexport interface IPostmortemItem {\n readonly file: string;\n readonly text: string;\n}\n\nexport interface IPostmortemsCargo extends ICargoHead {\n readonly items: readonly IPostmortemItem[];\n}\n\n/**\n * Обращение дерева за токеном.\n *\n * Имени дерева в нём нет вовсе: его приём берёт из приглашения — принятое из обращения, оно\n * позволило бы назваться чужим именем тому, кто добыл код.\n */\nexport interface IEnrollCargo {\n readonly schema: string;\n /** Признак дерева: его дерево считает у себя, а приём только сверяет. */\n readonly tree: string;\n /** Код приглашения, выданный владельцем. Уходит один раз и в журнал не попадает. */\n readonly code: string;\n}\n\n/** Ответ приёма на годное обращение: токен уходит дереву единственным этим ответом. */\nexport interface IEnrollGranted {\n readonly tree: string;\n /** Имя дерева, как его назвал владелец в приглашении. */\n readonly name: string;\n readonly token: string;\n}\n\n/** Ответ приёма на принятый груз: дерево и месяц печатаются владельцу отправляющей стороной. */\nexport interface IIntakeAccepted {\n readonly tree: string;\n /** Месяц записи в форме `2026-08`, по всемирному времени приёма. */\n readonly month: string;\n /** Запись месяца заведена этим запросом, а не обновлена. */\n readonly created: boolean;\n /**\n * Сколько записей легло этим запросом и сколько приехало повторно.\n *\n * Есть только у предложений: у них приём отбирает уже приехавшее по признаку, и без этих\n * двух чисел отправитель печатает «уехало» в том числе тогда, когда нового не уехало ничего.\n * Приём прежней редакции их не присылает вовсе — отсюда необязательность.\n */\n readonly added?: number;\n readonly known?: number;\n}\n"]}
|
package/lib/cascade.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Каскад отказа: ресурс, чей родитель не поехал в дерево, снимается вслед за ним.
|
|
3
|
+
*
|
|
4
|
+
* Отдельным модулем от каталога: каталог знает, какие ресурсы бывают, а каскад — как они связаны
|
|
5
|
+
* родством. Связь родителя с потомком читают двое — сверка связности пакета и сама раскладка, —
|
|
6
|
+
* и оба берут её отсюда.
|
|
7
|
+
*/
|
|
8
|
+
import { IEntryOfCatalog, ISelection } from './catalog.js';
|
|
9
|
+
/** Ресурс, снятый вслед за отвергнутым родителем. */
|
|
10
|
+
export interface ICascadeCut {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
/** Ближайший родитель: у правила — его закон, у паттерна — его правило. */
|
|
13
|
+
readonly parent: string;
|
|
14
|
+
/**
|
|
15
|
+
* Отвергнутый корень цепочки — то, что дерево действительно отвергло или не выбрало.
|
|
16
|
+
* Ближайшего родителя мало: паттерн уходит вслед за правилом, которого в отказе нет, и
|
|
17
|
+
* искать его там читатель пойдёт зря.
|
|
18
|
+
*/
|
|
19
|
+
readonly root: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Ресурсы, снятые каскадом: правила при невзятом законе и паттерны при невзятых правилах.
|
|
23
|
+
*
|
|
24
|
+
* Связь читается из вступления самого ресурса — отдельный список при пакете разошёлся бы с
|
|
25
|
+
* ресурсами молча, тем же молчанием, ради которого каскад и заводится. Родитель ищется по
|
|
26
|
+
* последнему звену имени: полного пути в шапке нет, потому что переезд закона между слоями
|
|
27
|
+
* переписывал бы шапки всех правил при нём.
|
|
28
|
+
*
|
|
29
|
+
* Родителя в каталоге нет вовсе — каскад молчит: снимать не по чему, а промах в шапке судит
|
|
30
|
+
* сверка связности пакета, до всякой раскладки в дереве.
|
|
31
|
+
*/
|
|
32
|
+
export declare function cascadeCuts(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly ICascadeCut[];
|
|
33
|
+
/**
|
|
34
|
+
* Ресурсы, названные выбором поимённо и всё равно снятые каскадом.
|
|
35
|
+
*
|
|
36
|
+
* Дерево, назвавшее правило в выборе при невыбранном законе, не получает его молча — то самое
|
|
37
|
+
* молчание, ради которого каскад и заводится, только с другой стороны: там о снятии не знал тот,
|
|
38
|
+
* кто ничего не просил, здесь — тот, кто попросил прямо.
|
|
39
|
+
*/
|
|
40
|
+
export declare function namedButCut(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly ICascadeCut[];
|
|
41
|
+
/**
|
|
42
|
+
* Что ложится в дерево: прямой отбор за вычетом снятого каскадом.
|
|
43
|
+
*
|
|
44
|
+
* Отдельной функцией, а не внутри `isChosen`, потому что каскад знает весь каталог, а отбор —
|
|
45
|
+
* один ресурс: связь родителя с потомком по одной записи не видна.
|
|
46
|
+
*/
|
|
47
|
+
export declare function chosenEntries(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly IEntryOfCatalog[];
|
|
48
|
+
/** Строка отказа, которая ничего не снимает. */
|
|
49
|
+
export interface IIdleSkip {
|
|
50
|
+
readonly id: string;
|
|
51
|
+
/** Чем названное ею уже снято: имя отвергнутого родителя, либо пусто — такого ресурса нет. */
|
|
52
|
+
readonly by: string;
|
|
53
|
+
}
|
|
54
|
+
export declare function idleSkips(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly IIdleSkip[];
|
|
55
|
+
//# sourceMappingURL=cascade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascade.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/cascade.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAiB,eAAe,EAAY,UAAU,EAAE,MAAM,cAAc,CAAC;AAIpF,qDAAqD;AACrD,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAgED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,EAAE,SAAS,EAAE,UAAU,GAAG,SAAS,WAAW,EAAE,CAM9G;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,EAAE,SAAS,EAAE,UAAU,GAAG,SAAS,WAAW,EAAE,CAE9G;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,EAAE,SAAS,EAAE,UAAU,GAAG,SAAS,eAAe,EAAE,CAIpH;AAED,gDAAgD;AAChD,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACvB;AA0BD,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,EAAE,SAAS,EAAE,UAAU,GAAG,SAAS,SAAS,EAAE,CAqB1G"}
|
package/lib/cascade.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Каскад отказа: ресурс, чей родитель не поехал в дерево, снимается вслед за ним.
|
|
3
|
+
*
|
|
4
|
+
* Отдельным модулем от каталога: каталог знает, какие ресурсы бывают, а каскад — как они связаны
|
|
5
|
+
* родством. Связь родителя с потомком читают двое — сверка связности пакета и сама раскладка, —
|
|
6
|
+
* и оба берут её отсюда.
|
|
7
|
+
*/
|
|
8
|
+
import { frontMatterOf, isChosen } from './catalog.js';
|
|
9
|
+
import { matchesVariant } from './variants.js';
|
|
10
|
+
/** Последнее звено имени: `application/money` → `money`. Им ресурсы и ссылаются друг на друга. */
|
|
11
|
+
const shortNameOf = (entry) => entry.name.split('/').pop() ?? entry.name;
|
|
12
|
+
/** Взятые ресурсы одного рода. */
|
|
13
|
+
function chosenOfKind(catalog, selection, kind) {
|
|
14
|
+
return catalog.filter((entry) => entry.kind === kind && isChosen(entry, selection));
|
|
15
|
+
}
|
|
16
|
+
/** Короткие имена взятых ресурсов рода. */
|
|
17
|
+
function takenNames(catalog, selection, kind) {
|
|
18
|
+
return new Set(chosenOfKind(catalog, selection, kind).map(shortNameOf));
|
|
19
|
+
}
|
|
20
|
+
/** Короткие имена всех ресурсов рода, взяты они или нет. */
|
|
21
|
+
function knownNames(catalog, kind) {
|
|
22
|
+
return new Set(catalog.filter((entry) => entry.kind === kind).map(shortNameOf));
|
|
23
|
+
}
|
|
24
|
+
/** Правила, снятые вслед за своим законом. Заодно называет корень цепочки для паттернов при них. */
|
|
25
|
+
function rulesCutByLaws(catalog, selection, rootByRule) {
|
|
26
|
+
const taken = takenNames(catalog, selection, 'laws');
|
|
27
|
+
const known = knownNames(catalog, 'laws');
|
|
28
|
+
const cuts = [];
|
|
29
|
+
for (const entry of chosenOfKind(catalog, selection, 'rules')) {
|
|
30
|
+
const law = frontMatterOf(entry.text).law;
|
|
31
|
+
if (law && known.has(law) && !taken.has(law)) {
|
|
32
|
+
cuts.push({ id: entry.id, parent: law, root: law });
|
|
33
|
+
rootByRule.set(shortNameOf(entry), law);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return cuts;
|
|
37
|
+
}
|
|
38
|
+
/** Паттерны, снятые вслед за своим правилом: либо оно не взято, либо само ушло за своим законом. */
|
|
39
|
+
function patternsCutByRules(catalog, selection, rootByRule) {
|
|
40
|
+
const taken = takenNames(catalog, selection, 'rules');
|
|
41
|
+
const known = knownNames(catalog, 'rules');
|
|
42
|
+
const cuts = [];
|
|
43
|
+
for (const entry of chosenOfKind(catalog, selection, 'patterns')) {
|
|
44
|
+
const rule = frontMatterOf(entry.text).rule;
|
|
45
|
+
const standing = taken.has(rule) && !rootByRule.has(rule);
|
|
46
|
+
if (rule && known.has(rule) && !standing) {
|
|
47
|
+
cuts.push({ id: entry.id, parent: rule, root: rootByRule.get(rule) ?? rule });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return cuts;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Ресурсы, снятые каскадом: правила при невзятом законе и паттерны при невзятых правилах.
|
|
54
|
+
*
|
|
55
|
+
* Связь читается из вступления самого ресурса — отдельный список при пакете разошёлся бы с
|
|
56
|
+
* ресурсами молча, тем же молчанием, ради которого каскад и заводится. Родитель ищется по
|
|
57
|
+
* последнему звену имени: полного пути в шапке нет, потому что переезд закона между слоями
|
|
58
|
+
* переписывал бы шапки всех правил при нём.
|
|
59
|
+
*
|
|
60
|
+
* Родителя в каталоге нет вовсе — каскад молчит: снимать не по чему, а промах в шапке судит
|
|
61
|
+
* сверка связности пакета, до всякой раскладки в дереве.
|
|
62
|
+
*/
|
|
63
|
+
export function cascadeCuts(catalog, selection) {
|
|
64
|
+
/** Правило, снятое законом: для паттернов при нём корнем цепочки будет этот закон. */
|
|
65
|
+
const rootByRule = new Map();
|
|
66
|
+
const rules = rulesCutByLaws(catalog, selection, rootByRule);
|
|
67
|
+
return [...rules, ...patternsCutByRules(catalog, selection, rootByRule)];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Ресурсы, названные выбором поимённо и всё равно снятые каскадом.
|
|
71
|
+
*
|
|
72
|
+
* Дерево, назвавшее правило в выборе при невыбранном законе, не получает его молча — то самое
|
|
73
|
+
* молчание, ради которого каскад и заводится, только с другой стороны: там о снятии не знал тот,
|
|
74
|
+
* кто ничего не просил, здесь — тот, кто попросил прямо.
|
|
75
|
+
*/
|
|
76
|
+
export function namedButCut(catalog, selection) {
|
|
77
|
+
return cascadeCuts(catalog, selection).filter((one) => selection.only.includes(one.id));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Что ложится в дерево: прямой отбор за вычетом снятого каскадом.
|
|
81
|
+
*
|
|
82
|
+
* Отдельной функцией, а не внутри `isChosen`, потому что каскад знает весь каталог, а отбор —
|
|
83
|
+
* один ресурс: связь родителя с потомком по одной записи не видна.
|
|
84
|
+
*/
|
|
85
|
+
export function chosenEntries(catalog, selection) {
|
|
86
|
+
const cut = new Set(cascadeCuts(catalog, selection).map((one) => one.id));
|
|
87
|
+
return catalog.filter((entry) => isChosen(entry, selection) && !cut.has(entry.id));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Строки отказа, которые ничего не снимают: названное ими снято каскадом или в каталоге не
|
|
91
|
+
* значится вовсе.
|
|
92
|
+
*
|
|
93
|
+
* Не отказ, а предупреждение: настройка, верная до обновления пакета, становится лишней сама,
|
|
94
|
+
* без единой правки в дереве, и отбивать за это раскладку значило бы наказывать за вчерашнюю
|
|
95
|
+
* правоту.
|
|
96
|
+
*
|
|
97
|
+
* Строка на ресурс чужого вида лишней не считается никогда: ею дерево гасит отказ о ресурсе,
|
|
98
|
+
* у которого нет подходящего вида, — то есть работу она делает.
|
|
99
|
+
*/
|
|
100
|
+
/**
|
|
101
|
+
* Корень цепочки, которой ресурс снят и без этой строки отказа. Пусто — каскад его не трогает.
|
|
102
|
+
*
|
|
103
|
+
* Каскад считается от отбора без самой строки: иначе снятое ею читалось бы как снятое родителем,
|
|
104
|
+
* и лишней оказалась бы любая строка отказа подряд.
|
|
105
|
+
*/
|
|
106
|
+
function cutParentOf(catalog, selection, id) {
|
|
107
|
+
const without = { ...selection, skip: selection.skip.filter((one) => one !== id) };
|
|
108
|
+
const cut = cascadeCuts(catalog, without).find((one) => one.id === id);
|
|
109
|
+
return cut ? cut.root : null;
|
|
110
|
+
}
|
|
111
|
+
export function idleSkips(catalog, selection) {
|
|
112
|
+
const idle = [];
|
|
113
|
+
for (const id of selection.skip) {
|
|
114
|
+
const entry = catalog.find((one) => one.id === id);
|
|
115
|
+
if (!entry) {
|
|
116
|
+
idle.push({ id, by: '' });
|
|
117
|
+
}
|
|
118
|
+
else if (matchesVariant(entry.variant, selection.variants)) {
|
|
119
|
+
const by = cutParentOf(catalog, selection, id);
|
|
120
|
+
if (by !== null) {
|
|
121
|
+
idle.push({ id, by });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Строка на ресурс чужого вида работу делает: ею дерево гасит отказ о ресурсе, у
|
|
126
|
+
// которого подходящего вида нет
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return idle;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=cascade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascade.js","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/cascade.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Каскад отказа: ресурс, чей родитель не поехал в дерево, снимается вслед за ним.\n *\n * Отдельным модулем от каталога: каталог знает, какие ресурсы бывают, а каскад — как они связаны\n * родством. Связь родителя с потомком читают двое — сверка связности пакета и сама раскладка, —\n * и оба берут её отсюда.\n */\n\nimport { frontMatterOf, IEntryOfCatalog, isChosen, ISelection } from './catalog.js';\nimport { TKind } from './config.js';\nimport { matchesVariant } from './variants.js';\n\n/** Ресурс, снятый вслед за отвергнутым родителем. */\nexport interface ICascadeCut {\n readonly id: string;\n /** Ближайший родитель: у правила — его закон, у паттерна — его правило. */\n readonly parent: string;\n /**\n * Отвергнутый корень цепочки — то, что дерево действительно отвергло или не выбрало.\n * Ближайшего родителя мало: паттерн уходит вслед за правилом, которого в отказе нет, и\n * искать его там читатель пойдёт зря.\n */\n readonly root: string;\n}\n\n/** Последнее звено имени: `application/money` → `money`. Им ресурсы и ссылаются друг на друга. */\nconst shortNameOf: (entry: IEntryOfCatalog) => string = (entry: IEntryOfCatalog): string => entry.name.split('/').pop() ?? entry.name;\n\n/** Взятые ресурсы одного рода. */\nfunction chosenOfKind(catalog: readonly IEntryOfCatalog[], selection: ISelection, kind: TKind): readonly IEntryOfCatalog[] {\n return catalog.filter((entry: IEntryOfCatalog): boolean => entry.kind === kind && isChosen(entry, selection));\n}\n\n/** Короткие имена взятых ресурсов рода. */\nfunction takenNames(catalog: readonly IEntryOfCatalog[], selection: ISelection, kind: TKind): ReadonlySet<string> {\n return new Set(chosenOfKind(catalog, selection, kind).map(shortNameOf));\n}\n\n/** Короткие имена всех ресурсов рода, взяты они или нет. */\nfunction knownNames(catalog: readonly IEntryOfCatalog[], kind: TKind): ReadonlySet<string> {\n return new Set(catalog.filter((entry: IEntryOfCatalog): boolean => entry.kind === kind).map(shortNameOf));\n}\n\n/** Правила, снятые вслед за своим законом. Заодно называет корень цепочки для паттернов при них. */\nfunction rulesCutByLaws(\n catalog: readonly IEntryOfCatalog[],\n selection: ISelection,\n rootByRule: Map<string, string>\n): readonly ICascadeCut[] {\n const taken: ReadonlySet<string> = takenNames(catalog, selection, 'laws');\n const known: ReadonlySet<string> = knownNames(catalog, 'laws');\n const cuts: ICascadeCut[] = [];\n\n for (const entry of chosenOfKind(catalog, selection, 'rules')) {\n const law: string = frontMatterOf(entry.text).law;\n\n if (law && known.has(law) && !taken.has(law)) {\n cuts.push({ id: entry.id, parent: law, root: law });\n rootByRule.set(shortNameOf(entry), law);\n }\n }\n\n return cuts;\n}\n\n/** Паттерны, снятые вслед за своим правилом: либо оно не взято, либо само ушло за своим законом. */\nfunction patternsCutByRules(\n catalog: readonly IEntryOfCatalog[],\n selection: ISelection,\n rootByRule: ReadonlyMap<string, string>\n): readonly ICascadeCut[] {\n const taken: ReadonlySet<string> = takenNames(catalog, selection, 'rules');\n const known: ReadonlySet<string> = knownNames(catalog, 'rules');\n const cuts: ICascadeCut[] = [];\n\n for (const entry of chosenOfKind(catalog, selection, 'patterns')) {\n const rule: string = frontMatterOf(entry.text).rule;\n const standing: boolean = taken.has(rule) && !rootByRule.has(rule);\n\n if (rule && known.has(rule) && !standing) {\n cuts.push({ id: entry.id, parent: rule, root: rootByRule.get(rule) ?? rule });\n }\n }\n\n return cuts;\n}\n\n/**\n * Ресурсы, снятые каскадом: правила при невзятом законе и паттерны при невзятых правилах.\n *\n * Связь читается из вступления самого ресурса — отдельный список при пакете разошёлся бы с\n * ресурсами молча, тем же молчанием, ради которого каскад и заводится. Родитель ищется по\n * последнему звену имени: полного пути в шапке нет, потому что переезд закона между слоями\n * переписывал бы шапки всех правил при нём.\n *\n * Родителя в каталоге нет вовсе — каскад молчит: снимать не по чему, а промах в шапке судит\n * сверка связности пакета, до всякой раскладки в дереве.\n */\nexport function cascadeCuts(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly ICascadeCut[] {\n /** Правило, снятое законом: для паттернов при нём корнем цепочки будет этот закон. */\n const rootByRule: Map<string, string> = new Map<string, string>();\n const rules: readonly ICascadeCut[] = rulesCutByLaws(catalog, selection, rootByRule);\n\n return [...rules, ...patternsCutByRules(catalog, selection, rootByRule)];\n}\n\n/**\n * Ресурсы, названные выбором поимённо и всё равно снятые каскадом.\n *\n * Дерево, назвавшее правило в выборе при невыбранном законе, не получает его молча — то самое\n * молчание, ради которого каскад и заводится, только с другой стороны: там о снятии не знал тот,\n * кто ничего не просил, здесь — тот, кто попросил прямо.\n */\nexport function namedButCut(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly ICascadeCut[] {\n return cascadeCuts(catalog, selection).filter((one: ICascadeCut): boolean => selection.only.includes(one.id));\n}\n\n/**\n * Что ложится в дерево: прямой отбор за вычетом снятого каскадом.\n *\n * Отдельной функцией, а не внутри `isChosen`, потому что каскад знает весь каталог, а отбор —\n * один ресурс: связь родителя с потомком по одной записи не видна.\n */\nexport function chosenEntries(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly IEntryOfCatalog[] {\n const cut: ReadonlySet<string> = new Set(cascadeCuts(catalog, selection).map((one: ICascadeCut): string => one.id));\n\n return catalog.filter((entry: IEntryOfCatalog): boolean => isChosen(entry, selection) && !cut.has(entry.id));\n}\n\n/** Строка отказа, которая ничего не снимает. */\nexport interface IIdleSkip {\n readonly id: string;\n /** Чем названное ею уже снято: имя отвергнутого родителя, либо пусто — такого ресурса нет. */\n readonly by: string;\n}\n\n/**\n * Строки отказа, которые ничего не снимают: названное ими снято каскадом или в каталоге не\n * значится вовсе.\n *\n * Не отказ, а предупреждение: настройка, верная до обновления пакета, становится лишней сама,\n * без единой правки в дереве, и отбивать за это раскладку значило бы наказывать за вчерашнюю\n * правоту.\n *\n * Строка на ресурс чужого вида лишней не считается никогда: ею дерево гасит отказ о ресурсе,\n * у которого нет подходящего вида, — то есть работу она делает.\n */\n/**\n * Корень цепочки, которой ресурс снят и без этой строки отказа. Пусто — каскад его не трогает.\n *\n * Каскад считается от отбора без самой строки: иначе снятое ею читалось бы как снятое родителем,\n * и лишней оказалась бы любая строка отказа подряд.\n */\nfunction cutParentOf(catalog: readonly IEntryOfCatalog[], selection: ISelection, id: string): string | null {\n const without: ISelection = { ...selection, skip: selection.skip.filter((one: string): boolean => one !== id) };\n const cut: ICascadeCut | undefined = cascadeCuts(catalog, without).find((one: ICascadeCut): boolean => one.id === id);\n\n return cut ? cut.root : null;\n}\n\nexport function idleSkips(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly IIdleSkip[] {\n const idle: IIdleSkip[] = [];\n\n for (const id of selection.skip) {\n const entry: IEntryOfCatalog | undefined = catalog.find((one: IEntryOfCatalog): boolean => one.id === id);\n\n if (!entry) {\n idle.push({ id, by: '' });\n } else if (matchesVariant(entry.variant, selection.variants)) {\n const by: string | null = cutParentOf(catalog, selection, id);\n\n if (by !== null) {\n idle.push({ id, by });\n }\n } else {\n // Строка на ресурс чужого вида работу делает: ею дерево гасит отказ о ресурсе, у\n // которого подходящего вида нет\n }\n }\n\n return idle;\n}\n"]}
|
package/lib/catalog.d.ts
CHANGED
|
@@ -47,12 +47,6 @@ export interface IFrontMatter {
|
|
|
47
47
|
/** Правило, при котором стоит паттерн. */
|
|
48
48
|
readonly rule: string;
|
|
49
49
|
}
|
|
50
|
-
/**
|
|
51
|
-
* Вступление между `---` в начале файла; его нет — вернётся пустая шапка.
|
|
52
|
-
*
|
|
53
|
-
* Живёт при каталоге, потому что связь родителя с потомком читают двое: сверка связности пакета
|
|
54
|
-
* и каскад отказа. Объявление у одного из них заводило бы круговой импорт между ними.
|
|
55
|
-
*/
|
|
56
50
|
export declare function frontMatterOf(text: string): IFrontMatter;
|
|
57
51
|
/**
|
|
58
52
|
* Что ресурс о себе объявил. Имена читаются идентификаторами — `hooks/observe.sh`: короткая
|
|
@@ -111,76 +105,7 @@ export interface IGapOfVariant {
|
|
|
111
105
|
/** Идентификаторы этих видов: ими же пробел и снимается через `skip`. */
|
|
112
106
|
readonly ids: readonly string[];
|
|
113
107
|
}
|
|
114
|
-
/**
|
|
115
|
-
* Ресурсы, оставшиеся без вида под выбор дерева.
|
|
116
|
-
*
|
|
117
|
-
* Молчаливый пропуск такого ресурса — худший из исходов. Правило поставки едет тремя видами, а
|
|
118
|
-
* команды заведения задачи и сверки очереди — одним: дерево, выбравшее чужой хостинг, получает
|
|
119
|
-
* правило, которое зовёт три команды, и ни одного скрипта под ними. Отказа при этом не бывает —
|
|
120
|
-
* ресурс просто не приезжает, и узнают об этом, когда команда из правила не находится.
|
|
121
|
-
*
|
|
122
|
-
* Отсюда правило: **ресурс с видами, ни один из которых не совпал, — отказ, а не пропуск.**
|
|
123
|
-
* Снимается он двумя способами, и оба явные: завести недостающий вид в пакете либо назвать
|
|
124
|
-
* существующие в `skip` — дерево тем самым говорит, что обходится без этого ресурса.
|
|
125
|
-
*/
|
|
126
108
|
export declare function variantGaps(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly IGapOfVariant[];
|
|
127
|
-
/** Ресурс, снятый вслед за отвергнутым родителем. */
|
|
128
|
-
export interface ICascadeCut {
|
|
129
|
-
readonly id: string;
|
|
130
|
-
/** Ближайший родитель: у правила — его закон, у паттерна — его правило. */
|
|
131
|
-
readonly parent: string;
|
|
132
|
-
/**
|
|
133
|
-
* Отвергнутый корень цепочки — то, что дерево действительно отвергло или не выбрало.
|
|
134
|
-
* Ближайшего родителя мало: паттерн уходит вслед за правилом, которого в отказе нет, и
|
|
135
|
-
* искать его там читатель пойдёт зря.
|
|
136
|
-
*/
|
|
137
|
-
readonly root: string;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Ресурсы, снятые каскадом: правила при невзятом законе и паттерны при невзятых правилах.
|
|
141
|
-
*
|
|
142
|
-
* Связь читается из вступления самого ресурса — отдельный список при пакете разошёлся бы с
|
|
143
|
-
* ресурсами молча, тем же молчанием, ради которого каскад и заводится. Родитель ищется по
|
|
144
|
-
* последнему звену имени: полного пути в шапке нет, потому что переезд закона между слоями
|
|
145
|
-
* переписывал бы шапки всех правил при нём.
|
|
146
|
-
*
|
|
147
|
-
* Родителя в каталоге нет вовсе — каскад молчит: снимать не по чему, а промах в шапке судит
|
|
148
|
-
* сверка связности пакета, до всякой раскладки в дереве.
|
|
149
|
-
*/
|
|
150
|
-
export declare function cascadeCuts(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly ICascadeCut[];
|
|
151
|
-
/**
|
|
152
|
-
* Ресурсы, названные выбором поимённо и всё равно снятые каскадом.
|
|
153
|
-
*
|
|
154
|
-
* Дерево, назвавшее правило в выборе при невыбранном законе, не получает его молча — то самое
|
|
155
|
-
* молчание, ради которого каскад и заводится, только с другой стороны: там о снятии не знал тот,
|
|
156
|
-
* кто ничего не просил, здесь — тот, кто попросил прямо.
|
|
157
|
-
*/
|
|
158
|
-
export declare function namedButCut(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly ICascadeCut[];
|
|
159
|
-
/**
|
|
160
|
-
* Что ложится в дерево: прямой отбор за вычетом снятого каскадом.
|
|
161
|
-
*
|
|
162
|
-
* Отдельной функцией, а не внутри `isChosen`, потому что каскад знает весь каталог, а отбор —
|
|
163
|
-
* один ресурс: связь родителя с потомком по одной записи не видна.
|
|
164
|
-
*/
|
|
165
|
-
export declare function chosenEntries(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly IEntryOfCatalog[];
|
|
166
|
-
/** Строка отказа, которая ничего не снимает. */
|
|
167
|
-
export interface IIdleSkip {
|
|
168
|
-
readonly id: string;
|
|
169
|
-
/** Чем названное ею уже снято: имя отвергнутого родителя, либо пусто — такого ресурса нет. */
|
|
170
|
-
readonly by: string;
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Строки отказа, которые ничего не снимают: названное ими снято каскадом или в каталоге не
|
|
174
|
-
* значится вовсе.
|
|
175
|
-
*
|
|
176
|
-
* Не отказ, а предупреждение: настройка, верная до обновления пакета, становится лишней сама,
|
|
177
|
-
* без единой правки в дереве, и отбивать за это раскладку значило бы наказывать за вчерашнюю
|
|
178
|
-
* правоту.
|
|
179
|
-
*
|
|
180
|
-
* Строка на ресурс чужого вида лишней не считается никогда: ею дерево гасит отказ о ресурсе,
|
|
181
|
-
* у которого нет подходящего вида, — то есть работу она делает.
|
|
182
|
-
*/
|
|
183
|
-
export declare function idleSkips(catalog: readonly IEntryOfCatalog[], selection: ISelection): readonly IIdleSkip[];
|
|
184
109
|
/** Выбранный ресурс, чьё требование в дерево не поехало. */
|
|
185
110
|
export interface IBrokenLink {
|
|
186
111
|
/** Кто требует — идентификатор выбранного ресурса. */
|
package/lib/catalog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/catalog.ts"],"names":[],"mappings":"AAUA,OAAO,EAAS,KAAK,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAS,QAAQ,EAAuD,MAAM,eAAe,CAAC;AAErG,MAAM,WAAW,eAAe;IAC5B,kGAAkG;IAClG,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAID,kFAAkF;AAClF,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/catalog.ts"],"names":[],"mappings":"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"}
|