@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
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { PlanningPrice } from '../foundation/config-planning.js';
|
|
2
|
+
import type { PlanningUsage } from './planning-records.js';
|
|
3
|
+
/** One model response read from a native planning transcript. */
|
|
4
|
+
export interface PlanningTurn {
|
|
5
|
+
readonly timestamp: string;
|
|
6
|
+
readonly model: string | null;
|
|
7
|
+
readonly inputTokens: number | null;
|
|
8
|
+
readonly outputTokens: number | null;
|
|
9
|
+
readonly cacheReadTokens: number | null;
|
|
10
|
+
readonly cacheWriteTokens: number | null;
|
|
11
|
+
readonly reasoningTokens: number | null;
|
|
12
|
+
readonly cost: number | null;
|
|
13
|
+
/** Raw paths exactly as reported, resolved like today's edits. */
|
|
14
|
+
readonly edits: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
/** Origin of a slice's cost: a harness report, the price table, or nothing. */
|
|
17
|
+
export type PlanningCostSource = 'harness' | 'price_table' | null;
|
|
18
|
+
/** Per-kind token totals of one owned slice. */
|
|
19
|
+
export interface PlanningTokens {
|
|
20
|
+
readonly input: number | null;
|
|
21
|
+
readonly output: number | null;
|
|
22
|
+
readonly cacheRead: number | null;
|
|
23
|
+
readonly cacheWrite: number | null;
|
|
24
|
+
readonly reasoning: number | null;
|
|
25
|
+
}
|
|
26
|
+
/** The measured slice of one session that one change owns. */
|
|
27
|
+
export interface PlanningSlice {
|
|
28
|
+
readonly start: string;
|
|
29
|
+
readonly end: string;
|
|
30
|
+
readonly approvedAt: string;
|
|
31
|
+
readonly lastEditAt: string | null;
|
|
32
|
+
readonly turns: number;
|
|
33
|
+
readonly activeMinutes: number;
|
|
34
|
+
readonly tokens: PlanningTokens;
|
|
35
|
+
readonly costSource: PlanningCostSource;
|
|
36
|
+
}
|
|
37
|
+
export interface SliceRequest {
|
|
38
|
+
readonly changeFolder: string;
|
|
39
|
+
readonly changesDir: string | null;
|
|
40
|
+
readonly sessionId: string;
|
|
41
|
+
readonly sessionDir: string | null;
|
|
42
|
+
readonly approvedAt: string;
|
|
43
|
+
readonly turns: readonly PlanningTurn[];
|
|
44
|
+
readonly sessionCost: number | null;
|
|
45
|
+
readonly idleGapMinutes: number;
|
|
46
|
+
readonly prices?: Readonly<Record<string, PlanningPrice>>;
|
|
47
|
+
readonly resolveApproval: (changeFolder: string, sessionId: string) => Promise<string | null>;
|
|
48
|
+
}
|
|
49
|
+
export interface SliceResult {
|
|
50
|
+
readonly slice: PlanningSlice;
|
|
51
|
+
readonly usage: PlanningUsage;
|
|
52
|
+
readonly ownedTurns: readonly PlanningTurn[];
|
|
53
|
+
}
|
|
54
|
+
/** Segment-aware containment: a sibling prefix or `..` escape is never inside. */
|
|
55
|
+
export declare function isSegmentContained(folder: string, target: string): boolean;
|
|
56
|
+
/** Resolve one raw tool path against its recorded session directory. */
|
|
57
|
+
export declare function resolveEditPath(raw: string, sessionDir: string | null): string | null;
|
|
58
|
+
/**
|
|
59
|
+
* Resolve one raw tool path against its recorded session directory, then
|
|
60
|
+
* require segment containment by the change folder.
|
|
61
|
+
*/
|
|
62
|
+
export declare function normalizeObservedTarget(raw: string, sessionDir: string | null, changeFolder: string): string | null;
|
|
63
|
+
/**
|
|
64
|
+
* The change folder a normalized path belongs to, recognized by name directly
|
|
65
|
+
* under the changes directory or under its `archive/`.
|
|
66
|
+
*/
|
|
67
|
+
export declare function changeFolderForPath(changesDir: string, target: string): string | null;
|
|
68
|
+
/** Cut one session to the turns a change owns and measure that slice. */
|
|
69
|
+
export declare function sliceChangeOwnership(request: SliceRequest): Promise<SliceResult | null>;
|
|
70
|
+
//# sourceMappingURL=planning-slice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning-slice.d.ts","sourceRoot":"","sources":["../../../src/core/report/planning-slice.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAS3D,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,+EAA+E;AAC/E,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,aAAa,GAAG,IAAI,CAAC;AAElE,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,eAAe,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC/F;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;CAC9C;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQ1E;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAIrF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAIf;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBrF;AAkFD,yEAAyE;AACzE,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA+B7F"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { activeMinutes, combineCache, lastEditTimestamp, resolveSliceCost, sumTokens, } from './planning-slice-measures.js';
|
|
3
|
+
/** Segment-aware containment: a sibling prefix or `..` escape is never inside. */
|
|
4
|
+
export function isSegmentContained(folder, target) {
|
|
5
|
+
const relative = path.relative(path.resolve(folder), path.resolve(target));
|
|
6
|
+
return (relative !== '' &&
|
|
7
|
+
relative !== '..' &&
|
|
8
|
+
!relative.startsWith(`..${path.sep}`) &&
|
|
9
|
+
!path.isAbsolute(relative));
|
|
10
|
+
}
|
|
11
|
+
/** Resolve one raw tool path against its recorded session directory. */
|
|
12
|
+
export function resolveEditPath(raw, sessionDir) {
|
|
13
|
+
if (!raw)
|
|
14
|
+
return null;
|
|
15
|
+
if (path.isAbsolute(raw))
|
|
16
|
+
return path.resolve(raw);
|
|
17
|
+
return sessionDir ? path.resolve(sessionDir, raw) : null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolve one raw tool path against its recorded session directory, then
|
|
21
|
+
* require segment containment by the change folder.
|
|
22
|
+
*/
|
|
23
|
+
export function normalizeObservedTarget(raw, sessionDir, changeFolder) {
|
|
24
|
+
const resolved = resolveEditPath(raw, sessionDir);
|
|
25
|
+
if (!resolved)
|
|
26
|
+
return null;
|
|
27
|
+
return isSegmentContained(changeFolder, resolved) ? resolved : null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The change folder a normalized path belongs to, recognized by name directly
|
|
31
|
+
* under the changes directory or under its `archive/`.
|
|
32
|
+
*/
|
|
33
|
+
export function changeFolderForPath(changesDir, target) {
|
|
34
|
+
const root = path.resolve(changesDir);
|
|
35
|
+
const relative = path.relative(root, path.resolve(target));
|
|
36
|
+
if (relative === '' ||
|
|
37
|
+
relative === '..' ||
|
|
38
|
+
relative.startsWith(`..${path.sep}`) ||
|
|
39
|
+
path.isAbsolute(relative)) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const segments = relative.split(path.sep);
|
|
43
|
+
if (segments[0] === 'archive') {
|
|
44
|
+
return segments.length >= 3 ? path.join(root, 'archive', segments[1]) : null;
|
|
45
|
+
}
|
|
46
|
+
if (segments[0] === 'rejected' || segments.length < 2)
|
|
47
|
+
return null;
|
|
48
|
+
return path.join(root, segments[0]);
|
|
49
|
+
}
|
|
50
|
+
function sortTurns(turns) {
|
|
51
|
+
return [...turns].sort((a, b) => a.timestamp.localeCompare(b.timestamp));
|
|
52
|
+
}
|
|
53
|
+
function turnOwner(request, turn) {
|
|
54
|
+
for (const raw of turn.edits) {
|
|
55
|
+
const resolved = resolveEditPath(raw, request.sessionDir);
|
|
56
|
+
if (!resolved)
|
|
57
|
+
continue;
|
|
58
|
+
if (request.changesDir) {
|
|
59
|
+
const folder = changeFolderForPath(request.changesDir, resolved);
|
|
60
|
+
if (folder)
|
|
61
|
+
return folder;
|
|
62
|
+
}
|
|
63
|
+
if (isSegmentContained(request.changeFolder, resolved))
|
|
64
|
+
return request.changeFolder;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
async function collectBoundaries(request, owners) {
|
|
69
|
+
const changes = new Set([request.changeFolder]);
|
|
70
|
+
for (const owner of owners) {
|
|
71
|
+
if (owner)
|
|
72
|
+
changes.add(owner);
|
|
73
|
+
}
|
|
74
|
+
const boundaries = [];
|
|
75
|
+
for (const change of changes) {
|
|
76
|
+
if (change === request.changeFolder) {
|
|
77
|
+
boundaries.push({ time: request.approvedAt, change });
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const time = await request.resolveApproval(change, request.sessionId);
|
|
81
|
+
if (time !== null)
|
|
82
|
+
boundaries.push({ time, change });
|
|
83
|
+
}
|
|
84
|
+
return boundaries.sort((a, b) => a.time.localeCompare(b.time) || a.change.localeCompare(b.change));
|
|
85
|
+
}
|
|
86
|
+
/** Assign every turn to at most one change under planning turn attribution. */
|
|
87
|
+
function assignOwnership(turns, owners, boundaries) {
|
|
88
|
+
const assigned = [...owners];
|
|
89
|
+
for (let index = 0; index < turns.length; index++) {
|
|
90
|
+
if (owners[index] !== null)
|
|
91
|
+
continue;
|
|
92
|
+
const closing = boundaries.find((boundary) => boundary.time >= turns[index].timestamp) ??
|
|
93
|
+
boundaries[boundaries.length - 1];
|
|
94
|
+
if (!closing)
|
|
95
|
+
continue;
|
|
96
|
+
let owner = null;
|
|
97
|
+
for (let next = index + 1; next < turns.length; next++) {
|
|
98
|
+
if (turns[next].timestamp > closing.time)
|
|
99
|
+
break;
|
|
100
|
+
if (owners[next] !== null) {
|
|
101
|
+
owner = owners[next];
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
assigned[index] = owner ?? closing.change;
|
|
106
|
+
}
|
|
107
|
+
return assigned;
|
|
108
|
+
}
|
|
109
|
+
function buildUsage(tokens, cost) {
|
|
110
|
+
return {
|
|
111
|
+
inputTokens: tokens.input,
|
|
112
|
+
outputTokens: tokens.output,
|
|
113
|
+
cachedTokens: combineCache(tokens.cacheRead, tokens.cacheWrite),
|
|
114
|
+
reasoningTokens: tokens.reasoning,
|
|
115
|
+
cost,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/** Cut one session to the turns a change owns and measure that slice. */
|
|
119
|
+
export async function sliceChangeOwnership(request) {
|
|
120
|
+
const turns = sortTurns(request.turns);
|
|
121
|
+
if (turns.length === 0)
|
|
122
|
+
return null;
|
|
123
|
+
const owners = turns.map((turn) => turnOwner(request, turn));
|
|
124
|
+
const boundaries = await collectBoundaries(request, owners);
|
|
125
|
+
const assigned = assignOwnership(turns, owners, boundaries);
|
|
126
|
+
const owned = turns.filter((_, index) => assigned[index] === request.changeFolder);
|
|
127
|
+
if (owned.length === 0)
|
|
128
|
+
return null;
|
|
129
|
+
const tokens = sumTokens(owned);
|
|
130
|
+
const complete = owned.length === turns.length;
|
|
131
|
+
const { cost, costSource } = resolveSliceCost(owned, complete, request.sessionCost, request.prices);
|
|
132
|
+
return {
|
|
133
|
+
slice: {
|
|
134
|
+
start: owned[0].timestamp,
|
|
135
|
+
end: owned[owned.length - 1].timestamp,
|
|
136
|
+
approvedAt: request.approvedAt,
|
|
137
|
+
lastEditAt: lastEditTimestamp(owned),
|
|
138
|
+
turns: owned.length,
|
|
139
|
+
activeMinutes: activeMinutes(owned, request.idleGapMinutes),
|
|
140
|
+
tokens,
|
|
141
|
+
costSource,
|
|
142
|
+
},
|
|
143
|
+
usage: buildUsage(tokens, cost),
|
|
144
|
+
ownedTurns: owned,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=planning-slice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning-slice.js","sourceRoot":"","sources":["../../../src/core/report/planning-slice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type PlanRecord, type PlanningUsage, type PlanningUsageReader, type PlanningUsageReaderOptions } from './planning-records.js';
|
|
2
|
+
export type { PlanExitedRecord, PlanRecord, PlanStartedRecord, PlanningSession, PlanningSource, PlanningUsage, PlanningUsageReader, PlanningUsageReaderOptions, } from './planning-records.js';
|
|
3
|
+
export { NULL_PLANNING_USAGE, correlatePlanSessions, getPlanLogPath, parsePlanRecords, planningRecordSource, readPlanRecords, readPlanningSessions, } from './planning-records.js';
|
|
4
|
+
/** `sha256:<hex>` digest of the exact brief bytes. */
|
|
5
|
+
export declare function hashBriefBytes(bytes: Buffer | string): string;
|
|
6
|
+
/** Version of the osq build currently executing, or `unknown`. */
|
|
7
|
+
export declare function resolveOsqPackageVersion(): Promise<string>;
|
|
8
|
+
/** Appends one JSONL record, creating `.run/` if necessary. */
|
|
9
|
+
export declare function appendPlanRecord(changeFolder: string, record: PlanRecord): Promise<void>;
|
|
10
|
+
/** Writes `plan_started` before spawn; returns id and start milliseconds. */
|
|
11
|
+
export declare function recordPlanStarted(changeFolder: string, options: {
|
|
12
|
+
harness: string;
|
|
13
|
+
model: string;
|
|
14
|
+
agent?: string;
|
|
15
|
+
briefPath: string;
|
|
16
|
+
}): Promise<{
|
|
17
|
+
sessionId: string;
|
|
18
|
+
timestamp: string;
|
|
19
|
+
startedAtMs: number;
|
|
20
|
+
}>;
|
|
21
|
+
/** Writes `plan_exited` after the process has closed, with observed usage. */
|
|
22
|
+
export declare function recordPlanExited(changeFolder: string, options: {
|
|
23
|
+
sessionId: string;
|
|
24
|
+
startedAtMs: number;
|
|
25
|
+
endedAtMs: number;
|
|
26
|
+
exitCode: number;
|
|
27
|
+
usage: PlanningUsage;
|
|
28
|
+
}): Promise<void>;
|
|
29
|
+
/** Invokes an optional reader; absence or failure yields all-null usage. */
|
|
30
|
+
export declare function readPlanningUsage(reader: PlanningUsageReader | undefined, options: PlanningUsageReaderOptions): Promise<PlanningUsage>;
|
|
31
|
+
//# sourceMappingURL=planning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../../src/core/report/planning.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAEhC,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAE/B,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE7D;AACD,kEAAkE;AAClE,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAShE;AACD,+DAA+D;AAC/D,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9F;AACD,6EAA6E;AAC7E,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC7E,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBxE;AACD,8EAA8E;AAC9E,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;CACtB,GACA,OAAO,CAAC,IAAI,CAAC,CAYf;AACD,4EAA4E;AAC5E,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,mBAAmB,GAAG,SAAS,EACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,aAAa,CAAC,CAOxB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { PACKAGE_ROOT } from '../foundation/package-root.js';
|
|
5
|
+
import { NULL_PLANNING_USAGE, getPlanLogPath, } from './planning-records.js';
|
|
6
|
+
export { NULL_PLANNING_USAGE, correlatePlanSessions, getPlanLogPath, parsePlanRecords, planningRecordSource, readPlanRecords, readPlanningSessions, } from './planning-records.js';
|
|
7
|
+
/** `sha256:<hex>` digest of the exact brief bytes. */
|
|
8
|
+
export function hashBriefBytes(bytes) {
|
|
9
|
+
return `sha256:${crypto.createHash('sha256').update(bytes).digest('hex')}`;
|
|
10
|
+
}
|
|
11
|
+
/** Version of the osq build currently executing, or `unknown`. */
|
|
12
|
+
export async function resolveOsqPackageVersion() {
|
|
13
|
+
try {
|
|
14
|
+
const raw = await fs.readFile(path.join(PACKAGE_ROOT, 'package.json'), 'utf8');
|
|
15
|
+
const version = JSON.parse(raw).version;
|
|
16
|
+
if (typeof version === 'string' && version.trim())
|
|
17
|
+
return version.trim();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Missing or malformed package.json.
|
|
21
|
+
}
|
|
22
|
+
return 'unknown';
|
|
23
|
+
}
|
|
24
|
+
/** Appends one JSONL record, creating `.run/` if necessary. */
|
|
25
|
+
export async function appendPlanRecord(changeFolder, record) {
|
|
26
|
+
const logPath = getPlanLogPath(changeFolder);
|
|
27
|
+
await fs.mkdir(path.dirname(logPath), { recursive: true });
|
|
28
|
+
await fs.appendFile(logPath, `${JSON.stringify(record)}\n`, 'utf8');
|
|
29
|
+
}
|
|
30
|
+
/** Writes `plan_started` before spawn; returns id and start milliseconds. */
|
|
31
|
+
export async function recordPlanStarted(changeFolder, options) {
|
|
32
|
+
const startedAtMs = Date.now();
|
|
33
|
+
const timestamp = new Date(startedAtMs).toISOString();
|
|
34
|
+
const sessionId = crypto.randomUUID();
|
|
35
|
+
await appendPlanRecord(changeFolder, {
|
|
36
|
+
type: 'plan_started',
|
|
37
|
+
sessionId,
|
|
38
|
+
timestamp,
|
|
39
|
+
source: 'owned',
|
|
40
|
+
data: {
|
|
41
|
+
harness: options.harness,
|
|
42
|
+
model: options.model,
|
|
43
|
+
...(options.agent ? { agent: options.agent } : {}),
|
|
44
|
+
osqVersion: await resolveOsqPackageVersion(),
|
|
45
|
+
briefHash: hashBriefBytes(await fs.readFile(options.briefPath)),
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
return { sessionId, timestamp, startedAtMs };
|
|
49
|
+
}
|
|
50
|
+
/** Writes `plan_exited` after the process has closed, with observed usage. */
|
|
51
|
+
export async function recordPlanExited(changeFolder, options) {
|
|
52
|
+
await appendPlanRecord(changeFolder, {
|
|
53
|
+
type: 'plan_exited',
|
|
54
|
+
sessionId: options.sessionId,
|
|
55
|
+
timestamp: new Date(options.endedAtMs).toISOString(),
|
|
56
|
+
source: 'owned',
|
|
57
|
+
data: {
|
|
58
|
+
exitCode: options.exitCode,
|
|
59
|
+
wallSeconds: Math.max(0, (options.endedAtMs - options.startedAtMs) / 1000),
|
|
60
|
+
usage: options.usage,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** Invokes an optional reader; absence or failure yields all-null usage. */
|
|
65
|
+
export async function readPlanningUsage(reader, options) {
|
|
66
|
+
if (!reader)
|
|
67
|
+
return NULL_PLANNING_USAGE;
|
|
68
|
+
try {
|
|
69
|
+
return await reader(options);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return NULL_PLANNING_USAGE;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=planning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning.js","sourceRoot":"","sources":["../../../src/core/report/planning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** Pure event-stream observation helpers shared by the terminal report and web documents. */
|
|
2
|
+
/** Parse one append-only jsonl stream, skipping blank and malformed lines. */
|
|
3
|
+
export declare function parseEventLines(content: string): Record<string, unknown>[];
|
|
4
|
+
/** The typed `data` object of an event, or null when absent or malformed. */
|
|
5
|
+
export declare function asData(event: Record<string, unknown>): Record<string, unknown> | null;
|
|
6
|
+
/** Event timestamp in epoch milliseconds, or null when missing or invalid. */
|
|
7
|
+
export declare function eventTimestampMs(event: Record<string, unknown>): number | null;
|
|
8
|
+
/** One token delta parsed from a `tokens` event, with cached input retained. */
|
|
9
|
+
export interface ObservedTokenDelta {
|
|
10
|
+
readonly input: number;
|
|
11
|
+
readonly cachedInput: number;
|
|
12
|
+
readonly output: number;
|
|
13
|
+
readonly reasoning: number;
|
|
14
|
+
readonly total: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parses one `tokens` event. A harness-reported cache counter is authoritative;
|
|
18
|
+
* the remainder formula is a fallback used when the event carries no cache field.
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseTokenEvent(data: Record<string, unknown>): ObservedTokenDelta;
|
|
21
|
+
/** Attempt count plus first-attempt outcome for one numbered task stream. */
|
|
22
|
+
export interface AttemptObservation {
|
|
23
|
+
readonly attempts: number;
|
|
24
|
+
readonly firstAttemptPass: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** Counts `started` events and whether a typed `done` resolved the first attempt. */
|
|
27
|
+
export declare function observeAttempts(events: readonly Record<string, unknown>[]): AttemptObservation;
|
|
28
|
+
/** Every history-relevant observation of one numbered task event stream. */
|
|
29
|
+
export interface TaskStreamObservation {
|
|
30
|
+
readonly attempts: number;
|
|
31
|
+
readonly unexplained: number;
|
|
32
|
+
readonly deadByReason: Record<string, number>;
|
|
33
|
+
readonly verifyCodes: readonly (number | null)[];
|
|
34
|
+
readonly preSpawnRuns: number;
|
|
35
|
+
readonly preSpawnMismatches: number;
|
|
36
|
+
/** Ordered finite cost values, one per reporting event, for exact sums. */
|
|
37
|
+
readonly costValues: readonly number[];
|
|
38
|
+
/** Attempts that contained at least one finite cost value. */
|
|
39
|
+
readonly costReportedAttempts: number;
|
|
40
|
+
readonly scopeDetected: number;
|
|
41
|
+
readonly scopeVerificationPassed: number;
|
|
42
|
+
readonly scopeVerificationFailed: number;
|
|
43
|
+
readonly scopeRecertifiedByHuman: number;
|
|
44
|
+
readonly scopeRequeuedForAgent: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Projects one numbered task stream into the aggregates the report and web
|
|
48
|
+
* documents both need. Scope-regression and recertification events never
|
|
49
|
+
* count as execution attempts, multiple-attempt tasks, or cost coverage.
|
|
50
|
+
*/
|
|
51
|
+
export declare function observeTaskStream(events: readonly Record<string, unknown>[]): TaskStreamObservation;
|
|
52
|
+
//# sourceMappingURL=report-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-events.d.ts","sourceRoot":"","sources":["../../../src/core/report/report-events.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAa1E;AAED,6EAA6E;AAC7E,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAMrF;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAI9E;AAED,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CA0CjF;AAED,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,kBAAkB,CA8B9F;AAiBD,4EAA4E;AAC5E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACzC,qBAAqB,CA4EvB"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/** Pure event-stream observation helpers shared by the terminal report and web documents. */
|
|
2
|
+
/** Parse one append-only jsonl stream, skipping blank and malformed lines. */
|
|
3
|
+
export function parseEventLines(content) {
|
|
4
|
+
const events = [];
|
|
5
|
+
for (const line of content.split('\n')) {
|
|
6
|
+
const trimmed = line.trim();
|
|
7
|
+
if (!trimmed)
|
|
8
|
+
continue;
|
|
9
|
+
try {
|
|
10
|
+
const parsed = JSON.parse(trimmed);
|
|
11
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
12
|
+
events.push(parsed);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch { }
|
|
16
|
+
}
|
|
17
|
+
return events;
|
|
18
|
+
}
|
|
19
|
+
/** The typed `data` object of an event, or null when absent or malformed. */
|
|
20
|
+
export function asData(event) {
|
|
21
|
+
const data = event.data;
|
|
22
|
+
if (data && typeof data === 'object' && !Array.isArray(data)) {
|
|
23
|
+
return data;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
/** Event timestamp in epoch milliseconds, or null when missing or invalid. */
|
|
28
|
+
export function eventTimestampMs(event) {
|
|
29
|
+
if (typeof event.timestamp !== 'string')
|
|
30
|
+
return null;
|
|
31
|
+
const ms = Date.parse(event.timestamp);
|
|
32
|
+
return Number.isFinite(ms) ? ms : null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parses one `tokens` event. A harness-reported cache counter is authoritative;
|
|
36
|
+
* the remainder formula is a fallback used when the event carries no cache field.
|
|
37
|
+
*/
|
|
38
|
+
export function parseTokenEvent(data) {
|
|
39
|
+
const input = Number(data.input ?? data.input_tokens ?? data.promptTokens ?? data.prompt ?? 0) || 0;
|
|
40
|
+
const output = Number(data.output ??
|
|
41
|
+
data.output_tokens ??
|
|
42
|
+
data.candidateTokens ??
|
|
43
|
+
data.candidate ??
|
|
44
|
+
data.completionTokens ??
|
|
45
|
+
0) || 0;
|
|
46
|
+
const reasoning = Number(data.reasoningTokens ?? data.reasoning ?? data.thinking_tokens ?? 0) || 0;
|
|
47
|
+
const cacheValue = typeof data.cache === 'number'
|
|
48
|
+
? data.cache
|
|
49
|
+
: typeof data.cache === 'object' && data.cache !== null && !Array.isArray(data.cache)
|
|
50
|
+
? data.cache.read
|
|
51
|
+
: undefined;
|
|
52
|
+
const reportedCachedInput = Number(data.cached_input ?? data.cachedTokens ?? data.cache_read_tokens ?? cacheValue ?? 0) ||
|
|
53
|
+
0;
|
|
54
|
+
const hasReportedCache = data.cachedTokens !== undefined ||
|
|
55
|
+
data.cached_input !== undefined ||
|
|
56
|
+
data.cache_read_tokens !== undefined ||
|
|
57
|
+
cacheValue !== undefined;
|
|
58
|
+
const rawTotal = data.total ?? data.totalTokens;
|
|
59
|
+
const hasReportedTotal = rawTotal !== undefined && rawTotal !== null;
|
|
60
|
+
const reportedTotal = Number(rawTotal) || 0;
|
|
61
|
+
const cachedInput = hasReportedCache
|
|
62
|
+
? reportedCachedInput
|
|
63
|
+
: hasReportedTotal
|
|
64
|
+
? Math.max(0, reportedTotal - input - output - reasoning)
|
|
65
|
+
: 0;
|
|
66
|
+
const total = hasReportedTotal ? reportedTotal : input + cachedInput + output + reasoning;
|
|
67
|
+
return { input, cachedInput, output, reasoning, total };
|
|
68
|
+
}
|
|
69
|
+
/** Counts `started` events and whether a typed `done` resolved the first attempt. */
|
|
70
|
+
export function observeAttempts(events) {
|
|
71
|
+
let attempts = 0;
|
|
72
|
+
let firstAttemptActive = false;
|
|
73
|
+
let firstAttemptResolved = false;
|
|
74
|
+
let firstAttemptPass = false;
|
|
75
|
+
for (const event of events) {
|
|
76
|
+
if (event.type === 'started') {
|
|
77
|
+
attempts++;
|
|
78
|
+
if (firstAttemptActive) {
|
|
79
|
+
firstAttemptResolved = true;
|
|
80
|
+
firstAttemptActive = false;
|
|
81
|
+
}
|
|
82
|
+
else if (!firstAttemptResolved) {
|
|
83
|
+
firstAttemptActive = true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else if (event.type === 'done') {
|
|
87
|
+
if (firstAttemptActive && !firstAttemptResolved) {
|
|
88
|
+
firstAttemptPass = true;
|
|
89
|
+
firstAttemptResolved = true;
|
|
90
|
+
firstAttemptActive = false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if (event.type === 'dead' || event.type === 'regressed') {
|
|
94
|
+
if (firstAttemptActive && !firstAttemptResolved) {
|
|
95
|
+
firstAttemptResolved = true;
|
|
96
|
+
firstAttemptActive = false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { attempts, firstAttemptPass };
|
|
101
|
+
}
|
|
102
|
+
/** Pre-spawn verify runs and mismatches counted apart from verification gates. */
|
|
103
|
+
function recordVerifyRun(data, verifyCodes, preSpawn) {
|
|
104
|
+
if (data?.phase === 'pre_spawn') {
|
|
105
|
+
preSpawn.runs++;
|
|
106
|
+
if (data.mismatch === true)
|
|
107
|
+
preSpawn.mismatches++;
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const rawExit = data?.exitCode;
|
|
111
|
+
verifyCodes.push(typeof rawExit === 'number' && Number.isFinite(rawExit) ? rawExit : null);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Projects one numbered task stream into the aggregates the report and web
|
|
115
|
+
* documents both need. Scope-regression and recertification events never
|
|
116
|
+
* count as execution attempts, multiple-attempt tasks, or cost coverage.
|
|
117
|
+
*/
|
|
118
|
+
export function observeTaskStream(events) {
|
|
119
|
+
let attempts = 0;
|
|
120
|
+
let unexplained = 0;
|
|
121
|
+
const deadByReason = {};
|
|
122
|
+
const verifyCodes = [];
|
|
123
|
+
const preSpawn = { runs: 0, mismatches: 0 };
|
|
124
|
+
const costValues = [];
|
|
125
|
+
let costReportedAttempts = 0;
|
|
126
|
+
let scopeDetected = 0;
|
|
127
|
+
let scopeVerificationPassed = 0;
|
|
128
|
+
let scopeVerificationFailed = 0;
|
|
129
|
+
let scopeRecertifiedByHuman = 0;
|
|
130
|
+
let scopeRequeuedForAgent = 0;
|
|
131
|
+
let hasPriorStarted = false;
|
|
132
|
+
let gapExplained = true;
|
|
133
|
+
let attemptReportedCost = false;
|
|
134
|
+
for (const event of events) {
|
|
135
|
+
const data = asData(event);
|
|
136
|
+
const type = event.type;
|
|
137
|
+
if (type === 'started') {
|
|
138
|
+
attempts++;
|
|
139
|
+
if (hasPriorStarted && !gapExplained)
|
|
140
|
+
unexplained++;
|
|
141
|
+
hasPriorStarted = true;
|
|
142
|
+
gapExplained = false;
|
|
143
|
+
attemptReportedCost = false;
|
|
144
|
+
}
|
|
145
|
+
else if (type === 'dead') {
|
|
146
|
+
gapExplained = true;
|
|
147
|
+
const rawReason = data?.reason;
|
|
148
|
+
const reason = typeof rawReason === 'string' && rawReason.trim() ? rawReason.trim() : 'unknown';
|
|
149
|
+
deadByReason[reason] = (deadByReason[reason] ?? 0) + 1;
|
|
150
|
+
}
|
|
151
|
+
else if (type === 'regressed') {
|
|
152
|
+
gapExplained = true;
|
|
153
|
+
if (data?.reason === 'scope_regression') {
|
|
154
|
+
scopeDetected++;
|
|
155
|
+
const rawExit = data.exitCode;
|
|
156
|
+
if (typeof rawExit === 'number' && Number.isFinite(rawExit)) {
|
|
157
|
+
if (rawExit === 0)
|
|
158
|
+
scopeVerificationPassed++;
|
|
159
|
+
else
|
|
160
|
+
scopeVerificationFailed++;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (type === 'recertification') {
|
|
165
|
+
if (data?.outcome === 'passed')
|
|
166
|
+
scopeRecertifiedByHuman++;
|
|
167
|
+
else if (data?.outcome === 'requeued')
|
|
168
|
+
scopeRequeuedForAgent++;
|
|
169
|
+
}
|
|
170
|
+
else if (type === 'verify_ran') {
|
|
171
|
+
recordVerifyRun(data, verifyCodes, preSpawn);
|
|
172
|
+
}
|
|
173
|
+
const rawCost = data?.cost;
|
|
174
|
+
if (typeof rawCost === 'number' && Number.isFinite(rawCost)) {
|
|
175
|
+
costValues.push(rawCost);
|
|
176
|
+
if (hasPriorStarted && !attemptReportedCost) {
|
|
177
|
+
attemptReportedCost = true;
|
|
178
|
+
costReportedAttempts++;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
attempts,
|
|
184
|
+
unexplained,
|
|
185
|
+
deadByReason,
|
|
186
|
+
verifyCodes,
|
|
187
|
+
preSpawnRuns: preSpawn.runs,
|
|
188
|
+
preSpawnMismatches: preSpawn.mismatches,
|
|
189
|
+
costValues,
|
|
190
|
+
costReportedAttempts,
|
|
191
|
+
scopeDetected,
|
|
192
|
+
scopeVerificationPassed,
|
|
193
|
+
scopeVerificationFailed,
|
|
194
|
+
scopeRecertifiedByHuman,
|
|
195
|
+
scopeRequeuedForAgent,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=report-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-events.js","sourceRoot":"","sources":["../../../src/core/report/report-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Pre-spawn verify counts beyond runs and mismatches, derived from task events. */
|
|
2
|
+
/** Total and zero-exit runs for one declared start state. */
|
|
3
|
+
export interface PreSpawnStartCount {
|
|
4
|
+
runs: number;
|
|
5
|
+
passed: number;
|
|
6
|
+
}
|
|
7
|
+
/** The three declared start states a pre-spawn event can carry. */
|
|
8
|
+
export interface PreSpawnStartCounts {
|
|
9
|
+
red: PreSpawnStartCount;
|
|
10
|
+
green: PreSpawnStartCount;
|
|
11
|
+
any: PreSpawnStartCount;
|
|
12
|
+
}
|
|
13
|
+
/** Pre-spawn runs with missing named paths and the per-start breakdown. */
|
|
14
|
+
export interface PreSpawnEventCounts {
|
|
15
|
+
readonly missingPathRuns: number;
|
|
16
|
+
readonly byStart: PreSpawnStartCounts;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Counts one numbered task stream's pre-spawn verify runs: how many recorded a
|
|
20
|
+
* non-empty `missingPaths`, and, per declared `expected` start, how many ran and
|
|
21
|
+
* how many exited zero. Post-spawn runs, absent or unknown expected values, and
|
|
22
|
+
* empty missing-path lists are left out.
|
|
23
|
+
*/
|
|
24
|
+
export declare function observePreSpawnEvents(events: readonly Record<string, unknown>[]): PreSpawnEventCounts;
|
|
25
|
+
//# sourceMappingURL=report-pre-spawn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-pre-spawn.d.ts","sourceRoot":"","sources":["../../../src/core/report/report-pre-spawn.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAIpF,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,mEAAmE;AACnE,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,kBAAkB,CAAC;IACxB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,GAAG,EAAE,kBAAkB,CAAC;CACzB;AAED,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;CACvC;AAcD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACzC,mBAAmB,CAmBrB"}
|