usesteady 0.1.0-alpha.1
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 +186 -0
- package/README.md +724 -0
- package/bin/use-steady.js +13 -0
- package/dist/server-store.d.ts +68 -0
- package/dist/server-store.d.ts.map +1 -0
- package/dist/server-store.js +133 -0
- package/dist/server-store.js.map +1 -0
- package/dist/server.d.ts +35 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +569 -0
- package/dist/server.js.map +1 -0
- package/dist/src/claude/adapters/api-adapter.d.ts +99 -0
- package/dist/src/claude/adapters/api-adapter.d.ts.map +1 -0
- package/dist/src/claude/adapters/api-adapter.js +415 -0
- package/dist/src/claude/adapters/api-adapter.js.map +1 -0
- package/dist/src/claude/adapters/stub-adapter.d.ts +73 -0
- package/dist/src/claude/adapters/stub-adapter.d.ts.map +1 -0
- package/dist/src/claude/adapters/stub-adapter.js +114 -0
- package/dist/src/claude/adapters/stub-adapter.js.map +1 -0
- package/dist/src/claude/artifact-mapper.d.ts +85 -0
- package/dist/src/claude/artifact-mapper.d.ts.map +1 -0
- package/dist/src/claude/artifact-mapper.js +187 -0
- package/dist/src/claude/artifact-mapper.js.map +1 -0
- package/dist/src/claude/delivery-gate.d.ts +136 -0
- package/dist/src/claude/delivery-gate.d.ts.map +1 -0
- package/dist/src/claude/delivery-gate.js +231 -0
- package/dist/src/claude/delivery-gate.js.map +1 -0
- package/dist/src/claude/index.d.ts +24 -0
- package/dist/src/claude/index.d.ts.map +1 -0
- package/dist/src/claude/index.js +23 -0
- package/dist/src/claude/index.js.map +1 -0
- package/dist/src/claude/types.d.ts +223 -0
- package/dist/src/claude/types.d.ts.map +1 -0
- package/dist/src/claude/types.js +64 -0
- package/dist/src/claude/types.js.map +1 -0
- package/dist/src/control/compiler.d.ts +125 -0
- package/dist/src/control/compiler.d.ts.map +1 -0
- package/dist/src/control/compiler.js +179 -0
- package/dist/src/control/compiler.js.map +1 -0
- package/dist/src/control/constraints.d.ts +42 -0
- package/dist/src/control/constraints.d.ts.map +1 -0
- package/dist/src/control/constraints.js +116 -0
- package/dist/src/control/constraints.js.map +1 -0
- package/dist/src/control/drift-detector.d.ts +49 -0
- package/dist/src/control/drift-detector.d.ts.map +1 -0
- package/dist/src/control/drift-detector.js +115 -0
- package/dist/src/control/drift-detector.js.map +1 -0
- package/dist/src/control/index.d.ts +44 -0
- package/dist/src/control/index.d.ts.map +1 -0
- package/dist/src/control/index.js +40 -0
- package/dist/src/control/index.js.map +1 -0
- package/dist/src/control/types.d.ts +144 -0
- package/dist/src/control/types.d.ts.map +1 -0
- package/dist/src/control/types.js +57 -0
- package/dist/src/control/types.js.map +1 -0
- package/dist/src/cursor/adapters/inprocess-adapter.d.ts +78 -0
- package/dist/src/cursor/adapters/inprocess-adapter.d.ts.map +1 -0
- package/dist/src/cursor/adapters/inprocess-adapter.js +308 -0
- package/dist/src/cursor/adapters/inprocess-adapter.js.map +1 -0
- package/dist/src/cursor/adapters/stub-adapter.d.ts +75 -0
- package/dist/src/cursor/adapters/stub-adapter.d.ts.map +1 -0
- package/dist/src/cursor/adapters/stub-adapter.js +120 -0
- package/dist/src/cursor/adapters/stub-adapter.js.map +1 -0
- package/dist/src/cursor/artifact-mapper.d.ts +81 -0
- package/dist/src/cursor/artifact-mapper.d.ts.map +1 -0
- package/dist/src/cursor/artifact-mapper.js +203 -0
- package/dist/src/cursor/artifact-mapper.js.map +1 -0
- package/dist/src/cursor/delivery-gate.d.ts +144 -0
- package/dist/src/cursor/delivery-gate.d.ts.map +1 -0
- package/dist/src/cursor/delivery-gate.js +208 -0
- package/dist/src/cursor/delivery-gate.js.map +1 -0
- package/dist/src/cursor/glob-matcher.d.ts +30 -0
- package/dist/src/cursor/glob-matcher.d.ts.map +1 -0
- package/dist/src/cursor/glob-matcher.js +68 -0
- package/dist/src/cursor/glob-matcher.js.map +1 -0
- package/dist/src/cursor/index.d.ts +43 -0
- package/dist/src/cursor/index.d.ts.map +1 -0
- package/dist/src/cursor/index.js +44 -0
- package/dist/src/cursor/index.js.map +1 -0
- package/dist/src/cursor/ocd-evaluator.d.ts +89 -0
- package/dist/src/cursor/ocd-evaluator.d.ts.map +1 -0
- package/dist/src/cursor/ocd-evaluator.js +142 -0
- package/dist/src/cursor/ocd-evaluator.js.map +1 -0
- package/dist/src/cursor/types.d.ts +309 -0
- package/dist/src/cursor/types.d.ts.map +1 -0
- package/dist/src/cursor/types.js +48 -0
- package/dist/src/cursor/types.js.map +1 -0
- package/dist/src/execution/claude/claude-execution-coordinator.d.ts +164 -0
- package/dist/src/execution/claude/claude-execution-coordinator.d.ts.map +1 -0
- package/dist/src/execution/claude/claude-execution-coordinator.js +198 -0
- package/dist/src/execution/claude/claude-execution-coordinator.js.map +1 -0
- package/dist/src/execution/claude/index.d.ts +13 -0
- package/dist/src/execution/claude/index.d.ts.map +1 -0
- package/dist/src/execution/claude/index.js +12 -0
- package/dist/src/execution/claude/index.js.map +1 -0
- package/dist/src/execution/cursor/cursor-execution-coordinator.d.ts +216 -0
- package/dist/src/execution/cursor/cursor-execution-coordinator.d.ts.map +1 -0
- package/dist/src/execution/cursor/cursor-execution-coordinator.js +233 -0
- package/dist/src/execution/cursor/cursor-execution-coordinator.js.map +1 -0
- package/dist/src/execution/cursor/index.d.ts +20 -0
- package/dist/src/execution/cursor/index.d.ts.map +1 -0
- package/dist/src/execution/cursor/index.js +18 -0
- package/dist/src/execution/cursor/index.js.map +1 -0
- package/dist/src/execution/reminders/index.d.ts +11 -0
- package/dist/src/execution/reminders/index.d.ts.map +1 -0
- package/dist/src/execution/reminders/index.js +9 -0
- package/dist/src/execution/reminders/index.js.map +1 -0
- package/dist/src/execution/reminders/reminder-execution-coordinator.d.ts +125 -0
- package/dist/src/execution/reminders/reminder-execution-coordinator.d.ts.map +1 -0
- package/dist/src/execution/reminders/reminder-execution-coordinator.js +129 -0
- package/dist/src/execution/reminders/reminder-execution-coordinator.js.map +1 -0
- package/dist/src/execution/reminders/reminder-execution-types.d.ts +161 -0
- package/dist/src/execution/reminders/reminder-execution-types.d.ts.map +1 -0
- package/dist/src/execution/reminders/reminder-execution-types.js +39 -0
- package/dist/src/execution/reminders/reminder-execution-types.js.map +1 -0
- package/dist/src/execution/reminders/reminder-execution-validator.d.ts +45 -0
- package/dist/src/execution/reminders/reminder-execution-validator.d.ts.map +1 -0
- package/dist/src/execution/reminders/reminder-execution-validator.js +92 -0
- package/dist/src/execution/reminders/reminder-execution-validator.js.map +1 -0
- package/dist/src/execution/reminders/reminder-executor.d.ts +62 -0
- package/dist/src/execution/reminders/reminder-executor.d.ts.map +1 -0
- package/dist/src/execution/reminders/reminder-executor.js +113 -0
- package/dist/src/execution/reminders/reminder-executor.js.map +1 -0
- package/dist/src/execution/reminders/reminder-time-parser.d.ts +41 -0
- package/dist/src/execution/reminders/reminder-time-parser.d.ts.map +1 -0
- package/dist/src/execution/reminders/reminder-time-parser.js +113 -0
- package/dist/src/execution/reminders/reminder-time-parser.js.map +1 -0
- package/dist/src/friction/auto-capture.d.ts +38 -0
- package/dist/src/friction/auto-capture.d.ts.map +1 -0
- package/dist/src/friction/auto-capture.js +133 -0
- package/dist/src/friction/auto-capture.js.map +1 -0
- package/dist/src/friction/client.d.ts +39 -0
- package/dist/src/friction/client.d.ts.map +1 -0
- package/dist/src/friction/client.js +165 -0
- package/dist/src/friction/client.js.map +1 -0
- package/dist/src/friction/config.d.ts +16 -0
- package/dist/src/friction/config.d.ts.map +1 -0
- package/dist/src/friction/config.js +56 -0
- package/dist/src/friction/config.js.map +1 -0
- package/dist/src/friction/github-auth.d.ts +41 -0
- package/dist/src/friction/github-auth.d.ts.map +1 -0
- package/dist/src/friction/github-auth.js +155 -0
- package/dist/src/friction/github-auth.js.map +1 -0
- package/dist/src/friction/github-issues.d.ts +51 -0
- package/dist/src/friction/github-issues.d.ts.map +1 -0
- package/dist/src/friction/github-issues.js +118 -0
- package/dist/src/friction/github-issues.js.map +1 -0
- package/dist/src/friction/payout-ledger.d.ts +45 -0
- package/dist/src/friction/payout-ledger.d.ts.map +1 -0
- package/dist/src/friction/payout-ledger.js +111 -0
- package/dist/src/friction/payout-ledger.js.map +1 -0
- package/dist/src/friction/queue.d.ts +42 -0
- package/dist/src/friction/queue.d.ts.map +1 -0
- package/dist/src/friction/queue.js +179 -0
- package/dist/src/friction/queue.js.map +1 -0
- package/dist/src/friction/reviewer.d.ts +42 -0
- package/dist/src/friction/reviewer.d.ts.map +1 -0
- package/dist/src/friction/reviewer.js +269 -0
- package/dist/src/friction/reviewer.js.map +1 -0
- package/dist/src/friction/types.d.ts +63 -0
- package/dist/src/friction/types.d.ts.map +1 -0
- package/dist/src/friction/types.js +18 -0
- package/dist/src/friction/types.js.map +1 -0
- package/dist/src/history/index.d.ts +39 -0
- package/dist/src/history/index.d.ts.map +1 -0
- package/dist/src/history/index.js +41 -0
- package/dist/src/history/index.js.map +1 -0
- package/dist/src/history/session-chain.d.ts +36 -0
- package/dist/src/history/session-chain.d.ts.map +1 -0
- package/dist/src/history/session-chain.js +91 -0
- package/dist/src/history/session-chain.js.map +1 -0
- package/dist/src/history/types.d.ts +130 -0
- package/dist/src/history/types.d.ts.map +1 -0
- package/dist/src/history/types.js +32 -0
- package/dist/src/history/types.js.map +1 -0
- package/dist/src/history/workflow-history.d.ts +48 -0
- package/dist/src/history/workflow-history.d.ts.map +1 -0
- package/dist/src/history/workflow-history.js +116 -0
- package/dist/src/history/workflow-history.js.map +1 -0
- package/dist/src/index.d.ts +88 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +58 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/intake/classify-intent-state.d.ts +20 -0
- package/dist/src/intake/classify-intent-state.d.ts.map +1 -0
- package/dist/src/intake/classify-intent-state.js +29 -0
- package/dist/src/intake/classify-intent-state.js.map +1 -0
- package/dist/src/intake/intake-service.d.ts +105 -0
- package/dist/src/intake/intake-service.d.ts.map +1 -0
- package/dist/src/intake/intake-service.js +407 -0
- package/dist/src/intake/intake-service.js.map +1 -0
- package/dist/src/intake/response-planner.d.ts +25 -0
- package/dist/src/intake/response-planner.d.ts.map +1 -0
- package/dist/src/intake/response-planner.js +52 -0
- package/dist/src/intake/response-planner.js.map +1 -0
- package/dist/src/intake/signal-extractor.d.ts +25 -0
- package/dist/src/intake/signal-extractor.d.ts.map +1 -0
- package/dist/src/intake/signal-extractor.js +42 -0
- package/dist/src/intake/signal-extractor.js.map +1 -0
- package/dist/src/intake/trace.d.ts +157 -0
- package/dist/src/intake/trace.d.ts.map +1 -0
- package/dist/src/intake/trace.js +38 -0
- package/dist/src/intake/trace.js.map +1 -0
- package/dist/src/intake/types.d.ts +70 -0
- package/dist/src/intake/types.d.ts.map +1 -0
- package/dist/src/intake/types.js +30 -0
- package/dist/src/intake/types.js.map +1 -0
- package/dist/src/interaction/defaults.d.ts +12 -0
- package/dist/src/interaction/defaults.d.ts.map +1 -0
- package/dist/src/interaction/defaults.js +26 -0
- package/dist/src/interaction/defaults.js.map +1 -0
- package/dist/src/interaction/guidance-order.d.ts +53 -0
- package/dist/src/interaction/guidance-order.d.ts.map +1 -0
- package/dist/src/interaction/guidance-order.js +131 -0
- package/dist/src/interaction/guidance-order.js.map +1 -0
- package/dist/src/interaction/observe.d.ts +57 -0
- package/dist/src/interaction/observe.d.ts.map +1 -0
- package/dist/src/interaction/observe.js +77 -0
- package/dist/src/interaction/observe.js.map +1 -0
- package/dist/src/interaction/selectors.d.ts +16 -0
- package/dist/src/interaction/selectors.d.ts.map +1 -0
- package/dist/src/interaction/selectors.js +23 -0
- package/dist/src/interaction/selectors.js.map +1 -0
- package/dist/src/interaction/types.d.ts +105 -0
- package/dist/src/interaction/types.d.ts.map +1 -0
- package/dist/src/interaction/types.js +48 -0
- package/dist/src/interaction/types.js.map +1 -0
- package/dist/src/interaction/updater.d.ts +22 -0
- package/dist/src/interaction/updater.d.ts.map +1 -0
- package/dist/src/interaction/updater.js +87 -0
- package/dist/src/interaction/updater.js.map +1 -0
- package/dist/src/present/boundary-explanation/boundary-explanation-detector.d.ts +48 -0
- package/dist/src/present/boundary-explanation/boundary-explanation-detector.d.ts.map +1 -0
- package/dist/src/present/boundary-explanation/boundary-explanation-detector.js +107 -0
- package/dist/src/present/boundary-explanation/boundary-explanation-detector.js.map +1 -0
- package/dist/src/present/boundary-explanation/boundary-explanation-types.d.ts +43 -0
- package/dist/src/present/boundary-explanation/boundary-explanation-types.d.ts.map +1 -0
- package/dist/src/present/boundary-explanation/boundary-explanation-types.js +20 -0
- package/dist/src/present/boundary-explanation/boundary-explanation-types.js.map +1 -0
- package/dist/src/present/boundary-explanation/index.d.ts +10 -0
- package/dist/src/present/boundary-explanation/index.d.ts.map +1 -0
- package/dist/src/present/boundary-explanation/index.js +2 -0
- package/dist/src/present/boundary-explanation/index.js.map +1 -0
- package/dist/src/present/control-visibility/control-visibility-assertions.d.ts +70 -0
- package/dist/src/present/control-visibility/control-visibility-assertions.d.ts.map +1 -0
- package/dist/src/present/control-visibility/control-visibility-assertions.js +138 -0
- package/dist/src/present/control-visibility/control-visibility-assertions.js.map +1 -0
- package/dist/src/present/control-visibility/control-visibility-evaluator.d.ts +67 -0
- package/dist/src/present/control-visibility/control-visibility-evaluator.d.ts.map +1 -0
- package/dist/src/present/control-visibility/control-visibility-evaluator.js +146 -0
- package/dist/src/present/control-visibility/control-visibility-evaluator.js.map +1 -0
- package/dist/src/present/control-visibility/control-visibility-types.d.ts +113 -0
- package/dist/src/present/control-visibility/control-visibility-types.d.ts.map +1 -0
- package/dist/src/present/control-visibility/control-visibility-types.js +24 -0
- package/dist/src/present/control-visibility/control-visibility-types.js.map +1 -0
- package/dist/src/present/control-visibility/index.d.ts +16 -0
- package/dist/src/present/control-visibility/index.d.ts.map +1 -0
- package/dist/src/present/control-visibility/index.js +15 -0
- package/dist/src/present/control-visibility/index.js.map +1 -0
- package/dist/src/present/format.d.ts +57 -0
- package/dist/src/present/format.d.ts.map +1 -0
- package/dist/src/present/format.js +150 -0
- package/dist/src/present/format.js.map +1 -0
- package/dist/src/present/present-coordinator.d.ts +153 -0
- package/dist/src/present/present-coordinator.d.ts.map +1 -0
- package/dist/src/present/present-coordinator.js +213 -0
- package/dist/src/present/present-coordinator.js.map +1 -0
- package/dist/src/present/reminders/index.d.ts +22 -0
- package/dist/src/present/reminders/index.d.ts.map +1 -0
- package/dist/src/present/reminders/index.js +22 -0
- package/dist/src/present/reminders/index.js.map +1 -0
- package/dist/src/present/reminders/reminder-presenter.d.ts +76 -0
- package/dist/src/present/reminders/reminder-presenter.d.ts.map +1 -0
- package/dist/src/present/reminders/reminder-presenter.js +359 -0
- package/dist/src/present/reminders/reminder-presenter.js.map +1 -0
- package/dist/src/present/reminders/reminder-renderer.d.ts +82 -0
- package/dist/src/present/reminders/reminder-renderer.d.ts.map +1 -0
- package/dist/src/present/reminders/reminder-renderer.js +136 -0
- package/dist/src/present/reminders/reminder-renderer.js.map +1 -0
- package/dist/src/present/reminders/reminder-types.d.ts +131 -0
- package/dist/src/present/reminders/reminder-types.d.ts.map +1 -0
- package/dist/src/present/reminders/reminder-types.js +29 -0
- package/dist/src/present/reminders/reminder-types.js.map +1 -0
- package/dist/src/present/types.d.ts +114 -0
- package/dist/src/present/types.d.ts.map +1 -0
- package/dist/src/present/types.js +18 -0
- package/dist/src/present/types.js.map +1 -0
- package/dist/src/product/claude-product-session.d.ts +146 -0
- package/dist/src/product/claude-product-session.d.ts.map +1 -0
- package/dist/src/product/claude-product-session.js +362 -0
- package/dist/src/product/claude-product-session.js.map +1 -0
- package/dist/src/product/cursor-product-session.d.ts +211 -0
- package/dist/src/product/cursor-product-session.d.ts.map +1 -0
- package/dist/src/product/cursor-product-session.js +390 -0
- package/dist/src/product/cursor-product-session.js.map +1 -0
- package/dist/src/product/index.d.ts +28 -0
- package/dist/src/product/index.d.ts.map +1 -0
- package/dist/src/product/index.js +22 -0
- package/dist/src/product/index.js.map +1 -0
- package/dist/src/product/session-resilience/index.d.ts +17 -0
- package/dist/src/product/session-resilience/index.d.ts.map +1 -0
- package/dist/src/product/session-resilience/index.js +15 -0
- package/dist/src/product/session-resilience/index.js.map +1 -0
- package/dist/src/product/session-resilience/session-serializer.d.ts +43 -0
- package/dist/src/product/session-resilience/session-serializer.d.ts.map +1 -0
- package/dist/src/product/session-resilience/session-serializer.js +84 -0
- package/dist/src/product/session-resilience/session-serializer.js.map +1 -0
- package/dist/src/product/session-resilience/session-snapshot-types.d.ts +35 -0
- package/dist/src/product/session-resilience/session-snapshot-types.d.ts.map +1 -0
- package/dist/src/product/session-resilience/session-snapshot-types.js +21 -0
- package/dist/src/product/session-resilience/session-snapshot-types.js.map +1 -0
- package/dist/src/product/session-resilience/session-staleness.d.ts +54 -0
- package/dist/src/product/session-resilience/session-staleness.d.ts.map +1 -0
- package/dist/src/product/session-resilience/session-staleness.js +62 -0
- package/dist/src/product/session-resilience/session-staleness.js.map +1 -0
- package/dist/src/product/session-resilience/session-summary.d.ts +40 -0
- package/dist/src/product/session-resilience/session-summary.d.ts.map +1 -0
- package/dist/src/product/session-resilience/session-summary.js +72 -0
- package/dist/src/product/session-resilience/session-summary.js.map +1 -0
- package/dist/src/prv/patterns.d.ts +32 -0
- package/dist/src/prv/patterns.d.ts.map +1 -0
- package/dist/src/prv/patterns.js +40 -0
- package/dist/src/prv/patterns.js.map +1 -0
- package/dist/src/prv/prv.d.ts +13 -0
- package/dist/src/prv/prv.d.ts.map +1 -0
- package/dist/src/prv/prv.js +22 -0
- package/dist/src/prv/prv.js.map +1 -0
- package/dist/src/prv/types.d.ts +26 -0
- package/dist/src/prv/types.d.ts.map +1 -0
- package/dist/src/prv/types.js +15 -0
- package/dist/src/prv/types.js.map +1 -0
- package/dist/src/safety/detectors/arbitrary-exec.detector.d.ts +3 -0
- package/dist/src/safety/detectors/arbitrary-exec.detector.d.ts.map +1 -0
- package/dist/src/safety/detectors/arbitrary-exec.detector.js +31 -0
- package/dist/src/safety/detectors/arbitrary-exec.detector.js.map +1 -0
- package/dist/src/safety/detectors/bulk-data-exfil.detector.d.ts +21 -0
- package/dist/src/safety/detectors/bulk-data-exfil.detector.d.ts.map +1 -0
- package/dist/src/safety/detectors/bulk-data-exfil.detector.js +90 -0
- package/dist/src/safety/detectors/bulk-data-exfil.detector.js.map +1 -0
- package/dist/src/safety/detectors/destructive.detector.d.ts +3 -0
- package/dist/src/safety/detectors/destructive.detector.d.ts.map +1 -0
- package/dist/src/safety/detectors/destructive.detector.js +28 -0
- package/dist/src/safety/detectors/destructive.detector.js.map +1 -0
- package/dist/src/safety/detectors/evasion.detector.d.ts +3 -0
- package/dist/src/safety/detectors/evasion.detector.d.ts.map +1 -0
- package/dist/src/safety/detectors/evasion.detector.js +28 -0
- package/dist/src/safety/detectors/evasion.detector.js.map +1 -0
- package/dist/src/safety/detectors/secret-access.detector.d.ts +31 -0
- package/dist/src/safety/detectors/secret-access.detector.d.ts.map +1 -0
- package/dist/src/safety/detectors/secret-access.detector.js +78 -0
- package/dist/src/safety/detectors/secret-access.detector.js.map +1 -0
- package/dist/src/safety/registry.d.ts +9 -0
- package/dist/src/safety/registry.d.ts.map +1 -0
- package/dist/src/safety/registry.js +22 -0
- package/dist/src/safety/registry.js.map +1 -0
- package/dist/src/safety/safety-gate.d.ts +16 -0
- package/dist/src/safety/safety-gate.d.ts.map +1 -0
- package/dist/src/safety/safety-gate.js +26 -0
- package/dist/src/safety/safety-gate.js.map +1 -0
- package/dist/src/safety/types.d.ts +35 -0
- package/dist/src/safety/types.d.ts.map +1 -0
- package/dist/src/safety/types.js +14 -0
- package/dist/src/safety/types.js.map +1 -0
- package/dist/src/shell/claude-shell.d.ts +63 -0
- package/dist/src/shell/claude-shell.d.ts.map +1 -0
- package/dist/src/shell/claude-shell.js +81 -0
- package/dist/src/shell/claude-shell.js.map +1 -0
- package/dist/src/shell/cli/friction-admin.d.ts +14 -0
- package/dist/src/shell/cli/friction-admin.d.ts.map +1 -0
- package/dist/src/shell/cli/friction-admin.js +276 -0
- package/dist/src/shell/cli/friction-admin.js.map +1 -0
- package/dist/src/shell/cli/friction-report.d.ts +16 -0
- package/dist/src/shell/cli/friction-report.d.ts.map +1 -0
- package/dist/src/shell/cli/friction-report.js +156 -0
- package/dist/src/shell/cli/friction-report.js.map +1 -0
- package/dist/src/shell/cli/main.d.ts +68 -0
- package/dist/src/shell/cli/main.d.ts.map +1 -0
- package/dist/src/shell/cli/main.js +488 -0
- package/dist/src/shell/cli/main.js.map +1 -0
- package/dist/src/shell/cli/use-steady.d.ts +26 -0
- package/dist/src/shell/cli/use-steady.d.ts.map +1 -0
- package/dist/src/shell/cli/use-steady.js +117 -0
- package/dist/src/shell/cli/use-steady.js.map +1 -0
- package/dist/src/shell/cursor-shell.d.ts +63 -0
- package/dist/src/shell/cursor-shell.d.ts.map +1 -0
- package/dist/src/shell/cursor-shell.js +88 -0
- package/dist/src/shell/cursor-shell.js.map +1 -0
- package/dist/src/shell/defaults.d.ts +51 -0
- package/dist/src/shell/defaults.d.ts.map +1 -0
- package/dist/src/shell/defaults.js +78 -0
- package/dist/src/shell/defaults.js.map +1 -0
- package/dist/src/shell/history-render.d.ts +56 -0
- package/dist/src/shell/history-render.d.ts.map +1 -0
- package/dist/src/shell/history-render.js +166 -0
- package/dist/src/shell/history-render.js.map +1 -0
- package/dist/src/shell/index.d.ts +43 -0
- package/dist/src/shell/index.d.ts.map +1 -0
- package/dist/src/shell/index.js +45 -0
- package/dist/src/shell/index.js.map +1 -0
- package/dist/src/shell/render.d.ts +42 -0
- package/dist/src/shell/render.d.ts.map +1 -0
- package/dist/src/shell/render.js +122 -0
- package/dist/src/shell/render.js.map +1 -0
- package/dist/src/shell/types.d.ts +46 -0
- package/dist/src/shell/types.d.ts.map +1 -0
- package/dist/src/shell/types.js +19 -0
- package/dist/src/shell/types.js.map +1 -0
- package/dist/src/shell/workflow-defaults.d.ts +23 -0
- package/dist/src/shell/workflow-defaults.d.ts.map +1 -0
- package/dist/src/shell/workflow-defaults.js +27 -0
- package/dist/src/shell/workflow-defaults.js.map +1 -0
- package/dist/src/shell/workflow-render.d.ts +54 -0
- package/dist/src/shell/workflow-render.d.ts.map +1 -0
- package/dist/src/shell/workflow-render.js +319 -0
- package/dist/src/shell/workflow-render.js.map +1 -0
- package/dist/src/shell/workflow-shell.d.ts +110 -0
- package/dist/src/shell/workflow-shell.d.ts.map +1 -0
- package/dist/src/shell/workflow-shell.js +180 -0
- package/dist/src/shell/workflow-shell.js.map +1 -0
- package/dist/src/skills/audit.d.ts +118 -0
- package/dist/src/skills/audit.d.ts.map +1 -0
- package/dist/src/skills/audit.js +147 -0
- package/dist/src/skills/audit.js.map +1 -0
- package/dist/src/skills/invocation.d.ts +131 -0
- package/dist/src/skills/invocation.d.ts.map +1 -0
- package/dist/src/skills/invocation.js +165 -0
- package/dist/src/skills/invocation.js.map +1 -0
- package/dist/src/skills/loader.d.ts +70 -0
- package/dist/src/skills/loader.d.ts.map +1 -0
- package/dist/src/skills/loader.js +220 -0
- package/dist/src/skills/loader.js.map +1 -0
- package/dist/src/skills/local-recovery-adapter.d.ts +49 -0
- package/dist/src/skills/local-recovery-adapter.d.ts.map +1 -0
- package/dist/src/skills/local-recovery-adapter.js +184 -0
- package/dist/src/skills/local-recovery-adapter.js.map +1 -0
- package/dist/src/skills/parser.d.ts +53 -0
- package/dist/src/skills/parser.d.ts.map +1 -0
- package/dist/src/skills/parser.js +336 -0
- package/dist/src/skills/parser.js.map +1 -0
- package/dist/src/skills/registry.d.ts +123 -0
- package/dist/src/skills/registry.d.ts.map +1 -0
- package/dist/src/skills/registry.js +144 -0
- package/dist/src/skills/registry.js.map +1 -0
- package/dist/src/skills/types.d.ts +242 -0
- package/dist/src/skills/types.d.ts.map +1 -0
- package/dist/src/skills/types.js +50 -0
- package/dist/src/skills/types.js.map +1 -0
- package/dist/src/skills/validator.d.ts +31 -0
- package/dist/src/skills/validator.d.ts.map +1 -0
- package/dist/src/skills/validator.js +366 -0
- package/dist/src/skills/validator.js.map +1 -0
- package/dist/src/ucp/envelope.d.ts +165 -0
- package/dist/src/ucp/envelope.d.ts.map +1 -0
- package/dist/src/ucp/envelope.js +241 -0
- package/dist/src/ucp/envelope.js.map +1 -0
- package/dist/src/ucp/hashes.d.ts +36 -0
- package/dist/src/ucp/hashes.d.ts.map +1 -0
- package/dist/src/ucp/hashes.js +59 -0
- package/dist/src/ucp/hashes.js.map +1 -0
- package/dist/src/ucp/mappers/map-artifact.d.ts +58 -0
- package/dist/src/ucp/mappers/map-artifact.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-artifact.js +51 -0
- package/dist/src/ucp/mappers/map-artifact.js.map +1 -0
- package/dist/src/ucp/mappers/map-change-interpretation.d.ts +12 -0
- package/dist/src/ucp/mappers/map-change-interpretation.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-change-interpretation.js +18 -0
- package/dist/src/ucp/mappers/map-change-interpretation.js.map +1 -0
- package/dist/src/ucp/mappers/map-completion.d.ts +10 -0
- package/dist/src/ucp/mappers/map-completion.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-completion.js +24 -0
- package/dist/src/ucp/mappers/map-completion.js.map +1 -0
- package/dist/src/ucp/mappers/map-context.d.ts +9 -0
- package/dist/src/ucp/mappers/map-context.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-context.js +13 -0
- package/dist/src/ucp/mappers/map-context.js.map +1 -0
- package/dist/src/ucp/mappers/map-debug-trace.d.ts +10 -0
- package/dist/src/ucp/mappers/map-debug-trace.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-debug-trace.js +18 -0
- package/dist/src/ucp/mappers/map-debug-trace.js.map +1 -0
- package/dist/src/ucp/mappers/map-disambiguation.d.ts +10 -0
- package/dist/src/ucp/mappers/map-disambiguation.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-disambiguation.js +21 -0
- package/dist/src/ucp/mappers/map-disambiguation.js.map +1 -0
- package/dist/src/ucp/mappers/map-execution-trace.d.ts +64 -0
- package/dist/src/ucp/mappers/map-execution-trace.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-execution-trace.js +57 -0
- package/dist/src/ucp/mappers/map-execution-trace.js.map +1 -0
- package/dist/src/ucp/mappers/map-intent-interpretation.d.ts +11 -0
- package/dist/src/ucp/mappers/map-intent-interpretation.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-intent-interpretation.js +17 -0
- package/dist/src/ucp/mappers/map-intent-interpretation.js.map +1 -0
- package/dist/src/ucp/mappers/map-intent.d.ts +9 -0
- package/dist/src/ucp/mappers/map-intent.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-intent.js +11 -0
- package/dist/src/ucp/mappers/map-intent.js.map +1 -0
- package/dist/src/ucp/mappers/map-prv.d.ts +10 -0
- package/dist/src/ucp/mappers/map-prv.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-prv.js +14 -0
- package/dist/src/ucp/mappers/map-prv.js.map +1 -0
- package/dist/src/ucp/mappers/map-reminder-execution.d.ts +57 -0
- package/dist/src/ucp/mappers/map-reminder-execution.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-reminder-execution.js +69 -0
- package/dist/src/ucp/mappers/map-reminder-execution.js.map +1 -0
- package/dist/src/ucp/mappers/map-replay-report.d.ts +81 -0
- package/dist/src/ucp/mappers/map-replay-report.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-replay-report.js +76 -0
- package/dist/src/ucp/mappers/map-replay-report.js.map +1 -0
- package/dist/src/ucp/mappers/map-response.d.ts +13 -0
- package/dist/src/ucp/mappers/map-response.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-response.js +25 -0
- package/dist/src/ucp/mappers/map-response.js.map +1 -0
- package/dist/src/ucp/mappers/map-safety.d.ts +14 -0
- package/dist/src/ucp/mappers/map-safety.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-safety.js +22 -0
- package/dist/src/ucp/mappers/map-safety.js.map +1 -0
- package/dist/src/ucp/persistence/index.d.ts +24 -0
- package/dist/src/ucp/persistence/index.d.ts.map +1 -0
- package/dist/src/ucp/persistence/index.js +22 -0
- package/dist/src/ucp/persistence/index.js.map +1 -0
- package/dist/src/ucp/persistence/query.d.ts +164 -0
- package/dist/src/ucp/persistence/query.d.ts.map +1 -0
- package/dist/src/ucp/persistence/query.js +240 -0
- package/dist/src/ucp/persistence/query.js.map +1 -0
- package/dist/src/ucp/persistence/reader.d.ts +43 -0
- package/dist/src/ucp/persistence/reader.d.ts.map +1 -0
- package/dist/src/ucp/persistence/reader.js +104 -0
- package/dist/src/ucp/persistence/reader.js.map +1 -0
- package/dist/src/ucp/persistence/store.d.ts +77 -0
- package/dist/src/ucp/persistence/store.d.ts.map +1 -0
- package/dist/src/ucp/persistence/store.js +177 -0
- package/dist/src/ucp/persistence/store.js.map +1 -0
- package/dist/src/ucp/persistence/write.d.ts +48 -0
- package/dist/src/ucp/persistence/write.d.ts.map +1 -0
- package/dist/src/ucp/persistence/write.js +59 -0
- package/dist/src/ucp/persistence/write.js.map +1 -0
- package/dist/src/ucp/projection.d.ts +146 -0
- package/dist/src/ucp/projection.d.ts.map +1 -0
- package/dist/src/ucp/projection.js +139 -0
- package/dist/src/ucp/projection.js.map +1 -0
- package/dist/src/ucp/types.d.ts +585 -0
- package/dist/src/ucp/types.d.ts.map +1 -0
- package/dist/src/ucp/types.js +57 -0
- package/dist/src/ucp/types.js.map +1 -0
- package/dist/src/understand/completion/completion.d.ts +26 -0
- package/dist/src/understand/completion/completion.d.ts.map +1 -0
- package/dist/src/understand/completion/completion.js +45 -0
- package/dist/src/understand/completion/completion.js.map +1 -0
- package/dist/src/understand/completion/rules.d.ts +61 -0
- package/dist/src/understand/completion/rules.d.ts.map +1 -0
- package/dist/src/understand/completion/rules.js +268 -0
- package/dist/src/understand/completion/rules.js.map +1 -0
- package/dist/src/understand/completion/types.d.ts +68 -0
- package/dist/src/understand/completion/types.d.ts.map +1 -0
- package/dist/src/understand/completion/types.js +34 -0
- package/dist/src/understand/completion/types.js.map +1 -0
- package/dist/src/understand/context/context-alignment.d.ts +18 -0
- package/dist/src/understand/context/context-alignment.d.ts.map +1 -0
- package/dist/src/understand/context/context-alignment.js +61 -0
- package/dist/src/understand/context/context-alignment.js.map +1 -0
- package/dist/src/understand/context/types.d.ts +20 -0
- package/dist/src/understand/context/types.d.ts.map +1 -0
- package/dist/src/understand/context/types.js +13 -0
- package/dist/src/understand/context/types.js.map +1 -0
- package/dist/src/understand/disambiguation/detectors/missing-context.detector.d.ts +12 -0
- package/dist/src/understand/disambiguation/detectors/missing-context.detector.d.ts.map +1 -0
- package/dist/src/understand/disambiguation/detectors/missing-context.detector.js +60 -0
- package/dist/src/understand/disambiguation/detectors/missing-context.detector.js.map +1 -0
- package/dist/src/understand/disambiguation/detectors/overloaded-term.detector.d.ts +13 -0
- package/dist/src/understand/disambiguation/detectors/overloaded-term.detector.d.ts.map +1 -0
- package/dist/src/understand/disambiguation/detectors/overloaded-term.detector.js +57 -0
- package/dist/src/understand/disambiguation/detectors/overloaded-term.detector.js.map +1 -0
- package/dist/src/understand/disambiguation/detectors/typo-adjacent.detector.d.ts +16 -0
- package/dist/src/understand/disambiguation/detectors/typo-adjacent.detector.d.ts.map +1 -0
- package/dist/src/understand/disambiguation/detectors/typo-adjacent.detector.js +56 -0
- package/dist/src/understand/disambiguation/detectors/typo-adjacent.detector.js.map +1 -0
- package/dist/src/understand/disambiguation/registry.d.ts +14 -0
- package/dist/src/understand/disambiguation/registry.d.ts.map +1 -0
- package/dist/src/understand/disambiguation/registry.js +27 -0
- package/dist/src/understand/disambiguation/registry.js.map +1 -0
- package/dist/src/understand/disambiguation/types.d.ts +34 -0
- package/dist/src/understand/disambiguation/types.d.ts.map +1 -0
- package/dist/src/understand/disambiguation/types.js +15 -0
- package/dist/src/understand/disambiguation/types.js.map +1 -0
- package/dist/src/understand/intent-interpretation/intent-interpretation.d.ts +86 -0
- package/dist/src/understand/intent-interpretation/intent-interpretation.d.ts.map +1 -0
- package/dist/src/understand/intent-interpretation/intent-interpretation.js +141 -0
- package/dist/src/understand/intent-interpretation/intent-interpretation.js.map +1 -0
- package/dist/src/understand/intent-interpretation/interpreters/color-intent.interpreter.d.ts +33 -0
- package/dist/src/understand/intent-interpretation/interpreters/color-intent.interpreter.d.ts.map +1 -0
- package/dist/src/understand/intent-interpretation/interpreters/color-intent.interpreter.js +66 -0
- package/dist/src/understand/intent-interpretation/interpreters/color-intent.interpreter.js.map +1 -0
- package/dist/src/understand/intent-interpretation/interpreters/config-intent.interpreter.d.ts +20 -0
- package/dist/src/understand/intent-interpretation/interpreters/config-intent.interpreter.d.ts.map +1 -0
- package/dist/src/understand/intent-interpretation/interpreters/config-intent.interpreter.js +80 -0
- package/dist/src/understand/intent-interpretation/interpreters/config-intent.interpreter.js.map +1 -0
- package/dist/src/understand/intent-interpretation/interpreters/text-intent.interpreter.d.ts +25 -0
- package/dist/src/understand/intent-interpretation/interpreters/text-intent.interpreter.d.ts.map +1 -0
- package/dist/src/understand/intent-interpretation/interpreters/text-intent.interpreter.js +47 -0
- package/dist/src/understand/intent-interpretation/interpreters/text-intent.interpreter.js.map +1 -0
- package/dist/src/understand/intent-interpretation/interpreters/workflow-intent.interpreter.d.ts +35 -0
- package/dist/src/understand/intent-interpretation/interpreters/workflow-intent.interpreter.d.ts.map +1 -0
- package/dist/src/understand/intent-interpretation/interpreters/workflow-intent.interpreter.js +89 -0
- package/dist/src/understand/intent-interpretation/interpreters/workflow-intent.interpreter.js.map +1 -0
- package/dist/src/understand/intent-interpretation/registry.d.ts +18 -0
- package/dist/src/understand/intent-interpretation/registry.d.ts.map +1 -0
- package/dist/src/understand/intent-interpretation/registry.js +26 -0
- package/dist/src/understand/intent-interpretation/registry.js.map +1 -0
- package/dist/src/understand/intent-interpretation/types.d.ts +83 -0
- package/dist/src/understand/intent-interpretation/types.d.ts.map +1 -0
- package/dist/src/understand/intent-interpretation/types.js +40 -0
- package/dist/src/understand/intent-interpretation/types.js.map +1 -0
- package/dist/src/understand/interpretation/intent.d.ts +72 -0
- package/dist/src/understand/interpretation/intent.d.ts.map +1 -0
- package/dist/src/understand/interpretation/intent.js +414 -0
- package/dist/src/understand/interpretation/intent.js.map +1 -0
- package/dist/src/understand/interpretation/interpretation.d.ts +26 -0
- package/dist/src/understand/interpretation/interpretation.d.ts.map +1 -0
- package/dist/src/understand/interpretation/interpretation.js +43 -0
- package/dist/src/understand/interpretation/interpretation.js.map +1 -0
- package/dist/src/understand/interpretation/parser.d.ts +20 -0
- package/dist/src/understand/interpretation/parser.d.ts.map +1 -0
- package/dist/src/understand/interpretation/parser.js +88 -0
- package/dist/src/understand/interpretation/parser.js.map +1 -0
- package/dist/src/understand/interpretation/rules.d.ts +19 -0
- package/dist/src/understand/interpretation/rules.d.ts.map +1 -0
- package/dist/src/understand/interpretation/rules.js +222 -0
- package/dist/src/understand/interpretation/rules.js.map +1 -0
- package/dist/src/understand/interpretation/types.d.ts +90 -0
- package/dist/src/understand/interpretation/types.d.ts.map +1 -0
- package/dist/src/understand/interpretation/types.js +29 -0
- package/dist/src/understand/interpretation/types.js.map +1 -0
- package/dist/src/understand/shared/types.d.ts +13 -0
- package/dist/src/understand/shared/types.d.ts.map +1 -0
- package/dist/src/understand/shared/types.js +9 -0
- package/dist/src/understand/shared/types.js.map +1 -0
- package/dist/src/understand/silent-guidance/index.d.ts +4 -0
- package/dist/src/understand/silent-guidance/index.d.ts.map +1 -0
- package/dist/src/understand/silent-guidance/index.js +3 -0
- package/dist/src/understand/silent-guidance/index.js.map +1 -0
- package/dist/src/understand/silent-guidance/selector.d.ts +44 -0
- package/dist/src/understand/silent-guidance/selector.d.ts.map +1 -0
- package/dist/src/understand/silent-guidance/selector.js +158 -0
- package/dist/src/understand/silent-guidance/selector.js.map +1 -0
- package/dist/src/understand/silent-guidance/templates.d.ts +31 -0
- package/dist/src/understand/silent-guidance/templates.d.ts.map +1 -0
- package/dist/src/understand/silent-guidance/templates.js +109 -0
- package/dist/src/understand/silent-guidance/templates.js.map +1 -0
- package/dist/src/understand/silent-guidance/types.d.ts +36 -0
- package/dist/src/understand/silent-guidance/types.d.ts.map +1 -0
- package/dist/src/understand/silent-guidance/types.js +2 -0
- package/dist/src/understand/silent-guidance/types.js.map +1 -0
- package/dist/src/workflow/coordinator.d.ts +197 -0
- package/dist/src/workflow/coordinator.d.ts.map +1 -0
- package/dist/src/workflow/coordinator.js +682 -0
- package/dist/src/workflow/coordinator.js.map +1 -0
- package/dist/src/workflow/index.d.ts +30 -0
- package/dist/src/workflow/index.d.ts.map +1 -0
- package/dist/src/workflow/index.js +30 -0
- package/dist/src/workflow/index.js.map +1 -0
- package/dist/src/workflow/types.d.ts +213 -0
- package/dist/src/workflow/types.d.ts.map +1 -0
- package/dist/src/workflow/types.js +27 -0
- package/dist/src/workflow/types.js.map +1 -0
- package/package.json +54 -0
- package/ui/README.md +73 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// Copyright 2026 Shortgigs LLC. Licensed under the Apache License, Version 2.0.
|
|
2
|
+
/**
|
|
3
|
+
* src/friction/queue.ts
|
|
4
|
+
*
|
|
5
|
+
* SQLite-backed local queue for friction events.
|
|
6
|
+
*
|
|
7
|
+
* Events are written here first (synchronously, fire-and-forget),
|
|
8
|
+
* then flushed to the collection backend asynchronously with retries.
|
|
9
|
+
* This ensures the core workflow path is never blocked or slowed.
|
|
10
|
+
*
|
|
11
|
+
* Storage: ~/.usesteady/friction-queue.db
|
|
12
|
+
* Schema: one table — friction_queue
|
|
13
|
+
*/
|
|
14
|
+
import Database from "better-sqlite3";
|
|
15
|
+
import { randomUUID } from "node:crypto";
|
|
16
|
+
import { mkdirSync, existsSync } from "node:fs";
|
|
17
|
+
import { homedir } from "node:os";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
// ─── Paths ────────────────────────────────────────────────────────────────────
|
|
20
|
+
const USESTEADY_DIR = join(homedir(), ".usesteady");
|
|
21
|
+
const DB_PATH = join(USESTEADY_DIR, "friction-queue.db");
|
|
22
|
+
// ─── Lazy singleton DB ────────────────────────────────────────────────────────
|
|
23
|
+
let _db = null;
|
|
24
|
+
function db() {
|
|
25
|
+
if (_db)
|
|
26
|
+
return _db;
|
|
27
|
+
if (!existsSync(USESTEADY_DIR))
|
|
28
|
+
mkdirSync(USESTEADY_DIR, { recursive: true });
|
|
29
|
+
_db = new Database(DB_PATH);
|
|
30
|
+
_db.pragma("journal_mode = WAL");
|
|
31
|
+
_db.pragma("synchronous = NORMAL");
|
|
32
|
+
_db.exec(`
|
|
33
|
+
CREATE TABLE IF NOT EXISTS friction_queue (
|
|
34
|
+
id TEXT PRIMARY KEY,
|
|
35
|
+
event_json TEXT NOT NULL,
|
|
36
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
37
|
+
attempts INTEGER NOT NULL DEFAULT 0,
|
|
38
|
+
created_at TEXT NOT NULL,
|
|
39
|
+
submitted_at TEXT,
|
|
40
|
+
last_error TEXT
|
|
41
|
+
);
|
|
42
|
+
CREATE INDEX IF NOT EXISTS idx_status ON friction_queue (status);
|
|
43
|
+
`);
|
|
44
|
+
return _db;
|
|
45
|
+
}
|
|
46
|
+
// ─── Serialisation helpers ────────────────────────────────────────────────────
|
|
47
|
+
function rowToEntry(row) {
|
|
48
|
+
const base = {
|
|
49
|
+
id: row["id"],
|
|
50
|
+
event: JSON.parse(row["event_json"]),
|
|
51
|
+
status: row["status"],
|
|
52
|
+
attempts: row["attempts"],
|
|
53
|
+
createdAt: row["created_at"],
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
...base,
|
|
57
|
+
...(row["submitted_at"] ? { submittedAt: row["submitted_at"] } : {}),
|
|
58
|
+
...(row["last_error"] ? { lastError: row["last_error"] } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
62
|
+
/**
|
|
63
|
+
* Add a new friction event to the queue.
|
|
64
|
+
* Called synchronously (no await) from auto-capture hooks so the
|
|
65
|
+
* core workflow path is never delayed.
|
|
66
|
+
*/
|
|
67
|
+
export function enqueue(event) {
|
|
68
|
+
const id = randomUUID();
|
|
69
|
+
const now = new Date().toISOString();
|
|
70
|
+
try {
|
|
71
|
+
db().prepare(`
|
|
72
|
+
INSERT INTO friction_queue (id, event_json, status, attempts, created_at)
|
|
73
|
+
VALUES (?, ?, 'pending', 0, ?)
|
|
74
|
+
`).run(id, JSON.stringify(event), now);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
// Queue write failure must never propagate to the caller — this is a
|
|
78
|
+
// best-effort side-channel.
|
|
79
|
+
process.stderr.write(`[friction-queue] enqueue failed: ${String(err)}\n`);
|
|
80
|
+
}
|
|
81
|
+
return id;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Return all entries with the given status.
|
|
85
|
+
*/
|
|
86
|
+
export function listByStatus(status) {
|
|
87
|
+
try {
|
|
88
|
+
const rows = db().prepare("SELECT * FROM friction_queue WHERE status = ? ORDER BY created_at ASC").all(status);
|
|
89
|
+
return rows.map(rowToEntry);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Return pending entries older than `olderThanMs` milliseconds,
|
|
97
|
+
* up to `limit`. Used by the flush loop to pick retry candidates.
|
|
98
|
+
*/
|
|
99
|
+
export function pendingEntries(limit = 20) {
|
|
100
|
+
try {
|
|
101
|
+
const rows = db().prepare(`
|
|
102
|
+
SELECT * FROM friction_queue
|
|
103
|
+
WHERE status = 'pending'
|
|
104
|
+
ORDER BY created_at ASC
|
|
105
|
+
LIMIT ?
|
|
106
|
+
`).all(limit);
|
|
107
|
+
return rows.map(rowToEntry);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Mark an entry as successfully submitted.
|
|
115
|
+
*/
|
|
116
|
+
export function markSubmitted(id) {
|
|
117
|
+
try {
|
|
118
|
+
db().prepare(`
|
|
119
|
+
UPDATE friction_queue
|
|
120
|
+
SET status = 'submitted', submitted_at = ?, attempts = attempts + 1
|
|
121
|
+
WHERE id = ?
|
|
122
|
+
`).run(new Date().toISOString(), id);
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
process.stderr.write(`[friction-queue] markSubmitted failed: ${String(err)}\n`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Record a submission attempt failure. After MAX_ATTEMPTS the entry
|
|
130
|
+
* is moved to 'failed' so it doesn't clog the retry loop forever.
|
|
131
|
+
*/
|
|
132
|
+
const MAX_ATTEMPTS = 5;
|
|
133
|
+
export function markFailed(id, error) {
|
|
134
|
+
try {
|
|
135
|
+
const row = db().prepare("SELECT attempts FROM friction_queue WHERE id = ?").get(id);
|
|
136
|
+
const nextAttempts = (row?.attempts ?? 0) + 1;
|
|
137
|
+
const nextStatus = nextAttempts >= MAX_ATTEMPTS ? "failed" : "pending";
|
|
138
|
+
db().prepare(`
|
|
139
|
+
UPDATE friction_queue
|
|
140
|
+
SET status = ?, attempts = ?, last_error = ?
|
|
141
|
+
WHERE id = ?
|
|
142
|
+
`).run(nextStatus, nextAttempts, error, id);
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
process.stderr.write(`[friction-queue] markFailed failed: ${String(err)}\n`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Delete submitted entries older than `keepDays` to keep the DB small.
|
|
150
|
+
*/
|
|
151
|
+
export function pruneSubmitted(keepDays = 30) {
|
|
152
|
+
try {
|
|
153
|
+
const cutoff = new Date(Date.now() - keepDays * 86_400_000).toISOString();
|
|
154
|
+
const result = db().prepare(`
|
|
155
|
+
DELETE FROM friction_queue
|
|
156
|
+
WHERE status = 'submitted' AND submitted_at < ?
|
|
157
|
+
`).run(cutoff);
|
|
158
|
+
return result.changes;
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return 0;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Total counts by status — useful for CLI status display.
|
|
166
|
+
*/
|
|
167
|
+
export function queueStats() {
|
|
168
|
+
try {
|
|
169
|
+
const rows = db().prepare("SELECT status, COUNT(*) AS cnt FROM friction_queue GROUP BY status").all();
|
|
170
|
+
const stats = { pending: 0, submitted: 0, failed: 0 };
|
|
171
|
+
for (const r of rows)
|
|
172
|
+
stats[r.status] = r.cnt;
|
|
173
|
+
return stats;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return { pending: 0, submitted: 0, failed: 0 };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/friction/queue.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF;;;;;;;;;;;GAWG;AAEH,OAAO,QAAQ,MAAmB,gBAAgB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAa,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAgB,SAAS,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAmB,WAAW,CAAC;AAG9C,iFAAiF;AAEjF,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACpD,MAAM,OAAO,GAAS,IAAI,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;AAE/D,iFAAiF;AAEjF,IAAI,GAAG,GAA6B,IAAI,CAAC;AAEzC,SAAS,EAAE;IACT,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAEpB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9E,GAAG,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5B,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACjC,GAAG,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAEnC,GAAG,CAAC,IAAI,CAAC;;;;;;;;;;;GAWR,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AAEjF,SAAS,UAAU,CAAC,GAA4B;IAC9C,MAAM,IAAI,GAAG;QACX,EAAE,EAAS,GAAG,CAAC,IAAI,CAAkB;QACrC,KAAK,EAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAW,CAAkB;QACnE,MAAM,EAAK,GAAG,CAAC,QAAQ,CAAmB;QAC1C,QAAQ,EAAG,GAAG,CAAC,UAAU,CAAY;QACrC,SAAS,EAAE,GAAG,CAAC,YAAY,CAAW;KACvC,CAAC;IACF,OAAO;QACL,GAAG,IAAI;QACP,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,cAAc,CAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAG,CAAC,CAAC,EAAE,SAAS,EAAI,GAAG,CAAC,YAAY,CAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/E,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,KAAoB;IAC1C,MAAM,EAAE,GAAI,UAAU,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,EAAE,EAAE,CAAC,OAAO,CAAC;;;KAGZ,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,qEAAqE;QACrE,4BAA4B;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,OAAO,CACvB,uEAAuE,CACxE,CAAC,GAAG,CAAC,MAAM,CAA8B,CAAC;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAK,GAAG,EAAE;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC;;;;;KAKzB,CAAC,CAAC,GAAG,CAAC,KAAK,CAA8B,CAAC;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,IAAI,CAAC;QACH,EAAE,EAAE,CAAC,OAAO,CAAC;;;;KAIZ,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,KAAa;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,OAAO,CACtB,kDAAkD,CACnD,CAAC,GAAG,CAAC,EAAE,CAAqC,CAAC;QAE9C,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAgB,YAAY,IAAI,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpF,EAAE,EAAE,CAAC,OAAO,CAAC;;;;KAIZ,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAQ,GAAG,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1E,MAAM,MAAM,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC;;;KAG3B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACf,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,OAAO,CACvB,oEAAoE,CACrE,CAAC,GAAG,EAA4C,CAAC;QAElD,MAAM,KAAK,GAAgC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACnF,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/friction/reviewer.ts
|
|
3
|
+
*
|
|
4
|
+
* AI-powered friction report classifier.
|
|
5
|
+
*
|
|
6
|
+
* Calls Claude claude-haiku-4-5 (cheap, fast) with a structured prompt to decide
|
|
7
|
+
* whether a submitted friction report represents genuine user friction worth
|
|
8
|
+
* paying out, or should be rejected (spam, nonsense, gaming the system).
|
|
9
|
+
*
|
|
10
|
+
* Uses the Anthropic Messages API directly via fetch — no SDK dependency.
|
|
11
|
+
* Requires ANTHROPIC_API_KEY in the environment.
|
|
12
|
+
*/
|
|
13
|
+
import type { GitHubIssue } from "./github-issues.js";
|
|
14
|
+
/**
|
|
15
|
+
* Load ANTHROPIC_API_KEY from multiple locations in priority order:
|
|
16
|
+
* 1. process.env (already set by caller / CI)
|
|
17
|
+
* 2. ~/.usesteady/.env (ops-specific, never committed)
|
|
18
|
+
* 3. <cwd>/.env.local
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadAnthropicKey(): string | undefined;
|
|
21
|
+
export type ReviewDecision = "approved" | "rejected" | "skip";
|
|
22
|
+
export interface ReviewVerdict {
|
|
23
|
+
readonly decision: ReviewDecision;
|
|
24
|
+
readonly reason: string;
|
|
25
|
+
readonly confidence: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Classify a single GitHub friction issue.
|
|
29
|
+
* Uses Claude when ANTHROPIC_API_KEY is available; falls back to rule-based
|
|
30
|
+
* heuristics otherwise (good for demos and offline use).
|
|
31
|
+
* Returns a ReviewVerdict with decision, reason, and confidence.
|
|
32
|
+
*/
|
|
33
|
+
export declare function classifyReport(issue: GitHubIssue): Promise<ReviewVerdict>;
|
|
34
|
+
/**
|
|
35
|
+
* Classify a batch of issues, printing progress to stderr.
|
|
36
|
+
* Returns results in the same order as the input array.
|
|
37
|
+
*/
|
|
38
|
+
export declare function classifyBatch(issues: GitHubIssue[]): Promise<Array<{
|
|
39
|
+
issue: GitHubIssue;
|
|
40
|
+
verdict: ReviewVerdict;
|
|
41
|
+
}>>;
|
|
42
|
+
//# sourceMappingURL=reviewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../../src/friction/reviewer.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAA0B,oBAAoB,CAAC;AAG1E;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAmBrD;AAID,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAI,cAAc,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AA2MD;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CA8B/E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,EAAE,GACpB,OAAO,CAAC,KAAK,CAAC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,CAAC,CAAC,CAiBhE"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
// Copyright 2026 Shortgigs LLC. Licensed under the Apache License, Version 2.0.
|
|
2
|
+
/**
|
|
3
|
+
* src/friction/reviewer.ts
|
|
4
|
+
*
|
|
5
|
+
* AI-powered friction report classifier.
|
|
6
|
+
*
|
|
7
|
+
* Calls Claude claude-haiku-4-5 (cheap, fast) with a structured prompt to decide
|
|
8
|
+
* whether a submitted friction report represents genuine user friction worth
|
|
9
|
+
* paying out, or should be rejected (spam, nonsense, gaming the system).
|
|
10
|
+
*
|
|
11
|
+
* Uses the Anthropic Messages API directly via fetch — no SDK dependency.
|
|
12
|
+
* Requires ANTHROPIC_API_KEY in the environment.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
15
|
+
import { homedir } from "node:os";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { parseIssueContext, parseIssueMetadata } from "./github-issues.js";
|
|
18
|
+
/**
|
|
19
|
+
* Load ANTHROPIC_API_KEY from multiple locations in priority order:
|
|
20
|
+
* 1. process.env (already set by caller / CI)
|
|
21
|
+
* 2. ~/.usesteady/.env (ops-specific, never committed)
|
|
22
|
+
* 3. <cwd>/.env.local
|
|
23
|
+
*/
|
|
24
|
+
export function loadAnthropicKey() {
|
|
25
|
+
if (process.env["ANTHROPIC_API_KEY"])
|
|
26
|
+
return process.env["ANTHROPIC_API_KEY"];
|
|
27
|
+
const candidates = [
|
|
28
|
+
join(homedir(), ".usesteady", ".env"),
|
|
29
|
+
join(process.cwd(), ".env.local"),
|
|
30
|
+
join(process.cwd(), ".env"),
|
|
31
|
+
];
|
|
32
|
+
for (const path of candidates) {
|
|
33
|
+
if (!existsSync(path))
|
|
34
|
+
continue;
|
|
35
|
+
const lines = readFileSync(path, "utf-8").split("\n");
|
|
36
|
+
for (const line of lines) {
|
|
37
|
+
const m = line.match(/^\s*ANTHROPIC_API_KEY\s*=\s*(.+)\s*$/);
|
|
38
|
+
if (m?.[1])
|
|
39
|
+
return m[1].trim().replace(/^["']|["']$/g, "");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
// ─── Prompt ───────────────────────────────────────────────────────────────────
|
|
45
|
+
const SYSTEM_PROMPT = `\
|
|
46
|
+
You are a senior UX reviewer for UseSteady, a developer workflow tool.
|
|
47
|
+
Your job is to evaluate user-submitted "friction reports" and decide whether
|
|
48
|
+
each one represents genuine user friction that Shortgigs LLC should pay out.
|
|
49
|
+
|
|
50
|
+
UseSteady is a CLI/UI tool that lets developers run governed, step-by-step
|
|
51
|
+
code changes. Users submit a natural-language task (e.g. "rename Button.tsx
|
|
52
|
+
to PrimaryButton.tsx"), review it before it runs, and approve each step.
|
|
53
|
+
|
|
54
|
+
The intake system rejects tasks it cannot parse into a supported operation.
|
|
55
|
+
Supported operations are things like: mkdir, create file, rename file, move
|
|
56
|
+
file, delete file, run script. Intentionally vague or multi-scope instructions
|
|
57
|
+
like "fix everything" or "refactor the app" are correctly rejected.
|
|
58
|
+
|
|
59
|
+
APPROVAL CRITERIA (pay the reporter):
|
|
60
|
+
- The task input is something a reasonable developer would type, expecting it
|
|
61
|
+
to work (e.g. "update the README", "add a test for login", "fix the linter")
|
|
62
|
+
- The error feedback the user received was unclear or didn't tell them what to
|
|
63
|
+
do instead
|
|
64
|
+
- The friction was real — the user genuinely didn't know how to proceed
|
|
65
|
+
- Auto-captured failures (kind: workflow-failure) are approved if the task
|
|
66
|
+
input is natural and the failure note shows skipped_by_intake
|
|
67
|
+
|
|
68
|
+
REJECTION CRITERIA (do not pay):
|
|
69
|
+
- The task input is obviously nonsensical, a test string, or intentionally
|
|
70
|
+
designed to trigger an error (e.g. "aaa", "test", "do the thing", "???")
|
|
71
|
+
- The reporter is clearly gaming the system (submitting the same failure
|
|
72
|
+
repeatedly with trivially invalid inputs)
|
|
73
|
+
- The kind is "server-error" and the error is an infrastructure problem,
|
|
74
|
+
not a UX friction point
|
|
75
|
+
- The issue looks like a duplicate of another already-approved issue in the
|
|
76
|
+
same session (same runId prefix)
|
|
77
|
+
|
|
78
|
+
SKIP (needs human review):
|
|
79
|
+
- Ambiguous cases where you are less than 60% confident
|
|
80
|
+
- Reports where the context is missing or truncated
|
|
81
|
+
|
|
82
|
+
Respond ONLY with a JSON object (no markdown fences), structured like:
|
|
83
|
+
{
|
|
84
|
+
"decision": "approved" | "rejected" | "skip",
|
|
85
|
+
"reason": "one or two sentence explanation",
|
|
86
|
+
"confidence": 0-100
|
|
87
|
+
}`;
|
|
88
|
+
/**
|
|
89
|
+
* Strip prompt-injection patterns from reporter-controlled strings before
|
|
90
|
+
* they are included in the Claude user message. We remove sequences that
|
|
91
|
+
* attempt to address the system/assistant role or escape the data boundary.
|
|
92
|
+
*/
|
|
93
|
+
function sanitizeField(raw, maxLen = 300) {
|
|
94
|
+
if (!raw)
|
|
95
|
+
return "(none)";
|
|
96
|
+
return raw
|
|
97
|
+
.slice(0, maxLen)
|
|
98
|
+
// Remove instruction-like role markers that could hijack the model.
|
|
99
|
+
.replace(/\b(ignore|disregard|forget)\b.{0,60}(instruction|above|prior|previous|system|prompt)/gi, "[redacted]")
|
|
100
|
+
.replace(/<\/?(?:system|assistant|user|instruction)>/gi, "[redacted]")
|
|
101
|
+
// Strip markdown code fences that might be used to smuggle structured output.
|
|
102
|
+
.replace(/```[\s\S]*?```/g, "[code-block]")
|
|
103
|
+
.trim();
|
|
104
|
+
}
|
|
105
|
+
function buildUserMessage(issue) {
|
|
106
|
+
const ctx = parseIssueContext(issue.body);
|
|
107
|
+
const meta = parseIssueMetadata(issue.body);
|
|
108
|
+
// All reporter-controlled fields are sanitized before inclusion.
|
|
109
|
+
const taskInputs = (ctx.taskInputs ?? []).map(t => sanitizeField(t, 200)).join("; ") || "(none)";
|
|
110
|
+
const failureNote = sanitizeField(ctx.failureNote);
|
|
111
|
+
const notes = ctx.notes ? `Reporter notes: ${sanitizeField(ctx.notes)}` : "";
|
|
112
|
+
const kind = sanitizeField(ctx.kind ?? meta?.["kind"], 50);
|
|
113
|
+
const phase = sanitizeField(ctx.phase, 50);
|
|
114
|
+
// Issue title is reporter-controlled too (used as the friction "headline").
|
|
115
|
+
const title = sanitizeField(issue.title, 200);
|
|
116
|
+
return [
|
|
117
|
+
`Issue #${issue.number}: ${title}`,
|
|
118
|
+
``,
|
|
119
|
+
`Kind: ${kind}`,
|
|
120
|
+
`Phase: ${phase}`,
|
|
121
|
+
`Task inputs: ${taskInputs}`,
|
|
122
|
+
`Failure note: ${failureNote}`,
|
|
123
|
+
notes,
|
|
124
|
+
`Reporter: @${issue.user.login}`,
|
|
125
|
+
`Captured: ${meta?.["capturedAt"] ?? issue.created_at}`,
|
|
126
|
+
`UseSteady version: ${meta?.["usesteadyVersion"] ?? "unknown"}`,
|
|
127
|
+
].filter(Boolean).join("\n");
|
|
128
|
+
}
|
|
129
|
+
async function callClaude(userMessage) {
|
|
130
|
+
const apiKey = loadAnthropicKey();
|
|
131
|
+
if (!apiKey) {
|
|
132
|
+
throw new Error("ANTHROPIC_API_KEY is not set.\n" +
|
|
133
|
+
" Add it to ~/.usesteady/.env:\n" +
|
|
134
|
+
" ANTHROPIC_API_KEY=sk-ant-...\n" +
|
|
135
|
+
" Or set it as an environment variable before running.");
|
|
136
|
+
}
|
|
137
|
+
const resp = await fetch("https://api.anthropic.com/v1/messages", {
|
|
138
|
+
method: "POST",
|
|
139
|
+
headers: {
|
|
140
|
+
"x-api-key": apiKey,
|
|
141
|
+
"anthropic-version": "2023-06-01",
|
|
142
|
+
"content-type": "application/json",
|
|
143
|
+
},
|
|
144
|
+
body: JSON.stringify({
|
|
145
|
+
model: "claude-haiku-4-5",
|
|
146
|
+
max_tokens: 256,
|
|
147
|
+
system: SYSTEM_PROMPT,
|
|
148
|
+
messages: [{ role: "user", content: userMessage }],
|
|
149
|
+
}),
|
|
150
|
+
});
|
|
151
|
+
if (!resp.ok) {
|
|
152
|
+
const text = await resp.text().catch(() => resp.statusText);
|
|
153
|
+
throw new Error(`Anthropic API ${resp.status}: ${text}`);
|
|
154
|
+
}
|
|
155
|
+
const data = await resp.json();
|
|
156
|
+
const text = data.content.find(b => b.type === "text")?.text ?? "";
|
|
157
|
+
return text.trim();
|
|
158
|
+
}
|
|
159
|
+
// ─── Rule-based fallback ──────────────────────────────────────────────────────
|
|
160
|
+
const JUNK_PATTERNS = [
|
|
161
|
+
/^(test|aaa+|bbb+|xxx+|zzz+|foo|bar|baz|\?+|\.+|123+|abc)$/i,
|
|
162
|
+
/^.{1,3}$/, // fewer than 4 chars
|
|
163
|
+
];
|
|
164
|
+
const NATURAL_LANGUAGE_SIGNALS = [
|
|
165
|
+
/\b(add|create|update|fix|remove|rename|delete|move|refactor|change|install|run|build|generate)\b/i,
|
|
166
|
+
/\b(file|folder|component|function|class|test|style|config|readme|button|page|route|api)\b/i,
|
|
167
|
+
];
|
|
168
|
+
/**
|
|
169
|
+
* Rule-based classifier — runs when ANTHROPIC_API_KEY is unavailable.
|
|
170
|
+
* Deterministic, free, and good enough for obvious cases.
|
|
171
|
+
*/
|
|
172
|
+
function ruleBasedClassify(issue) {
|
|
173
|
+
const ctx = parseIssueContext(issue.body);
|
|
174
|
+
const inputs = ctx.taskInputs ?? [];
|
|
175
|
+
const primaryInput = inputs[0] ?? "";
|
|
176
|
+
const failureNote = ctx.failureNote ?? "";
|
|
177
|
+
const kind = ctx.kind ?? "";
|
|
178
|
+
// Server errors are not UX friction — skip for human review
|
|
179
|
+
if (kind === "server-error") {
|
|
180
|
+
return { decision: "skip", reason: "Server errors need manual review.", confidence: 70 };
|
|
181
|
+
}
|
|
182
|
+
// Obvious junk inputs — reject
|
|
183
|
+
for (const pattern of JUNK_PATTERNS) {
|
|
184
|
+
if (pattern.test(primaryInput.trim())) {
|
|
185
|
+
return {
|
|
186
|
+
decision: "rejected",
|
|
187
|
+
reason: `Task input "${primaryInput}" is too short or pattern-matches known junk.`,
|
|
188
|
+
confidence: 90,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// skipped_by_intake with natural-language input — approve
|
|
193
|
+
const isSkippedByIntake = failureNote.includes("skipped_by_intake");
|
|
194
|
+
const looksNatural = NATURAL_LANGUAGE_SIGNALS.some(p => p.test(primaryInput));
|
|
195
|
+
if (isSkippedByIntake && looksNatural && primaryInput.length > 8) {
|
|
196
|
+
return {
|
|
197
|
+
decision: "approved",
|
|
198
|
+
reason: `Task "${primaryInput}" looks like genuine natural language that intake should handle better.`,
|
|
199
|
+
confidence: 72,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (isSkippedByIntake && primaryInput.length > 8) {
|
|
203
|
+
return {
|
|
204
|
+
decision: "skip",
|
|
205
|
+
reason: `Task "${primaryInput}" — skipped_by_intake but language is ambiguous. Needs human review.`,
|
|
206
|
+
confidence: 55,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
decision: "skip",
|
|
211
|
+
reason: "Could not determine validity with rule-based classifier. Set ANTHROPIC_API_KEY for AI review.",
|
|
212
|
+
confidence: 0,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
216
|
+
/**
|
|
217
|
+
* Classify a single GitHub friction issue.
|
|
218
|
+
* Uses Claude when ANTHROPIC_API_KEY is available; falls back to rule-based
|
|
219
|
+
* heuristics otherwise (good for demos and offline use).
|
|
220
|
+
* Returns a ReviewVerdict with decision, reason, and confidence.
|
|
221
|
+
*/
|
|
222
|
+
export async function classifyReport(issue) {
|
|
223
|
+
// Use rule-based fallback when no API key is configured
|
|
224
|
+
if (!loadAnthropicKey()) {
|
|
225
|
+
return ruleBasedClassify(issue);
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
const userMessage = buildUserMessage(issue);
|
|
229
|
+
const raw = await callClaude(userMessage);
|
|
230
|
+
// Strip any accidental markdown fences
|
|
231
|
+
const json = raw.replace(/^```(?:json)?\s*/i, "").replace(/```\s*$/, "").trim();
|
|
232
|
+
const parsed = JSON.parse(json);
|
|
233
|
+
const decision = ["approved", "rejected", "skip"].includes(parsed.decision)
|
|
234
|
+
? parsed.decision
|
|
235
|
+
: "skip";
|
|
236
|
+
const reason = typeof parsed.reason === "string" ? parsed.reason : "No reason returned.";
|
|
237
|
+
const confidence = typeof parsed.confidence === "number"
|
|
238
|
+
? Math.max(0, Math.min(100, Math.round(parsed.confidence)))
|
|
239
|
+
: 50;
|
|
240
|
+
return { decision, reason, confidence };
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
return {
|
|
244
|
+
decision: "skip",
|
|
245
|
+
reason: `Classifier error: ${String(err)}`,
|
|
246
|
+
confidence: 0,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Classify a batch of issues, printing progress to stderr.
|
|
252
|
+
* Returns results in the same order as the input array.
|
|
253
|
+
*/
|
|
254
|
+
export async function classifyBatch(issues) {
|
|
255
|
+
const results = [];
|
|
256
|
+
for (let i = 0; i < issues.length; i++) {
|
|
257
|
+
const issue = issues[i];
|
|
258
|
+
process.stderr.write(` Classifying #${issue.number} (${i + 1}/${issues.length})...\r`);
|
|
259
|
+
const verdict = await classifyReport(issue);
|
|
260
|
+
results.push({ issue, verdict });
|
|
261
|
+
// Polite delay to avoid rate limits
|
|
262
|
+
if (i < issues.length - 1) {
|
|
263
|
+
await new Promise(r => setTimeout(r, 500));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
process.stderr.write(" ".repeat(60) + "\r"); // clear progress line
|
|
267
|
+
return results;
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../../../src/friction/reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/friction/types.ts
|
|
3
|
+
*
|
|
4
|
+
* Shared types for the friction capture pipeline.
|
|
5
|
+
*
|
|
6
|
+
* Design rules:
|
|
7
|
+
* - All types are plain data (no methods, no class instances).
|
|
8
|
+
* - Nothing here imports from the workflow domain — friction capture
|
|
9
|
+
* is a side-channel; it must never block or slow the core path.
|
|
10
|
+
* - The admin / payout / collection backend types live in the private
|
|
11
|
+
* the private ops repo and are NOT exported from here.
|
|
12
|
+
*/
|
|
13
|
+
export type FrictionKind = "workflow-failure" | "server-error" | "ux-block" | "install-error" | "manual-cli";
|
|
14
|
+
export interface FrictionEvent {
|
|
15
|
+
readonly kind: FrictionKind;
|
|
16
|
+
readonly capturedAt: string;
|
|
17
|
+
readonly usesteadyVersion: string;
|
|
18
|
+
readonly context: FrictionContext;
|
|
19
|
+
readonly notes?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface FrictionContext {
|
|
22
|
+
readonly runId?: string;
|
|
23
|
+
readonly phase?: string;
|
|
24
|
+
readonly taskInputs?: readonly string[];
|
|
25
|
+
readonly failureNote?: string;
|
|
26
|
+
readonly workspaceRoot?: string;
|
|
27
|
+
readonly errorMessage?: string;
|
|
28
|
+
readonly errorStack?: string;
|
|
29
|
+
readonly route?: string;
|
|
30
|
+
readonly platform?: string;
|
|
31
|
+
readonly nodeVersion?: string;
|
|
32
|
+
}
|
|
33
|
+
export type QueueStatus = "pending" | "submitted" | "failed";
|
|
34
|
+
export interface QueueEntry {
|
|
35
|
+
readonly id: string;
|
|
36
|
+
readonly event: FrictionEvent;
|
|
37
|
+
readonly status: QueueStatus;
|
|
38
|
+
readonly attempts: number;
|
|
39
|
+
readonly createdAt: string;
|
|
40
|
+
readonly submittedAt?: string;
|
|
41
|
+
readonly lastError?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface FrictionReport {
|
|
44
|
+
readonly id: string;
|
|
45
|
+
readonly kind: FrictionKind;
|
|
46
|
+
readonly reporterGitHub?: string;
|
|
47
|
+
readonly event: FrictionEvent;
|
|
48
|
+
readonly submittedAt: string;
|
|
49
|
+
}
|
|
50
|
+
export interface AuthToken {
|
|
51
|
+
readonly githubToken: string;
|
|
52
|
+
readonly githubLogin: string;
|
|
53
|
+
readonly githubEmail?: string;
|
|
54
|
+
readonly obtainedAt: string;
|
|
55
|
+
}
|
|
56
|
+
export interface FrictionConfig {
|
|
57
|
+
/** GitHub API endpoint for issue creation. Default: Shortgigs collection repo. */
|
|
58
|
+
readonly frictionEndpoint: string;
|
|
59
|
+
/** GitHub repo slug for label + issue management. */
|
|
60
|
+
readonly frictionRepo: string;
|
|
61
|
+
}
|
|
62
|
+
export declare const DEFAULT_FRICTION_CONFIG: FrictionConfig;
|
|
63
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/friction/types.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;GAWG;AAIH,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,cAAc,GACd,UAAU,GACV,eAAe,GACf,YAAY,CAAC;AAIjB,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAc,YAAY,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAQ,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAW,eAAe,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAY,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAE9B,QAAQ,CAAC,KAAK,CAAC,EAAQ,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAQ,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAG,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAGhC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAI,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAS,MAAM,CAAC;IAG/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAID,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAW,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAQ,aAAa,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAO,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAK,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAI,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAG,MAAM,CAAC;CAC9B;AAID,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAc,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAY,YAAY,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAW,aAAa,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAK,MAAM,CAAC;CACjC;AAID,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,WAAW,EAAK,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAK,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAI,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAM,MAAM,CAAC;CACjC;AAID,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAM,MAAM,CAAC;CACnC;AAED,eAAO,MAAM,uBAAuB,EAAE,cAGrC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Copyright 2026 Shortgigs LLC. Licensed under the Apache License, Version 2.0.
|
|
2
|
+
/**
|
|
3
|
+
* src/friction/types.ts
|
|
4
|
+
*
|
|
5
|
+
* Shared types for the friction capture pipeline.
|
|
6
|
+
*
|
|
7
|
+
* Design rules:
|
|
8
|
+
* - All types are plain data (no methods, no class instances).
|
|
9
|
+
* - Nothing here imports from the workflow domain — friction capture
|
|
10
|
+
* is a side-channel; it must never block or slow the core path.
|
|
11
|
+
* - The admin / payout / collection backend types live in the private
|
|
12
|
+
* the private ops repo and are NOT exported from here.
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_FRICTION_CONFIG = {
|
|
15
|
+
frictionEndpoint: "https://api.github.com/repos/<your-org>/<your-friction-repo>/issues",
|
|
16
|
+
frictionRepo: "<your-org>/<your-friction-repo>",
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/friction/types.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF;;;;;;;;;;;GAWG;AAiFH,MAAM,CAAC,MAAM,uBAAuB,GAAmB;IACrD,gBAAgB,EAAE,qEAAqE;IACvF,YAAY,EAAM,iCAAiC;CACpD,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 10B: History / Audit — public API.
|
|
3
|
+
*
|
|
4
|
+
* ── What this module exports ──────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* Types — WorkflowHistorySummary, WorkflowAuditRecord, SessionChain, etc.
|
|
7
|
+
* Tier 1 — getWorkflowHistories(storeDir)
|
|
8
|
+
* Tier 2 — getWorkflowAuditRecord(storeDir, workflowRunId)
|
|
9
|
+
* Internals — buildSessionChain (exposed for testing and advanced consumers)
|
|
10
|
+
*
|
|
11
|
+
* ── Authority ─────────────────────────────────────────────────────────────────
|
|
12
|
+
*
|
|
13
|
+
* Zero. The history module is entirely read-only.
|
|
14
|
+
* It imports from src/ucp/persistence/ only.
|
|
15
|
+
* It accepts storeDir strings — never live WorkflowRun objects.
|
|
16
|
+
*
|
|
17
|
+
* ── Consumer pattern ──────────────────────────────────────────────────────────
|
|
18
|
+
*
|
|
19
|
+
* // Tier 1 — list all completed/stopped runs (cheap):
|
|
20
|
+
* const summaries = getWorkflowHistories(storeDir);
|
|
21
|
+
* for (const s of summaries) { ... s.workflowName, s.finalOutcome, s.tasks ... }
|
|
22
|
+
*
|
|
23
|
+
* // Tier 2 — full provenance for one run (expensive):
|
|
24
|
+
* const audit = getWorkflowAuditRecord(storeDir, workflowRunId);
|
|
25
|
+
* if (audit) {
|
|
26
|
+
* for (const t of audit.tasks) {
|
|
27
|
+
* if (t.session?.cursorReceipt) { ... }
|
|
28
|
+
* if (t.session?.cursorRefused) { ... }
|
|
29
|
+
* }
|
|
30
|
+
* }
|
|
31
|
+
*
|
|
32
|
+
* See: docs/phase-10a-history-audit-design.md — design record
|
|
33
|
+
* docs/phase-10b-baseline.md — implementation freeze
|
|
34
|
+
*/
|
|
35
|
+
export type { HistoryTaskOutcome, WorkflowTaskHistoryEntry, WorkflowHistorySummary, SessionChain, WorkflowTaskAuditEntry, WorkflowAuditRecord, } from "./types.js";
|
|
36
|
+
export { getWorkflowHistories } from "./workflow-history.js";
|
|
37
|
+
export { getWorkflowAuditRecord } from "./workflow-history.js";
|
|
38
|
+
export { buildSessionChain } from "./session-chain.js";
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/history/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAIH,YAAY,EACV,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAI/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
|