@neurcode-ai/cli 0.9.64 → 0.9.66
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/LICENSE +201 -0
- package/dist/commands/bootstrap-policy.d.ts +29 -0
- package/dist/commands/bootstrap-policy.d.ts.map +1 -0
- package/dist/commands/bootstrap-policy.js +334 -0
- package/dist/commands/bootstrap-policy.js.map +1 -0
- package/dist/commands/brain.d.ts.map +1 -1
- package/dist/commands/brain.js +273 -0
- package/dist/commands/brain.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +82 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/pilot-report.d.ts +9 -0
- package/dist/commands/pilot-report.d.ts.map +1 -0
- package/dist/commands/pilot-report.js +176 -0
- package/dist/commands/pilot-report.js.map +1 -0
- package/dist/commands/quickstart.d.ts +21 -0
- package/dist/commands/quickstart.d.ts.map +1 -0
- package/dist/commands/quickstart.js +178 -0
- package/dist/commands/quickstart.js.map +1 -0
- package/dist/commands/remediate-export.d.ts +31 -0
- package/dist/commands/remediate-export.d.ts.map +1 -0
- package/dist/commands/remediate-export.js +283 -0
- package/dist/commands/remediate-export.js.map +1 -0
- package/dist/commands/remediate-governance.d.ts +54 -0
- package/dist/commands/remediate-governance.d.ts.map +1 -0
- package/dist/commands/remediate-governance.js +375 -0
- package/dist/commands/remediate-governance.js.map +1 -0
- package/dist/commands/remediate.d.ts.map +1 -1
- package/dist/commands/remediate.js.map +1 -1
- package/dist/commands/replay.d.ts.map +1 -1
- package/dist/commands/replay.js +30 -0
- package/dist/commands/replay.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +409 -30
- package/dist/commands/verify.js.map +1 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +1078 -0
- package/dist/daemon/server.js.map +1 -1
- package/dist/explainability/DeterminismClassifier.d.ts +34 -0
- package/dist/explainability/DeterminismClassifier.d.ts.map +1 -0
- package/dist/explainability/DeterminismClassifier.js +104 -0
- package/dist/explainability/DeterminismClassifier.js.map +1 -0
- package/dist/explainability/ViolationFormatter.d.ts +32 -0
- package/dist/explainability/ViolationFormatter.d.ts.map +1 -0
- package/dist/explainability/ViolationFormatter.js +252 -0
- package/dist/explainability/ViolationFormatter.js.map +1 -0
- package/dist/explainability/index.d.ts +15 -0
- package/dist/explainability/index.d.ts.map +1 -0
- package/dist/explainability/index.js +94 -0
- package/dist/explainability/index.js.map +1 -0
- package/dist/explainability/types.d.ts +37 -0
- package/dist/explainability/types.d.ts.map +1 -0
- package/dist/explainability/types.js +3 -0
- package/dist/explainability/types.js.map +1 -0
- package/dist/governance/canonical-invariants.d.ts +88 -0
- package/dist/governance/canonical-invariants.d.ts.map +1 -0
- package/dist/governance/canonical-invariants.js +197 -0
- package/dist/governance/canonical-invariants.js.map +1 -0
- package/dist/governance/canonical-ordering.d.ts +76 -0
- package/dist/governance/canonical-ordering.d.ts.map +1 -0
- package/dist/governance/canonical-ordering.js +189 -0
- package/dist/governance/canonical-ordering.js.map +1 -0
- package/dist/governance/canonical-pipeline.d.ts +45 -0
- package/dist/governance/canonical-pipeline.d.ts.map +1 -0
- package/dist/governance/canonical-pipeline.js +616 -0
- package/dist/governance/canonical-pipeline.js.map +1 -0
- package/dist/governance/diff-line-provenance.d.ts +59 -0
- package/dist/governance/diff-line-provenance.d.ts.map +1 -0
- package/dist/governance/diff-line-provenance.js +118 -0
- package/dist/governance/diff-line-provenance.js.map +1 -0
- package/dist/governance/pilot-readiness.d.ts +34 -0
- package/dist/governance/pilot-readiness.d.ts.map +1 -0
- package/dist/governance/pilot-readiness.js +226 -0
- package/dist/governance/pilot-readiness.js.map +1 -0
- package/dist/governance/policy-parity-validator.d.ts +62 -0
- package/dist/governance/policy-parity-validator.d.ts.map +1 -0
- package/dist/governance/policy-parity-validator.js +137 -0
- package/dist/governance/policy-parity-validator.js.map +1 -0
- package/dist/governance/remediation-boundary.d.ts +55 -0
- package/dist/governance/remediation-boundary.d.ts.map +1 -0
- package/dist/governance/remediation-boundary.js +120 -0
- package/dist/governance/remediation-boundary.js.map +1 -0
- package/dist/governance/structural-cache.d.ts +103 -0
- package/dist/governance/structural-cache.d.ts.map +1 -0
- package/dist/governance/structural-cache.js +240 -0
- package/dist/governance/structural-cache.js.map +1 -0
- package/dist/governance/structural-on-diff.d.ts +33 -0
- package/dist/governance/structural-on-diff.d.ts.map +1 -0
- package/dist/governance/structural-on-diff.js +67 -0
- package/dist/governance/structural-on-diff.js.map +1 -0
- package/dist/governance/structural-policy-merge.d.ts +22 -0
- package/dist/governance/structural-policy-merge.d.ts.map +1 -0
- package/dist/governance/structural-policy-merge.js +32 -0
- package/dist/governance/structural-policy-merge.js.map +1 -0
- package/dist/governance/verify-runtime-guard.d.ts +99 -0
- package/dist/governance/verify-runtime-guard.d.ts.map +1 -0
- package/dist/governance/verify-runtime-guard.js +129 -0
- package/dist/governance/verify-runtime-guard.js.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/review-compression/index.d.ts +50 -0
- package/dist/integrations/review-compression/index.d.ts.map +1 -0
- package/dist/integrations/review-compression/index.js +158 -0
- package/dist/integrations/review-compression/index.js.map +1 -0
- package/dist/intent-engine/domain-taxonomy.d.ts +42 -0
- package/dist/intent-engine/domain-taxonomy.d.ts.map +1 -0
- package/dist/intent-engine/domain-taxonomy.js +534 -0
- package/dist/intent-engine/domain-taxonomy.js.map +1 -0
- package/dist/intent-engine/index.d.ts +1 -0
- package/dist/intent-engine/index.d.ts.map +1 -1
- package/dist/intent-engine/index.js +6 -1
- package/dist/intent-engine/index.js.map +1 -1
- package/dist/intent-engine/parser.d.ts.map +1 -1
- package/dist/intent-engine/parser.js +47 -0
- package/dist/intent-engine/parser.js.map +1 -1
- package/dist/intent-engine/repo-classifier.d.ts +64 -0
- package/dist/intent-engine/repo-classifier.d.ts.map +1 -0
- package/dist/intent-engine/repo-classifier.js +178 -0
- package/dist/intent-engine/repo-classifier.js.map +1 -0
- package/dist/intent-engine/semantic-expander.d.ts +104 -0
- package/dist/intent-engine/semantic-expander.d.ts.map +1 -0
- package/dist/intent-engine/semantic-expander.js +480 -0
- package/dist/intent-engine/semantic-expander.js.map +1 -0
- package/dist/patch-engine/patterns.d.ts.map +1 -1
- package/dist/patch-engine/patterns.js +8 -4
- package/dist/patch-engine/patterns.js.map +1 -1
- package/dist/semantic/index.d.ts +14 -0
- package/dist/semantic/index.d.ts.map +1 -0
- package/dist/semantic/index.js +30 -0
- package/dist/semantic/index.js.map +1 -0
- package/dist/semantic/tfidf-engine.d.ts +81 -0
- package/dist/semantic/tfidf-engine.d.ts.map +1 -0
- package/dist/semantic/tfidf-engine.js +278 -0
- package/dist/semantic/tfidf-engine.js.map +1 -0
- package/dist/semantic/vector-store.d.ts +108 -0
- package/dist/semantic/vector-store.d.ts.map +1 -0
- package/dist/semantic/vector-store.js +321 -0
- package/dist/semantic/vector-store.js.map +1 -0
- package/dist/structural-rules/context-severity.d.ts +46 -0
- package/dist/structural-rules/context-severity.d.ts.map +1 -0
- package/dist/structural-rules/context-severity.js +115 -0
- package/dist/structural-rules/context-severity.js.map +1 -0
- package/dist/structural-rules/distributed/DS001-saga-rollback-absence.d.ts +11 -0
- package/dist/structural-rules/distributed/DS001-saga-rollback-absence.d.ts.map +1 -0
- package/dist/structural-rules/distributed/DS001-saga-rollback-absence.js +212 -0
- package/dist/structural-rules/distributed/DS001-saga-rollback-absence.js.map +1 -0
- package/dist/structural-rules/distributed/DS002-missing-correlation-id.d.ts +11 -0
- package/dist/structural-rules/distributed/DS002-missing-correlation-id.d.ts.map +1 -0
- package/dist/structural-rules/distributed/DS002-missing-correlation-id.js +213 -0
- package/dist/structural-rules/distributed/DS002-missing-correlation-id.js.map +1 -0
- package/dist/structural-rules/distributed/index.d.ts +3 -0
- package/dist/structural-rules/distributed/index.d.ts.map +1 -0
- package/dist/structural-rules/distributed/index.js +8 -0
- package/dist/structural-rules/distributed/index.js.map +1 -0
- package/dist/structural-rules/engine.d.ts +25 -0
- package/dist/structural-rules/engine.d.ts.map +1 -0
- package/dist/structural-rules/engine.js +90 -0
- package/dist/structural-rules/engine.js.map +1 -0
- package/dist/structural-rules/index.d.ts +45 -0
- package/dist/structural-rules/index.d.ts.map +1 -0
- package/dist/structural-rules/index.js +158 -0
- package/dist/structural-rules/index.js.map +1 -0
- package/dist/structural-rules/python/PY001-asyncio-task-without-cancel.d.ts +11 -0
- package/dist/structural-rules/python/PY001-asyncio-task-without-cancel.d.ts.map +1 -0
- package/dist/structural-rules/python/PY001-asyncio-task-without-cancel.js +66 -0
- package/dist/structural-rules/python/PY001-asyncio-task-without-cancel.js.map +1 -0
- package/dist/structural-rules/python/PY002-unbounded-dict-singleton.d.ts +11 -0
- package/dist/structural-rules/python/PY002-unbounded-dict-singleton.d.ts.map +1 -0
- package/dist/structural-rules/python/PY002-unbounded-dict-singleton.js +135 -0
- package/dist/structural-rules/python/PY002-unbounded-dict-singleton.js.map +1 -0
- package/dist/structural-rules/python/PY003-broad-except-clause.d.ts +32 -0
- package/dist/structural-rules/python/PY003-broad-except-clause.d.ts.map +1 -0
- package/dist/structural-rules/python/PY003-broad-except-clause.js +277 -0
- package/dist/structural-rules/python/PY003-broad-except-clause.js.map +1 -0
- package/dist/structural-rules/python/PY004-swallowed-async-exception.d.ts +11 -0
- package/dist/structural-rules/python/PY004-swallowed-async-exception.d.ts.map +1 -0
- package/dist/structural-rules/python/PY004-swallowed-async-exception.js +167 -0
- package/dist/structural-rules/python/PY004-swallowed-async-exception.js.map +1 -0
- package/dist/structural-rules/python/PY005-fastapi-without-pydantic.d.ts +11 -0
- package/dist/structural-rules/python/PY005-fastapi-without-pydantic.d.ts.map +1 -0
- package/dist/structural-rules/python/PY005-fastapi-without-pydantic.js +154 -0
- package/dist/structural-rules/python/PY005-fastapi-without-pydantic.js.map +1 -0
- package/dist/structural-rules/python/PY006-blocking-io-in-async.d.ts +11 -0
- package/dist/structural-rules/python/PY006-blocking-io-in-async.d.ts.map +1 -0
- package/dist/structural-rules/python/PY006-blocking-io-in-async.js +130 -0
- package/dist/structural-rules/python/PY006-blocking-io-in-async.js.map +1 -0
- package/dist/structural-rules/python/PY007-sqlalchemy-session-leak.d.ts +11 -0
- package/dist/structural-rules/python/PY007-sqlalchemy-session-leak.d.ts.map +1 -0
- package/dist/structural-rules/python/PY007-sqlalchemy-session-leak.js +93 -0
- package/dist/structural-rules/python/PY007-sqlalchemy-session-leak.js.map +1 -0
- package/dist/structural-rules/python/PY008-celery-task-without-retry.d.ts +11 -0
- package/dist/structural-rules/python/PY008-celery-task-without-retry.d.ts.map +1 -0
- package/dist/structural-rules/python/PY008-celery-task-without-retry.js +154 -0
- package/dist/structural-rules/python/PY008-celery-task-without-retry.js.map +1 -0
- package/dist/structural-rules/python/PY009-unsafe-pickle-deserialization.d.ts +11 -0
- package/dist/structural-rules/python/PY009-unsafe-pickle-deserialization.d.ts.map +1 -0
- package/dist/structural-rules/python/PY009-unsafe-pickle-deserialization.js +133 -0
- package/dist/structural-rules/python/PY009-unsafe-pickle-deserialization.js.map +1 -0
- package/dist/structural-rules/python/PY010-leaked-aiohttp-session.d.ts +11 -0
- package/dist/structural-rules/python/PY010-leaked-aiohttp-session.d.ts.map +1 -0
- package/dist/structural-rules/python/PY010-leaked-aiohttp-session.js +80 -0
- package/dist/structural-rules/python/PY010-leaked-aiohttp-session.js.map +1 -0
- package/dist/structural-rules/python/PY011-thread-lifecycle.d.ts +11 -0
- package/dist/structural-rules/python/PY011-thread-lifecycle.d.ts.map +1 -0
- package/dist/structural-rules/python/PY011-thread-lifecycle.js +97 -0
- package/dist/structural-rules/python/PY011-thread-lifecycle.js.map +1 -0
- package/dist/structural-rules/python/PY012-asyncio-run-misuse.d.ts +11 -0
- package/dist/structural-rules/python/PY012-asyncio-run-misuse.d.ts.map +1 -0
- package/dist/structural-rules/python/PY012-asyncio-run-misuse.js +83 -0
- package/dist/structural-rules/python/PY012-asyncio-run-misuse.js.map +1 -0
- package/dist/structural-rules/python/PY013-mutable-default-arg.d.ts +11 -0
- package/dist/structural-rules/python/PY013-mutable-default-arg.d.ts.map +1 -0
- package/dist/structural-rules/python/PY013-mutable-default-arg.js +73 -0
- package/dist/structural-rules/python/PY013-mutable-default-arg.js.map +1 -0
- package/dist/structural-rules/python/PY014-fixed-sleep-retry.d.ts +11 -0
- package/dist/structural-rules/python/PY014-fixed-sleep-retry.d.ts.map +1 -0
- package/dist/structural-rules/python/PY014-fixed-sleep-retry.js +115 -0
- package/dist/structural-rules/python/PY014-fixed-sleep-retry.js.map +1 -0
- package/dist/structural-rules/rules/SR001-swallowed-async-rejection.d.ts +11 -0
- package/dist/structural-rules/rules/SR001-swallowed-async-rejection.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR001-swallowed-async-rejection.js +145 -0
- package/dist/structural-rules/rules/SR001-swallowed-async-rejection.js.map +1 -0
- package/dist/structural-rules/rules/SR002-unbounded-collection.d.ts +11 -0
- package/dist/structural-rules/rules/SR002-unbounded-collection.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR002-unbounded-collection.js +196 -0
- package/dist/structural-rules/rules/SR002-unbounded-collection.js.map +1 -0
- package/dist/structural-rules/rules/SR003-timer-without-cleanup.d.ts +11 -0
- package/dist/structural-rules/rules/SR003-timer-without-cleanup.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR003-timer-without-cleanup.js +148 -0
- package/dist/structural-rules/rules/SR003-timer-without-cleanup.js.map +1 -0
- package/dist/structural-rules/rules/SR004-request-boundary-no-validation.d.ts +11 -0
- package/dist/structural-rules/rules/SR004-request-boundary-no-validation.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR004-request-boundary-no-validation.js +162 -0
- package/dist/structural-rules/rules/SR004-request-boundary-no-validation.js.map +1 -0
- package/dist/structural-rules/rules/SR005-halfopen-probe-gate.d.ts +11 -0
- package/dist/structural-rules/rules/SR005-halfopen-probe-gate.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR005-halfopen-probe-gate.js +150 -0
- package/dist/structural-rules/rules/SR005-halfopen-probe-gate.js.map +1 -0
- package/dist/structural-rules/rules/SR006-fanout-error-sanitization.d.ts +11 -0
- package/dist/structural-rules/rules/SR006-fanout-error-sanitization.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR006-fanout-error-sanitization.js +161 -0
- package/dist/structural-rules/rules/SR006-fanout-error-sanitization.js.map +1 -0
- package/dist/structural-rules/rules/SR007-cross-request-error.d.ts +11 -0
- package/dist/structural-rules/rules/SR007-cross-request-error.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR007-cross-request-error.js +175 -0
- package/dist/structural-rules/rules/SR007-cross-request-error.js.map +1 -0
- package/dist/structural-rules/rules/SR008-background-task-orphan.d.ts +11 -0
- package/dist/structural-rules/rules/SR008-background-task-orphan.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR008-background-task-orphan.js +176 -0
- package/dist/structural-rules/rules/SR008-background-task-orphan.js.map +1 -0
- package/dist/structural-rules/rules/SR009-missing-retry-backoff.d.ts +11 -0
- package/dist/structural-rules/rules/SR009-missing-retry-backoff.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR009-missing-retry-backoff.js +168 -0
- package/dist/structural-rules/rules/SR009-missing-retry-backoff.js.map +1 -0
- package/dist/structural-rules/rules/SR010-retry-storm.d.ts +11 -0
- package/dist/structural-rules/rules/SR010-retry-storm.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR010-retry-storm.js +181 -0
- package/dist/structural-rules/rules/SR010-retry-storm.js.map +1 -0
- package/dist/structural-rules/rules/SR011-event-listener-leak.d.ts +11 -0
- package/dist/structural-rules/rules/SR011-event-listener-leak.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR011-event-listener-leak.js +208 -0
- package/dist/structural-rules/rules/SR011-event-listener-leak.js.map +1 -0
- package/dist/structural-rules/rules/SR012-promise-race-leak.d.ts +11 -0
- package/dist/structural-rules/rules/SR012-promise-race-leak.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR012-promise-race-leak.js +191 -0
- package/dist/structural-rules/rules/SR012-promise-race-leak.js.map +1 -0
- package/dist/structural-rules/rules/SR013-missing-idempotency-key.d.ts +11 -0
- package/dist/structural-rules/rules/SR013-missing-idempotency-key.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR013-missing-idempotency-key.js +219 -0
- package/dist/structural-rules/rules/SR013-missing-idempotency-key.js.map +1 -0
- package/dist/structural-rules/rules/SR014-mutable-closure-async.d.ts +11 -0
- package/dist/structural-rules/rules/SR014-mutable-closure-async.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR014-mutable-closure-async.js +208 -0
- package/dist/structural-rules/rules/SR014-mutable-closure-async.js.map +1 -0
- package/dist/structural-rules/rules/SR015-dangling-abort-controller.d.ts +11 -0
- package/dist/structural-rules/rules/SR015-dangling-abort-controller.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR015-dangling-abort-controller.js +190 -0
- package/dist/structural-rules/rules/SR015-dangling-abort-controller.js.map +1 -0
- package/dist/structural-rules/rules/SR016-unsafe-json-parse.d.ts +11 -0
- package/dist/structural-rules/rules/SR016-unsafe-json-parse.d.ts.map +1 -0
- package/dist/structural-rules/rules/SR016-unsafe-json-parse.js +187 -0
- package/dist/structural-rules/rules/SR016-unsafe-json-parse.js.map +1 -0
- package/dist/structural-rules/suppressions.d.ts +43 -0
- package/dist/structural-rules/suppressions.d.ts.map +1 -0
- package/dist/structural-rules/suppressions.js +115 -0
- package/dist/structural-rules/suppressions.js.map +1 -0
- package/dist/structural-rules/types.d.ts +55 -0
- package/dist/structural-rules/types.d.ts.map +1 -0
- package/dist/structural-rules/types.js +3 -0
- package/dist/structural-rules/types.js.map +1 -0
- package/dist/utils/brain-cache.d.ts +100 -0
- package/dist/utils/brain-cache.d.ts.map +1 -0
- package/dist/utils/brain-cache.js +346 -0
- package/dist/utils/brain-cache.js.map +1 -0
- package/dist/utils/governance-provenance.d.ts +95 -0
- package/dist/utils/governance-provenance.d.ts.map +1 -0
- package/dist/utils/governance-provenance.js +187 -0
- package/dist/utils/governance-provenance.js.map +1 -0
- package/dist/utils/pilot-metrics.d.ts +46 -0
- package/dist/utils/pilot-metrics.d.ts.map +1 -0
- package/dist/utils/pilot-metrics.js +240 -0
- package/dist/utils/pilot-metrics.js.map +1 -0
- package/dist/utils/replay-runtime.d.ts +34 -0
- package/dist/utils/replay-runtime.d.ts.map +1 -1
- package/dist/utils/replay-runtime.js +207 -0
- package/dist/utils/replay-runtime.js.map +1 -1
- package/dist/utils/verify-runtime-stability.d.ts +142 -0
- package/dist/utils/verify-runtime-stability.d.ts.map +1 -0
- package/dist/utils/verify-runtime-stability.js +230 -0
- package/dist/utils/verify-runtime-stability.js.map +1 -0
- package/dist/workspace/cross-repo-graph.d.ts +111 -0
- package/dist/workspace/cross-repo-graph.d.ts.map +1 -0
- package/dist/workspace/cross-repo-graph.js +450 -0
- package/dist/workspace/cross-repo-graph.js.map +1 -0
- package/dist/workspace/federated-context.d.ts +144 -0
- package/dist/workspace/federated-context.d.ts.map +1 -0
- package/dist/workspace/federated-context.js +347 -0
- package/dist/workspace/federated-context.js.map +1 -0
- package/dist/workspace/index.d.ts +38 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +48 -0
- package/dist/workspace/index.js.map +1 -0
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/intent-engine/parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/intent-engine/parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAkGD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAgDxD"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.parseIntent = parseIntent;
|
|
9
|
+
const domain_taxonomy_1 = require("./domain-taxonomy");
|
|
9
10
|
// ── Domain keyword map ────────────────────────────────────────────────────────
|
|
10
11
|
const DOMAIN_KEYWORDS = {
|
|
11
12
|
auth: ['auth', 'login', 'logout', 'jwt', 'token', 'session', 'password',
|
|
@@ -24,6 +25,22 @@ const DOMAIN_KEYWORDS = {
|
|
|
24
25
|
notification: ['notification', 'email', 'sms', 'push', 'alert', 'message'],
|
|
25
26
|
file: ['file', 'upload', 'download', 'storage', 's3', 'blob', 'attachment', 'media'],
|
|
26
27
|
testing: ['test', 'spec', 'mock', 'unit', 'integration', 'e2e', 'coverage'],
|
|
28
|
+
// ── New domains ─────────────────────────────────────────────────────────────
|
|
29
|
+
resilience: ['circuit', 'breaker', 'bulkhead', 'retry', 'backoff', 'fallback',
|
|
30
|
+
'timeout', 'half-open', 'coalesce', 'throttle', 'jitter', 'probe',
|
|
31
|
+
'resilience', 'shed'],
|
|
32
|
+
infrastructure: ['middleware', 'proxy', 'gateway', 'kubernetes', 'docker',
|
|
33
|
+
'container', 'deployment', 'health', 'liveness', 'readiness'],
|
|
34
|
+
concurrency: ['concurrent', 'async', 'await', 'promise', 'race', 'mutex',
|
|
35
|
+
'semaphore', 'lock', 'atomic', 'deadlock', 'goroutine', 'asyncio',
|
|
36
|
+
'thread'],
|
|
37
|
+
observability: ['metric', 'trace', 'span', 'telemetry', 'prometheus', 'grafana',
|
|
38
|
+
'datadog', 'alert', 'dashboard', 'monitor'],
|
|
39
|
+
caching: ['cache', 'redis', 'memcached', 'ttl', 'eviction', 'lru', 'invalidat'],
|
|
40
|
+
messaging: ['queue', 'topic', 'kafka', 'rabbitmq', 'sqs', 'sns', 'pubsub',
|
|
41
|
+
'publish', 'subscribe', 'consumer'],
|
|
42
|
+
'ml-inference': ['model', 'inference', 'embedding', 'vector', 'tensor', 'llm',
|
|
43
|
+
'gpu', 'cuda', 'onnx'],
|
|
27
44
|
};
|
|
28
45
|
// ── Domain → expected patterns ────────────────────────────────────────────────
|
|
29
46
|
const DOMAIN_PATTERNS = {
|
|
@@ -41,6 +58,17 @@ const DOMAIN_PATTERNS = {
|
|
|
41
58
|
notification: ['retry logic', 'delivery confirmation', 'template validation'],
|
|
42
59
|
file: ['file type validation', 'size limits', 'virus scanning', 'access control'],
|
|
43
60
|
testing: ['coverage thresholds', 'mock boundaries', 'assertion completeness'],
|
|
61
|
+
// ── New domains ─────────────────────────────────────────────────────────────
|
|
62
|
+
resilience: ['single-probe half-open gate', 'bounded retry with backoff',
|
|
63
|
+
'circuit state hooks', 'fallback handler', 'timeout propagation'],
|
|
64
|
+
infrastructure: ['health endpoint', 'graceful shutdown', 'config validation',
|
|
65
|
+
'middleware chain'],
|
|
66
|
+
concurrency: ['abort signal propagation', 'cancellation token',
|
|
67
|
+
'bounded concurrency', 'timer cleanup'],
|
|
68
|
+
observability: ['structured logging', 'span creation', 'metric emission',
|
|
69
|
+
'alert threshold'],
|
|
70
|
+
caching: ['TTL eviction', 'bounded cache size', 'cache invalidation',
|
|
71
|
+
'stale-while-revalidate'],
|
|
44
72
|
};
|
|
45
73
|
// ── Domain → critical rules ───────────────────────────────────────────────────
|
|
46
74
|
const DOMAIN_RULES = {
|
|
@@ -57,6 +85,12 @@ const DOMAIN_RULES = {
|
|
|
57
85
|
notification: ['validate-recipients', 'rate-limit-sends'],
|
|
58
86
|
file: ['validate-file-type', 'enforce-size-limit', 'sanitize-filename'],
|
|
59
87
|
testing: ['no-test-skips', 'no-only-blocks'],
|
|
88
|
+
// ── New domains ─────────────────────────────────────────────────────────────
|
|
89
|
+
resilience: ['single-probe-halfopen', 'bounded-retry', 'circuit-hooks',
|
|
90
|
+
'timer-cleanup', 'abort-signal'],
|
|
91
|
+
infrastructure: ['validate-config', 'graceful-shutdown', 'health-endpoint'],
|
|
92
|
+
concurrency: ['propagate-abort-signal', 'bounded-concurrency', 'cleanup-timers'],
|
|
93
|
+
caching: ['bound-cache-size', 'ttl-eviction', 'invalidation-strategy'],
|
|
60
94
|
};
|
|
61
95
|
// ── Public API ────────────────────────────────────────────────────────────────
|
|
62
96
|
function parseIntent(intent) {
|
|
@@ -67,6 +101,7 @@ function parseIntent(intent) {
|
|
|
67
101
|
const words = lower.split(/\W+/).filter(Boolean);
|
|
68
102
|
const wordSet = new Set(words);
|
|
69
103
|
const matchedDomains = new Set();
|
|
104
|
+
// Step 1: keyword-heuristic matching (existing approach)
|
|
70
105
|
for (const [domain, keywords] of Object.entries(DOMAIN_KEYWORDS)) {
|
|
71
106
|
for (const keyword of keywords) {
|
|
72
107
|
if (lower.includes(keyword) || wordSet.has(keyword)) {
|
|
@@ -75,6 +110,18 @@ function parseIntent(intent) {
|
|
|
75
110
|
}
|
|
76
111
|
}
|
|
77
112
|
}
|
|
113
|
+
// Step 2: taxonomy-based classification — merge primary domains into results
|
|
114
|
+
const taxonomyResult = (0, domain_taxonomy_1.classifyDomains)(intent);
|
|
115
|
+
for (const domainId of taxonomyResult.primary) {
|
|
116
|
+
// Normalise data-access → database for backward compatibility with
|
|
117
|
+
// existing DOMAIN_PATTERNS / DOMAIN_RULES keys
|
|
118
|
+
if (domainId === 'data-access') {
|
|
119
|
+
matchedDomains.add('database');
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
matchedDomains.add(domainId);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
78
125
|
const domains = [...matchedDomains];
|
|
79
126
|
const expectedPatterns = [];
|
|
80
127
|
const criticalRules = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/intent-engine/parser.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/intent-engine/parser.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AA0GH,kCAgDC;AAxJD,uDAAoD;AAQpD,iFAAiF;AAEjF,MAAM,eAAe,GAA6B;IAChD,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU;QAChE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ;QACpE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,CAAC;IACzD,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM;QAC3D,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC;IACxE,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ;QAC7D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAC5E,QAAQ,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO;QAChE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC;IAChF,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;QACnD,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC;IAClE,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;QAC1D,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,CAAC;IACxE,YAAY,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC;IAC1E,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC;IACpF,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC;IAE3E,+EAA+E;IAC/E,UAAU,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU;QAChE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO;QACjE,YAAY,EAAE,MAAM,CAAC;IAClC,cAAc,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ;QACxD,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC;IAC9E,WAAW,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO;QAC1D,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS;QACjE,QAAQ,CAAC;IACvB,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS;QAC/D,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC;IAC3D,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC;IAC/E,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ;QAC7D,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC;IAC/C,cAAc,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK;QAC5D,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;CACxC,CAAC;AAEF,iFAAiF;AAEjF,MAAM,eAAe,GAA6B;IAChD,IAAI,EAAE,CAAC,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB;QACxE,kBAAkB,EAAE,cAAc,CAAC;IAC1C,GAAG,EAAE,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe;QACxE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,gBAAgB;QAC3D,oBAAoB,CAAC;IACjC,OAAO,EAAE,CAAC,oBAAoB,EAAE,aAAa,EAAE,sBAAsB;QAC1D,gBAAgB,EAAE,gBAAgB,CAAC;IAC9C,QAAQ,EAAE,CAAC,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB;QAC3D,aAAa,EAAE,aAAa,CAAC;IACzC,EAAE,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,CAAC;IAC9E,YAAY,EAAE,CAAC,aAAa,EAAE,uBAAuB,EAAE,qBAAqB,CAAC;IAC7E,IAAI,EAAE,CAAC,sBAAsB,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,CAAC;IACjF,OAAO,EAAE,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,wBAAwB,CAAC;IAE7E,+EAA+E;IAC/E,UAAU,EAAE,CAAC,6BAA6B,EAAE,4BAA4B;QAC3D,qBAAqB,EAAE,kBAAkB,EAAE,qBAAqB,CAAC;IAC9E,cAAc,EAAE,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB;QAC3D,kBAAkB,CAAC;IACpC,WAAW,EAAE,CAAC,0BAA0B,EAAE,oBAAoB;QAChD,qBAAqB,EAAE,eAAe,CAAC;IACrD,aAAa,EAAE,CAAC,oBAAoB,EAAE,eAAe,EAAE,iBAAiB;QACxD,iBAAiB,CAAC;IAClC,OAAO,EAAE,CAAC,cAAc,EAAE,oBAAoB,EAAE,oBAAoB;QAC1D,wBAAwB,CAAC;CACpC,CAAC;AAEF,iFAAiF;AAEjF,MAAM,YAAY,GAA6B;IAC7C,IAAI,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB;QACtE,uBAAuB,CAAC;IAC/B,GAAG,EAAE,CAAC,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,CAAC;IAC/E,QAAQ,EAAE,CAAC,0BAA0B,EAAE,kBAAkB,EAAE,iBAAiB;QAChE,0BAA0B,CAAC;IACvC,OAAO,EAAE,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,mBAAmB;QAClE,kBAAkB,CAAC;IAC9B,QAAQ,EAAE,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,aAAa;QACrD,SAAS,EAAE,cAAc,CAAC;IACtC,EAAE,EAAE,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC;IAC9D,YAAY,EAAE,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;IACzD,IAAI,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,mBAAmB,CAAC;IACvE,OAAO,EAAE,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,+EAA+E;IAC/E,UAAU,EAAE,CAAC,uBAAuB,EAAE,eAAe,EAAE,eAAe;QACzD,eAAe,EAAE,cAAc,CAAC;IAC7C,cAAc,EAAE,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,CAAC;IAC3E,WAAW,EAAE,CAAC,wBAAwB,EAAE,qBAAqB,EAAE,gBAAgB,CAAC;IAChF,OAAO,EAAE,CAAC,kBAAkB,EAAE,cAAc,EAAE,uBAAuB,CAAC;CACvE,CAAC;AAEF,iFAAiF;AAEjF,SAAgB,WAAW,CAAC,MAAc;IACxC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAE/B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,yDAAyD;IACzD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QACjE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,MAAM,cAAc,GAAG,IAAA,iCAAe,EAAC,MAAM,CAAC,CAAC;IAC/C,KAAK,MAAM,QAAQ,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;QAC9C,mEAAmE;QACnE,+CAA+C;QAC/C,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC/B,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC;IAEpC,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1E,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository Classifier (Phase 3 — Repository-Aware Intent Bounding)
|
|
3
|
+
*
|
|
4
|
+
* Deterministic classification of a repository's primary language, framework
|
|
5
|
+
* ecosystem, and dependency archetype from the diff file list alone.
|
|
6
|
+
* No disk I/O, no LLM, no heuristics beyond file path and extension patterns.
|
|
7
|
+
*
|
|
8
|
+
* Used to bound semantic reasoning in the intent matcher so that:
|
|
9
|
+
* - Python repos NEVER emit Express/Zod/React-specific findings
|
|
10
|
+
* - Java repos NEVER emit Node.js-specific findings
|
|
11
|
+
* - TypeScript repos NEVER emit FastAPI/Django-specific findings
|
|
12
|
+
*
|
|
13
|
+
* Output confidence < UNSUPPORTED_THRESHOLD triggers an explicit
|
|
14
|
+
* 'unsupported-reasoning-domain' state rather than guessing.
|
|
15
|
+
*/
|
|
16
|
+
export type PrimaryLanguage = 'typescript' | 'javascript' | 'python' | 'java' | 'go' | 'rust' | 'mixed' | 'unknown';
|
|
17
|
+
export type FrameworkEcosystem = 'express' | 'nextjs' | 'react' | 'fastapi' | 'django' | 'flask' | 'spring' | 'airflow' | 'celery' | 'unknown';
|
|
18
|
+
export type DependencyArchetype = 'nodejs' | 'python' | 'java' | 'go' | 'rust' | 'mixed' | 'unknown';
|
|
19
|
+
export interface RepoClassification {
|
|
20
|
+
primaryLanguage: PrimaryLanguage;
|
|
21
|
+
frameworkEcosystem: FrameworkEcosystem;
|
|
22
|
+
dependencyArchetype: DependencyArchetype;
|
|
23
|
+
/**
|
|
24
|
+
* 0.0–1.0. Below UNSUPPORTED_THRESHOLD the classification is unreliable
|
|
25
|
+
* and semantic reasoning should be suppressed.
|
|
26
|
+
*/
|
|
27
|
+
confidence: number;
|
|
28
|
+
/**
|
|
29
|
+
* Explicit list of semantic reasoning domains that are VALID for this repo.
|
|
30
|
+
* Intent matching should only use signals from these domains.
|
|
31
|
+
* Empty = all domains allowed (unknown repo, safe default).
|
|
32
|
+
*/
|
|
33
|
+
boundedDomains: string[];
|
|
34
|
+
/**
|
|
35
|
+
* When true, the repo classification was too uncertain to run bounded
|
|
36
|
+
* semantic reasoning. Intent matching should emit a single advisory finding
|
|
37
|
+
* rather than domain-specific findings.
|
|
38
|
+
*/
|
|
39
|
+
unsupportedReasoningDomain: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Classify a repository from the diff file paths.
|
|
43
|
+
*
|
|
44
|
+
* Deterministic algorithm:
|
|
45
|
+
* 1. Count file extensions → determine primaryLanguage by weighted vote
|
|
46
|
+
* 2. Scan manifest file names → determine dependencyArchetype
|
|
47
|
+
* 3. Scan file paths for framework markers → determine frameworkEcosystem
|
|
48
|
+
* 4. Compute confidence from vote margin
|
|
49
|
+
* 5. Bound semantic domains by primaryLanguage
|
|
50
|
+
*/
|
|
51
|
+
export declare function classifyRepo(diffFiles: Array<{
|
|
52
|
+
path: string;
|
|
53
|
+
}>): RepoClassification;
|
|
54
|
+
/**
|
|
55
|
+
* Returns true if a component signal key is valid for the given repo classification.
|
|
56
|
+
*
|
|
57
|
+
* Component signals that are TypeScript/JavaScript-specific (zod, express, jwt.sign,
|
|
58
|
+
* bcrypt, etc.) must be suppressed when the primary language is Python, Java, Go, etc.
|
|
59
|
+
*
|
|
60
|
+
* @param signalLanguages Languages this signal applies to (empty = applies to all)
|
|
61
|
+
* @param repo The classified repository
|
|
62
|
+
*/
|
|
63
|
+
export declare function isSignalCompatible(signalLanguages: PrimaryLanguage[], repo: RepoClassification): boolean;
|
|
64
|
+
//# sourceMappingURL=repo-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-classifier.d.ts","sourceRoot":"","sources":["../../src/intent-engine/repo-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,YAAY,GACZ,QAAQ,GACR,MAAM,GACN,IAAI,GACJ,MAAM,GACN,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,QAAQ,GACR,OAAO,GACP,SAAS,GACT,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,IAAI,GACJ,MAAM,GACN,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;;;;OAIG;IACH,0BAA0B,EAAE,OAAO,CAAC;CACrC;AA+DD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,kBAAkB,CAwFnF;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,eAAe,EAAE,EAClC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAMT"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Repository Classifier (Phase 3 — Repository-Aware Intent Bounding)
|
|
4
|
+
*
|
|
5
|
+
* Deterministic classification of a repository's primary language, framework
|
|
6
|
+
* ecosystem, and dependency archetype from the diff file list alone.
|
|
7
|
+
* No disk I/O, no LLM, no heuristics beyond file path and extension patterns.
|
|
8
|
+
*
|
|
9
|
+
* Used to bound semantic reasoning in the intent matcher so that:
|
|
10
|
+
* - Python repos NEVER emit Express/Zod/React-specific findings
|
|
11
|
+
* - Java repos NEVER emit Node.js-specific findings
|
|
12
|
+
* - TypeScript repos NEVER emit FastAPI/Django-specific findings
|
|
13
|
+
*
|
|
14
|
+
* Output confidence < UNSUPPORTED_THRESHOLD triggers an explicit
|
|
15
|
+
* 'unsupported-reasoning-domain' state rather than guessing.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.classifyRepo = classifyRepo;
|
|
19
|
+
exports.isSignalCompatible = isSignalCompatible;
|
|
20
|
+
// ── Thresholds ────────────────────────────────────────────────────────────────
|
|
21
|
+
/** Below this confidence, emit unsupportedReasoningDomain */
|
|
22
|
+
const UNSUPPORTED_THRESHOLD = 0.4;
|
|
23
|
+
// ── Language detection patterns ───────────────────────────────────────────────
|
|
24
|
+
const LANG_PATTERNS = [
|
|
25
|
+
{ language: 'typescript', pattern: /\.(ts|tsx)$/, weight: 2 },
|
|
26
|
+
{ language: 'javascript', pattern: /\.(js|jsx|mjs|cjs)$/, weight: 1 },
|
|
27
|
+
{ language: 'python', pattern: /\.py$/, weight: 2 },
|
|
28
|
+
{ language: 'java', pattern: /\.java$/, weight: 2 },
|
|
29
|
+
{ language: 'go', pattern: /\.go$/, weight: 2 },
|
|
30
|
+
{ language: 'rust', pattern: /\.rs$/, weight: 2 },
|
|
31
|
+
];
|
|
32
|
+
// ── Dependency archetype detection ────────────────────────────────────────────
|
|
33
|
+
const DEPENDENCY_PATTERNS = [
|
|
34
|
+
{ archetype: 'nodejs', pattern: /(?:^|\/)package\.json$/ },
|
|
35
|
+
{ archetype: 'python', pattern: /(?:^|\/)(?:requirements(?:[-_]\w+)?\.txt|pyproject\.toml|setup\.py|setup\.cfg|Pipfile)$/ },
|
|
36
|
+
{ archetype: 'java', pattern: /(?:^|\/)(?:pom\.xml|build\.gradle(?:\.kts)?)$/ },
|
|
37
|
+
{ archetype: 'go', pattern: /(?:^|\/)go\.mod$/ },
|
|
38
|
+
{ archetype: 'rust', pattern: /(?:^|\/)Cargo\.toml$/ },
|
|
39
|
+
];
|
|
40
|
+
// ── Framework ecosystem detection ─────────────────────────────────────────────
|
|
41
|
+
// Keyed by path/filename patterns found in the diff
|
|
42
|
+
const FRAMEWORK_PATTERNS = [
|
|
43
|
+
{ ecosystem: 'airflow', pattern: /(?:airflow|dags?\/|operators?\/)/ },
|
|
44
|
+
{ ecosystem: 'celery', pattern: /(?:celery|tasks?\.py$|worker\.py$)/ },
|
|
45
|
+
{ ecosystem: 'fastapi', pattern: /(?:fastapi|routers?\/.*\.py$)/ },
|
|
46
|
+
{ ecosystem: 'django', pattern: /(?:django|settings\.py$|urls\.py$|views\.py$|models\.py$)/ },
|
|
47
|
+
{ ecosystem: 'flask', pattern: /(?:flask|app\.py$|blueprints?\/)/ },
|
|
48
|
+
{ ecosystem: 'spring', pattern: /(?:springframework|@SpringBootApplication|Controller\.java$)/ },
|
|
49
|
+
{ ecosystem: 'nextjs', pattern: /(?:pages\/|app\/.*page\.tsx$|next\.config\.)/ },
|
|
50
|
+
{ ecosystem: 'react', pattern: /(?:\.tsx$|components?\/|hooks?\/)/ },
|
|
51
|
+
{ ecosystem: 'express', pattern: /(?:express|router\.(ts|js)$|middleware\.(ts|js)$)/ },
|
|
52
|
+
];
|
|
53
|
+
// ── Domain bounding by language ───────────────────────────────────────────────
|
|
54
|
+
// Maps primaryLanguage → list of intent domains safe to evaluate on that language.
|
|
55
|
+
// '*' means all domains are safe (no bounding applied).
|
|
56
|
+
const LANGUAGE_DOMAIN_BOUNDS = {
|
|
57
|
+
python: ['concurrency', 'observability', 'resilience', 'data-access', 'messaging',
|
|
58
|
+
'orchestration', 'caching', 'ml-inference', 'infrastructure', 'security', 'auth'],
|
|
59
|
+
java: ['concurrency', 'observability', 'resilience', 'data-access', 'messaging',
|
|
60
|
+
'orchestration', 'caching', 'infrastructure', 'security', 'auth', 'api'],
|
|
61
|
+
go: ['concurrency', 'observability', 'resilience', 'data-access', 'messaging',
|
|
62
|
+
'caching', 'infrastructure', 'security', 'auth', 'api'],
|
|
63
|
+
rust: ['concurrency', 'observability', 'resilience', 'caching', 'infrastructure'],
|
|
64
|
+
typescript: [], // all domains allowed
|
|
65
|
+
javascript: [], // all domains allowed
|
|
66
|
+
mixed: [], // all domains allowed (conservative — don't bound a mixed repo)
|
|
67
|
+
unknown: [], // all domains allowed (safe default — don't suppress on uncertainty)
|
|
68
|
+
};
|
|
69
|
+
// ── Classifier ────────────────────────────────────────────────────────────────
|
|
70
|
+
/**
|
|
71
|
+
* Classify a repository from the diff file paths.
|
|
72
|
+
*
|
|
73
|
+
* Deterministic algorithm:
|
|
74
|
+
* 1. Count file extensions → determine primaryLanguage by weighted vote
|
|
75
|
+
* 2. Scan manifest file names → determine dependencyArchetype
|
|
76
|
+
* 3. Scan file paths for framework markers → determine frameworkEcosystem
|
|
77
|
+
* 4. Compute confidence from vote margin
|
|
78
|
+
* 5. Bound semantic domains by primaryLanguage
|
|
79
|
+
*/
|
|
80
|
+
function classifyRepo(diffFiles) {
|
|
81
|
+
const langCounts = {};
|
|
82
|
+
let dependencyArchetype = 'unknown';
|
|
83
|
+
let frameworkEcosystem = 'unknown';
|
|
84
|
+
for (const file of diffFiles) {
|
|
85
|
+
const p = file.path.replace(/\\/g, '/');
|
|
86
|
+
// Language vote
|
|
87
|
+
for (const { language, pattern, weight } of LANG_PATTERNS) {
|
|
88
|
+
if (pattern.test(p)) {
|
|
89
|
+
langCounts[language] = (langCounts[language] ?? 0) + weight;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Dependency archetype (first match wins)
|
|
93
|
+
if (dependencyArchetype === 'unknown') {
|
|
94
|
+
for (const { archetype, pattern } of DEPENDENCY_PATTERNS) {
|
|
95
|
+
if (pattern.test(p)) {
|
|
96
|
+
dependencyArchetype = archetype;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Framework ecosystem (first match wins)
|
|
102
|
+
if (frameworkEcosystem === 'unknown') {
|
|
103
|
+
for (const { ecosystem, pattern } of FRAMEWORK_PATTERNS) {
|
|
104
|
+
if (pattern.test(p)) {
|
|
105
|
+
frameworkEcosystem = ecosystem;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Determine primary language
|
|
112
|
+
const sorted = Object.entries(langCounts)
|
|
113
|
+
.sort((a, b) => b[1] - a[1]);
|
|
114
|
+
let primaryLanguage = 'unknown';
|
|
115
|
+
let confidence = 0;
|
|
116
|
+
if (sorted.length === 0) {
|
|
117
|
+
primaryLanguage = 'unknown';
|
|
118
|
+
confidence = 0;
|
|
119
|
+
}
|
|
120
|
+
else if (sorted.length === 1) {
|
|
121
|
+
primaryLanguage = sorted[0][0];
|
|
122
|
+
confidence = 0.95;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const top = sorted[0][1];
|
|
126
|
+
const second = sorted[1][1];
|
|
127
|
+
const total = sorted.reduce((s, [, v]) => s + v, 0);
|
|
128
|
+
const dominance = top / total;
|
|
129
|
+
if (dominance >= 0.75) {
|
|
130
|
+
primaryLanguage = sorted[0][0];
|
|
131
|
+
confidence = 0.9;
|
|
132
|
+
}
|
|
133
|
+
else if (dominance >= 0.5) {
|
|
134
|
+
primaryLanguage = sorted[0][0];
|
|
135
|
+
confidence = 0.65;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
primaryLanguage = 'mixed';
|
|
139
|
+
confidence = 0.4;
|
|
140
|
+
}
|
|
141
|
+
// Boost confidence if dependency archetype aligns
|
|
142
|
+
if ((dependencyArchetype === 'python' && primaryLanguage === 'python') ||
|
|
143
|
+
(dependencyArchetype === 'nodejs' && (primaryLanguage === 'typescript' || primaryLanguage === 'javascript')) ||
|
|
144
|
+
(dependencyArchetype === 'java' && primaryLanguage === 'java') ||
|
|
145
|
+
(dependencyArchetype === 'go' && primaryLanguage === 'go')) {
|
|
146
|
+
confidence = Math.min(1.0, confidence + 0.1);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const boundedDomains = LANGUAGE_DOMAIN_BOUNDS[primaryLanguage] ?? [];
|
|
150
|
+
const unsupportedReasoningDomain = confidence < UNSUPPORTED_THRESHOLD;
|
|
151
|
+
return {
|
|
152
|
+
primaryLanguage,
|
|
153
|
+
frameworkEcosystem,
|
|
154
|
+
dependencyArchetype,
|
|
155
|
+
confidence,
|
|
156
|
+
boundedDomains,
|
|
157
|
+
unsupportedReasoningDomain,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Returns true if a component signal key is valid for the given repo classification.
|
|
162
|
+
*
|
|
163
|
+
* Component signals that are TypeScript/JavaScript-specific (zod, express, jwt.sign,
|
|
164
|
+
* bcrypt, etc.) must be suppressed when the primary language is Python, Java, Go, etc.
|
|
165
|
+
*
|
|
166
|
+
* @param signalLanguages Languages this signal applies to (empty = applies to all)
|
|
167
|
+
* @param repo The classified repository
|
|
168
|
+
*/
|
|
169
|
+
function isSignalCompatible(signalLanguages, repo) {
|
|
170
|
+
// If the signal has no language restriction, it applies everywhere
|
|
171
|
+
if (signalLanguages.length === 0)
|
|
172
|
+
return true;
|
|
173
|
+
// If the repo is unknown or mixed, allow all signals (safe default)
|
|
174
|
+
if (repo.primaryLanguage === 'unknown' || repo.primaryLanguage === 'mixed')
|
|
175
|
+
return true;
|
|
176
|
+
return signalLanguages.includes(repo.primaryLanguage);
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=repo-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-classifier.js","sourceRoot":"","sources":["../../src/intent-engine/repo-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic Intent Expander (Phase 2)
|
|
3
|
+
*
|
|
4
|
+
* Calls an LLM exactly ONCE per unique intent to produce a structured
|
|
5
|
+
* semantic expansion. The result is stored as a signed governance artifact
|
|
6
|
+
* (HMAC-SHA256) so all subsequent enforcement runs against the same
|
|
7
|
+
* deterministic stored result — never re-calling the LLM.
|
|
8
|
+
*
|
|
9
|
+
* ┌──────────────────────────────────────────────────────────────┐
|
|
10
|
+
* │ TRUST MODEL │
|
|
11
|
+
* │ │
|
|
12
|
+
* │ LLM is used for UNDERSTANDING (once, stored, signed). │
|
|
13
|
+
* │ All ENFORCEMENT decisions are deterministic (regex/AST). │
|
|
14
|
+
* │ │
|
|
15
|
+
* │ This mirrors how human architects write design docs: │
|
|
16
|
+
* │ judgment applied once → all reviews check the document. │
|
|
17
|
+
* └──────────────────────────────────────────────────────────────┘
|
|
18
|
+
*
|
|
19
|
+
* Provider support: any OpenAI-compatible HTTP endpoint.
|
|
20
|
+
* - OpenAI: NEURCODE_OPENAI_API_KEY (default)
|
|
21
|
+
* - Anthropic: NEURCODE_ANTHROPIC_API_KEY (maps to their API)
|
|
22
|
+
* - Local: NEURCODE_LLM_BASE_URL=http://localhost:11434/v1 (Ollama)
|
|
23
|
+
*
|
|
24
|
+
* Fallback: if no API key is configured, silently falls back to the
|
|
25
|
+
* deterministic keyword parser — expansion still produced, marked
|
|
26
|
+
* expansionMethod='keyword-fallback'.
|
|
27
|
+
*/
|
|
28
|
+
import { z } from 'zod';
|
|
29
|
+
import { ParsedIntent } from './parser';
|
|
30
|
+
/**
|
|
31
|
+
* The structured output schema enforced on the LLM response.
|
|
32
|
+
* Zod parses and strips any extra fields — if the LLM hallucinates
|
|
33
|
+
* fields outside this schema they are silently dropped.
|
|
34
|
+
*/
|
|
35
|
+
declare const SemanticExpansionResponseSchema: z.ZodObject<{
|
|
36
|
+
semanticDescription: z.ZodString;
|
|
37
|
+
domains: z.ZodArray<z.ZodString>;
|
|
38
|
+
affectedLayerHints: z.ZodArray<z.ZodString>;
|
|
39
|
+
expectedFilePatterns: z.ZodArray<z.ZodString>;
|
|
40
|
+
policyApplicability: z.ZodArray<z.ZodString>;
|
|
41
|
+
riskLevel: z.ZodEnum<{
|
|
42
|
+
low: "low";
|
|
43
|
+
medium: "medium";
|
|
44
|
+
high: "high";
|
|
45
|
+
critical: "critical";
|
|
46
|
+
}>;
|
|
47
|
+
riskRationale: z.ZodString;
|
|
48
|
+
semanticKeywords: z.ZodArray<z.ZodString>;
|
|
49
|
+
}, z.core.$strip>;
|
|
50
|
+
type SemanticExpansionResponse = z.infer<typeof SemanticExpansionResponseSchema>;
|
|
51
|
+
export interface SemanticIntentExpansion extends SemanticExpansionResponse {
|
|
52
|
+
/** SHA-256 of normalized intent — stable identifier for this expansion. */
|
|
53
|
+
intentHash: string;
|
|
54
|
+
rawIntent: string;
|
|
55
|
+
expansionMethod: 'llm' | 'keyword-fallback';
|
|
56
|
+
modelUsed: string | null;
|
|
57
|
+
expandedAt: string;
|
|
58
|
+
/** Carries parsed keyword data for backward-compat with existing matcher. */
|
|
59
|
+
parsedKeyword: ParsedIntent;
|
|
60
|
+
/** HMAC-SHA256 signature — tamper-evident. Present when signing key configured. */
|
|
61
|
+
signature?: {
|
|
62
|
+
algorithm: 'hmac-sha256';
|
|
63
|
+
keyId: string | null;
|
|
64
|
+
signedAt: string;
|
|
65
|
+
payloadHash: string;
|
|
66
|
+
value: string;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export interface ExpandIntentOptions {
|
|
70
|
+
cwd: string;
|
|
71
|
+
/** Force a fresh LLM call even if a cached expansion exists. */
|
|
72
|
+
forceRefresh?: boolean;
|
|
73
|
+
/** Skip signing (for tests). */
|
|
74
|
+
skipSigning?: boolean;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Expands an intent into a rich semantic governance artifact.
|
|
78
|
+
*
|
|
79
|
+
* Call flow:
|
|
80
|
+
* 1. Check cache (.neurcode/intent-expansions/{hash}.json)
|
|
81
|
+
* 2. If fresh cached → return it (pure deterministic path)
|
|
82
|
+
* 3. If no cache and LLM available → call LLM once, sign, store, return
|
|
83
|
+
* 4. If no cache and no LLM → keyword fallback, sign, store, return
|
|
84
|
+
*
|
|
85
|
+
* The returned artifact is always HMAC-signed if a signing key is configured.
|
|
86
|
+
* Callers must treat this artifact as the authoritative intent record.
|
|
87
|
+
*/
|
|
88
|
+
export declare function expandIntent(rawIntent: string, options: ExpandIntentOptions): Promise<SemanticIntentExpansion>;
|
|
89
|
+
/**
|
|
90
|
+
* Loads a cached expansion for an intent, or null if not found.
|
|
91
|
+
* Used by verify/plan to retrieve the stored governance artifact.
|
|
92
|
+
*/
|
|
93
|
+
export declare function loadCachedExpansion(cwd: string, rawIntent: string): SemanticIntentExpansion | null;
|
|
94
|
+
/**
|
|
95
|
+
* Lists all cached expansion hashes in this workspace.
|
|
96
|
+
*/
|
|
97
|
+
export declare function listCachedExpansions(cwd: string): string[];
|
|
98
|
+
/**
|
|
99
|
+
* Returns a human-readable summary of what the intent expander knows.
|
|
100
|
+
* Useful for `neurcode intent show` command and audit reports.
|
|
101
|
+
*/
|
|
102
|
+
export declare function formatExpansionSummary(exp: SemanticIntentExpansion): string;
|
|
103
|
+
export {};
|
|
104
|
+
//# sourceMappingURL=semantic-expander.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-expander.d.ts","sourceRoot":"","sources":["../../src/intent-engine/semantic-expander.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAe,YAAY,EAAE,MAAM,UAAU,CAAC;AAQrD;;;;GAIG;AACH,QAAA,MAAM,+BAA+B;;;;;;;;;;;;;;iBASnC,CAAC;AAEH,KAAK,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAEjF,MAAM,WAAW,uBAAwB,SAAQ,yBAAyB;IACxE,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,KAAK,GAAG,kBAAkB,CAAC;IAC5C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,aAAa,EAAE,YAAY,CAAC;IAC5B,mFAAmF;IACnF,SAAS,CAAC,EAAE;QACV,SAAS,EAAE,aAAa,CAAC;QACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AA8TD,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,uBAAuB,CAAC,CA6DlC;AAuCD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAChB,uBAAuB,GAAG,IAAI,CAEhC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAW1D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,uBAAuB,GAAG,MAAM,CAa3E"}
|