@matteeh/osq 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +415 -72
- package/dist/cli/approve.d.ts +13 -3
- package/dist/cli/approve.d.ts.map +1 -1
- package/dist/cli/approve.js +59 -4
- package/dist/cli/approve.js.map +1 -1
- package/dist/cli/bin.js +0 -0
- package/dist/cli/confirm.d.ts +21 -0
- package/dist/cli/confirm.d.ts.map +1 -0
- package/dist/cli/confirm.js +28 -0
- package/dist/cli/confirm.js.map +1 -0
- package/dist/cli/doctor.d.ts +13 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +23 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/done.d.ts +12 -0
- package/dist/cli/done.d.ts.map +1 -0
- package/dist/cli/done.js +26 -0
- package/dist/cli/done.js.map +1 -0
- package/dist/cli/inbox.d.ts +22 -0
- package/dist/cli/inbox.d.ts.map +1 -0
- package/dist/cli/inbox.js +41 -0
- package/dist/cli/inbox.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +127 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +1 -0
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +9 -3
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/lint.d.ts +26 -0
- package/dist/cli/lint.d.ts.map +1 -0
- package/dist/cli/lint.js +60 -0
- package/dist/cli/lint.js.map +1 -0
- package/dist/cli/migrate.d.ts +18 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +42 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli/new.js +1 -1
- package/dist/cli/new.js.map +1 -1
- package/dist/cli/plan-queue.d.ts +50 -0
- package/dist/cli/plan-queue.d.ts.map +1 -0
- package/dist/cli/plan-queue.js +167 -0
- package/dist/cli/plan-queue.js.map +1 -0
- package/dist/cli/plan.d.ts +35 -0
- package/dist/cli/plan.d.ts.map +1 -0
- package/dist/cli/plan.js +153 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/queue.d.ts +9 -0
- package/dist/cli/queue.d.ts.map +1 -0
- package/dist/cli/queue.js +24 -0
- package/dist/cli/queue.js.map +1 -0
- package/dist/cli/reject.d.ts +8 -0
- package/dist/cli/reject.d.ts.map +1 -0
- package/dist/cli/reject.js +18 -0
- package/dist/cli/reject.js.map +1 -0
- package/dist/cli/report.d.ts +1 -1
- package/dist/cli/report.d.ts.map +1 -1
- package/dist/cli/report.js +141 -14
- package/dist/cli/report.js.map +1 -1
- package/dist/cli/retry.d.ts +7 -0
- package/dist/cli/retry.d.ts.map +1 -0
- package/dist/cli/retry.js +29 -0
- package/dist/cli/retry.js.map +1 -0
- package/dist/cli/serve.d.ts +30 -0
- package/dist/cli/serve.d.ts.map +1 -0
- package/dist/cli/serve.js +136 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +7 -1
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/show.d.ts +2 -1
- package/dist/cli/show.d.ts.map +1 -1
- package/dist/cli/show.js +20 -3
- package/dist/cli/show.js.map +1 -1
- package/dist/cli/status.d.ts +1 -1
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +2 -2
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/watch.d.ts +9 -6
- package/dist/cli/watch.d.ts.map +1 -1
- package/dist/cli/watch.js +15 -2
- package/dist/cli/watch.js.map +1 -1
- package/dist/core/foundation/config-codex.d.ts +22 -0
- package/dist/core/foundation/config-codex.d.ts.map +1 -0
- package/dist/core/foundation/config-codex.js +58 -0
- package/dist/core/foundation/config-codex.js.map +1 -0
- package/dist/core/foundation/config-doctor.d.ts +14 -0
- package/dist/core/foundation/config-doctor.d.ts.map +1 -0
- package/dist/core/foundation/config-doctor.js +29 -0
- package/dist/core/foundation/config-doctor.js.map +1 -0
- package/dist/core/foundation/config-env.d.ts +3 -0
- package/dist/core/foundation/config-env.d.ts.map +1 -0
- package/dist/core/foundation/config-env.js +22 -0
- package/dist/core/foundation/config-env.js.map +1 -0
- package/dist/core/foundation/config-gates.d.ts +22 -0
- package/dist/core/foundation/config-gates.d.ts.map +1 -0
- package/dist/core/foundation/config-gates.js +43 -0
- package/dist/core/foundation/config-gates.js.map +1 -0
- package/dist/core/foundation/config-pi.d.ts +64 -0
- package/dist/core/foundation/config-pi.d.ts.map +1 -0
- package/dist/core/foundation/config-pi.js +131 -0
- package/dist/core/foundation/config-pi.js.map +1 -0
- package/dist/core/foundation/config-planning.d.ts +24 -0
- package/dist/core/foundation/config-planning.d.ts.map +1 -0
- package/dist/core/foundation/config-planning.js +60 -0
- package/dist/core/foundation/config-planning.js.map +1 -0
- package/dist/core/foundation/config-queue.d.ts +15 -0
- package/dist/core/foundation/config-queue.d.ts.map +1 -0
- package/dist/core/foundation/config-queue.js +24 -0
- package/dist/core/foundation/config-queue.js.map +1 -0
- package/dist/core/foundation/config-serve.d.ts +20 -0
- package/dist/core/foundation/config-serve.d.ts.map +1 -0
- package/dist/core/foundation/config-serve.js +35 -0
- package/dist/core/foundation/config-serve.js.map +1 -0
- package/dist/core/{config.d.ts → foundation/config.d.ts} +34 -3
- package/dist/core/foundation/config.d.ts.map +1 -0
- package/dist/core/{config.js → foundation/config.js} +35 -18
- package/dist/core/foundation/config.js.map +1 -0
- package/dist/core/foundation/doctor-managed.d.ts +13 -0
- package/dist/core/foundation/doctor-managed.d.ts.map +1 -0
- package/dist/core/foundation/doctor-managed.js +77 -0
- package/dist/core/foundation/doctor-managed.js.map +1 -0
- package/dist/core/foundation/doctor.d.ts +19 -0
- package/dist/core/foundation/doctor.d.ts.map +1 -0
- package/dist/core/foundation/doctor.js +187 -0
- package/dist/core/foundation/doctor.js.map +1 -0
- package/dist/core/foundation/harness-catalog.d.ts +96 -0
- package/dist/core/foundation/harness-catalog.d.ts.map +1 -0
- package/dist/core/foundation/harness-catalog.js +182 -0
- package/dist/core/foundation/harness-catalog.js.map +1 -0
- package/dist/core/foundation/init-blocks.d.ts +33 -0
- package/dist/core/foundation/init-blocks.d.ts.map +1 -0
- package/dist/core/foundation/init-blocks.js +165 -0
- package/dist/core/foundation/init-blocks.js.map +1 -0
- package/dist/core/foundation/init-managed.d.ts +10 -0
- package/dist/core/foundation/init-managed.d.ts.map +1 -0
- package/dist/core/foundation/init-managed.js +115 -0
- package/dist/core/foundation/init-managed.js.map +1 -0
- package/dist/core/foundation/init.d.ts +18 -0
- package/dist/core/foundation/init.d.ts.map +1 -0
- package/dist/core/foundation/init.js +113 -0
- package/dist/core/foundation/init.js.map +1 -0
- package/dist/core/{logger.d.ts → foundation/logger.d.ts} +1 -0
- package/dist/core/foundation/logger.d.ts.map +1 -0
- package/dist/core/{logger.js → foundation/logger.js} +18 -2
- package/dist/core/foundation/logger.js.map +1 -0
- package/dist/core/{new.d.ts → foundation/new.d.ts} +3 -0
- package/dist/core/foundation/new.d.ts.map +1 -0
- package/dist/core/foundation/new.js +206 -0
- package/dist/core/foundation/new.js.map +1 -0
- package/dist/core/foundation/package-root.d.ts +9 -0
- package/dist/core/foundation/package-root.d.ts.map +1 -0
- package/dist/core/foundation/package-root.js +11 -0
- package/dist/core/foundation/package-root.js.map +1 -0
- package/dist/core/lifecycle/done.d.ts +17 -0
- package/dist/core/lifecycle/done.d.ts.map +1 -0
- package/dist/core/lifecycle/done.js +97 -0
- package/dist/core/lifecycle/done.js.map +1 -0
- package/dist/core/lifecycle/reject.d.ts +26 -0
- package/dist/core/lifecycle/reject.d.ts.map +1 -0
- package/dist/core/lifecycle/reject.js +83 -0
- package/dist/core/lifecycle/reject.js.map +1 -0
- package/dist/core/lifecycle/retry-transition.d.ts +23 -0
- package/dist/core/lifecycle/retry-transition.d.ts.map +1 -0
- package/dist/core/lifecycle/retry-transition.js +41 -0
- package/dist/core/lifecycle/retry-transition.js.map +1 -0
- package/dist/core/lifecycle/retry.d.ts +18 -0
- package/dist/core/lifecycle/retry.d.ts.map +1 -0
- package/dist/core/lifecycle/retry.js +179 -0
- package/dist/core/lifecycle/retry.js.map +1 -0
- package/dist/core/report/approval-flags.d.ts +29 -0
- package/dist/core/report/approval-flags.d.ts.map +1 -0
- package/dist/core/report/approval-flags.js +138 -0
- package/dist/core/report/approval-flags.js.map +1 -0
- package/dist/core/report/planning-economics.d.ts +39 -0
- package/dist/core/report/planning-economics.d.ts.map +1 -0
- package/dist/core/report/planning-economics.js +168 -0
- package/dist/core/report/planning-economics.js.map +1 -0
- package/dist/core/report/planning-observed.d.ts +59 -0
- package/dist/core/report/planning-observed.d.ts.map +1 -0
- package/dist/core/report/planning-observed.js +135 -0
- package/dist/core/report/planning-observed.js.map +1 -0
- package/dist/core/report/planning-records.d.ts +69 -0
- package/dist/core/report/planning-records.d.ts.map +1 -0
- package/dist/core/report/planning-records.js +149 -0
- package/dist/core/report/planning-records.js.map +1 -0
- package/dist/core/report/planning-slice-lookup.d.ts +13 -0
- package/dist/core/report/planning-slice-lookup.d.ts.map +1 -0
- package/dist/core/report/planning-slice-lookup.js +146 -0
- package/dist/core/report/planning-slice-lookup.js.map +1 -0
- package/dist/core/report/planning-slice-measures.d.ts +17 -0
- package/dist/core/report/planning-slice-measures.d.ts.map +1 -0
- package/dist/core/report/planning-slice-measures.js +85 -0
- package/dist/core/report/planning-slice-measures.js.map +1 -0
- package/dist/core/report/planning-slice-record.d.ts +4 -0
- package/dist/core/report/planning-slice-record.d.ts.map +1 -0
- package/dist/core/report/planning-slice-record.js +66 -0
- package/dist/core/report/planning-slice-record.js.map +1 -0
- package/dist/core/report/planning-slice-turns.d.ts +13 -0
- package/dist/core/report/planning-slice-turns.d.ts.map +1 -0
- package/dist/core/report/planning-slice-turns.js +41 -0
- package/dist/core/report/planning-slice-turns.js.map +1 -0
- package/dist/core/report/planning-slice.d.ts +70 -0
- package/dist/core/report/planning-slice.d.ts.map +1 -0
- package/dist/core/report/planning-slice.js +147 -0
- package/dist/core/report/planning-slice.js.map +1 -0
- package/dist/core/report/planning.d.ts +31 -0
- package/dist/core/report/planning.d.ts.map +1 -0
- package/dist/core/report/planning.js +75 -0
- package/dist/core/report/planning.js.map +1 -0
- package/dist/core/report/report-events.d.ts +52 -0
- package/dist/core/report/report-events.d.ts.map +1 -0
- package/dist/core/report/report-events.js +198 -0
- package/dist/core/report/report-events.js.map +1 -0
- package/dist/core/report/report-pre-spawn.d.ts +25 -0
- package/dist/core/report/report-pre-spawn.d.ts.map +1 -0
- package/dist/core/report/report-pre-spawn.js +40 -0
- package/dist/core/report/report-pre-spawn.js.map +1 -0
- package/dist/core/report/report-retries.d.ts +30 -0
- package/dist/core/report/report-retries.d.ts.map +1 -0
- package/dist/core/report/report-retries.js +100 -0
- package/dist/core/report/report-retries.js.map +1 -0
- package/dist/core/report/report.d.ts +276 -0
- package/dist/core/report/report.d.ts.map +1 -0
- package/dist/core/report/report.js +1421 -0
- package/dist/core/report/report.js.map +1 -0
- package/dist/core/{lock.d.ts → run/lock.d.ts} +6 -0
- package/dist/core/run/lock.d.ts.map +1 -0
- package/dist/core/{lock.js → run/lock.js} +7 -15
- package/dist/core/run/lock.js.map +1 -0
- package/dist/core/run/manifest.d.ts +39 -0
- package/dist/core/run/manifest.d.ts.map +1 -0
- package/dist/core/run/manifest.js +137 -0
- package/dist/core/run/manifest.js.map +1 -0
- package/dist/core/run/scope-hash.d.ts +71 -0
- package/dist/core/run/scope-hash.d.ts.map +1 -0
- package/dist/core/run/scope-hash.js +177 -0
- package/dist/core/run/scope-hash.js.map +1 -0
- package/dist/core/run/scope.d.ts +30 -0
- package/dist/core/run/scope.d.ts.map +1 -0
- package/dist/core/run/scope.js +193 -0
- package/dist/core/run/scope.js.map +1 -0
- package/dist/core/run/summary.d.ts +8 -0
- package/dist/core/run/summary.d.ts.map +1 -0
- package/dist/core/run/summary.js +25 -0
- package/dist/core/run/summary.js.map +1 -0
- package/dist/core/run/verification.d.ts +23 -0
- package/dist/core/run/verification.d.ts.map +1 -0
- package/dist/core/run/verification.js +78 -0
- package/dist/core/run/verification.js.map +1 -0
- package/dist/core/spec/approve.d.ts +31 -0
- package/dist/core/spec/approve.d.ts.map +1 -0
- package/dist/core/spec/approve.js +111 -0
- package/dist/core/spec/approve.js.map +1 -0
- package/dist/core/spec/delta.d.ts +77 -0
- package/dist/core/spec/delta.d.ts.map +1 -0
- package/dist/core/spec/delta.js +581 -0
- package/dist/core/spec/delta.js.map +1 -0
- package/dist/core/spec/digest-flags.d.ts +21 -0
- package/dist/core/spec/digest-flags.d.ts.map +1 -0
- package/dist/core/spec/digest-flags.js +194 -0
- package/dist/core/spec/digest-flags.js.map +1 -0
- package/dist/core/spec/digest-verify-starts.d.ts +5 -0
- package/dist/core/spec/digest-verify-starts.d.ts.map +1 -0
- package/dist/core/spec/digest-verify-starts.js +31 -0
- package/dist/core/spec/digest-verify-starts.js.map +1 -0
- package/dist/core/spec/digest.d.ts +42 -0
- package/dist/core/spec/digest.d.ts.map +1 -0
- package/dist/core/spec/digest.js +170 -0
- package/dist/core/spec/digest.js.map +1 -0
- package/dist/core/spec/hasher.d.ts +11 -0
- package/dist/core/spec/hasher.d.ts.map +1 -0
- package/dist/core/{hasher.js → spec/hasher.js} +27 -3
- package/dist/core/spec/hasher.js.map +1 -0
- package/dist/core/spec/linter.d.ts +79 -0
- package/dist/core/spec/linter.d.ts.map +1 -0
- package/dist/core/spec/linter.js +826 -0
- package/dist/core/spec/linter.js.map +1 -0
- package/dist/core/spec/migrate.d.ts +54 -0
- package/dist/core/spec/migrate.d.ts.map +1 -0
- package/dist/core/spec/migrate.js +297 -0
- package/dist/core/spec/migrate.js.map +1 -0
- package/dist/core/spec/openspec-version.d.ts +30 -0
- package/dist/core/spec/openspec-version.d.ts.map +1 -0
- package/dist/core/spec/openspec-version.js +118 -0
- package/dist/core/spec/openspec-version.js.map +1 -0
- package/dist/core/spec/parser.d.ts +82 -0
- package/dist/core/spec/parser.d.ts.map +1 -0
- package/dist/core/spec/parser.js +221 -0
- package/dist/core/spec/parser.js.map +1 -0
- package/dist/core/spec/verify-paths.d.ts +18 -0
- package/dist/core/spec/verify-paths.d.ts.map +1 -0
- package/dist/core/spec/verify-paths.js +139 -0
- package/dist/core/spec/verify-paths.js.map +1 -0
- package/dist/core/spec/verify-starts.d.ts +45 -0
- package/dist/core/spec/verify-starts.d.ts.map +1 -0
- package/dist/core/spec/verify-starts.js +61 -0
- package/dist/core/spec/verify-starts.js.map +1 -0
- package/dist/core/status/inbox-cursor.d.ts +10 -0
- package/dist/core/status/inbox-cursor.d.ts.map +1 -0
- package/dist/core/status/inbox-cursor.js +33 -0
- package/dist/core/status/inbox-cursor.js.map +1 -0
- package/dist/core/status/inbox-projection.d.ts +15 -0
- package/dist/core/status/inbox-projection.d.ts.map +1 -0
- package/dist/core/status/inbox-projection.js +20 -0
- package/dist/core/status/inbox-projection.js.map +1 -0
- package/dist/core/status/inbox-text.d.ts +4 -0
- package/dist/core/status/inbox-text.d.ts.map +1 -0
- package/dist/core/status/inbox-text.js +48 -0
- package/dist/core/status/inbox-text.js.map +1 -0
- package/dist/core/status/inbox.d.ts +53 -0
- package/dist/core/status/inbox.d.ts.map +1 -0
- package/dist/core/status/inbox.js +167 -0
- package/dist/core/status/inbox.js.map +1 -0
- package/dist/core/status/layout.d.ts +29 -0
- package/dist/core/status/layout.d.ts.map +1 -0
- package/dist/core/status/layout.js +77 -0
- package/dist/core/status/layout.js.map +1 -0
- package/dist/core/status/queue-parser.d.ts +13 -0
- package/dist/core/status/queue-parser.d.ts.map +1 -0
- package/dist/core/status/queue-parser.js +88 -0
- package/dist/core/status/queue-parser.js.map +1 -0
- package/dist/core/status/queue-planning.d.ts +62 -0
- package/dist/core/status/queue-planning.d.ts.map +1 -0
- package/dist/core/status/queue-planning.js +158 -0
- package/dist/core/status/queue-planning.js.map +1 -0
- package/dist/core/status/queue-report-detail.d.ts +50 -0
- package/dist/core/status/queue-report-detail.d.ts.map +1 -0
- package/dist/core/status/queue-report-detail.js +140 -0
- package/dist/core/status/queue-report-detail.js.map +1 -0
- package/dist/core/status/queue-report.d.ts +14 -0
- package/dist/core/status/queue-report.d.ts.map +1 -0
- package/dist/core/status/queue-report.js +41 -0
- package/dist/core/status/queue-report.js.map +1 -0
- package/dist/core/status/queue-state.d.ts +53 -0
- package/dist/core/status/queue-state.d.ts.map +1 -0
- package/dist/core/status/queue-state.js +167 -0
- package/dist/core/status/queue-state.js.map +1 -0
- package/dist/core/status/queue.d.ts +7 -0
- package/dist/core/status/queue.d.ts.map +1 -0
- package/dist/core/status/queue.js +4 -0
- package/dist/core/status/queue.js.map +1 -0
- package/dist/core/status/show.d.ts +102 -0
- package/dist/core/status/show.d.ts.map +1 -0
- package/dist/core/status/show.js +704 -0
- package/dist/core/status/show.js.map +1 -0
- package/dist/core/status/state.d.ts +56 -0
- package/dist/core/status/state.d.ts.map +1 -0
- package/dist/core/status/state.js +187 -0
- package/dist/core/status/state.js.map +1 -0
- package/dist/core/status/status.d.ts +23 -0
- package/dist/core/status/status.d.ts.map +1 -0
- package/dist/core/status/status.js +173 -0
- package/dist/core/status/status.js.map +1 -0
- package/dist/core/web/web-data-change.d.ts +10 -0
- package/dist/core/web/web-data-change.d.ts.map +1 -0
- package/dist/core/web/web-data-change.js +106 -0
- package/dist/core/web/web-data-change.js.map +1 -0
- package/dist/core/web/web-data-folders.d.ts +39 -0
- package/dist/core/web/web-data-folders.d.ts.map +1 -0
- package/dist/core/web/web-data-folders.js +125 -0
- package/dist/core/web/web-data-folders.js.map +1 -0
- package/dist/core/web/web-data-graph.d.ts +8 -0
- package/dist/core/web/web-data-graph.d.ts.map +1 -0
- package/dist/core/web/web-data-graph.js +113 -0
- package/dist/core/web/web-data-graph.js.map +1 -0
- package/dist/core/web/web-data-lifecycle.d.ts +43 -0
- package/dist/core/web/web-data-lifecycle.d.ts.map +1 -0
- package/dist/core/web/web-data-lifecycle.js +141 -0
- package/dist/core/web/web-data-lifecycle.js.map +1 -0
- package/dist/core/web/web-data-observations.d.ts +30 -0
- package/dist/core/web/web-data-observations.d.ts.map +1 -0
- package/dist/core/web/web-data-observations.js +181 -0
- package/dist/core/web/web-data-observations.js.map +1 -0
- package/dist/core/web/web-data-tokens.d.ts +29 -0
- package/dist/core/web/web-data-tokens.d.ts.map +1 -0
- package/dist/core/web/web-data-tokens.js +62 -0
- package/dist/core/web/web-data-tokens.js.map +1 -0
- package/dist/core/web/web-data-types.d.ts +156 -0
- package/dist/core/web/web-data-types.d.ts.map +1 -0
- package/dist/core/web/web-data-types.js +15 -0
- package/dist/core/web/web-data-types.js.map +1 -0
- package/dist/core/web/web-data.d.ts +10 -0
- package/dist/core/web/web-data.d.ts.map +1 -0
- package/dist/core/web/web-data.js +8 -0
- package/dist/core/web/web-data.js.map +1 -0
- package/dist/core/web/web-events.d.ts +54 -0
- package/dist/core/web/web-events.d.ts.map +1 -0
- package/dist/core/web/web-events.js +162 -0
- package/dist/core/web/web-events.js.map +1 -0
- package/dist/core/web/web-export.d.ts +18 -0
- package/dist/core/web/web-export.d.ts.map +1 -0
- package/dist/core/web/web-export.js +112 -0
- package/dist/core/web/web-export.js.map +1 -0
- package/dist/core/web/web-server.d.ts +34 -0
- package/dist/core/web/web-server.d.ts.map +1 -0
- package/dist/core/web/web-server.js +182 -0
- package/dist/core/web/web-server.js.map +1 -0
- package/dist/core/web/web-static.d.ts +20 -0
- package/dist/core/web/web-static.d.ts.map +1 -0
- package/dist/core/web/web-static.js +104 -0
- package/dist/core/web/web-static.js.map +1 -0
- package/dist/harness/{agy.d.ts → agy/agy.d.ts} +8 -6
- package/dist/harness/agy/agy.d.ts.map +1 -0
- package/dist/harness/{agy.js → agy/agy.js} +49 -34
- package/dist/harness/agy/agy.js.map +1 -0
- package/dist/harness/claude/claude-turns.d.ts +29 -0
- package/dist/harness/claude/claude-turns.d.ts.map +1 -0
- package/dist/harness/claude/claude-turns.js +162 -0
- package/dist/harness/claude/claude-turns.js.map +1 -0
- package/dist/harness/claude/claude-usage.d.ts +12 -0
- package/dist/harness/claude/claude-usage.d.ts.map +1 -0
- package/dist/harness/claude/claude-usage.js +144 -0
- package/dist/harness/claude/claude-usage.js.map +1 -0
- package/dist/harness/codex/codex-observe-usage.d.ts +6 -0
- package/dist/harness/codex/codex-observe-usage.d.ts.map +1 -0
- package/dist/harness/codex/codex-observe-usage.js +215 -0
- package/dist/harness/codex/codex-observe-usage.js.map +1 -0
- package/dist/harness/codex/codex-prompt.d.ts +17 -0
- package/dist/harness/codex/codex-prompt.d.ts.map +1 -0
- package/dist/harness/codex/codex-prompt.js +43 -0
- package/dist/harness/codex/codex-prompt.js.map +1 -0
- package/dist/harness/codex/codex-stream.d.ts +23 -0
- package/dist/harness/codex/codex-stream.d.ts.map +1 -0
- package/dist/harness/codex/codex-stream.js +182 -0
- package/dist/harness/codex/codex-stream.js.map +1 -0
- package/dist/harness/codex/codex-usage.d.ts +26 -0
- package/dist/harness/codex/codex-usage.d.ts.map +1 -0
- package/dist/harness/codex/codex-usage.js +122 -0
- package/dist/harness/codex/codex-usage.js.map +1 -0
- package/dist/harness/codex/codex.d.ts +16 -0
- package/dist/harness/codex/codex.d.ts.map +1 -0
- package/dist/harness/codex/codex.js +92 -0
- package/dist/harness/codex/codex.js.map +1 -0
- package/dist/harness/index.d.ts +11 -2
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +24 -9
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/mock.d.ts +5 -2
- package/dist/harness/mock.d.ts.map +1 -1
- package/dist/harness/mock.js +10 -11
- package/dist/harness/mock.js.map +1 -1
- package/dist/harness/opencode/opencode-observe-usage.d.ts +4 -0
- package/dist/harness/opencode/opencode-observe-usage.d.ts.map +1 -0
- package/dist/harness/opencode/opencode-observe-usage.js +100 -0
- package/dist/harness/opencode/opencode-observe-usage.js.map +1 -0
- package/dist/harness/opencode/opencode-usage.d.ts +24 -0
- package/dist/harness/opencode/opencode-usage.d.ts.map +1 -0
- package/dist/harness/opencode/opencode-usage.js +181 -0
- package/dist/harness/opencode/opencode-usage.js.map +1 -0
- package/dist/harness/{opencode.d.ts → opencode/opencode.d.ts} +10 -7
- package/dist/harness/opencode/opencode.d.ts.map +1 -0
- package/dist/harness/{opencode.js → opencode/opencode.js} +159 -70
- package/dist/harness/opencode/opencode.js.map +1 -0
- package/dist/harness/pi/pi-args.d.ts +9 -0
- package/dist/harness/pi/pi-args.d.ts.map +1 -0
- package/dist/harness/pi/pi-args.js +33 -0
- package/dist/harness/pi/pi-args.js.map +1 -0
- package/dist/harness/pi/pi-stream.d.ts +27 -0
- package/dist/harness/pi/pi-stream.d.ts.map +1 -0
- package/dist/harness/pi/pi-stream.js +176 -0
- package/dist/harness/pi/pi-stream.js.map +1 -0
- package/dist/harness/pi/pi-tools.d.ts +5 -0
- package/dist/harness/pi/pi-tools.d.ts.map +1 -0
- package/dist/harness/pi/pi-tools.js +31 -0
- package/dist/harness/pi/pi-tools.js.map +1 -0
- package/dist/harness/pi/pi.d.ts +11 -0
- package/dist/harness/pi/pi.d.ts.map +1 -0
- package/dist/harness/pi/pi.js +109 -0
- package/dist/harness/pi/pi.js.map +1 -0
- package/dist/harness/prompt.d.ts +11 -0
- package/dist/harness/prompt.d.ts.map +1 -0
- package/dist/harness/prompt.js +105 -0
- package/dist/harness/prompt.js.map +1 -0
- package/dist/harness/types.d.ts +287 -8
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js +125 -0
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/watcher/archive-verify.d.ts +9 -0
- package/dist/watcher/archive-verify.d.ts.map +1 -0
- package/dist/watcher/archive-verify.js +80 -0
- package/dist/watcher/archive-verify.js.map +1 -0
- package/dist/watcher/archiver.d.ts +14 -2
- package/dist/watcher/archiver.d.ts.map +1 -1
- package/dist/watcher/archiver.js +112 -33
- package/dist/watcher/archiver.js.map +1 -1
- package/dist/watcher/attempt.d.ts +19 -0
- package/dist/watcher/attempt.d.ts.map +1 -0
- package/dist/watcher/attempt.js +94 -0
- package/dist/watcher/attempt.js.map +1 -0
- package/dist/watcher/auto-retry.d.ts +11 -0
- package/dist/watcher/auto-retry.d.ts.map +1 -0
- package/dist/watcher/auto-retry.js +180 -0
- package/dist/watcher/auto-retry.js.map +1 -0
- package/dist/watcher/build.d.ts +24 -0
- package/dist/watcher/build.d.ts.map +1 -0
- package/dist/watcher/build.js +169 -0
- package/dist/watcher/build.js.map +1 -0
- package/dist/watcher/change-verify.d.ts +25 -0
- package/dist/watcher/change-verify.d.ts.map +1 -0
- package/dist/watcher/change-verify.js +57 -0
- package/dist/watcher/change-verify.js.map +1 -0
- package/dist/watcher/dev.d.ts +51 -0
- package/dist/watcher/dev.d.ts.map +1 -0
- package/dist/watcher/dev.js +124 -0
- package/dist/watcher/dev.js.map +1 -0
- package/dist/watcher/failure-reason.d.ts +7 -0
- package/dist/watcher/failure-reason.d.ts.map +1 -0
- package/dist/watcher/failure-reason.js +2 -0
- package/dist/watcher/failure-reason.js.map +1 -0
- package/dist/watcher/fingerprint.d.ts +19 -0
- package/dist/watcher/fingerprint.d.ts.map +1 -0
- package/dist/watcher/fingerprint.js +53 -0
- package/dist/watcher/fingerprint.js.map +1 -0
- package/dist/watcher/heartbeat.d.ts +33 -0
- package/dist/watcher/heartbeat.d.ts.map +1 -0
- package/dist/watcher/heartbeat.js +135 -0
- package/dist/watcher/heartbeat.js.map +1 -0
- package/dist/watcher/lock.d.ts +10 -0
- package/dist/watcher/lock.d.ts.map +1 -0
- package/dist/watcher/lock.js +14 -0
- package/dist/watcher/lock.js.map +1 -0
- package/dist/watcher/loop.d.ts +26 -6
- package/dist/watcher/loop.d.ts.map +1 -1
- package/dist/watcher/loop.js +154 -37
- package/dist/watcher/loop.js.map +1 -1
- package/dist/watcher/measures.d.ts +46 -0
- package/dist/watcher/measures.d.ts.map +1 -0
- package/dist/watcher/measures.js +203 -0
- package/dist/watcher/measures.js.map +1 -0
- package/dist/watcher/outcome.d.ts +32 -0
- package/dist/watcher/outcome.d.ts.map +1 -0
- package/dist/watcher/outcome.js +127 -0
- package/dist/watcher/outcome.js.map +1 -0
- package/dist/watcher/regression.d.ts +43 -0
- package/dist/watcher/regression.d.ts.map +1 -0
- package/dist/watcher/regression.js +175 -0
- package/dist/watcher/regression.js.map +1 -0
- package/dist/watcher/runner.d.ts +6 -68
- package/dist/watcher/runner.d.ts.map +1 -1
- package/dist/watcher/runner.js +74 -523
- package/dist/watcher/runner.js.map +1 -1
- package/dist/watcher/spawn.d.ts +48 -0
- package/dist/watcher/spawn.d.ts.map +1 -0
- package/dist/watcher/spawn.js +130 -0
- package/dist/watcher/spawn.js.map +1 -0
- package/dist/watcher/task-verify.d.ts +59 -0
- package/dist/watcher/task-verify.d.ts.map +1 -0
- package/dist/watcher/task-verify.js +108 -0
- package/dist/watcher/task-verify.js.map +1 -0
- package/dist/watcher/verify.d.ts +44 -0
- package/dist/watcher/verify.d.ts.map +1 -0
- package/dist/watcher/verify.js +156 -0
- package/dist/watcher/verify.js.map +1 -0
- package/package.json +21 -9
- package/templates/PLANNER.md +77 -0
- package/templates/openspec/config.yaml +24 -0
- package/templates/openspec/schemas/osq/README.md +30 -0
- package/templates/openspec/schemas/osq/schema.yaml +133 -0
- package/templates/openspec/schemas/osq/templates/proposal.md +66 -0
- package/templates/openspec/schemas/osq/templates/spec.md +13 -0
- package/templates/openspec/schemas/osq/templates/tasks.md +11 -0
- package/templates/proposal.md +66 -0
- package/templates/tasks.md +5 -0
- package/ui/dist/assets/index-CZYeQ8la.js +9 -0
- package/ui/dist/assets/index-D6zVSjO7.css +1 -0
- package/ui/dist/index.html +14 -0
- package/dist/core/approve.d.ts +0 -11
- package/dist/core/approve.d.ts.map +0 -1
- package/dist/core/approve.js +0 -52
- package/dist/core/approve.js.map +0 -1
- package/dist/core/config.d.ts.map +0 -1
- package/dist/core/config.js.map +0 -1
- package/dist/core/hasher.d.ts +0 -4
- package/dist/core/hasher.d.ts.map +0 -1
- package/dist/core/hasher.js.map +0 -1
- package/dist/core/init.d.ts +0 -12
- package/dist/core/init.d.ts.map +0 -1
- package/dist/core/init.js +0 -151
- package/dist/core/init.js.map +0 -1
- package/dist/core/linter.d.ts +0 -8
- package/dist/core/linter.d.ts.map +0 -1
- package/dist/core/linter.js +0 -100
- package/dist/core/linter.js.map +0 -1
- package/dist/core/lock.d.ts.map +0 -1
- package/dist/core/lock.js.map +0 -1
- package/dist/core/logger.d.ts.map +0 -1
- package/dist/core/logger.js.map +0 -1
- package/dist/core/new.d.ts.map +0 -1
- package/dist/core/new.js +0 -79
- package/dist/core/new.js.map +0 -1
- package/dist/core/parser.d.ts +0 -32
- package/dist/core/parser.d.ts.map +0 -1
- package/dist/core/parser.js +0 -87
- package/dist/core/parser.js.map +0 -1
- package/dist/core/report.d.ts +0 -54
- package/dist/core/report.d.ts.map +0 -1
- package/dist/core/report.js +0 -475
- package/dist/core/report.js.map +0 -1
- package/dist/core/show.d.ts +0 -50
- package/dist/core/show.d.ts.map +0 -1
- package/dist/core/show.js +0 -374
- package/dist/core/show.js.map +0 -1
- package/dist/core/state.d.ts +0 -25
- package/dist/core/state.d.ts.map +0 -1
- package/dist/core/state.js +0 -180
- package/dist/core/state.js.map +0 -1
- package/dist/core/status.d.ts +0 -10
- package/dist/core/status.d.ts.map +0 -1
- package/dist/core/status.js +0 -106
- package/dist/core/status.js.map +0 -1
- package/dist/harness/agy.d.ts.map +0 -1
- package/dist/harness/agy.js.map +0 -1
- package/dist/harness/opencode.d.ts.map +0 -1
- package/dist/harness/opencode.js.map +0 -1
package/dist/cli/watch.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { type LogLevel } from '../core/logger.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
verbose?: boolean;
|
|
5
|
-
quiet?: boolean;
|
|
6
|
-
}
|
|
1
|
+
import { type LogLevel } from '../core/foundation/logger.js';
|
|
2
|
+
import type { WatchCommandOptions } from '../watcher/dev.js';
|
|
3
|
+
export type { WatchCommandOptions };
|
|
7
4
|
export declare function resolveLogLevel(options: WatchCommandOptions): LogLevel;
|
|
5
|
+
/**
|
|
6
|
+
* Dev mode hands control to the supervisor, which runs the watcher as a `tsx`
|
|
7
|
+
* child and restarts it on source changes. The supervised worker carries
|
|
8
|
+
* `OSQ_DEV_WORKER=1` and must start the loop rather than recurse.
|
|
9
|
+
*/
|
|
10
|
+
export declare function shouldRunDevSupervisor(options: WatchCommandOptions, env?: NodeJS.ProcessEnv): boolean;
|
|
8
11
|
export declare function watchCommand(options: WatchCommandOptions): Promise<void>;
|
|
9
12
|
//# sourceMappingURL=watch.d.ts.map
|
package/dist/cli/watch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAgB,MAAM,
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAgB,MAAM,8BAA8B,CAAC;AAE3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG7D,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,QAAQ,CAItE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAET;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAa9E"}
|
package/dist/cli/watch.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { loadConfig } from '../core/config.js';
|
|
2
|
-
import { createLogger } from '../core/logger.js';
|
|
1
|
+
import { loadConfig } from '../core/foundation/config.js';
|
|
2
|
+
import { createLogger } from '../core/foundation/logger.js';
|
|
3
3
|
import { getHarnessAdapter } from '../harness/index.js';
|
|
4
4
|
import { startWatcher } from '../watcher/loop.js';
|
|
5
5
|
export function resolveLogLevel(options) {
|
|
@@ -9,7 +9,20 @@ export function resolveLogLevel(options) {
|
|
|
9
9
|
return 'verbose';
|
|
10
10
|
return 'normal';
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Dev mode hands control to the supervisor, which runs the watcher as a `tsx`
|
|
14
|
+
* child and restarts it on source changes. The supervised worker carries
|
|
15
|
+
* `OSQ_DEV_WORKER=1` and must start the loop rather than recurse.
|
|
16
|
+
*/
|
|
17
|
+
export function shouldRunDevSupervisor(options, env = process.env) {
|
|
18
|
+
return options.dev === true && env.OSQ_DEV_WORKER !== '1';
|
|
19
|
+
}
|
|
12
20
|
export async function watchCommand(options) {
|
|
21
|
+
if (shouldRunDevSupervisor(options)) {
|
|
22
|
+
const { runDevSupervisor } = await import('../watcher/dev.js');
|
|
23
|
+
await runDevSupervisor(options);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
13
26
|
const cwd = process.cwd();
|
|
14
27
|
const config = await loadConfig(cwd);
|
|
15
28
|
const adapter = getHarnessAdapter(config.harness);
|
package/dist/cli/watch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAiB,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,MAAM,UAAU,eAAe,CAAC,OAA4B;IAC1D,IAAI,OAAO,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IAClC,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACtC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAA4B,EAC5B,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA4B;IAC7D,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC/D,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC;IAC9C,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { PlannerConfig } from './config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Optional Codex CLI execution settings. Every field is optional; omitting a
|
|
4
|
+
* field defers to Codex's own native configuration and defaults.
|
|
5
|
+
*/
|
|
6
|
+
export interface CodexConfig {
|
|
7
|
+
readonly bin?: string;
|
|
8
|
+
readonly model?: string;
|
|
9
|
+
readonly effort?: string;
|
|
10
|
+
}
|
|
11
|
+
/** Validate optional Codex settings, rejecting blank or non-string values. */
|
|
12
|
+
export declare function validateCodexConfig(codex: unknown): CodexConfig;
|
|
13
|
+
/**
|
|
14
|
+
* Validate the optional `planner` block. Supported harness names and
|
|
15
|
+
* harness-specific optional settings are derived from the canonical catalog;
|
|
16
|
+
* the model is always required. Unsupported settings fail with the selected
|
|
17
|
+
* harness and the offending setting named rather than being silently ignored.
|
|
18
|
+
*/
|
|
19
|
+
export declare function validatePlannerConfig(planner: unknown): PlannerConfig;
|
|
20
|
+
export { resolveAdapterModel, resolveCodexBinary, resolveCodexEffort, resolveCodexModel, resolveHarnessEffort, resolveHarnessModel, resolvePlannerSelection, } from './harness-catalog.js';
|
|
21
|
+
export type { PlannerSelection } from './harness-catalog.js';
|
|
22
|
+
//# sourceMappingURL=config-codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-codex.d.ts","sourceRoot":"","sources":["../../../src/core/foundation/config-codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAID,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAkB/D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CA6BrE;AAID,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { HARNESS_NAMES, findHarness } from './harness-catalog.js';
|
|
2
|
+
const CODEX_STRING_FIELDS = ['bin', 'model', 'effort'];
|
|
3
|
+
/** Validate optional Codex settings, rejecting blank or non-string values. */
|
|
4
|
+
export function validateCodexConfig(codex) {
|
|
5
|
+
if (codex === undefined || codex === null) {
|
|
6
|
+
return {};
|
|
7
|
+
}
|
|
8
|
+
if (typeof codex !== 'object' || Array.isArray(codex)) {
|
|
9
|
+
throw new Error('codex configuration must be an object');
|
|
10
|
+
}
|
|
11
|
+
const record = codex;
|
|
12
|
+
const validated = {};
|
|
13
|
+
for (const field of CODEX_STRING_FIELDS) {
|
|
14
|
+
const value = record[field];
|
|
15
|
+
if (value === undefined)
|
|
16
|
+
continue;
|
|
17
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
18
|
+
throw new Error(`codex.${field} must be a non-empty string if provided`);
|
|
19
|
+
}
|
|
20
|
+
validated[field] = value.trim();
|
|
21
|
+
}
|
|
22
|
+
return validated;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Validate the optional `planner` block. Supported harness names and
|
|
26
|
+
* harness-specific optional settings are derived from the canonical catalog;
|
|
27
|
+
* the model is always required. Unsupported settings fail with the selected
|
|
28
|
+
* harness and the offending setting named rather than being silently ignored.
|
|
29
|
+
*/
|
|
30
|
+
export function validatePlannerConfig(planner) {
|
|
31
|
+
if (!planner || typeof planner !== 'object') {
|
|
32
|
+
throw new Error('planner configuration must be an object');
|
|
33
|
+
}
|
|
34
|
+
const p = planner;
|
|
35
|
+
if (typeof p.harness !== 'string' || !p.harness.trim()) {
|
|
36
|
+
throw new Error('planner.harness must be a non-empty string');
|
|
37
|
+
}
|
|
38
|
+
const entry = findHarness(p.harness);
|
|
39
|
+
if (!entry) {
|
|
40
|
+
throw new Error(`Unsupported planner harness: "${String(p.harness).trim()}". Must be one of: ${HARNESS_NAMES.join(', ')}`);
|
|
41
|
+
}
|
|
42
|
+
if (typeof p.model !== 'string' || !p.model.trim()) {
|
|
43
|
+
throw new Error('planner.model must be a non-empty string');
|
|
44
|
+
}
|
|
45
|
+
const model = p.model.trim();
|
|
46
|
+
if (p.agent !== undefined && (typeof p.agent !== 'string' || !p.agent.trim())) {
|
|
47
|
+
throw new Error('planner.agent must be a non-empty string if provided');
|
|
48
|
+
}
|
|
49
|
+
const agent = typeof p.agent === 'string' && p.agent.trim() ? p.agent.trim() : undefined;
|
|
50
|
+
if (agent && !entry.planner.agent) {
|
|
51
|
+
throw new Error(`planner.agent is unsupported for the ${entry.name} harness; remove it`);
|
|
52
|
+
}
|
|
53
|
+
return { harness: entry.name, model, ...(agent ? { agent } : {}) };
|
|
54
|
+
}
|
|
55
|
+
// Shared resolution lives in the canonical catalog; re-exported here so the
|
|
56
|
+
// 032 public surface and its call sites keep working unchanged.
|
|
57
|
+
export { resolveAdapterModel, resolveCodexBinary, resolveCodexEffort, resolveCodexModel, resolveHarnessEffort, resolveHarnessModel, resolvePlannerSelection, } from './harness-catalog.js';
|
|
58
|
+
//# sourceMappingURL=config-codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-codex.js","sourceRoot":"","sources":["../../../src/core/foundation/config-codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { OsqConfig } from './config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve the binary the doctor must probe for the active harness, using the
|
|
4
|
+
* catalog's executable resolution. Returns `null` for harnesses with no binary
|
|
5
|
+
* (the mock adapter). Uncatalogued names are echoed back so doctor can still
|
|
6
|
+
* report them as unavailable.
|
|
7
|
+
*/
|
|
8
|
+
export declare function harnessBinary(config: OsqConfig): string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Probe `<bin> --version`, returning the first trimmed output line. The default
|
|
11
|
+
* deadline matches the configured harness preflight value used elsewhere.
|
|
12
|
+
*/
|
|
13
|
+
export declare function probeVersion(bin: string, root: string, timeoutSeconds?: number): Promise<string>;
|
|
14
|
+
//# sourceMappingURL=config-doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-doctor.d.ts","sourceRoot":"","sources":["../../../src/core/foundation/config-doctor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAK9D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,SAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAY5F"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { findHarness, resolveHarnessExecutable } from './harness-catalog.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the binary the doctor must probe for the active harness, using the
|
|
5
|
+
* catalog's executable resolution. Returns `null` for harnesses with no binary
|
|
6
|
+
* (the mock adapter). Uncatalogued names are echoed back so doctor can still
|
|
7
|
+
* report them as unavailable.
|
|
8
|
+
*/
|
|
9
|
+
export function harnessBinary(config) {
|
|
10
|
+
const name = typeof config.harness === 'string' ? config.harness.trim() : '';
|
|
11
|
+
if (name === '')
|
|
12
|
+
return null;
|
|
13
|
+
const entry = findHarness(name);
|
|
14
|
+
return entry ? resolveHarnessExecutable(entry.name, config) : name;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Probe `<bin> --version`, returning the first trimmed output line. The default
|
|
18
|
+
* deadline matches the configured harness preflight value used elsewhere.
|
|
19
|
+
*/
|
|
20
|
+
export function probeVersion(bin, root, timeoutSeconds = 10) {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
execFile(bin, ['--version'], { cwd: root, timeout: timeoutSeconds * 1000 }, (err, out, errOut) => {
|
|
23
|
+
if (err)
|
|
24
|
+
return reject(err);
|
|
25
|
+
resolve((out || errOut).trim().split('\n')[0].trim());
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=config-doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-doctor.js","sourceRoot":"","sources":["../../../src/core/foundation/config-doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAE7E;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,IAAY,EAAE,cAAc,GAAG,EAAE;IACzE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,QAAQ,CACN,GAAG,EACH,CAAC,WAAW,CAAC,EACb,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,EAAE,EAC7C,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;YACnB,IAAI,GAAG;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-env.d.ts","sourceRoot":"","sources":["../../../src/core/foundation/config-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjF,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,aAAa,EACzB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,SAAS,CAAC,CAepB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { DEFAULT_CONFIG } from './config.js';
|
|
2
|
+
import { HARNESS_CATALOG } from './harness-catalog.js';
|
|
3
|
+
// Apply OSQ_MODEL to catalogued harness sections that accept it; explicit
|
|
4
|
+
// models still win and `defineConfig` owns default merging and validation.
|
|
5
|
+
export function applyHarnessModelEnv(userConfig, selectedHarness, envModel) {
|
|
6
|
+
const selected = selectedHarness.trim().toLowerCase();
|
|
7
|
+
const overrides = {};
|
|
8
|
+
for (const entry of HARNESS_CATALOG) {
|
|
9
|
+
if (!entry.configKey)
|
|
10
|
+
continue;
|
|
11
|
+
if (!entry.envModelWhenUnselected && entry.name !== selected)
|
|
12
|
+
continue;
|
|
13
|
+
const sections = userConfig;
|
|
14
|
+
const section = sections[entry.configKey];
|
|
15
|
+
if (section?.model)
|
|
16
|
+
continue;
|
|
17
|
+
const defaults = DEFAULT_CONFIG[entry.configKey];
|
|
18
|
+
overrides[entry.configKey] = { ...(defaults ?? {}), ...(section ?? {}), model: envModel };
|
|
19
|
+
}
|
|
20
|
+
return overrides;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=config-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-env.js","sourceRoot":"","sources":["../../../src/core/foundation/config-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAsC,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,0EAA0E;AAC1E,2EAA2E;AAC3E,MAAM,UAAU,oBAAoB,CAClC,UAAyB,EACzB,eAAuB,EACvB,QAAgB;IAEhB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtD,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,SAAS;QAC/B,IAAI,CAAC,KAAK,CAAC,sBAAsB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACvE,MAAM,QAAQ,GAAG,UAAuE,CAAC;QACzF,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,KAAK;YAAE,SAAS;QAC7B,MAAM,QAAQ,GAAI,cAAgE,CAChF,KAAK,CAAC,SAAS,CAChB,CAAC;QACF,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC5F,CAAC;IACD,OAAO,SAA+B,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task-boundary verification gates. `changeVerifyAfterTask` runs the change's
|
|
3
|
+
* proposal verify after each passing task verify; it defaults on so every
|
|
4
|
+
* completed task leaves the full change verifier green. `preSpawnVerify`
|
|
5
|
+
* controls whether a task's verify runs once before its first attempt.
|
|
6
|
+
* `autoRetries` bounds how many automatic retries the watcher may spend on a
|
|
7
|
+
* dead task before a human must intervene; zero disables them.
|
|
8
|
+
*/
|
|
9
|
+
export type PreSpawnVerifyMode = 'warn' | 'fail' | 'off';
|
|
10
|
+
export interface GatesConfig {
|
|
11
|
+
readonly changeVerifyAfterTask: boolean;
|
|
12
|
+
readonly preSpawnVerify?: PreSpawnVerifyMode;
|
|
13
|
+
readonly autoRetries?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare const DEFAULT_GATES_CONFIG: GatesConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Validate an optional `gates` block over the defaults. A partial block keeps
|
|
18
|
+
* each missing gate's default; a present value outside the gate's type is
|
|
19
|
+
* rejected.
|
|
20
|
+
*/
|
|
21
|
+
export declare function validateGatesConfig(gates: unknown): GatesConfig;
|
|
22
|
+
//# sourceMappingURL=config-gates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-gates.d.ts","sourceRoot":"","sources":["../../../src/core/foundation/config-gates.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,kBAAkB,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,eAAO,MAAM,oBAAoB,EAAE,WAIlC,CAAC;AAIF;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAkC/D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export const DEFAULT_GATES_CONFIG = {
|
|
2
|
+
changeVerifyAfterTask: true,
|
|
3
|
+
preSpawnVerify: 'warn',
|
|
4
|
+
autoRetries: 1,
|
|
5
|
+
};
|
|
6
|
+
const PRE_SPAWN_VERIFY_MODES = ['warn', 'fail', 'off'];
|
|
7
|
+
/**
|
|
8
|
+
* Validate an optional `gates` block over the defaults. A partial block keeps
|
|
9
|
+
* each missing gate's default; a present value outside the gate's type is
|
|
10
|
+
* rejected.
|
|
11
|
+
*/
|
|
12
|
+
export function validateGatesConfig(gates) {
|
|
13
|
+
if (gates === undefined)
|
|
14
|
+
return DEFAULT_GATES_CONFIG;
|
|
15
|
+
if (typeof gates !== 'object' || gates === null || Array.isArray(gates)) {
|
|
16
|
+
throw new Error('gates configuration must be an object');
|
|
17
|
+
}
|
|
18
|
+
const record = gates;
|
|
19
|
+
const value = record.changeVerifyAfterTask === undefined
|
|
20
|
+
? DEFAULT_GATES_CONFIG.changeVerifyAfterTask
|
|
21
|
+
: record.changeVerifyAfterTask;
|
|
22
|
+
if (typeof value !== 'boolean') {
|
|
23
|
+
throw new Error('gates.changeVerifyAfterTask must be a boolean');
|
|
24
|
+
}
|
|
25
|
+
const preSpawnRaw = record.preSpawnVerify === undefined
|
|
26
|
+
? DEFAULT_GATES_CONFIG.preSpawnVerify
|
|
27
|
+
: record.preSpawnVerify;
|
|
28
|
+
if (!PRE_SPAWN_VERIFY_MODES.includes(preSpawnRaw)) {
|
|
29
|
+
throw new Error('gates.preSpawnVerify must be one of warn, fail, off');
|
|
30
|
+
}
|
|
31
|
+
const autoRetriesRaw = record.autoRetries === undefined ? DEFAULT_GATES_CONFIG.autoRetries : record.autoRetries;
|
|
32
|
+
if (typeof autoRetriesRaw !== 'number' ||
|
|
33
|
+
!Number.isInteger(autoRetriesRaw) ||
|
|
34
|
+
autoRetriesRaw < 0) {
|
|
35
|
+
throw new Error('gates.autoRetries must be a non-negative integer');
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
changeVerifyAfterTask: value,
|
|
39
|
+
preSpawnVerify: preSpawnRaw,
|
|
40
|
+
autoRetries: autoRetriesRaw,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=config-gates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-gates.js","sourceRoot":"","sources":["../../../src/core/foundation/config-gates.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,qBAAqB,EAAE,IAAI;IAC3B,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE,CAAC;CACf,CAAC;AAEF,MAAM,sBAAsB,GAAkC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAEtF;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,oBAAoB,CAAC;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,KAAK,GACT,MAAM,CAAC,qBAAqB,KAAK,SAAS;QACxC,CAAC,CAAC,oBAAoB,CAAC,qBAAqB;QAC5C,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC;IACnC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,WAAW,GACf,MAAM,CAAC,cAAc,KAAK,SAAS;QACjC,CAAC,CAAC,oBAAoB,CAAC,cAAc;QACrC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;IAC5B,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,WAAiC,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,cAAc,GAClB,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;IAC3F,IACE,OAAO,cAAc,KAAK,QAAQ;QAClC,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC;QACjC,cAAc,GAAG,CAAC,EAClB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO;QACL,qBAAqB,EAAE,KAAK;QAC5B,cAAc,EAAE,WAAiC;QACjD,WAAW,EAAE,cAAc;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { OsqConfig } from './config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Optional Pi CLI execution settings. Every field is optional; omitting a field
|
|
4
|
+
* defers to Pi's own native configuration and defaults. Pi reads `AGENTS.md`
|
|
5
|
+
* itself, so osq writes no Pi files.
|
|
6
|
+
*/
|
|
7
|
+
export interface PiConfig {
|
|
8
|
+
readonly bin?: string;
|
|
9
|
+
readonly provider?: string;
|
|
10
|
+
readonly model?: string;
|
|
11
|
+
readonly thinking?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Validate optional Pi settings, rejecting blank or non-string values. */
|
|
14
|
+
export declare function validatePiConfig(pi: unknown): PiConfig;
|
|
15
|
+
/** Tested Pi release range. Pi ships often, so bumping this is a one-liner. */
|
|
16
|
+
export declare const PI_TESTED_RANGE = ">=0.87.0 <0.88.0";
|
|
17
|
+
/** Assessment of one `pi --version` line against the tested range. */
|
|
18
|
+
export interface PiVersionAssessment {
|
|
19
|
+
readonly version: string;
|
|
20
|
+
readonly tested: boolean;
|
|
21
|
+
readonly warning?: string;
|
|
22
|
+
}
|
|
23
|
+
/** Assess the first line of `pi --version` without failing outside the range. */
|
|
24
|
+
export declare function assessPiVersion(raw: string): PiVersionAssessment;
|
|
25
|
+
/** Outcome of `pi auth check --provider <name> --json`. */
|
|
26
|
+
export interface PiAuthResult {
|
|
27
|
+
readonly ok: boolean;
|
|
28
|
+
readonly status: string;
|
|
29
|
+
readonly provider: string;
|
|
30
|
+
readonly reason?: string;
|
|
31
|
+
}
|
|
32
|
+
/** Inputs a catalog entry's doctor `diagnose` hook receives after a probe. */
|
|
33
|
+
export interface HarnessDiagnoseContext {
|
|
34
|
+
readonly config: OsqConfig;
|
|
35
|
+
readonly projectRoot: string;
|
|
36
|
+
readonly version: string;
|
|
37
|
+
}
|
|
38
|
+
/** One extra doctor check contributed by a catalog entry. */
|
|
39
|
+
export interface HarnessDiagnosis {
|
|
40
|
+
readonly name: string;
|
|
41
|
+
readonly ok: boolean;
|
|
42
|
+
readonly warning?: boolean;
|
|
43
|
+
readonly message: string;
|
|
44
|
+
}
|
|
45
|
+
/** Resolve the Pi executable: explicit `pi.bin`, then `OSQ_PI_PATH`, then `pi`. */
|
|
46
|
+
export declare function resolvePiBinary(config?: {
|
|
47
|
+
readonly pi?: {
|
|
48
|
+
readonly bin?: string;
|
|
49
|
+
};
|
|
50
|
+
}): string;
|
|
51
|
+
/** Pi thinking level as effort, or null when unset. */
|
|
52
|
+
export declare function resolvePiEffort(config?: {
|
|
53
|
+
readonly pi?: {
|
|
54
|
+
readonly thinking?: string;
|
|
55
|
+
};
|
|
56
|
+
}): string | null;
|
|
57
|
+
/** Version warning plus provider credential check for `osq doctor`. */
|
|
58
|
+
export declare function diagnosePi(context: HarnessDiagnoseContext): Promise<readonly HarnessDiagnosis[]>;
|
|
59
|
+
/**
|
|
60
|
+
* Run `pi auth check --provider <name> --json`. Pi exits 0, 1, or 2 and always
|
|
61
|
+
* prints the status object, so a non-zero exit is data, not an error.
|
|
62
|
+
*/
|
|
63
|
+
export declare function runPiAuthCheck(bin: string, projectRoot: string, provider: string, timeoutSeconds?: number): Promise<PiAuthResult>;
|
|
64
|
+
//# sourceMappingURL=config-pi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-pi.d.ts","sourceRoot":"","sources":["../../../src/core/foundation/config-pi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAID,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,QAAQ,CAkBtD;AAED,+EAA+E;AAC/E,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAKlD,sEAAsE;AACtE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAYD,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAmBhE;AAED,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,8EAA8E;AAC9E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAM5F;AAED,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE;IACvC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C,GAAG,MAAM,GAAG,IAAI,CAEhB;AAED,uEAAuE;AACvE,wBAAsB,UAAU,CAC9B,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CA4BtC;AAmBD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,cAAc,SAAK,GAClB,OAAO,CAAC,YAAY,CAAC,CAoBvB"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
const PI_STRING_FIELDS = ['bin', 'provider', 'model', 'thinking'];
|
|
3
|
+
/** Validate optional Pi settings, rejecting blank or non-string values. */
|
|
4
|
+
export function validatePiConfig(pi) {
|
|
5
|
+
if (pi === undefined || pi === null) {
|
|
6
|
+
return {};
|
|
7
|
+
}
|
|
8
|
+
if (typeof pi !== 'object' || Array.isArray(pi)) {
|
|
9
|
+
throw new Error('pi configuration must be an object');
|
|
10
|
+
}
|
|
11
|
+
const record = pi;
|
|
12
|
+
const validated = {};
|
|
13
|
+
for (const field of PI_STRING_FIELDS) {
|
|
14
|
+
const value = record[field];
|
|
15
|
+
if (value === undefined)
|
|
16
|
+
continue;
|
|
17
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
18
|
+
throw new Error(`pi.${field} must be a non-empty string if provided`);
|
|
19
|
+
}
|
|
20
|
+
validated[field] = value.trim();
|
|
21
|
+
}
|
|
22
|
+
return validated;
|
|
23
|
+
}
|
|
24
|
+
/** Tested Pi release range. Pi ships often, so bumping this is a one-liner. */
|
|
25
|
+
export const PI_TESTED_RANGE = '>=0.87.0 <0.88.0';
|
|
26
|
+
const PI_TESTED_MIN = [0, 87, 0];
|
|
27
|
+
const PI_TESTED_MAX = [0, 88, 0];
|
|
28
|
+
function compareVersion(a, b) {
|
|
29
|
+
for (let i = 0; i < 3; i += 1) {
|
|
30
|
+
if (a[i] !== b[i])
|
|
31
|
+
return (a[i] ?? 0) - (b[i] ?? 0);
|
|
32
|
+
}
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
/** Assess the first line of `pi --version` without failing outside the range. */
|
|
36
|
+
export function assessPiVersion(raw) {
|
|
37
|
+
const version = raw.trim().split('\n')[0]?.trim() ?? '';
|
|
38
|
+
const match = /(\d+)\.(\d+)\.(\d+)/.exec(version);
|
|
39
|
+
if (!match) {
|
|
40
|
+
return {
|
|
41
|
+
version,
|
|
42
|
+
tested: false,
|
|
43
|
+
warning: `Pi version "${version}" is outside the tested range ${PI_TESTED_RANGE}`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const current = [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
47
|
+
const tested = compareVersion(current, PI_TESTED_MIN) >= 0 && compareVersion(current, PI_TESTED_MAX) < 0;
|
|
48
|
+
if (tested)
|
|
49
|
+
return { version, tested };
|
|
50
|
+
return {
|
|
51
|
+
version,
|
|
52
|
+
tested,
|
|
53
|
+
warning: `Pi ${version} is outside the tested range ${PI_TESTED_RANGE}`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Resolve the Pi executable: explicit `pi.bin`, then `OSQ_PI_PATH`, then `pi`. */
|
|
57
|
+
export function resolvePiBinary(config) {
|
|
58
|
+
const explicit = config?.pi?.bin?.trim();
|
|
59
|
+
if (explicit)
|
|
60
|
+
return explicit;
|
|
61
|
+
const fromEnv = process.env.OSQ_PI_PATH?.trim();
|
|
62
|
+
if (fromEnv)
|
|
63
|
+
return fromEnv;
|
|
64
|
+
return 'pi';
|
|
65
|
+
}
|
|
66
|
+
/** Pi thinking level as effort, or null when unset. */
|
|
67
|
+
export function resolvePiEffort(config) {
|
|
68
|
+
return config?.pi?.thinking?.trim() || null;
|
|
69
|
+
}
|
|
70
|
+
/** Version warning plus provider credential check for `osq doctor`. */
|
|
71
|
+
export async function diagnosePi(context) {
|
|
72
|
+
const assessment = assessPiVersion(context.version);
|
|
73
|
+
const version = {
|
|
74
|
+
name: 'harness-version',
|
|
75
|
+
ok: true,
|
|
76
|
+
...(assessment.tested ? {} : { warning: true }),
|
|
77
|
+
message: assessment.tested
|
|
78
|
+
? `Pi ${assessment.version} (tested ${PI_TESTED_RANGE})`
|
|
79
|
+
: (assessment.warning ?? `Pi ${assessment.version} is outside ${PI_TESTED_RANGE}`),
|
|
80
|
+
};
|
|
81
|
+
const provider = context.config.pi?.provider?.trim();
|
|
82
|
+
if (!provider)
|
|
83
|
+
return [version];
|
|
84
|
+
const auth = await runPiAuthCheck(resolvePiBinary(context.config), context.projectRoot, provider, context.config.timeouts?.harnessPreflightSeconds ?? 10);
|
|
85
|
+
const authCheck = auth.ok
|
|
86
|
+
? { name: 'harness-auth', ok: true, message: `${auth.provider} credentials ready` }
|
|
87
|
+
: {
|
|
88
|
+
name: 'harness-auth',
|
|
89
|
+
ok: false,
|
|
90
|
+
message: `${auth.provider} credentials not ready: ${auth.reason ?? auth.status}`,
|
|
91
|
+
};
|
|
92
|
+
return [version, authCheck];
|
|
93
|
+
}
|
|
94
|
+
function parseJsonRecord(raw) {
|
|
95
|
+
if (!raw)
|
|
96
|
+
return undefined;
|
|
97
|
+
try {
|
|
98
|
+
const parsed = JSON.parse(raw);
|
|
99
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
100
|
+
? parsed
|
|
101
|
+
: undefined;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function stringField(record, key) {
|
|
108
|
+
const value = record?.[key];
|
|
109
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Run `pi auth check --provider <name> --json`. Pi exits 0, 1, or 2 and always
|
|
113
|
+
* prints the status object, so a non-zero exit is data, not an error.
|
|
114
|
+
*/
|
|
115
|
+
export function runPiAuthCheck(bin, projectRoot, provider, timeoutSeconds = 10) {
|
|
116
|
+
return new Promise((resolve) => {
|
|
117
|
+
execFile(bin, ['auth', 'check', '--provider', provider, '--json'], { cwd: projectRoot, timeout: timeoutSeconds * 1000 }, (err, stdout) => {
|
|
118
|
+
const parsed = parseJsonRecord((stdout || '').trim());
|
|
119
|
+
const status = stringField(parsed, 'status') ?? (err ? 'error' : 'unknown');
|
|
120
|
+
const reason = stringField(parsed, 'reason') ?? (err ? String(err.message) : undefined);
|
|
121
|
+
const resolvedProvider = stringField(parsed, 'provider') ?? provider;
|
|
122
|
+
resolve({
|
|
123
|
+
ok: status === 'ready',
|
|
124
|
+
status,
|
|
125
|
+
provider: resolvedProvider,
|
|
126
|
+
...(reason ? { reason } : {}),
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=config-pi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-pi.js","sourceRoot":"","sources":["../../../src/core/foundation/config-pi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planning measurement settings. `idleGapMinutes` bounds the gap between two
|
|
3
|
+
* owned turns that still counts as active planning; `prices` optionally maps a
|
|
4
|
+
* model id to USD per million tokens so a slice can be priced when no harness
|
|
5
|
+
* reported a cost. osq ships no price table of its own.
|
|
6
|
+
*/
|
|
7
|
+
export interface PlanningPrice {
|
|
8
|
+
readonly input: number;
|
|
9
|
+
readonly output: number;
|
|
10
|
+
readonly cacheRead: number;
|
|
11
|
+
readonly cacheWrite: number;
|
|
12
|
+
}
|
|
13
|
+
export interface PlanningConfig {
|
|
14
|
+
readonly idleGapMinutes: number;
|
|
15
|
+
readonly prices?: Readonly<Record<string, PlanningPrice>>;
|
|
16
|
+
}
|
|
17
|
+
export declare const DEFAULT_PLANNING_CONFIG: PlanningConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Validate an optional `planning` block over the defaults. A partial block
|
|
20
|
+
* keeps the default idle gap; a present `prices` map must hold complete,
|
|
21
|
+
* finite, non-negative price entries. Every rejection names the offending key.
|
|
22
|
+
*/
|
|
23
|
+
export declare function validatePlanningConfig(planning: unknown): PlanningConfig;
|
|
24
|
+
//# sourceMappingURL=config-planning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-planning.d.ts","sourceRoot":"","sources":["../../../src/core/foundation/config-planning.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;CAC3D;AAED,eAAO,MAAM,uBAAuB,EAAE,cAErC,CAAC;AAIF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,GAAG,cAAc,CAmBxE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export const DEFAULT_PLANNING_CONFIG = {
|
|
2
|
+
idleGapMinutes: 10,
|
|
3
|
+
};
|
|
4
|
+
const PRICE_KINDS = ['input', 'output', 'cacheRead', 'cacheWrite'];
|
|
5
|
+
/**
|
|
6
|
+
* Validate an optional `planning` block over the defaults. A partial block
|
|
7
|
+
* keeps the default idle gap; a present `prices` map must hold complete,
|
|
8
|
+
* finite, non-negative price entries. Every rejection names the offending key.
|
|
9
|
+
*/
|
|
10
|
+
export function validatePlanningConfig(planning) {
|
|
11
|
+
if (planning === undefined)
|
|
12
|
+
return DEFAULT_PLANNING_CONFIG;
|
|
13
|
+
if (typeof planning !== 'object' || planning === null || Array.isArray(planning)) {
|
|
14
|
+
throw new Error('planning configuration must be an object with idleGapMinutes');
|
|
15
|
+
}
|
|
16
|
+
const record = planning;
|
|
17
|
+
const idleGapMinutes = record.idleGapMinutes === undefined
|
|
18
|
+
? DEFAULT_PLANNING_CONFIG.idleGapMinutes
|
|
19
|
+
: record.idleGapMinutes;
|
|
20
|
+
if (typeof idleGapMinutes !== 'number' ||
|
|
21
|
+
!Number.isFinite(idleGapMinutes) ||
|
|
22
|
+
idleGapMinutes <= 0) {
|
|
23
|
+
throw new Error('planning.idleGapMinutes must be a positive finite number');
|
|
24
|
+
}
|
|
25
|
+
const prices = validatePlanningPrices(record.prices);
|
|
26
|
+
return prices === undefined ? { idleGapMinutes } : { idleGapMinutes, prices };
|
|
27
|
+
}
|
|
28
|
+
function validatePlanningPrices(prices) {
|
|
29
|
+
if (prices === undefined)
|
|
30
|
+
return undefined;
|
|
31
|
+
if (typeof prices !== 'object' || prices === null || Array.isArray(prices)) {
|
|
32
|
+
throw new Error('planning.prices must be an object mapping model ids to prices');
|
|
33
|
+
}
|
|
34
|
+
const result = {};
|
|
35
|
+
for (const [model, entry] of Object.entries(prices)) {
|
|
36
|
+
result[model] = validatePlanningPrice(model, entry);
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
function validatePlanningPrice(model, entry) {
|
|
41
|
+
if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {
|
|
42
|
+
throw new Error(`planning.prices.${model} must be an object with input, output, cacheRead, cacheWrite`);
|
|
43
|
+
}
|
|
44
|
+
const record = entry;
|
|
45
|
+
const price = {
|
|
46
|
+
input: 0,
|
|
47
|
+
output: 0,
|
|
48
|
+
cacheRead: 0,
|
|
49
|
+
cacheWrite: 0,
|
|
50
|
+
};
|
|
51
|
+
for (const kind of PRICE_KINDS) {
|
|
52
|
+
const value = record[kind];
|
|
53
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {
|
|
54
|
+
throw new Error(`planning.prices.${model}.${kind} must be a finite non-negative number`);
|
|
55
|
+
}
|
|
56
|
+
price[kind] = value;
|
|
57
|
+
}
|
|
58
|
+
return price;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=config-planning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-planning.js","sourceRoot":"","sources":["../../../src/core/foundation/config-planning.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,uBAAuB,GAAmB;IACrD,cAAc,EAAE,EAAE;CACnB,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAU,CAAC;AAE5E;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAiB;IACtD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,uBAAuB,CAAC;IAC3D,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,MAAM,GAAG,QAAmC,CAAC;IACnD,MAAM,cAAc,GAClB,MAAM,CAAC,cAAc,KAAK,SAAS;QACjC,CAAC,CAAC,uBAAuB,CAAC,cAAc;QACxC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;IAC5B,IACE,OAAO,cAAc,KAAK,QAAQ;QAClC,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC;QAChC,cAAc,IAAI,CAAC,EACnB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,sBAAsB,CAC7B,MAAe;IAEf,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,MAAM,GAAkC,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAiC,CAAC,EAAE,CAAC;QAC/E,MAAM,CAAC,KAAK,CAAC,GAAG,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa,EAAE,KAAc;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CACb,mBAAmB,KAAK,8DAA8D,CACvF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,KAAK,GAAiD;QAC1D,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;KACd,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,IAAI,IAAI,uCAAuC,CAAC,CAAC;QAC3F,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|