@owlmeans/viable-common 0.0.4
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 +68 -0
- package/agent-meta/manifest.json +16 -0
- package/agent-meta/skills/viable-common/SKILL.md +179 -0
- package/build/agent/index.d.ts +4 -0
- package/build/agent/index.d.ts.map +1 -0
- package/build/agent/index.js +3 -0
- package/build/agent/index.js.map +1 -0
- package/build/agent/memory.d.ts +12 -0
- package/build/agent/memory.d.ts.map +1 -0
- package/build/agent/memory.js +11 -0
- package/build/agent/memory.js.map +1 -0
- package/build/agent/spectator/consts.d.ts +9 -0
- package/build/agent/spectator/consts.d.ts.map +1 -0
- package/build/agent/spectator/consts.js +10 -0
- package/build/agent/spectator/consts.js.map +1 -0
- package/build/agent/spectator/index.d.ts +3 -0
- package/build/agent/spectator/index.d.ts.map +1 -0
- package/build/agent/spectator/index.js +2 -0
- package/build/agent/spectator/index.js.map +1 -0
- package/build/agent/spectator/types.d.ts +13 -0
- package/build/agent/spectator/types.d.ts.map +1 -0
- package/build/agent/spectator/types.js +2 -0
- package/build/agent/spectator/types.js.map +1 -0
- package/build/agent/types.d.ts +10 -0
- package/build/agent/types.d.ts.map +1 -0
- package/build/agent/types.js +2 -0
- package/build/agent/types.js.map +1 -0
- package/build/areas/consts.d.ts +88 -0
- package/build/areas/consts.d.ts.map +1 -0
- package/build/areas/consts.js +106 -0
- package/build/areas/consts.js.map +1 -0
- package/build/areas/index.d.ts +3 -0
- package/build/areas/index.d.ts.map +1 -0
- package/build/areas/index.js +2 -0
- package/build/areas/index.js.map +1 -0
- package/build/areas/types.d.ts +28 -0
- package/build/areas/types.d.ts.map +1 -0
- package/build/areas/types.js +2 -0
- package/build/areas/types.js.map +1 -0
- package/build/ba/consts.d.ts +38 -0
- package/build/ba/consts.d.ts.map +1 -0
- package/build/ba/consts.js +41 -0
- package/build/ba/consts.js.map +1 -0
- package/build/ba/helpers.d.ts +41 -0
- package/build/ba/helpers.d.ts.map +1 -0
- package/build/ba/helpers.js +79 -0
- package/build/ba/helpers.js.map +1 -0
- package/build/ba/index.d.ts +5 -0
- package/build/ba/index.d.ts.map +1 -0
- package/build/ba/index.js +4 -0
- package/build/ba/index.js.map +1 -0
- package/build/ba/schemas.d.ts +13 -0
- package/build/ba/schemas.d.ts.map +1 -0
- package/build/ba/schemas.js +181 -0
- package/build/ba/schemas.js.map +1 -0
- package/build/ba/types.d.ts +113 -0
- package/build/ba/types.d.ts.map +1 -0
- package/build/ba/types.js +2 -0
- package/build/ba/types.js.map +1 -0
- package/build/blueprint/case.d.ts +73 -0
- package/build/blueprint/case.d.ts.map +1 -0
- package/build/blueprint/case.js +244 -0
- package/build/blueprint/case.js.map +1 -0
- package/build/blueprint/consts.d.ts +11 -0
- package/build/blueprint/consts.d.ts.map +1 -0
- package/build/blueprint/consts.js +11 -0
- package/build/blueprint/consts.js.map +1 -0
- package/build/blueprint/index.d.ts +6 -0
- package/build/blueprint/index.d.ts.map +1 -0
- package/build/blueprint/index.js +6 -0
- package/build/blueprint/index.js.map +1 -0
- package/build/blueprint/resolve.d.ts +51 -0
- package/build/blueprint/resolve.d.ts.map +1 -0
- package/build/blueprint/resolve.js +108 -0
- package/build/blueprint/resolve.js.map +1 -0
- package/build/blueprint/schemas.d.ts +41 -0
- package/build/blueprint/schemas.d.ts.map +1 -0
- package/build/blueprint/schemas.js +27 -0
- package/build/blueprint/schemas.js.map +1 -0
- package/build/blueprint/types.d.ts +186 -0
- package/build/blueprint/types.d.ts.map +1 -0
- package/build/blueprint/types.js +32 -0
- package/build/blueprint/types.js.map +1 -0
- package/build/branding.d.ts +19 -0
- package/build/branding.d.ts.map +1 -0
- package/build/branding.js +32 -0
- package/build/branding.js.map +1 -0
- package/build/connect/consts.d.ts +378 -0
- package/build/connect/consts.d.ts.map +1 -0
- package/build/connect/consts.js +425 -0
- package/build/connect/consts.js.map +1 -0
- package/build/connect/entrypoints.d.ts +41 -0
- package/build/connect/entrypoints.d.ts.map +1 -0
- package/build/connect/entrypoints.js +141 -0
- package/build/connect/entrypoints.js.map +1 -0
- package/build/connect/errors.d.ts +50 -0
- package/build/connect/errors.d.ts.map +1 -0
- package/build/connect/errors.js +77 -0
- package/build/connect/errors.js.map +1 -0
- package/build/connect/index.d.ts +8 -0
- package/build/connect/index.d.ts.map +1 -0
- package/build/connect/index.js +6 -0
- package/build/connect/index.js.map +1 -0
- package/build/connect/ops.d.ts +192 -0
- package/build/connect/ops.d.ts.map +1 -0
- package/build/connect/ops.js +2 -0
- package/build/connect/ops.js.map +1 -0
- package/build/connect/references.d.ts +194 -0
- package/build/connect/references.d.ts.map +1 -0
- package/build/connect/references.js +62 -0
- package/build/connect/references.js.map +1 -0
- package/build/connect/schemas.d.ts +59 -0
- package/build/connect/schemas.d.ts.map +1 -0
- package/build/connect/schemas.js +346 -0
- package/build/connect/schemas.js.map +1 -0
- package/build/connect/types.d.ts +428 -0
- package/build/connect/types.d.ts.map +1 -0
- package/build/connect/types.js +2 -0
- package/build/connect/types.js.map +1 -0
- package/build/consts.d.ts +9 -0
- package/build/consts.d.ts.map +1 -0
- package/build/consts.js +31 -0
- package/build/consts.js.map +1 -0
- package/build/convert/consts.d.ts +539 -0
- package/build/convert/consts.d.ts.map +1 -0
- package/build/convert/consts.js +630 -0
- package/build/convert/consts.js.map +1 -0
- package/build/convert/helpers.d.ts +91 -0
- package/build/convert/helpers.d.ts.map +1 -0
- package/build/convert/helpers.js +301 -0
- package/build/convert/helpers.js.map +1 -0
- package/build/convert/index.d.ts +11 -0
- package/build/convert/index.d.ts.map +1 -0
- package/build/convert/index.js +4 -0
- package/build/convert/index.js.map +1 -0
- package/build/convert/schemas.d.ts +62 -0
- package/build/convert/schemas.d.ts.map +1 -0
- package/build/convert/schemas.js +626 -0
- package/build/convert/schemas.js.map +1 -0
- package/build/convert/types.d.ts +683 -0
- package/build/convert/types.d.ts.map +1 -0
- package/build/convert/types.js +2 -0
- package/build/convert/types.js.map +1 -0
- package/build/design/consts.d.ts +25 -0
- package/build/design/consts.d.ts.map +1 -0
- package/build/design/consts.js +26 -0
- package/build/design/consts.js.map +1 -0
- package/build/design/helpers.d.ts +60 -0
- package/build/design/helpers.d.ts.map +1 -0
- package/build/design/helpers.js +221 -0
- package/build/design/helpers.js.map +1 -0
- package/build/design/index.d.ts +6 -0
- package/build/design/index.d.ts.map +1 -0
- package/build/design/index.js +5 -0
- package/build/design/index.js.map +1 -0
- package/build/design/runtime.d.ts +126 -0
- package/build/design/runtime.d.ts.map +1 -0
- package/build/design/runtime.js +65 -0
- package/build/design/runtime.js.map +1 -0
- package/build/design/schemas.d.ts +21 -0
- package/build/design/schemas.d.ts.map +1 -0
- package/build/design/schemas.js +369 -0
- package/build/design/schemas.js.map +1 -0
- package/build/design/types.d.ts +199 -0
- package/build/design/types.d.ts.map +1 -0
- package/build/design/types.js +2 -0
- package/build/design/types.js.map +1 -0
- package/build/dev/consts.d.ts +32 -0
- package/build/dev/consts.d.ts.map +1 -0
- package/build/dev/consts.js +33 -0
- package/build/dev/consts.js.map +1 -0
- package/build/dev/index.d.ts +4 -0
- package/build/dev/index.d.ts.map +1 -0
- package/build/dev/index.js +3 -0
- package/build/dev/index.js.map +1 -0
- package/build/dev/schemas.d.ts +15 -0
- package/build/dev/schemas.d.ts.map +1 -0
- package/build/dev/schemas.js +116 -0
- package/build/dev/schemas.js.map +1 -0
- package/build/dev/types.d.ts +42 -0
- package/build/dev/types.d.ts.map +1 -0
- package/build/dev/types.js +2 -0
- package/build/dev/types.js.map +1 -0
- package/build/execution/consts.d.ts +36 -0
- package/build/execution/consts.d.ts.map +1 -0
- package/build/execution/consts.js +37 -0
- package/build/execution/consts.js.map +1 -0
- package/build/execution/index.d.ts +3 -0
- package/build/execution/index.d.ts.map +1 -0
- package/build/execution/index.js +2 -0
- package/build/execution/index.js.map +1 -0
- package/build/execution/types.d.ts +50 -0
- package/build/execution/types.d.ts.map +1 -0
- package/build/execution/types.js +2 -0
- package/build/execution/types.js.map +1 -0
- package/build/index.d.ts +22 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +21 -0
- package/build/index.js.map +1 -0
- package/build/integrity/consts.d.ts +226 -0
- package/build/integrity/consts.d.ts.map +1 -0
- package/build/integrity/consts.js +401 -0
- package/build/integrity/consts.js.map +1 -0
- package/build/integrity/index.d.ts +4 -0
- package/build/integrity/index.d.ts.map +1 -0
- package/build/integrity/index.js +3 -0
- package/build/integrity/index.js.map +1 -0
- package/build/integrity/types.d.ts +35 -0
- package/build/integrity/types.d.ts.map +1 -0
- package/build/integrity/types.js +2 -0
- package/build/integrity/types.js.map +1 -0
- package/build/integrity/verify.d.ts +23 -0
- package/build/integrity/verify.d.ts.map +1 -0
- package/build/integrity/verify.js +198 -0
- package/build/integrity/verify.js.map +1 -0
- package/build/metadata/consts.d.ts +101 -0
- package/build/metadata/consts.d.ts.map +1 -0
- package/build/metadata/consts.js +104 -0
- package/build/metadata/consts.js.map +1 -0
- package/build/metadata/index.d.ts +3 -0
- package/build/metadata/index.d.ts.map +1 -0
- package/build/metadata/index.js +3 -0
- package/build/metadata/index.js.map +1 -0
- package/build/metadata/types.d.ts +286 -0
- package/build/metadata/types.d.ts.map +1 -0
- package/build/metadata/types.js +39 -0
- package/build/metadata/types.js.map +1 -0
- package/build/moderation/consts.d.ts +58 -0
- package/build/moderation/consts.d.ts.map +1 -0
- package/build/moderation/consts.js +60 -0
- package/build/moderation/consts.js.map +1 -0
- package/build/moderation/index.d.ts +5 -0
- package/build/moderation/index.d.ts.map +1 -0
- package/build/moderation/index.js +4 -0
- package/build/moderation/index.js.map +1 -0
- package/build/moderation/schemas.d.ts +19 -0
- package/build/moderation/schemas.d.ts.map +1 -0
- package/build/moderation/schemas.js +26 -0
- package/build/moderation/schemas.js.map +1 -0
- package/build/moderation/types.d.ts +64 -0
- package/build/moderation/types.d.ts.map +1 -0
- package/build/moderation/types.js +2 -0
- package/build/moderation/types.js.map +1 -0
- package/build/moderation/utils.d.ts +21 -0
- package/build/moderation/utils.d.ts.map +1 -0
- package/build/moderation/utils.js +31 -0
- package/build/moderation/utils.js.map +1 -0
- package/build/preview/consts.d.ts +10 -0
- package/build/preview/consts.d.ts.map +1 -0
- package/build/preview/consts.js +11 -0
- package/build/preview/consts.js.map +1 -0
- package/build/preview/index.d.ts +3 -0
- package/build/preview/index.d.ts.map +1 -0
- package/build/preview/index.js +2 -0
- package/build/preview/index.js.map +1 -0
- package/build/preview/types.d.ts +60 -0
- package/build/preview/types.d.ts.map +1 -0
- package/build/preview/types.js +2 -0
- package/build/preview/types.js.map +1 -0
- package/build/scaffold/consts.d.ts +25 -0
- package/build/scaffold/consts.d.ts.map +1 -0
- package/build/scaffold/consts.js +26 -0
- package/build/scaffold/consts.js.map +1 -0
- package/build/scaffold/helpers.d.ts +35 -0
- package/build/scaffold/helpers.d.ts.map +1 -0
- package/build/scaffold/helpers.js +54 -0
- package/build/scaffold/helpers.js.map +1 -0
- package/build/scaffold/index.d.ts +5 -0
- package/build/scaffold/index.d.ts.map +1 -0
- package/build/scaffold/index.js +4 -0
- package/build/scaffold/index.js.map +1 -0
- package/build/scaffold/schemas.d.ts +5 -0
- package/build/scaffold/schemas.d.ts.map +1 -0
- package/build/scaffold/schemas.js +273 -0
- package/build/scaffold/schemas.js.map +1 -0
- package/build/scaffold/types.d.ts +144 -0
- package/build/scaffold/types.d.ts.map +1 -0
- package/build/scaffold/types.js +2 -0
- package/build/scaffold/types.js.map +1 -0
- package/build/skills/catalogue.d.ts +47 -0
- package/build/skills/catalogue.d.ts.map +1 -0
- package/build/skills/catalogue.js +1566 -0
- package/build/skills/catalogue.js.map +1 -0
- package/build/skills/consts.d.ts +104 -0
- package/build/skills/consts.d.ts.map +1 -0
- package/build/skills/consts.js +170 -0
- package/build/skills/consts.js.map +1 -0
- package/build/skills/index.d.ts +4 -0
- package/build/skills/index.d.ts.map +1 -0
- package/build/skills/index.js +4 -0
- package/build/skills/index.js.map +1 -0
- package/build/skills/roles.d.ts +52 -0
- package/build/skills/roles.d.ts.map +1 -0
- package/build/skills/roles.js +256 -0
- package/build/skills/roles.js.map +1 -0
- package/build/slot/consts.d.ts +305 -0
- package/build/slot/consts.d.ts.map +1 -0
- package/build/slot/consts.js +376 -0
- package/build/slot/consts.js.map +1 -0
- package/build/slot/helpers.d.ts +25 -0
- package/build/slot/helpers.d.ts.map +1 -0
- package/build/slot/helpers.js +27 -0
- package/build/slot/helpers.js.map +1 -0
- package/build/slot/index.d.ts +6 -0
- package/build/slot/index.d.ts.map +1 -0
- package/build/slot/index.js +5 -0
- package/build/slot/index.js.map +1 -0
- package/build/slot/layout.d.ts +72 -0
- package/build/slot/layout.d.ts.map +1 -0
- package/build/slot/layout.js +82 -0
- package/build/slot/layout.js.map +1 -0
- package/build/slot/schemas.d.ts +12 -0
- package/build/slot/schemas.d.ts.map +1 -0
- package/build/slot/schemas.js +43 -0
- package/build/slot/schemas.js.map +1 -0
- package/build/slot/types.d.ts +147 -0
- package/build/slot/types.d.ts.map +1 -0
- package/build/slot/types.js +2 -0
- package/build/slot/types.js.map +1 -0
- package/build/topology/card.d.ts +23 -0
- package/build/topology/card.d.ts.map +1 -0
- package/build/topology/card.js +95 -0
- package/build/topology/card.js.map +1 -0
- package/build/topology/consts.d.ts +32 -0
- package/build/topology/consts.d.ts.map +1 -0
- package/build/topology/consts.js +55 -0
- package/build/topology/consts.js.map +1 -0
- package/build/topology/helpers.d.ts +44 -0
- package/build/topology/helpers.d.ts.map +1 -0
- package/build/topology/helpers.js +112 -0
- package/build/topology/helpers.js.map +1 -0
- package/build/topology/index.d.ts +5 -0
- package/build/topology/index.d.ts.map +1 -0
- package/build/topology/index.js +4 -0
- package/build/topology/index.js.map +1 -0
- package/build/topology/types.d.ts +83 -0
- package/build/topology/types.d.ts.map +1 -0
- package/build/topology/types.js +2 -0
- package/build/topology/types.js.map +1 -0
- package/build/types.d.ts +88 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/build/ux/consts.d.ts +5 -0
- package/build/ux/consts.d.ts.map +1 -0
- package/build/ux/consts.js +6 -0
- package/build/ux/consts.js.map +1 -0
- package/build/ux/index.d.ts +4 -0
- package/build/ux/index.d.ts.map +1 -0
- package/build/ux/index.js +3 -0
- package/build/ux/index.js.map +1 -0
- package/build/ux/schemas.d.ts +8 -0
- package/build/ux/schemas.d.ts.map +1 -0
- package/build/ux/schemas.js +91 -0
- package/build/ux/schemas.js.map +1 -0
- package/build/ux/types.d.ts +21 -0
- package/build/ux/types.d.ts.map +1 -0
- package/build/ux/types.js +2 -0
- package/build/ux/types.js.map +1 -0
- package/package.json +71 -0
- package/src/agent/index.ts +4 -0
- package/src/agent/memory.ts +16 -0
- package/src/agent/spectator/consts.ts +10 -0
- package/src/agent/spectator/index.ts +3 -0
- package/src/agent/spectator/types.ts +14 -0
- package/src/agent/types.ts +10 -0
- package/src/areas/consts.ts +112 -0
- package/src/areas/index.ts +3 -0
- package/src/areas/types.ts +29 -0
- package/src/ba/consts.ts +40 -0
- package/src/ba/helpers.ts +93 -0
- package/src/ba/index.ts +5 -0
- package/src/ba/schemas.ts +196 -0
- package/src/ba/types.ts +125 -0
- package/src/blueprint/case.ts +272 -0
- package/src/blueprint/consts.ts +11 -0
- package/src/blueprint/index.ts +6 -0
- package/src/blueprint/resolve.ts +133 -0
- package/src/blueprint/schemas.ts +44 -0
- package/src/blueprint/types.ts +204 -0
- package/src/branding.ts +34 -0
- package/src/connect/consts.ts +441 -0
- package/src/connect/entrypoints.ts +291 -0
- package/src/connect/errors.ts +91 -0
- package/src/connect/index.ts +7 -0
- package/src/connect/ops.ts +208 -0
- package/src/connect/references.ts +89 -0
- package/src/connect/schemas.ts +384 -0
- package/src/connect/types.ts +456 -0
- package/src/consts.ts +34 -0
- package/src/convert/consts.ts +672 -0
- package/src/convert/helpers.ts +340 -0
- package/src/convert/index.ts +10 -0
- package/src/convert/schemas.ts +663 -0
- package/src/convert/types.ts +741 -0
- package/src/design/consts.ts +26 -0
- package/src/design/helpers.ts +255 -0
- package/src/design/index.ts +5 -0
- package/src/design/runtime.ts +142 -0
- package/src/design/schemas.ts +384 -0
- package/src/design/types.ts +191 -0
- package/src/dev/consts.ts +35 -0
- package/src/dev/index.ts +4 -0
- package/src/dev/schemas.ts +124 -0
- package/src/dev/types.ts +47 -0
- package/src/execution/consts.ts +37 -0
- package/src/execution/index.ts +3 -0
- package/src/execution/types.ts +55 -0
- package/src/index.ts +22 -0
- package/src/integrity/consts.ts +477 -0
- package/src/integrity/index.ts +3 -0
- package/src/integrity/types.ts +37 -0
- package/src/integrity/verify.ts +221 -0
- package/src/metadata/consts.ts +118 -0
- package/src/metadata/index.ts +3 -0
- package/src/metadata/types.ts +310 -0
- package/src/moderation/consts.ts +59 -0
- package/src/moderation/index.ts +4 -0
- package/src/moderation/schemas.ts +28 -0
- package/src/moderation/types.ts +68 -0
- package/src/moderation/utils.ts +35 -0
- package/src/preview/consts.ts +9 -0
- package/src/preview/index.ts +3 -0
- package/src/preview/types.ts +79 -0
- package/src/scaffold/consts.ts +26 -0
- package/src/scaffold/helpers.ts +84 -0
- package/src/scaffold/index.ts +4 -0
- package/src/scaffold/schemas.ts +283 -0
- package/src/scaffold/types.ts +118 -0
- package/src/skills/catalogue.ts +1617 -0
- package/src/skills/consts.ts +183 -0
- package/src/skills/index.ts +4 -0
- package/src/skills/roles.ts +299 -0
- package/src/slot/consts.ts +393 -0
- package/src/slot/helpers.ts +34 -0
- package/src/slot/index.ts +5 -0
- package/src/slot/layout.ts +141 -0
- package/src/slot/schemas.ts +46 -0
- package/src/slot/types.ts +164 -0
- package/src/topology/card.ts +106 -0
- package/src/topology/consts.ts +59 -0
- package/src/topology/helpers.ts +138 -0
- package/src/topology/index.ts +5 -0
- package/src/topology/types.ts +86 -0
- package/src/types.ts +104 -0
- package/src/ux/consts.ts +5 -0
- package/src/ux/index.ts +4 -0
- package/src/ux/schemas.ts +97 -0
- package/src/ux/types.ts +25 -0
- package/tests/connect-convert.spec.ts +161 -0
- package/tests/convert.spec.ts +318 -0
- package/tests/design.spec.ts +136 -0
- package/tsconfig.json +16 -0
package/README.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# @owlmeans/viable-common
|
|
2
|
+
|
|
3
|
+
Runtime-free contracts of the OwlMeans Viable platform.
|
|
4
|
+
|
|
5
|
+
Viable turns a description into a running full-stack application. Four runtimes have to agree
|
|
6
|
+
about every name involved — the manager API, the agent, the publisher that runs inside a project
|
|
7
|
+
slot, and the connector SDK on a developer's machine — so each of those names is declared here
|
|
8
|
+
once and imported by all of them. There is no runtime in this package: no `@langchain/*`, no
|
|
9
|
+
filesystem, no inference SDK. It is safe to import from a browser bundle.
|
|
10
|
+
|
|
11
|
+
## What is in it
|
|
12
|
+
|
|
13
|
+
| Subpath | Contents |
|
|
14
|
+
|---|---|
|
|
15
|
+
| `.` | The shapes a generated project is described by: user stories and entities, the design and scaffold plans, UX/UI specs, the `docs/` metadata paths, the four user areas, the model roles and personas, moderation categories, slot metadata |
|
|
16
|
+
| `@owlmeans/viable-common/slot` | The slot command vocabulary — file, shell and git commands, the sub-project roles, the target's ports and process markers |
|
|
17
|
+
| `@owlmeans/viable-common/connect` | The connector protocol: sessions, operations, model tasks, questions, jobs, capabilities, the error family, and `connectEntrypoints()` — the one declaration both the platform and the SDK elevate |
|
|
18
|
+
| `@owlmeans/viable-common/convert` | Converting an application that already exists: the stages and their transitions, the origin and stack taxonomy, the census classifiers, and the `docs/conversion/` layout |
|
|
19
|
+
| `@owlmeans/viable-common/integrity` | The target-shape manifest — what a slot is allowed to install, build and run — per target layout |
|
|
20
|
+
|
|
21
|
+
## Installation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
bun add @owlmeans/viable-common@^0.0.4
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Rules worth knowing before you change something
|
|
28
|
+
|
|
29
|
+
**A schema is written for the reader that will refuse it.** Model-answer schemas are annotated
|
|
30
|
+
`JSONSchemaType<T>` so a drift from the type is caught where it is written; record schemas are
|
|
31
|
+
hand-written and cast, because they are re-applied as a Mongo `$jsonSchema`, which admits no
|
|
32
|
+
`Record<>` maps, no `integer` and no date objects.
|
|
33
|
+
|
|
34
|
+
**`nullable: true` always carries its `type`, and a nullable `enum` lists `null` among its
|
|
35
|
+
values.** Ajv checks `nullable` and `enum` independently, so the pair written apart admits `null`
|
|
36
|
+
by type and then refuses it by enum — the field can only ever be omitted, never sent empty. A
|
|
37
|
+
provider's structured output writes an unset optional as `null`, and a wire body where `null`
|
|
38
|
+
means "inherit" has no other spelling. `tests/convert.spec.ts` walks every exported schema for
|
|
39
|
+
both faults, and for draft-04 tuple `items`.
|
|
40
|
+
|
|
41
|
+
**A field that crosses a version skew carries no `enum`.** A connector is installed with
|
|
42
|
+
`npx -y @owlmeans/viable-mcp` and talks to a separately deployed platform, so an executor kind it
|
|
43
|
+
sends must remain an unused capability on an older platform rather than a refused session.
|
|
44
|
+
|
|
45
|
+
**A ceiling exists once.** The inquiry answer cap here equals `DEFAULT_INQUIRY_ANSWER_CHARS` in
|
|
46
|
+
`@owlmeans/llm-common` and must stay equal; two ceilings mean the larger one truncates silently
|
|
47
|
+
at the smaller.
|
|
48
|
+
|
|
49
|
+
## Related
|
|
50
|
+
|
|
51
|
+
- `@owlmeans/viable-sdk` — the connector SDK written against these contracts
|
|
52
|
+
- `@owlmeans/viable-mcp` — the npx MCP server built on that SDK
|
|
53
|
+
|
|
54
|
+
<!-- owlmeans:agent-guidance:start -->
|
|
55
|
+
## Agent guidance
|
|
56
|
+
|
|
57
|
+
This package ships embedded agent skills under `agent-meta/`. After installing your
|
|
58
|
+
`@owlmeans/*` packages, run the OwlMeans agent-skills installer to place them into
|
|
59
|
+
your project's skill store (`.agents/skills/`):
|
|
60
|
+
|
|
61
|
+
```sh
|
|
62
|
+
npx @owlmeans/agent-skills@^0.1.18-rc.13
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The embedded files are version-matched to this package release. Do not edit them
|
|
66
|
+
directly — they are regenerated on each publish. To contribute guidance edits,
|
|
67
|
+
open a PR against the source monorepo.
|
|
68
|
+
<!-- owlmeans:agent-guidance:end -->
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 2,
|
|
3
|
+
"package": "@owlmeans/viable-common",
|
|
4
|
+
"version": "0.0.4",
|
|
5
|
+
"generatedAt": "2026-09-10T18:54:42.505Z",
|
|
6
|
+
"canonicalRepo": "https://github.com/owlmeans/common",
|
|
7
|
+
"entries": [
|
|
8
|
+
{
|
|
9
|
+
"kind": "skill",
|
|
10
|
+
"name": "viable-common",
|
|
11
|
+
"category": "package-specific",
|
|
12
|
+
"file": "skills/viable-common/SKILL.md",
|
|
13
|
+
"canonicalPath": ".agents/skills/viable-common/SKILL.md"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: viable-common
|
|
3
|
+
description: How to use @owlmeans/viable-common — the runtime-free contract package of the OwlMeans Viable platform. Covers the slot command vocabulary and target layouts, the target-shape integrity manifest, the connector protocol and its entrypoints, the conversion vocabulary, the analysis/design/metadata shapes a generated project is described by, the schema conventions every model answer and stored record here is written to (nullable with its type, a nullable enum carrying null, no Record maps in a record schema), and the version-skew rule a name on the wire obeys. Auto-invoked when importing a slot command, a connector or conversion type, a target-integrity helper, or any *Schema this package exports.
|
|
4
|
+
user-invocable: false
|
|
5
|
+
---
|
|
6
|
+
<!-- AUTO-GENERATED — do not edit. Regenerate via sync-agent-meta. -->
|
|
7
|
+
|
|
8
|
+
# @owlmeans/viable-common
|
|
9
|
+
|
|
10
|
+
**Layer:** Cross-cutting domain (contracts only)
|
|
11
|
+
**Install:** `"@owlmeans/viable-common": "^0.0.4"` in `dependencies`
|
|
12
|
+
**Subpaths:** `.` · `./slot` · `./connect` · `./convert` · `./integrity`
|
|
13
|
+
**Runtime-free:** no `@langchain/*`, no filesystem, no Ajv at run time (a devDependency, for the
|
|
14
|
+
tests that compile the schemas). It depends on `@owlmeans/entrypoint`, `@owlmeans/route`,
|
|
15
|
+
`@owlmeans/error`, `@owlmeans/agent-common` and `@owlmeans/llm-common` and on nothing else.
|
|
16
|
+
|
|
17
|
+
Every name the OwlMeans Viable platform puts on a wire, on a volume or in a prompt is declared
|
|
18
|
+
here once, and the four runtimes that must agree about it — the manager API, the agent, the
|
|
19
|
+
publisher/production runtime, and the connector SDK on somebody's laptop — all read the same
|
|
20
|
+
declaration. A vocabulary copied instead of imported is how one tree gets two totals, one
|
|
21
|
+
refusal two spellings, and one ceiling two values.
|
|
22
|
+
|
|
23
|
+
## Key Exports
|
|
24
|
+
|
|
25
|
+
| Subpath | What it declares |
|
|
26
|
+
|---|---|
|
|
27
|
+
| `.` (barrel) | `SlotMetadata` and the three metadata vocabularies (`metadataConfigs`, `metadataLists`, `metadataSecrets`); `ProjectArea` / `AREA_PATHS` / `AREA_ACCESS` / `AREA_TIER`; `ModelRole` and the viable `ExecutionState`; `ViableSkill` / `ViablePersona` / `VIABLE_SKILLS`; the BA, dev, UX, design and scaffold shapes and their schemas; `ModerationCategory` / `ModerationSubject` / `decideModeration`; the `docs/` metadata paths; `PreviewEventType` |
|
|
28
|
+
| `./slot` | `SlotCommandType` and the `SlotFileCommand` / `SlotShellCommand` / `SlotGitCommand` sets, `SubProject`, `WorkloadKind`, the target ports and process markers, `slotOrigin` / `targetRedirectUrisForOrigin` |
|
|
29
|
+
| `./connect` | `ConnectTarget`, `ConnectLlm`, `ConnectHarness`, `ConnectExecutor`, `ConnectOpKind`, `ConnectJobKind`/`Status`/`Block`, `ModelTier` + `tierOfRole`/`clampTier`, `ModelTask*`, `InquiryPayload` + `ConnectInquiryKind`, the session/job/status views, the `Connect*` error family, `connectEntrypoints(opts)` and every `*Schema` behind them |
|
|
30
|
+
| `./convert` | `ConversionStage`/`Status`/`Decision` and the `stageAfter`/`decisionFor`/`canEnter` transitions, `OriginKind`/`Shape`/`State`, `StackId` + `STACK_FAMILY`, `ArchitectureCase`, `ConvertibilityVerdict`/`Reason`, the census classifiers (`fileClassOf`, `sizeClassOf`, `entropyClassOf`, `binaryByExtension`), the `docs/conversion/` paths, `CONVERTED_ORIGIN_DIR`, `SOURCE_LIST_EXCLUSIONS`, `CENSUS_SKIP_DIRS`, `RELOCATE_ALWAYS_KEEP`, and the model-answer schemas the conversion asks with |
|
|
31
|
+
| `./integrity` | `TargetLayout` + `TARGET_LAYOUTS`, `detectTargetLayout`, `verifyTargetShape`, `TARGET_INTEGRITY_FILES`, `TARGET_PROTECTED_FILES`, `isLegacyLayout`, `targetPackageName` |
|
|
32
|
+
|
|
33
|
+
## A schema here is written for the reader that will refuse it
|
|
34
|
+
|
|
35
|
+
Two populations live side by side and are written differently on purpose. Getting the population
|
|
36
|
+
wrong is not a style error — each reader refuses a different thing, and one of them refuses at
|
|
37
|
+
boot rather than at the call.
|
|
38
|
+
|
|
39
|
+
**Model-answer schemas** are the shape a model's single JSON object must take. Annotate them
|
|
40
|
+
`JSONSchemaType<T>` — checked, not cast — because the answer is parsed straight back into that
|
|
41
|
+
type, and a schema that drifted fails at run time with a message about a document rather than
|
|
42
|
+
about a field.
|
|
43
|
+
|
|
44
|
+
**Record-element schemas** describe what the platform stores and puts on the wire. They are
|
|
45
|
+
hand-written and cast, because they are re-applied as a Mongo `$jsonSchema`, which is stricter
|
|
46
|
+
than Ajv: no `Record<>` maps (an open key space cannot be validated), no `integer` (a stored
|
|
47
|
+
number is a double), dates as ISO strings rather than objects.
|
|
48
|
+
|
|
49
|
+
Three rules hold for both, and `tests/convert.spec.ts` walks **the package barrel** for each —
|
|
50
|
+
not the conversion barrel, although the file is the conversion's, because none of the three
|
|
51
|
+
faults is particular to a conversion and a walk over one directory lets the same shape through
|
|
52
|
+
in a design, a slot or a connector schema:
|
|
53
|
+
|
|
54
|
+
- **`nullable: true` always carries its `type`.** Ajv refuses `nullable` on its own, and a schema
|
|
55
|
+
that fails to compile takes down whatever compiled it — the route registration, the collection
|
|
56
|
+
validator — instead of the one call that would have carried the value.
|
|
57
|
+
- **A nullable ENUM lists `null` among its values**: `enum: [...Object.values(X), null]`.
|
|
58
|
+
`nullable` and `enum` are separate keywords checked independently, so the pair written apart
|
|
59
|
+
widens the type check to admit `null` and then refuses that very value by enum — the field can
|
|
60
|
+
only ever be OMITTED, never sent empty. Nothing fails at compile time and nothing fails for a
|
|
61
|
+
caller that leaves the key out, which is why it survives review; it surfaces as the one caller
|
|
62
|
+
that spells absence as `null`. Both callers exist here: a provider's structured output writes an
|
|
63
|
+
unset optional as `null` (an intake stack call was retried three times and discarded as
|
|
64
|
+
`llm:retry-exceeded`), and a wire body where `null` MEANS something — `llmMode`, "inherit the
|
|
65
|
+
profile's setting" — has no other spelling at all.
|
|
66
|
+
- **`items` is never an array.** A draft-04 tuple is refused wherever the schema reaches a
|
|
67
|
+
provider or a collection validator.
|
|
68
|
+
|
|
69
|
+
**A field that crosses a version skew carries no `enum`.** Users run
|
|
70
|
+
`npx -y @owlmeans/viable-mcp@next` (the moving prerelease tag) against a separately deployed
|
|
71
|
+
platform, so `ConnectCapabilitiesSchema.executors.items`
|
|
72
|
+
is a bare string: a newer executor kind must stay an unused capability on an older platform, never
|
|
73
|
+
a refused session. Apply the same reasoning to anything else a newer connector may send an older
|
|
74
|
+
platform, and nowhere else — a closed set is worth more than a tolerant one everywhere both ends
|
|
75
|
+
deploy together.
|
|
76
|
+
|
|
77
|
+
## One declaration, elevated on both ends
|
|
78
|
+
|
|
79
|
+
`connectEntrypoints(opts)` is the connector's whole HTTP and socket surface — paths, methods,
|
|
80
|
+
schemas, parents — and the platform spreads it into its own entrypoints while the SDK elevates the
|
|
81
|
+
same list into client entrypoints. That is what makes a path or a schema impossible to get wrong on
|
|
82
|
+
one side only. Only what belongs to the DEPLOYMENT is injected: the guard alias, the ownership
|
|
83
|
+
gate, the paid local-LLM gate (on the two routes that can turn that mode on) and the platform's own
|
|
84
|
+
socket base.
|
|
85
|
+
|
|
86
|
+
Adding a route means adding it here first, then elevating it on both sides. A route declared on one
|
|
87
|
+
side alone is a 404 nobody can explain from the failing end.
|
|
88
|
+
|
|
89
|
+
## Closed sets that mean something
|
|
90
|
+
|
|
91
|
+
- **`ProjectArea`** — guest `/`, user `/frontoffice`, admin `/admin`, operator `/backoffice`. A
|
|
92
|
+
generated product's own roles map onto `user` or `operator`; there is no fifth area. `AREA_PATHS`,
|
|
93
|
+
`AREA_ACCESS` and `AREA_TIER` are total over it.
|
|
94
|
+
- **`TargetLayout` + `TARGET_LAYOUTS`** — the integrity manifest is PER LAYOUT. A volume never
|
|
95
|
+
migrates, so a project created before the restructure stays on the legacy tree forever and must
|
|
96
|
+
verify **clean**; `TARGET_INTEGRITY_FILES` is the union over layouts so a caller has both probes
|
|
97
|
+
before it knows which tree it holds, and an absent layout reads as the CURRENT one.
|
|
98
|
+
- **`SubProject`** — a ROLE vocabulary mapped per layout, never joined onto a path. Both
|
|
99
|
+
generations arrive on the wire at once, so the enum must stay total over what any live agent may
|
|
100
|
+
send, and no role but `Common` may resolve to the `common` directory.
|
|
101
|
+
- **`ConversionStage`** — advanced only through `stageAfter` / `canEnter` / `decisionFor`. A stage
|
|
102
|
+
transition computed at a call site is how a conversion re-enters a stage it already paid for.
|
|
103
|
+
- **`ModerationCategory`** — a wire contract with seven languages of wording behind it. A fifth
|
|
104
|
+
shape is PHRASED into one of the four, never added.
|
|
105
|
+
|
|
106
|
+
## The conversion vocabulary is shared with three executors that walk the same tree
|
|
107
|
+
|
|
108
|
+
The census, listing and relocation commands are one contract with three implementations — the
|
|
109
|
+
SDK's local executor, the publisher's file helper, and the library's in-process helper — so
|
|
110
|
+
anything they could disagree about is a constant HERE rather than a matching local copy:
|
|
111
|
+
`CENSUS_SKIP_DIRS` (`node_modules`, `.git` — and deliberately not `dist`/`build`/`.next`, ordinary
|
|
112
|
+
directory names an origin may keep sources in), `SOURCE_LIST_EXCLUSIONS` (the metadata directories
|
|
113
|
+
plus `CONVERTED_ORIGIN_DIR`), `BINARY_PROBE_BYTES`, `CENSUS_MAX_HEAD_BYTES`, `RELOCATE_ALWAYS_KEEP`.
|
|
114
|
+
The one thing they are allowed to differ about is stated rather than inherited: the platform's two
|
|
115
|
+
keep what a volume it owns must not lose, the SDK's keeps what a DEVELOPER owns (`.viable`, the two
|
|
116
|
+
`.env` files).
|
|
117
|
+
|
|
118
|
+
`docs/conversion/` is likewise addressed only through the exported path builders
|
|
119
|
+
(`CONVERSION_*_FILE`, `conversionStoryDoc`, `conversionSeedDoc`) — a conversion's own artifacts are
|
|
120
|
+
read back by the purge, and a path spelled at a call site is a file the purge leaves behind.
|
|
121
|
+
|
|
122
|
+
## The inquiry vocabulary is a deliberate COPY, and the ceiling is not
|
|
123
|
+
|
|
124
|
+
`ConnectInquiryKind` / `InquiryPayload` / `InquiryAnswerPayload` mirror `@owlmeans/llm-common`'s
|
|
125
|
+
`Inquiry` family, renamed so both vocabularies can be imported into one file and so `manager-api`,
|
|
126
|
+
which does not depend on the model runtime, stays free of it. Values are byte-identical, so the
|
|
127
|
+
platform's mapper is a widening rather than a translation table, and a test pins that — the same
|
|
128
|
+
arrangement `ModelTask` has with `DelegatedTask`.
|
|
129
|
+
|
|
130
|
+
The CEILING is not copied twice over: `CONNECT_INQUIRY_MAX_TEXT` equals
|
|
131
|
+
`DEFAULT_INQUIRY_ANSWER_CHARS` and must stay equal, and `./convert`'s own
|
|
132
|
+
`INQUIRY_STATE_TEXT_CHARS` — what a pipeline STATE may keep of an answer's prose, the rest going to
|
|
133
|
+
`docs/conversion/inquiries.md` — equals its twin of the same name there. Two ceilings for one value means the layer with the larger one
|
|
134
|
+
truncates silently at the smaller, and the caller records an assumption about an answer the person
|
|
135
|
+
actually gave. Never introduce a local cap; import the one that exists.
|
|
136
|
+
|
|
137
|
+
## Errors: declared here, phrased where they are read
|
|
138
|
+
|
|
139
|
+
`ConnectError` and its family (`ConnectSessionNotFound`, `ConnectSessionGone`, `ConnectOpTimeout`,
|
|
140
|
+
`ConnectOpRefused`, `LocalSlotUnsupported`, `ConnectOpUnknown`) are `ResilientError` classes with
|
|
141
|
+
markers under `viable-connect:`. `ConnectSessionGone` is registered FATAL on the agent side: a run
|
|
142
|
+
whose executor has gone away must stop at once rather than spend a retry ladder, and the step fails
|
|
143
|
+
as an OUTCOME so the run row records where it stopped and `pipeline.resume` picks it up when a
|
|
144
|
+
connector returns.
|
|
145
|
+
|
|
146
|
+
The platform's own refusals — conversion, moderation, reserved names, integrity — are declared in
|
|
147
|
+
the product repo, not here, so a consumer that cannot `instanceof` them matches by MARKER instead:
|
|
148
|
+
`@owlmeans/viable-sdk`'s `REFUSALS` map and the manager's `useErrorPhrase` read the same substrings,
|
|
149
|
+
which is what stops one refusal being phrased two ways. When a marker changes, both readers change
|
|
150
|
+
with it.
|
|
151
|
+
|
|
152
|
+
## Tests
|
|
153
|
+
|
|
154
|
+
`bun test ./tests` — offline. `convert.spec.ts` (the three structural walks over the barrel, the
|
|
155
|
+
conversion schemas compiling, a nullable enum accepting `null` under Ajv while still refusing an
|
|
156
|
+
unknown member, the census classifiers and the stage transitions), `connect-convert.spec.ts` (the
|
|
157
|
+
conversion routes at their paths and methods, hanging under the connector base and carrying no paid
|
|
158
|
+
gate; capabilities accepting an executor kind this platform has never heard of; the answer and
|
|
159
|
+
resume bodies), `design.spec.ts` (the design aggregate, staleness ranking, and the design schema
|
|
160
|
+
refusing an undeclared field or an area outside the closed set).
|
|
161
|
+
|
|
162
|
+
## Depends On
|
|
163
|
+
|
|
164
|
+
- `@owlmeans/entrypoint`, `@owlmeans/route` — the entrypoint declarations
|
|
165
|
+
- `@owlmeans/error` — the `Connect*` error family
|
|
166
|
+
- `@owlmeans/llm-common` — `ExecutionEffort`/`ExecutionLevel`, `PromptPolicy`, `LlmPurpose`, and the
|
|
167
|
+
inquiry ceilings this package's copies are pinned to
|
|
168
|
+
- `@owlmeans/agent-common` — the run and pipeline contracts a conversion's runs are declared against
|
|
169
|
+
|
|
170
|
+
## Related
|
|
171
|
+
|
|
172
|
+
- [[viable-sdk]] — the connector SDK written entirely against these contracts
|
|
173
|
+
- [[viable-mcp]] — the npx stdio server built on that SDK
|
|
174
|
+
- [[inquiry]] — the primitive `InquiryPayload` mirrors, and the one answer ceiling
|
|
175
|
+
- [[llm-common]] — the contracts half of the model runtime
|
|
176
|
+
- The DOMAIN rules for what these shapes mean — target areas and navigation, the scaffold, target
|
|
177
|
+
integrity, the metadata files, the converter — live in the downstream repos that implement them
|
|
178
|
+
(`target-areas`, `scaffolding`, `workload-integrity`, `viable-metadata`, `converter`). This skill
|
|
179
|
+
owns the CONTRACT: how a name is declared, and what refuses it.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AACA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAEA,cAAc,sBAAsB,CAAA;AACpC,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The agent-memory contracts, re-exported under viable's own name.
|
|
3
|
+
*
|
|
4
|
+
* The platform reaches `@owlmeans/agent-common` through here rather than importing it directly,
|
|
5
|
+
* for the same reason it reaches the LLM contracts through this package: the platform pins one
|
|
6
|
+
* version of the agent library, and a direct import would bind it to a second copy of the same
|
|
7
|
+
* types. Serializable contracts only — the runtime is `@owlmeans/agent`, re-exported by
|
|
8
|
+
* `@owlmeans/viable`.
|
|
9
|
+
*/
|
|
10
|
+
export { AgentRunStatus, conversationFor, truncateAt } from '@owlmeans/agent-common';
|
|
11
|
+
export type { ConversationRef, ConversationEvent, ConversationEventInput, MemoryNode, MemoryEvent, MemoryEventInput, } from '@owlmeans/agent-common';
|
|
12
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/agent/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEpF,YAAY,EACV,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAC1D,UAAU,EAAE,WAAW,EAAE,gBAAgB,GAC1C,MAAM,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The agent-memory contracts, re-exported under viable's own name.
|
|
3
|
+
*
|
|
4
|
+
* The platform reaches `@owlmeans/agent-common` through here rather than importing it directly,
|
|
5
|
+
* for the same reason it reaches the LLM contracts through this package: the platform pins one
|
|
6
|
+
* version of the agent library, and a direct import would bind it to a second copy of the same
|
|
7
|
+
* types. Serializable contracts only — the runtime is `@owlmeans/agent`, re-exported by
|
|
8
|
+
* `@owlmeans/viable`.
|
|
9
|
+
*/
|
|
10
|
+
export { AgentRunStatus, conversationFor, truncateAt } from '@owlmeans/agent-common';
|
|
11
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/agent/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Viable's concrete instance of the open `kind` field on a spectator entry. */
|
|
2
|
+
export declare enum SpectatorEntryKind {
|
|
3
|
+
Coder = "coder",
|
|
4
|
+
Fixer = "fixer",
|
|
5
|
+
General = "general"
|
|
6
|
+
}
|
|
7
|
+
/** Owned by `@owlmeans/llm-common` — re-exported so consumers need one import only. */
|
|
8
|
+
export { SpectatorContentType } from '@owlmeans/llm-common';
|
|
9
|
+
//# sourceMappingURL=consts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../../../src/agent/spectator/consts.ts"],"names":[],"mappings":"AACA,gFAAgF;AAChF,oBAAY,kBAAkB;IAC5B,KAAK,UAAU;IACf,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED,uFAAuF;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Viable's concrete instance of the open `kind` field on a spectator entry. */
|
|
2
|
+
export var SpectatorEntryKind;
|
|
3
|
+
(function (SpectatorEntryKind) {
|
|
4
|
+
SpectatorEntryKind["Coder"] = "coder";
|
|
5
|
+
SpectatorEntryKind["Fixer"] = "fixer";
|
|
6
|
+
SpectatorEntryKind["General"] = "general";
|
|
7
|
+
})(SpectatorEntryKind || (SpectatorEntryKind = {}));
|
|
8
|
+
/** Owned by `@owlmeans/llm-common` — re-exported so consumers need one import only. */
|
|
9
|
+
export { SpectatorContentType } from '@owlmeans/llm-common';
|
|
10
|
+
//# sourceMappingURL=consts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../../../src/agent/spectator/consts.ts"],"names":[],"mappings":"AACA,gFAAgF;AAChF,MAAM,CAAN,IAAY,kBAIX;AAJD,WAAY,kBAAkB;IAC5B,qCAAe,CAAA;IACf,qCAAe,CAAA;IACf,yCAAmB,CAAA;AACrB,CAAC,EAJW,kBAAkB,KAAlB,kBAAkB,QAI7B;AAED,uFAAuF;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/spectator/index.ts"],"names":[],"mappings":"AACA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/spectator/index.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SpectatorEntry as LlmSpectatorEntry } from '@owlmeans/llm-common';
|
|
2
|
+
import type { SpectatorEntryKind } from './consts.js';
|
|
3
|
+
import type { PurposeMetadata } from '../types.js';
|
|
4
|
+
/**
|
|
5
|
+
* The spectator record contracts are owned by `@owlmeans/llm-common`; viable narrows
|
|
6
|
+
* `kind` and `purpose` to its own enums on {@link SpectatorEntry}.
|
|
7
|
+
*/
|
|
8
|
+
export type { SpectatorArgument, SpectatorEntryMessage } from '@owlmeans/llm-common';
|
|
9
|
+
export interface SpectatorEntry extends LlmSpectatorEntry {
|
|
10
|
+
kind: SpectatorEntryKind;
|
|
11
|
+
purpose: PurposeMetadata;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/agent/spectator/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD;;;GAGG;AACH,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAEpF,MAAM,WAAW,cAAe,SAAQ,iBAAiB;IACvD,IAAI,EAAE,kBAAkB,CAAA;IACxB,OAAO,EAAE,eAAe,CAAA;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/agent/spectator/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LlmPurpose } from '@owlmeans/llm-common';
|
|
2
|
+
/**
|
|
3
|
+
* Observability metadata attached to every model call. Extends the generic
|
|
4
|
+
* `@owlmeans/llm-common` purpose (`type`, `dedication`) with viable's attribution fields.
|
|
5
|
+
*/
|
|
6
|
+
export interface PurposeMetadata extends LlmPurpose {
|
|
7
|
+
viableAgent?: string;
|
|
8
|
+
viableHelper?: string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEtD;;;GAGG;AACH,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { AccessLevel } from '../dev/consts.js';
|
|
2
|
+
/**
|
|
3
|
+
* The audiences a generated application serves.
|
|
4
|
+
*
|
|
5
|
+
* Every application has these four and only these four. A product's own roles are not new
|
|
6
|
+
* areas — they fall into one of these: anyone acting on the product's business process from
|
|
7
|
+
* the inside is an OPERATOR, anyone consuming the product's value as an end user is a USER.
|
|
8
|
+
* The set is closed so that navigation, access and preview all key off the same vocabulary;
|
|
9
|
+
* an application that needs a fifth audience needs a permission, not an area.
|
|
10
|
+
*/
|
|
11
|
+
export declare enum ProjectArea {
|
|
12
|
+
/** Unauthenticated. The public face of the application. */
|
|
13
|
+
Guest = "guest",
|
|
14
|
+
/** Signed-in end users — the front office. */
|
|
15
|
+
User = "user",
|
|
16
|
+
/** The owner. Holds {@link ADMIN_PERMISSION} and passes every gate. */
|
|
17
|
+
Admin = "admin",
|
|
18
|
+
/** Staff running the business process — the back office. */
|
|
19
|
+
Operator = "operator"
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Where each area lives in the URL. One frontend, four prefixes — never four applications.
|
|
23
|
+
*
|
|
24
|
+
* The guest area owns `/` because it is the only area an anonymous visitor can reach, so it
|
|
25
|
+
* has to be what a bare hostname serves.
|
|
26
|
+
*/
|
|
27
|
+
export declare const AREA_PATHS: Record<ProjectArea, string>;
|
|
28
|
+
/** Areas in menu/footer order — guest first, then the authenticated ones. */
|
|
29
|
+
export declare const PROJECT_AREAS: ProjectArea[];
|
|
30
|
+
/**
|
|
31
|
+
* The prefix of an AREA entrypoint — the parent every screen of that area hangs under.
|
|
32
|
+
*
|
|
33
|
+
* An area is addressed like a screen and rendered by the same router, so it has to be
|
|
34
|
+
* excluded explicitly wherever "the entrypoint of this screen" is being resolved — exactly
|
|
35
|
+
* as {@link ALIAS_PREFIX_WEB_LAYOUT} was.
|
|
36
|
+
*/
|
|
37
|
+
export declare const ALIAS_PREFIX_WEB_AREA = "web:area:";
|
|
38
|
+
/**
|
|
39
|
+
* The owner's marker permission.
|
|
40
|
+
*
|
|
41
|
+
* It is a MARKER, not a scope: holding it means passing every gate, because the owner of a
|
|
42
|
+
* project is not a role inside it. A "limited admin" is therefore not this — it is an
|
|
43
|
+
* ordinary user holding some of the project's own permissions.
|
|
44
|
+
*
|
|
45
|
+
* Spelled as `<resource>--<action>` like every generated permission, on a resource name no
|
|
46
|
+
* domain entity can take.
|
|
47
|
+
*/
|
|
48
|
+
export declare const ADMIN_PERMISSION = "project--admin";
|
|
49
|
+
/**
|
|
50
|
+
* The back office's marker permission.
|
|
51
|
+
*
|
|
52
|
+
* The operator area is where an organization's own staff work, and until this existed it was
|
|
53
|
+
* declared `guard(DEFAULT_GUARD)` alone — any signed-in person, which for a generated application
|
|
54
|
+
* means any visitor who typed an email address. The per-screen gates story development adds narrow
|
|
55
|
+
* particular screens; they cannot narrow the area, and a project with nothing developed yet has
|
|
56
|
+
* none of them at all, so the whole back office stood open by construction.
|
|
57
|
+
*
|
|
58
|
+
* It is a MARKER like {@link ADMIN_PERMISSION}, but it is NOT a bypass: it says a person belongs in
|
|
59
|
+
* the back office, and each screen's own permission still decides what they may do there. That AND
|
|
60
|
+
* is expressed by the area declaring the marker and the screen declaring its own — never by adding
|
|
61
|
+
* the marker to a screen's gate, where the OR between gate params would make it sufficient on its
|
|
62
|
+
* own and the screen's permission would stop meaning anything.
|
|
63
|
+
*
|
|
64
|
+
* Granted by the platform to the owning organization's people, exactly as the owner marker is, and
|
|
65
|
+
* to nobody else by default: a customer of the generated app is not staff.
|
|
66
|
+
*/
|
|
67
|
+
export declare const OPERATOR_PERMISSION = "project--operator";
|
|
68
|
+
/**
|
|
69
|
+
* The access an area implies for the screens under it.
|
|
70
|
+
*
|
|
71
|
+
* Screens INHERIT this from the area declaration and never restate it. Only the operator
|
|
72
|
+
* area needs anything per screen — its gate names which permission that particular screen
|
|
73
|
+
* demands, which is the one thing an area cannot know.
|
|
74
|
+
*/
|
|
75
|
+
export declare const AREA_ACCESS: Record<ProjectArea, AccessLevel>;
|
|
76
|
+
/**
|
|
77
|
+
* The grouping tag a story's area gives the permissions it declares.
|
|
78
|
+
*
|
|
79
|
+
* A TAG on the permission definition, never a segment of the permission's name. The gate treats a
|
|
80
|
+
* name as one opaque string, so putting a tier inside it would buy nothing at request time while
|
|
81
|
+
* making every existing permission a different permission — orphaning every grant already made
|
|
82
|
+
* against it, with no way to migrate the grant across.
|
|
83
|
+
*
|
|
84
|
+
* Two areas declare nothing. Guest is public and needs no permission. Admin's whole rule is
|
|
85
|
+
* {@link ADMIN_PERMISSION}, which the platform grants and no story ever registers.
|
|
86
|
+
*/
|
|
87
|
+
export declare const AREA_TIER: Record<ProjectArea, string | null>;
|
|
88
|
+
//# sourceMappingURL=consts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../../src/areas/consts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;;;;;;GAQG;AACH,oBAAY,WAAW;IACrB,2DAA2D;IAC3D,KAAK,UAAU;IACf,8CAA8C;IAC9C,IAAI,SAAS;IACb,uEAAuE;IACvE,KAAK,UAAU;IACf,4DAA4D;IAC5D,QAAQ,aAAa;CACtB;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAKlD,CAAA;AAED,6EAA6E;AAC7E,eAAO,MAAM,aAAa,EAAE,WAAW,EAEtC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,cAAc,CAAA;AAEhD;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,mBAAmB,CAAA;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,mBAAmB,sBAAsB,CAAA;AAEtD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,CAKxD,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAKxD,CAAA"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { AccessLevel } from '../dev/consts.js';
|
|
2
|
+
/**
|
|
3
|
+
* The audiences a generated application serves.
|
|
4
|
+
*
|
|
5
|
+
* Every application has these four and only these four. A product's own roles are not new
|
|
6
|
+
* areas — they fall into one of these: anyone acting on the product's business process from
|
|
7
|
+
* the inside is an OPERATOR, anyone consuming the product's value as an end user is a USER.
|
|
8
|
+
* The set is closed so that navigation, access and preview all key off the same vocabulary;
|
|
9
|
+
* an application that needs a fifth audience needs a permission, not an area.
|
|
10
|
+
*/
|
|
11
|
+
export var ProjectArea;
|
|
12
|
+
(function (ProjectArea) {
|
|
13
|
+
/** Unauthenticated. The public face of the application. */
|
|
14
|
+
ProjectArea["Guest"] = "guest";
|
|
15
|
+
/** Signed-in end users — the front office. */
|
|
16
|
+
ProjectArea["User"] = "user";
|
|
17
|
+
/** The owner. Holds {@link ADMIN_PERMISSION} and passes every gate. */
|
|
18
|
+
ProjectArea["Admin"] = "admin";
|
|
19
|
+
/** Staff running the business process — the back office. */
|
|
20
|
+
ProjectArea["Operator"] = "operator";
|
|
21
|
+
})(ProjectArea || (ProjectArea = {}));
|
|
22
|
+
/**
|
|
23
|
+
* Where each area lives in the URL. One frontend, four prefixes — never four applications.
|
|
24
|
+
*
|
|
25
|
+
* The guest area owns `/` because it is the only area an anonymous visitor can reach, so it
|
|
26
|
+
* has to be what a bare hostname serves.
|
|
27
|
+
*/
|
|
28
|
+
export const AREA_PATHS = {
|
|
29
|
+
[ProjectArea.Guest]: '/',
|
|
30
|
+
[ProjectArea.User]: '/frontoffice',
|
|
31
|
+
[ProjectArea.Admin]: '/admin',
|
|
32
|
+
[ProjectArea.Operator]: '/backoffice',
|
|
33
|
+
};
|
|
34
|
+
/** Areas in menu/footer order — guest first, then the authenticated ones. */
|
|
35
|
+
export const PROJECT_AREAS = [
|
|
36
|
+
ProjectArea.Guest, ProjectArea.User, ProjectArea.Admin, ProjectArea.Operator
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* The prefix of an AREA entrypoint — the parent every screen of that area hangs under.
|
|
40
|
+
*
|
|
41
|
+
* An area is addressed like a screen and rendered by the same router, so it has to be
|
|
42
|
+
* excluded explicitly wherever "the entrypoint of this screen" is being resolved — exactly
|
|
43
|
+
* as {@link ALIAS_PREFIX_WEB_LAYOUT} was.
|
|
44
|
+
*/
|
|
45
|
+
export const ALIAS_PREFIX_WEB_AREA = 'web:area:';
|
|
46
|
+
/**
|
|
47
|
+
* The owner's marker permission.
|
|
48
|
+
*
|
|
49
|
+
* It is a MARKER, not a scope: holding it means passing every gate, because the owner of a
|
|
50
|
+
* project is not a role inside it. A "limited admin" is therefore not this — it is an
|
|
51
|
+
* ordinary user holding some of the project's own permissions.
|
|
52
|
+
*
|
|
53
|
+
* Spelled as `<resource>--<action>` like every generated permission, on a resource name no
|
|
54
|
+
* domain entity can take.
|
|
55
|
+
*/
|
|
56
|
+
export const ADMIN_PERMISSION = 'project--admin';
|
|
57
|
+
/**
|
|
58
|
+
* The back office's marker permission.
|
|
59
|
+
*
|
|
60
|
+
* The operator area is where an organization's own staff work, and until this existed it was
|
|
61
|
+
* declared `guard(DEFAULT_GUARD)` alone — any signed-in person, which for a generated application
|
|
62
|
+
* means any visitor who typed an email address. The per-screen gates story development adds narrow
|
|
63
|
+
* particular screens; they cannot narrow the area, and a project with nothing developed yet has
|
|
64
|
+
* none of them at all, so the whole back office stood open by construction.
|
|
65
|
+
*
|
|
66
|
+
* It is a MARKER like {@link ADMIN_PERMISSION}, but it is NOT a bypass: it says a person belongs in
|
|
67
|
+
* the back office, and each screen's own permission still decides what they may do there. That AND
|
|
68
|
+
* is expressed by the area declaring the marker and the screen declaring its own — never by adding
|
|
69
|
+
* the marker to a screen's gate, where the OR between gate params would make it sufficient on its
|
|
70
|
+
* own and the screen's permission would stop meaning anything.
|
|
71
|
+
*
|
|
72
|
+
* Granted by the platform to the owning organization's people, exactly as the owner marker is, and
|
|
73
|
+
* to nobody else by default: a customer of the generated app is not staff.
|
|
74
|
+
*/
|
|
75
|
+
export const OPERATOR_PERMISSION = 'project--operator';
|
|
76
|
+
/**
|
|
77
|
+
* The access an area implies for the screens under it.
|
|
78
|
+
*
|
|
79
|
+
* Screens INHERIT this from the area declaration and never restate it. Only the operator
|
|
80
|
+
* area needs anything per screen — its gate names which permission that particular screen
|
|
81
|
+
* demands, which is the one thing an area cannot know.
|
|
82
|
+
*/
|
|
83
|
+
export const AREA_ACCESS = {
|
|
84
|
+
[ProjectArea.Guest]: AccessLevel.Guest,
|
|
85
|
+
[ProjectArea.User]: AccessLevel.User,
|
|
86
|
+
[ProjectArea.Admin]: AccessLevel.Admin,
|
|
87
|
+
[ProjectArea.Operator]: AccessLevel.Permissioned,
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* The grouping tag a story's area gives the permissions it declares.
|
|
91
|
+
*
|
|
92
|
+
* A TAG on the permission definition, never a segment of the permission's name. The gate treats a
|
|
93
|
+
* name as one opaque string, so putting a tier inside it would buy nothing at request time while
|
|
94
|
+
* making every existing permission a different permission — orphaning every grant already made
|
|
95
|
+
* against it, with no way to migrate the grant across.
|
|
96
|
+
*
|
|
97
|
+
* Two areas declare nothing. Guest is public and needs no permission. Admin's whole rule is
|
|
98
|
+
* {@link ADMIN_PERMISSION}, which the platform grants and no story ever registers.
|
|
99
|
+
*/
|
|
100
|
+
export const AREA_TIER = {
|
|
101
|
+
[ProjectArea.Guest]: null,
|
|
102
|
+
[ProjectArea.User]: ProjectArea.User,
|
|
103
|
+
[ProjectArea.Admin]: null,
|
|
104
|
+
[ProjectArea.Operator]: ProjectArea.Operator,
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=consts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../../src/areas/consts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;;;;;;GAQG;AACH,MAAM,CAAN,IAAY,WASX;AATD,WAAY,WAAW;IACrB,2DAA2D;IAC3D,8BAAe,CAAA;IACf,8CAA8C;IAC9C,4BAAa,CAAA;IACb,uEAAuE;IACvE,8BAAe,CAAA;IACf,4DAA4D;IAC5D,oCAAqB,CAAA;AACvB,CAAC,EATW,WAAW,KAAX,WAAW,QAStB;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAgC;IACrD,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,GAAG;IACxB,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,cAAc;IAClC,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,QAAQ;IAC7B,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,aAAa;CACtC,CAAA;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ;CAC7E,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,WAAW,CAAA;AAEhD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAA;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAA;AAEtD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAqC;IAC3D,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,KAAK;IACtC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,IAAI;IACpC,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,KAAK;IACtC,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,YAAY;CACjD,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,SAAS,GAAuC;IAC3D,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI;IACzB,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,IAAI;IACpC,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI;IACzB,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,QAAQ;CAC7C,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/areas/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAA;AAE/B,cAAc,aAAa,CAAA"}
|