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,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reminder time parser — Phase 6, Execution Layer.
|
|
3
|
+
*
|
|
4
|
+
* ── Purpose ───────────────────────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* Converts a time_text phrase into a structured ParsedTime.
|
|
7
|
+
* Conservative, regex-only, fully deterministic.
|
|
8
|
+
*
|
|
9
|
+
* ── What it does NOT do ───────────────────────────────────────────────────────
|
|
10
|
+
*
|
|
11
|
+
* Does NOT produce Date objects or resolved timestamps.
|
|
12
|
+
* Does NOT assume a default time for day-only phrases.
|
|
13
|
+
* Does NOT handle timezones.
|
|
14
|
+
* Does NOT do fuzzy matching or ML-based inference.
|
|
15
|
+
*
|
|
16
|
+
* ── Pattern priority (first match wins) ──────────────────────────────────────
|
|
17
|
+
*
|
|
18
|
+
* 1. relative_offset — "in N minutes" / "in N hours"
|
|
19
|
+
* 2. day_with_time — day qualifier + explicit time phrase
|
|
20
|
+
* 3. time_of_day — explicit time with no day qualifier
|
|
21
|
+
* 4. unresolvable — anything else (including day qualifier without time)
|
|
22
|
+
*
|
|
23
|
+
* ── Day qualifier without time → unresolvable ────────────────────────────────
|
|
24
|
+
*
|
|
25
|
+
* "remind me tomorrow" has no time → unresolvable.
|
|
26
|
+
* The execution layer does not guess a default time.
|
|
27
|
+
* The caller must surface the missing time to the user.
|
|
28
|
+
*/
|
|
29
|
+
// ─── Patterns ─────────────────────────────────────────────────────────────────
|
|
30
|
+
/** "in 30 minutes" */
|
|
31
|
+
const RELATIVE_MINUTES_RE = /\bin\s+(\d+)\s+minutes?\b/i;
|
|
32
|
+
/** "in 2 hours" */
|
|
33
|
+
const RELATIVE_HOURS_RE = /\bin\s+(\d+)\s+hours?\b/i;
|
|
34
|
+
/**
|
|
35
|
+
* Explicit time phrase: "at 3pm", "at 09:30 am", "at 14:00"
|
|
36
|
+
* Groups: [1]=hour, [2]=minute (optional), [3]=am/pm (optional)
|
|
37
|
+
*/
|
|
38
|
+
const TIME_OF_DAY_RE = /\bat\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)?\b/i;
|
|
39
|
+
/**
|
|
40
|
+
* Day qualifier: "tomorrow", "today", "next Monday" … "next Sunday"
|
|
41
|
+
* Captured as a single string for textual preservation.
|
|
42
|
+
*/
|
|
43
|
+
const DAY_QUALIFIER_RE = /\b(tomorrow|today|next\s+(?:monday|tuesday|wednesday|thursday|friday|saturday|sunday))\b/i;
|
|
44
|
+
function extractTimeParts(match) {
|
|
45
|
+
const hour = parseInt(match[1], 10);
|
|
46
|
+
const minute = match[2] !== undefined ? parseInt(match[2], 10) : 0;
|
|
47
|
+
const raw = match[3]?.toLowerCase();
|
|
48
|
+
const period = raw === "am" ? "am" : raw === "pm" ? "pm" : "24h";
|
|
49
|
+
return { hour, minute, period };
|
|
50
|
+
}
|
|
51
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
52
|
+
/**
|
|
53
|
+
* Parse a time_text phrase into a structured ParsedTime.
|
|
54
|
+
*
|
|
55
|
+
* Pure function — same input always produces the same output.
|
|
56
|
+
* Called once inside executeReminder(); the result is passed to
|
|
57
|
+
* validateExecutionRequest(req, parsedTime) to avoid duplicate parsing.
|
|
58
|
+
*
|
|
59
|
+
* @param time_text The time phrase extracted by the Present Layer, e.g.
|
|
60
|
+
* "tomorrow at 9am", "in 30 minutes", "at 3pm".
|
|
61
|
+
*/
|
|
62
|
+
export function parseTimeText(time_text) {
|
|
63
|
+
const input = time_text.trim();
|
|
64
|
+
// ── 1. Relative offset ────────────────────────────────────────────────────
|
|
65
|
+
const relMin = RELATIVE_MINUTES_RE.exec(input);
|
|
66
|
+
if (relMin) {
|
|
67
|
+
return {
|
|
68
|
+
kind: "relative_offset",
|
|
69
|
+
offset_minutes: parseInt(relMin[1], 10),
|
|
70
|
+
basis: input,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const relHr = RELATIVE_HOURS_RE.exec(input);
|
|
74
|
+
if (relHr) {
|
|
75
|
+
return {
|
|
76
|
+
kind: "relative_offset",
|
|
77
|
+
offset_minutes: parseInt(relHr[1], 10) * 60,
|
|
78
|
+
basis: input,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// ── 2. Day qualifier + time ───────────────────────────────────────────────
|
|
82
|
+
const dayMatch = DAY_QUALIFIER_RE.exec(input);
|
|
83
|
+
const timeMatch = TIME_OF_DAY_RE.exec(input);
|
|
84
|
+
if (dayMatch && timeMatch) {
|
|
85
|
+
const { hour, minute, period } = extractTimeParts(timeMatch);
|
|
86
|
+
return {
|
|
87
|
+
kind: "day_with_time",
|
|
88
|
+
day: dayMatch[1].toLowerCase(),
|
|
89
|
+
hour,
|
|
90
|
+
minute,
|
|
91
|
+
period,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Day qualifier with no explicit time → unresolvable.
|
|
95
|
+
// We do not guess a default time (e.g. "tomorrow" alone is ambiguous).
|
|
96
|
+
if (dayMatch && !timeMatch) {
|
|
97
|
+
return {
|
|
98
|
+
kind: "unresolvable",
|
|
99
|
+
reason: `day qualifier "${dayMatch[1].toLowerCase()}" present but no time specified`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// ── 3. Time of day only (no day qualifier) ────────────────────────────────
|
|
103
|
+
if (timeMatch) {
|
|
104
|
+
const { hour, minute, period } = extractTimeParts(timeMatch);
|
|
105
|
+
return { kind: "time_of_day", hour, minute, period };
|
|
106
|
+
}
|
|
107
|
+
// ── 4. Unresolvable ───────────────────────────────────────────────────────
|
|
108
|
+
return {
|
|
109
|
+
kind: "unresolvable",
|
|
110
|
+
reason: `could not parse time from: "${input}"`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=reminder-time-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reminder-time-parser.js","sourceRoot":"","sources":["../../../../src/execution/reminders/reminder-time-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/friction/auto-capture.ts
|
|
3
|
+
*
|
|
4
|
+
* Automatic friction event capture hooks for the server layer.
|
|
5
|
+
*
|
|
6
|
+
* These functions are the only integration points between the core
|
|
7
|
+
* workflow domain and the friction pipeline. They must be:
|
|
8
|
+
* - Synchronous (no awaiting — never block the HTTP response path)
|
|
9
|
+
* - Zero-authority (read-only access to run state)
|
|
10
|
+
* - Silent on failure (errors logged to stderr, never rethrown)
|
|
11
|
+
*
|
|
12
|
+
* Called from server.ts after state-mutating actions.
|
|
13
|
+
*/
|
|
14
|
+
import type { FrictionContext } from "./types.js";
|
|
15
|
+
import type { WorkflowRun } from "../workflow/types.js";
|
|
16
|
+
/**
|
|
17
|
+
* Call this after every workflow run that has reached a terminal phase
|
|
18
|
+
* (task_failed, stopped, skipped_by_intake).
|
|
19
|
+
*
|
|
20
|
+
* Enqueues a "workflow-failure" friction event and schedules a flush.
|
|
21
|
+
* Never throws — any error is written to stderr and silently dropped.
|
|
22
|
+
*/
|
|
23
|
+
export declare function captureWorkflowFailure(run: WorkflowRun, workspaceRoot: string): void;
|
|
24
|
+
/**
|
|
25
|
+
* Call this from an Express error middleware to capture server-side errors.
|
|
26
|
+
* The middleware should be registered AFTER all routes in server.ts.
|
|
27
|
+
*/
|
|
28
|
+
export declare function captureServerError(err: Error, route: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Enqueue a user-initiated friction report (from UI or CLI).
|
|
31
|
+
* Called with pre-built context from the UI report modal or `usesteady report`.
|
|
32
|
+
*/
|
|
33
|
+
export declare function captureManualReport(opts: {
|
|
34
|
+
kind: "ux-block" | "manual-cli" | "install-error";
|
|
35
|
+
notes: string;
|
|
36
|
+
context?: Partial<FrictionContext>;
|
|
37
|
+
}): string;
|
|
38
|
+
//# sourceMappingURL=auto-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-capture.d.ts","sourceRoot":"","sources":["../../../src/friction/auto-capture.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAc,sBAAsB,CAAC;AA2BhE;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAY,WAAW,EAC1B,aAAa,EAAE,MAAM,GACpB,IAAI,CAuDN;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAI,KAAK,EACZ,KAAK,EAAE,MAAM,GACZ,IAAI,CAmBN;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,IAAI,EAAW,UAAU,GAAG,YAAY,GAAG,eAAe,CAAC;IAC3D,KAAK,EAAU,MAAM,CAAC;IACtB,OAAO,CAAC,EAAO,OAAO,CAAC,eAAe,CAAC,CAAC;CACzC,GAAG,MAAM,CAYT"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Copyright 2026 Shortgigs LLC. Licensed under the Apache License, Version 2.0.
|
|
2
|
+
/**
|
|
3
|
+
* src/friction/auto-capture.ts
|
|
4
|
+
*
|
|
5
|
+
* Automatic friction event capture hooks for the server layer.
|
|
6
|
+
*
|
|
7
|
+
* These functions are the only integration points between the core
|
|
8
|
+
* workflow domain and the friction pipeline. They must be:
|
|
9
|
+
* - Synchronous (no awaiting — never block the HTTP response path)
|
|
10
|
+
* - Zero-authority (read-only access to run state)
|
|
11
|
+
* - Silent on failure (errors logged to stderr, never rethrown)
|
|
12
|
+
*
|
|
13
|
+
* Called from server.ts after state-mutating actions.
|
|
14
|
+
*/
|
|
15
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { enqueue } from "./queue.js";
|
|
18
|
+
import { scheduleFlush } from "./client.js";
|
|
19
|
+
import { readConfig } from "./config.js";
|
|
20
|
+
// ─── Version helper ───────────────────────────────────────────────────────────
|
|
21
|
+
let _version = null;
|
|
22
|
+
function packageVersion() {
|
|
23
|
+
if (_version)
|
|
24
|
+
return _version;
|
|
25
|
+
try {
|
|
26
|
+
// Walk up from dist/src/friction/ or src/friction/ to find package.json
|
|
27
|
+
const candidates = [
|
|
28
|
+
join(process.cwd(), "package.json"),
|
|
29
|
+
];
|
|
30
|
+
for (const p of candidates) {
|
|
31
|
+
if (existsSync(p)) {
|
|
32
|
+
const pkg = JSON.parse(readFileSync(p, "utf-8"));
|
|
33
|
+
_version = pkg.version ?? "unknown";
|
|
34
|
+
return _version;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch { /* ignore */ }
|
|
39
|
+
_version = "unknown";
|
|
40
|
+
return _version;
|
|
41
|
+
}
|
|
42
|
+
// ─── Terminal phase capture ───────────────────────────────────────────────────
|
|
43
|
+
/**
|
|
44
|
+
* Call this after every workflow run that has reached a terminal phase
|
|
45
|
+
* (task_failed, stopped, skipped_by_intake).
|
|
46
|
+
*
|
|
47
|
+
* Enqueues a "workflow-failure" friction event and schedules a flush.
|
|
48
|
+
* Never throws — any error is written to stderr and silently dropped.
|
|
49
|
+
*/
|
|
50
|
+
export function captureWorkflowFailure(run, workspaceRoot) {
|
|
51
|
+
const failurePhasess = new Set([
|
|
52
|
+
"task_failed",
|
|
53
|
+
"stopped",
|
|
54
|
+
]);
|
|
55
|
+
// Also capture completed runs that have skipped_by_intake tasks
|
|
56
|
+
const hasSkippedByIntake = run.tasks.some((t) => t.outcome === "skipped_by_intake");
|
|
57
|
+
const isCapturable = failurePhasess.has(run.phase) ||
|
|
58
|
+
(run.phase === "completed" && hasSkippedByIntake);
|
|
59
|
+
if (!isCapturable)
|
|
60
|
+
return;
|
|
61
|
+
try {
|
|
62
|
+
const kind = run.phase === "stopped" ? "workflow-failure" : "workflow-failure";
|
|
63
|
+
const taskInputs = run.tasks.map((t) => t.spec.input);
|
|
64
|
+
// Find the first failed/skipped task for the failure note
|
|
65
|
+
const failedTask = run.tasks.find((t) => t.outcome === "rejected" ||
|
|
66
|
+
t.outcome === "stopped" ||
|
|
67
|
+
t.outcome === "skipped_by_intake");
|
|
68
|
+
const context = {
|
|
69
|
+
runId: run.workflowRunId,
|
|
70
|
+
phase: run.phase,
|
|
71
|
+
taskInputs,
|
|
72
|
+
platform: process.platform,
|
|
73
|
+
nodeVersion: process.version,
|
|
74
|
+
...(failedTask ? {
|
|
75
|
+
failureNote: `Task "${failedTask.spec.input.slice(0, 80)}" — outcome: ${failedTask.outcome}`,
|
|
76
|
+
} : {}),
|
|
77
|
+
...(workspaceRoot ? { workspaceRoot } : {}),
|
|
78
|
+
};
|
|
79
|
+
enqueue({
|
|
80
|
+
kind,
|
|
81
|
+
capturedAt: new Date().toISOString(),
|
|
82
|
+
usesteadyVersion: packageVersion(),
|
|
83
|
+
context,
|
|
84
|
+
});
|
|
85
|
+
// Schedule flush — non-blocking, runs after current tick
|
|
86
|
+
scheduleFlush(readConfig());
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
process.stderr.write(`[friction-capture] captureWorkflowFailure error: ${String(err)}\n`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Call this from an Express error middleware to capture server-side errors.
|
|
94
|
+
* The middleware should be registered AFTER all routes in server.ts.
|
|
95
|
+
*/
|
|
96
|
+
export function captureServerError(err, route) {
|
|
97
|
+
try {
|
|
98
|
+
enqueue({
|
|
99
|
+
kind: "server-error",
|
|
100
|
+
capturedAt: new Date().toISOString(),
|
|
101
|
+
usesteadyVersion: packageVersion(),
|
|
102
|
+
context: {
|
|
103
|
+
errorMessage: err.message,
|
|
104
|
+
route,
|
|
105
|
+
platform: process.platform,
|
|
106
|
+
nodeVersion: process.version,
|
|
107
|
+
...(err.stack ? { errorStack: err.stack.slice(0, 1000) } : {}),
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
scheduleFlush(readConfig());
|
|
111
|
+
}
|
|
112
|
+
catch (captureErr) {
|
|
113
|
+
process.stderr.write(`[friction-capture] captureServerError error: ${String(captureErr)}\n`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Enqueue a user-initiated friction report (from UI or CLI).
|
|
118
|
+
* Called with pre-built context from the UI report modal or `usesteady report`.
|
|
119
|
+
*/
|
|
120
|
+
export function captureManualReport(opts) {
|
|
121
|
+
return enqueue({
|
|
122
|
+
kind: opts.kind,
|
|
123
|
+
capturedAt: new Date().toISOString(),
|
|
124
|
+
usesteadyVersion: packageVersion(),
|
|
125
|
+
notes: opts.notes,
|
|
126
|
+
context: {
|
|
127
|
+
platform: process.platform,
|
|
128
|
+
nodeVersion: process.version,
|
|
129
|
+
...opts.context,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=auto-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-capture.js","sourceRoot":"","sources":["../../../src/friction/auto-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/friction/client.ts
|
|
3
|
+
*
|
|
4
|
+
* Submits a queued friction entry to the collection backend.
|
|
5
|
+
*
|
|
6
|
+
* The collection endpoint and GitHub token are read from
|
|
7
|
+
* ~/.usesteady/config.json and ~/.usesteady/auth.json respectively.
|
|
8
|
+
* No hardcoded private URLs exist in this file — alpha testers receive
|
|
9
|
+
* a pre-filled config.json out-of-band.
|
|
10
|
+
*
|
|
11
|
+
* Transport: GitHub Issues REST API
|
|
12
|
+
* POST /repos/{owner}/{repo}/issues
|
|
13
|
+
* Authorization: Bearer {github_token}
|
|
14
|
+
*
|
|
15
|
+
* The private friction collection repo has triage label
|
|
16
|
+
* automation that routes + tags incoming issues automatically.
|
|
17
|
+
*/
|
|
18
|
+
import type { FrictionConfig, QueueEntry } from "./types.js";
|
|
19
|
+
/**
|
|
20
|
+
* Submit one queue entry to the GitHub Issues collection backend.
|
|
21
|
+
* Returns the created issue number on success, throws on failure.
|
|
22
|
+
*/
|
|
23
|
+
export declare function submitEntry(entry: QueueEntry, config: FrictionConfig): Promise<number>;
|
|
24
|
+
/**
|
|
25
|
+
* Flush all pending queue entries to the collection backend.
|
|
26
|
+
*
|
|
27
|
+
* Designed to be called:
|
|
28
|
+
* - At server startup (if a token exists)
|
|
29
|
+
* - After each new enqueue (non-blocking, fire-and-forget)
|
|
30
|
+
*
|
|
31
|
+
* Uses simple linear back-off between entries to avoid rate limiting.
|
|
32
|
+
* Returns the count of successfully submitted entries.
|
|
33
|
+
*/
|
|
34
|
+
export declare function flushQueue(config: FrictionConfig): Promise<number>;
|
|
35
|
+
/**
|
|
36
|
+
* Fire-and-forget flush — called after enqueue() so callers don't need to await.
|
|
37
|
+
*/
|
|
38
|
+
export declare function scheduleFlush(config: FrictionConfig): void;
|
|
39
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/friction/client.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAiF7D;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAG,UAAU,EAClB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,CAAC,CAgCjB;AAID;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BxE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAM1D"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Copyright 2026 Shortgigs LLC. Licensed under the Apache License, Version 2.0.
|
|
2
|
+
/**
|
|
3
|
+
* src/friction/client.ts
|
|
4
|
+
*
|
|
5
|
+
* Submits a queued friction entry to the collection backend.
|
|
6
|
+
*
|
|
7
|
+
* The collection endpoint and GitHub token are read from
|
|
8
|
+
* ~/.usesteady/config.json and ~/.usesteady/auth.json respectively.
|
|
9
|
+
* No hardcoded private URLs exist in this file — alpha testers receive
|
|
10
|
+
* a pre-filled config.json out-of-band.
|
|
11
|
+
*
|
|
12
|
+
* Transport: GitHub Issues REST API
|
|
13
|
+
* POST /repos/{owner}/{repo}/issues
|
|
14
|
+
* Authorization: Bearer {github_token}
|
|
15
|
+
*
|
|
16
|
+
* The private friction collection repo has triage label
|
|
17
|
+
* automation that routes + tags incoming issues automatically.
|
|
18
|
+
*/
|
|
19
|
+
import { readAuth } from "./config.js";
|
|
20
|
+
import { markSubmitted, markFailed, pendingEntries, pruneSubmitted, } from "./queue.js";
|
|
21
|
+
// ─── Issue body builder ───────────────────────────────────────────────────────
|
|
22
|
+
function buildIssueBody(entry, githubLogin) {
|
|
23
|
+
const { event } = entry;
|
|
24
|
+
const ctx = event.context;
|
|
25
|
+
const contextLines = [];
|
|
26
|
+
if (ctx.phase)
|
|
27
|
+
contextLines.push(`- **Phase:** ${ctx.phase}`);
|
|
28
|
+
if (ctx.runId)
|
|
29
|
+
contextLines.push(`- **Run ID:** \`${ctx.runId}\``);
|
|
30
|
+
if (ctx.taskInputs?.length) {
|
|
31
|
+
contextLines.push("- **Task inputs:**");
|
|
32
|
+
for (const t of ctx.taskInputs)
|
|
33
|
+
contextLines.push(` - ${t}`);
|
|
34
|
+
}
|
|
35
|
+
if (ctx.failureNote)
|
|
36
|
+
contextLines.push(`- **Failure note:** ${ctx.failureNote}`);
|
|
37
|
+
if (ctx.workspaceRoot)
|
|
38
|
+
contextLines.push(`- **Workspace:** \`${ctx.workspaceRoot}\``);
|
|
39
|
+
if (ctx.route)
|
|
40
|
+
contextLines.push(`- **Route:** \`${ctx.route}\``);
|
|
41
|
+
if (ctx.errorMessage)
|
|
42
|
+
contextLines.push(`- **Error:** ${ctx.errorMessage}`);
|
|
43
|
+
const metadata = {
|
|
44
|
+
id: entry.id,
|
|
45
|
+
kind: event.kind,
|
|
46
|
+
capturedAt: event.capturedAt,
|
|
47
|
+
usesteadyVersion: event.usesteadyVersion,
|
|
48
|
+
platform: ctx.platform,
|
|
49
|
+
nodeVersion: ctx.nodeVersion,
|
|
50
|
+
};
|
|
51
|
+
return [
|
|
52
|
+
`## Friction Report`,
|
|
53
|
+
``,
|
|
54
|
+
`**Type:** ${event.kind}`,
|
|
55
|
+
`**Reporter:** @${githubLogin}`,
|
|
56
|
+
`**Captured:** ${event.capturedAt}`,
|
|
57
|
+
`**UseSteady version:** ${event.usesteadyVersion}`,
|
|
58
|
+
``,
|
|
59
|
+
`### Context`,
|
|
60
|
+
contextLines.length ? contextLines.join("\n") : "_No structured context._",
|
|
61
|
+
``,
|
|
62
|
+
...(event.notes ? [`### Notes from reporter`, ``, event.notes, ``] : []),
|
|
63
|
+
`### Metadata`,
|
|
64
|
+
``,
|
|
65
|
+
"```json",
|
|
66
|
+
JSON.stringify(metadata, null, 2),
|
|
67
|
+
"```",
|
|
68
|
+
].join("\n");
|
|
69
|
+
}
|
|
70
|
+
function buildIssueTitle(entry) {
|
|
71
|
+
const { event } = entry;
|
|
72
|
+
const ctx = event.context;
|
|
73
|
+
switch (event.kind) {
|
|
74
|
+
case "workflow-failure":
|
|
75
|
+
return `[friction] workflow ${event.kind}: ${ctx.phase ?? "unknown phase"} — ${ctx.runId?.slice(0, 8) ?? "?"}`;
|
|
76
|
+
case "server-error":
|
|
77
|
+
return `[friction] server error: ${ctx.route ?? "unknown route"}`;
|
|
78
|
+
case "ux-block":
|
|
79
|
+
return `[friction] ux block: ${(event.notes ?? "").slice(0, 60) || "user report"}`;
|
|
80
|
+
case "install-error":
|
|
81
|
+
return `[friction] install error: ${(ctx.errorMessage ?? "").slice(0, 60) || "startup crash"}`;
|
|
82
|
+
case "manual-cli":
|
|
83
|
+
return `[friction] manual report: ${(event.notes ?? "").slice(0, 60) || "cli report"}`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Submit one queue entry to the GitHub Issues collection backend.
|
|
88
|
+
* Returns the created issue number on success, throws on failure.
|
|
89
|
+
*/
|
|
90
|
+
export async function submitEntry(entry, config) {
|
|
91
|
+
const auth = readAuth();
|
|
92
|
+
if (!auth?.githubToken) {
|
|
93
|
+
throw new Error("No GitHub token. Run `usesteady report` and authenticate first.");
|
|
94
|
+
}
|
|
95
|
+
const body = {
|
|
96
|
+
title: buildIssueTitle(entry),
|
|
97
|
+
body: buildIssueBody(entry, auth.githubLogin),
|
|
98
|
+
labels: ["status/pending", entry.event.kind],
|
|
99
|
+
};
|
|
100
|
+
const resp = await fetch(config.frictionEndpoint, {
|
|
101
|
+
method: "POST",
|
|
102
|
+
headers: {
|
|
103
|
+
"Authorization": `Bearer ${auth.githubToken}`,
|
|
104
|
+
"Accept": "application/vnd.github+json",
|
|
105
|
+
"Content-Type": "application/json",
|
|
106
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
107
|
+
"User-Agent": `usesteady/${entry.event.usesteadyVersion}`,
|
|
108
|
+
},
|
|
109
|
+
body: JSON.stringify(body),
|
|
110
|
+
});
|
|
111
|
+
if (!resp.ok) {
|
|
112
|
+
const text = await resp.text().catch(() => resp.statusText);
|
|
113
|
+
throw new Error(`GitHub API ${resp.status}: ${text}`);
|
|
114
|
+
}
|
|
115
|
+
const data = await resp.json();
|
|
116
|
+
return data.number;
|
|
117
|
+
}
|
|
118
|
+
// ─── Flush loop ───────────────────────────────────────────────────────────────
|
|
119
|
+
/**
|
|
120
|
+
* Flush all pending queue entries to the collection backend.
|
|
121
|
+
*
|
|
122
|
+
* Designed to be called:
|
|
123
|
+
* - At server startup (if a token exists)
|
|
124
|
+
* - After each new enqueue (non-blocking, fire-and-forget)
|
|
125
|
+
*
|
|
126
|
+
* Uses simple linear back-off between entries to avoid rate limiting.
|
|
127
|
+
* Returns the count of successfully submitted entries.
|
|
128
|
+
*/
|
|
129
|
+
export async function flushQueue(config) {
|
|
130
|
+
const auth = readAuth();
|
|
131
|
+
if (!auth?.githubToken)
|
|
132
|
+
return 0; // nothing to do without a token
|
|
133
|
+
const entries = pendingEntries(20);
|
|
134
|
+
if (entries.length === 0)
|
|
135
|
+
return 0;
|
|
136
|
+
let submitted = 0;
|
|
137
|
+
for (const entry of entries) {
|
|
138
|
+
try {
|
|
139
|
+
await submitEntry(entry, config);
|
|
140
|
+
markSubmitted(entry.id);
|
|
141
|
+
submitted++;
|
|
142
|
+
// Small delay between submissions — GitHub allows 5000 req/hour per token
|
|
143
|
+
// but we are polite to avoid bursts.
|
|
144
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
markFailed(entry.id, String(err));
|
|
148
|
+
process.stderr.write(`[friction-client] submission failed for ${entry.id}: ${String(err)}\n`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Housekeeping: prune old submitted entries
|
|
152
|
+
pruneSubmitted(30);
|
|
153
|
+
return submitted;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Fire-and-forget flush — called after enqueue() so callers don't need to await.
|
|
157
|
+
*/
|
|
158
|
+
export function scheduleFlush(config) {
|
|
159
|
+
setImmediate(() => {
|
|
160
|
+
flushQueue(config).catch((err) => {
|
|
161
|
+
process.stderr.write(`[friction-client] flush error: ${String(err)}\n`);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/friction/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/friction/config.ts
|
|
3
|
+
*
|
|
4
|
+
* Reads and writes ~/.usesteady/config.json and ~/.usesteady/auth.json.
|
|
5
|
+
*
|
|
6
|
+
* These files hold the configurable collection endpoint and the GitHub
|
|
7
|
+
* OAuth token. Neither the endpoint URL nor the token is hardcoded in
|
|
8
|
+
* the public source — users (and alpha testers) receive them out-of-band.
|
|
9
|
+
*/
|
|
10
|
+
import type { AuthToken, FrictionConfig } from "./types.js";
|
|
11
|
+
export declare function readConfig(): FrictionConfig;
|
|
12
|
+
export declare function writeConfig(config: FrictionConfig): void;
|
|
13
|
+
export declare function readAuth(): AuthToken | null;
|
|
14
|
+
export declare function writeAuth(token: AuthToken): void;
|
|
15
|
+
export declare function clearAuth(): void;
|
|
16
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/friction/config.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAa5D,wBAAgB,UAAU,IAAI,cAAc,CAO3C;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAGxD;AAID,wBAAgB,QAAQ,IAAI,SAAS,GAAG,IAAI,CAO3C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAGhD;AAED,wBAAgB,SAAS,IAAI,IAAI,CAKhC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Copyright 2026 Shortgigs LLC. Licensed under the Apache License, Version 2.0.
|
|
2
|
+
/**
|
|
3
|
+
* src/friction/config.ts
|
|
4
|
+
*
|
|
5
|
+
* Reads and writes ~/.usesteady/config.json and ~/.usesteady/auth.json.
|
|
6
|
+
*
|
|
7
|
+
* These files hold the configurable collection endpoint and the GitHub
|
|
8
|
+
* OAuth token. Neither the endpoint URL nor the token is hardcoded in
|
|
9
|
+
* the public source — users (and alpha testers) receive them out-of-band.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { DEFAULT_FRICTION_CONFIG } from "./types.js";
|
|
15
|
+
const USESTEADY_DIR = join(homedir(), ".usesteady");
|
|
16
|
+
const CONFIG_PATH = join(USESTEADY_DIR, "config.json");
|
|
17
|
+
const AUTH_PATH = join(USESTEADY_DIR, "auth.json");
|
|
18
|
+
function ensureDir() {
|
|
19
|
+
if (!existsSync(USESTEADY_DIR))
|
|
20
|
+
mkdirSync(USESTEADY_DIR, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
// ─── Config ───────────────────────────────────────────────────────────────────
|
|
23
|
+
export function readConfig() {
|
|
24
|
+
try {
|
|
25
|
+
if (existsSync(CONFIG_PATH)) {
|
|
26
|
+
return JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch { /* fall through to default */ }
|
|
30
|
+
return DEFAULT_FRICTION_CONFIG;
|
|
31
|
+
}
|
|
32
|
+
export function writeConfig(config) {
|
|
33
|
+
ensureDir();
|
|
34
|
+
writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), "utf-8");
|
|
35
|
+
}
|
|
36
|
+
// ─── Auth token ───────────────────────────────────────────────────────────────
|
|
37
|
+
export function readAuth() {
|
|
38
|
+
try {
|
|
39
|
+
if (existsSync(AUTH_PATH)) {
|
|
40
|
+
return JSON.parse(readFileSync(AUTH_PATH, "utf-8"));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch { /* no token */ }
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
export function writeAuth(token) {
|
|
47
|
+
ensureDir();
|
|
48
|
+
writeFileSync(AUTH_PATH, JSON.stringify(token, null, 2), "utf-8");
|
|
49
|
+
}
|
|
50
|
+
export function clearAuth() {
|
|
51
|
+
ensureDir();
|
|
52
|
+
if (existsSync(AUTH_PATH)) {
|
|
53
|
+
writeFileSync(AUTH_PATH, "{}", "utf-8");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/friction/config.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAS,WAAW,CAAC;AAEpC,OAAO,EAAE,uBAAuB,EAAE,MAAa,YAAY,CAAC;AAE5D,MAAM,aAAa,GAAI,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACrD,MAAM,WAAW,GAAM,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAC1D,MAAM,SAAS,GAAQ,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;AAExD,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAmB,CAAC;QAC1E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;IACzC,OAAO,uBAAuB,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAsB;IAChD,SAAS,EAAE,CAAC;IACZ,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,QAAQ;IACtB,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAc,CAAC;QACnE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAgB;IACxC,SAAS,EAAE,CAAC;IACZ,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,SAAS,EAAE,CAAC;IACZ,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/friction/github-auth.ts
|
|
3
|
+
*
|
|
4
|
+
* GitHub Device Flow OAuth — no browser redirect needed.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. POST /login/device/code → get device_code + user_code + verification_uri
|
|
8
|
+
* 2. Show user_code to the user; they visit verification_uri and enter it
|
|
9
|
+
* 3. Poll /login/oauth/access_token until user approves or timeout
|
|
10
|
+
* 4. Exchange token for GitHub user profile
|
|
11
|
+
* 5. Store token in ~/.usesteady/auth.json
|
|
12
|
+
*
|
|
13
|
+
* Required GitHub OAuth App settings:
|
|
14
|
+
* - Client ID: set via USESTEADY_GITHUB_CLIENT_ID env var or ~/.usesteady/config.json
|
|
15
|
+
* - Scopes: user:email (read public profile + email)
|
|
16
|
+
* - Device flow: enabled in GitHub App / OAuth App settings
|
|
17
|
+
*
|
|
18
|
+
* Register a free GitHub OAuth App at:
|
|
19
|
+
* https://github.com/settings/developers → "New OAuth App"
|
|
20
|
+
* Set Authorization callback URL to: http://localhost (unused for device flow)
|
|
21
|
+
* Enable "Device Authorization flow" checkbox
|
|
22
|
+
*/
|
|
23
|
+
import type { AuthToken } from "./types.js";
|
|
24
|
+
/**
|
|
25
|
+
* Run the GitHub device-flow OAuth dance interactively.
|
|
26
|
+
*
|
|
27
|
+
* Prints the user code and verification URL to stdout, then polls
|
|
28
|
+
* until the user approves. Stores the resulting token in
|
|
29
|
+
* ~/.usesteady/auth.json and returns the AuthToken.
|
|
30
|
+
*
|
|
31
|
+
* @param onCode called with { userCode, verificationUri } when ready to display
|
|
32
|
+
* @param onWaiting called each poll cycle while waiting for user
|
|
33
|
+
*/
|
|
34
|
+
export declare function runDeviceFlow(opts?: {
|
|
35
|
+
onCode?: (info: {
|
|
36
|
+
userCode: string;
|
|
37
|
+
verificationUri: string;
|
|
38
|
+
}) => void;
|
|
39
|
+
onWaiting?: () => void;
|
|
40
|
+
}): Promise<AuthToken>;
|
|
41
|
+
//# sourceMappingURL=github-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-auth.d.ts","sourceRoot":"","sources":["../../../src/friction/github-auth.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAsK5C;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE;IACzC,MAAM,CAAC,EAAK,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1E,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,GAAG,OAAO,CAAC,SAAS,CAAC,CA0BrB"}
|