ultimate-pi 0.18.1 → 0.19.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.
Files changed (284) hide show
  1. package/.agents/skills/harness-debate-plan/SKILL.md +1 -1
  2. package/.agents/skills/harness-decisions/SKILL.md +1 -2
  3. package/.agents/skills/harness-governor/SKILL.md +6 -5
  4. package/.pi/PACKAGING.md +4 -4
  5. package/.pi/SYSTEM.md +54 -120
  6. package/.pi/agents/harness/incident-recorder.md +0 -1
  7. package/.pi/agents/harness/planning/decompose.md +0 -2
  8. package/.pi/agents/harness/planning/execution-plan-author.md +0 -2
  9. package/.pi/agents/harness/planning/hypothesis-validator.md +0 -2
  10. package/.pi/agents/harness/planning/hypothesis.md +0 -2
  11. package/.pi/agents/harness/planning/implementation-researcher.md +0 -2
  12. package/.pi/agents/harness/planning/plan-adversary.md +0 -2
  13. package/.pi/agents/harness/planning/plan-evaluator.md +1 -3
  14. package/.pi/agents/harness/planning/planning-context.md +0 -2
  15. package/.pi/agents/harness/planning/review-integrator.md +0 -2
  16. package/.pi/agents/harness/planning/sprint-contract-auditor.md +0 -2
  17. package/.pi/agents/harness/planning/stack-researcher.md +0 -2
  18. package/.pi/agents/harness/reviewing/adversary.md +0 -2
  19. package/.pi/agents/harness/reviewing/evaluator.md +0 -2
  20. package/.pi/agents/harness/reviewing/tie-breaker.md +0 -2
  21. package/.pi/agents/harness/running/executor.md +0 -2
  22. package/.pi/agents/harness/sentrux-bootstrap.md +0 -1
  23. package/.pi/agents/harness/sentrux-steward.md +0 -2
  24. package/.pi/agents/harness/trace-librarian.md +0 -1
  25. package/.pi/extensions/00-posthog-network-bootstrap.ts +1 -1
  26. package/.pi/extensions/agt-kill-switch.ts +57 -0
  27. package/.pi/extensions/agt-prompt-guard.ts +32 -0
  28. package/.pi/extensions/custom-footer.ts +46 -145
  29. package/.pi/extensions/custom-header.ts +1 -1
  30. package/.pi/extensions/custom-system-prompt.ts +1 -1
  31. package/.pi/extensions/debate-orchestrator.ts +6 -6
  32. package/.pi/extensions/harness-ask-user.ts +7 -7
  33. package/.pi/extensions/harness-debate-tools.ts +26 -42
  34. package/.pi/extensions/harness-lens.ts +94 -0
  35. package/.pi/extensions/harness-plan-approval.ts +11 -11
  36. package/.pi/extensions/harness-run-context.ts +1070 -876
  37. package/.pi/extensions/harness-subagent-governance.ts +8 -0
  38. package/.pi/extensions/harness-subagent-submit.ts +34 -163
  39. package/.pi/extensions/harness-subagents.ts +3 -3
  40. package/.pi/extensions/harness-telemetry.ts +2 -2
  41. package/.pi/extensions/harness-web-tools.ts +2 -2
  42. package/.pi/extensions/policy-gate.ts +25 -5
  43. package/.pi/extensions/sentrux-rules-sync.ts +1 -1
  44. package/.pi/extensions/subagent-governance.ts +92 -0
  45. package/.pi/extensions/trace-recorder.ts +1 -1
  46. package/.pi/extensions/{ultimate-pi-vcc.ts → vcc-compaction.ts} +1 -1
  47. package/.pi/harness/README.md +6 -2
  48. package/.pi/harness/agents.manifest.json +22 -25
  49. package/.pi/harness/agents.policy.yaml +275 -0
  50. package/.pi/harness/docs/adrs/0030-inhouse-vcc-compaction.md +1 -1
  51. package/.pi/harness/docs/adrs/0035-plan-phase-review-gate.md +1 -1
  52. package/.pi/harness/docs/adrs/0045-harness-lens-minimal-contract.md +49 -0
  53. package/.pi/harness/docs/adrs/0046-agt-policy-engine.md +51 -0
  54. package/.pi/harness/docs/adrs/0047-agt-layered-security.md +39 -0
  55. package/.pi/harness/docs/adrs/0048-tool-call-hook-order.md +25 -0
  56. package/.pi/harness/docs/adrs/0049-agents-policy-manifest.md +36 -0
  57. package/.pi/harness/docs/adrs/README.md +5 -0
  58. package/.pi/harness/evolution/README.md +1 -2
  59. package/.pi/harness/examples/agents.policy.project.yaml +19 -0
  60. package/.pi/harness/examples/policies/custom-deny-bash.yaml +9 -0
  61. package/.pi/harness/policies/bash-denylists.yaml +5 -0
  62. package/.pi/harness/policies/defaults.yaml +51 -0
  63. package/.pi/harness/policies/orchestrator.yaml +18 -0
  64. package/.pi/harness/policies/phases.yaml +10 -0
  65. package/.pi/harness/policies/roles.yaml +5 -0
  66. package/.pi/harness/policies/web-guard.yaml +5 -0
  67. package/.pi/harness/policies/workflow-sequences.yaml +9 -0
  68. package/.pi/harness/sentrux/architecture.manifest.json +26 -4
  69. package/.pi/harness/specs/observation.schema.json +2 -1
  70. package/.pi/lib/agents-policy.d.mts +70 -0
  71. package/.pi/lib/agents-policy.mjs +325 -0
  72. package/.pi/lib/agents-policy.ts +19 -0
  73. package/.pi/lib/agt/audit-run-sink.ts +52 -0
  74. package/.pi/lib/agt/build-evaluation-context.ts +285 -0
  75. package/.pi/lib/agt/config.ts +28 -0
  76. package/.pi/lib/agt/delegation.ts +69 -0
  77. package/.pi/lib/agt/evaluate-policy.ts +56 -0
  78. package/.pi/lib/agt/identity-registry.ts +41 -0
  79. package/.pi/lib/agt/index.ts +55 -0
  80. package/.pi/lib/agt/kill-switch-state.ts +11 -0
  81. package/.pi/lib/agt/legacy-evaluate.ts +101 -0
  82. package/.pi/lib/agt/policy-engine.ts +154 -0
  83. package/.pi/lib/agt/rings.ts +21 -0
  84. package/.pi/lib/agt/sre-hooks.ts +45 -0
  85. package/.pi/lib/agt/trust-run-store.ts +26 -0
  86. package/.pi/lib/agt/workflow-history.ts +29 -0
  87. package/.pi/lib/agt-governance-active.ts +14 -0
  88. package/.pi/lib/agt-tool-guard.ts +78 -0
  89. package/.pi/lib/ask-user/dialog.ts +314 -0
  90. package/.pi/{extensions/lib → lib}/debate-bus-core.ts +10 -10
  91. package/.pi/{extensions/lib → lib}/debate-bus-state.ts +1 -1
  92. package/.pi/{extensions/lib → lib}/extension-load-guard.ts +13 -2
  93. package/.pi/lib/harness-agt-tool-guard.ts +5 -0
  94. package/.pi/{extensions/lib → lib}/harness-artifact-gate.ts +1 -1
  95. package/.pi/lib/harness-debate-core-deps.ts +14 -0
  96. package/.pi/lib/harness-debate-workflow-deps.ts +43 -0
  97. package/.pi/lib/harness-lens/.gitattributes +1 -0
  98. package/.pi/lib/harness-lens/clients/edit-autopatch.ts +88 -0
  99. package/.pi/lib/harness-lens/clients/file-kinds.ts +380 -0
  100. package/.pi/lib/harness-lens/clients/file-time.ts +215 -0
  101. package/.pi/lib/harness-lens/clients/file-utils.ts +484 -0
  102. package/.pi/lib/harness-lens/clients/format-service.ts +276 -0
  103. package/.pi/lib/harness-lens/clients/formatters.ts +1000 -0
  104. package/.pi/lib/harness-lens/clients/git-guard.ts +31 -0
  105. package/.pi/lib/harness-lens/clients/indent-retarget.ts +90 -0
  106. package/.pi/lib/harness-lens/clients/installer/index.ts +2368 -0
  107. package/.pi/lib/harness-lens/clients/latency-logger.ts +80 -0
  108. package/.pi/lib/harness-lens/clients/lens-config.ts +43 -0
  109. package/.pi/lib/harness-lens/clients/lens-events.ts +164 -0
  110. package/.pi/lib/harness-lens/clients/lsp/aggregation.ts +91 -0
  111. package/.pi/lib/harness-lens/clients/lsp/client.ts +1466 -0
  112. package/.pi/lib/harness-lens/clients/lsp/config.ts +216 -0
  113. package/.pi/lib/harness-lens/clients/lsp/edits.ts +297 -0
  114. package/.pi/lib/harness-lens/clients/lsp/index.ts +1355 -0
  115. package/.pi/lib/harness-lens/clients/lsp/interactive-install.ts +424 -0
  116. package/.pi/lib/harness-lens/clients/lsp/language.ts +223 -0
  117. package/.pi/lib/harness-lens/clients/lsp/launch.ts +939 -0
  118. package/.pi/lib/harness-lens/clients/lsp/lsp-index.ts +11 -0
  119. package/.pi/lib/harness-lens/clients/lsp/path-utils.ts +12 -0
  120. package/.pi/lib/harness-lens/clients/lsp/server-strategies.ts +81 -0
  121. package/.pi/lib/harness-lens/clients/lsp/server.ts +1971 -0
  122. package/.pi/lib/harness-lens/clients/path-utils.ts +182 -0
  123. package/.pi/lib/harness-lens/clients/pipeline.ts +360 -0
  124. package/.pi/lib/harness-lens/clients/project-profile.ts +117 -0
  125. package/.pi/lib/harness-lens/clients/runtime-agent-end.ts +112 -0
  126. package/.pi/lib/harness-lens/clients/runtime-config.ts +33 -0
  127. package/.pi/lib/harness-lens/clients/runtime-coordinator.ts +186 -0
  128. package/.pi/lib/harness-lens/clients/runtime-tool-result.ts +171 -0
  129. package/.pi/lib/harness-lens/clients/safe-spawn.ts +339 -0
  130. package/.pi/lib/harness-lens/clients/secrets-scanner.ts +214 -0
  131. package/.pi/lib/harness-lens/clients/tool-policy.ts +2072 -0
  132. package/.pi/lib/harness-lens/clients/types.ts +59 -0
  133. package/.pi/lib/harness-lens/clients/widget-state.ts +283 -0
  134. package/.pi/lib/harness-lens/index.ts +532 -0
  135. package/.pi/lib/harness-lens/tools/lsp-diagnostics.ts +706 -0
  136. package/.pi/lib/harness-lens/tools/lsp-navigation.ts +1246 -0
  137. package/.pi/{extensions/lib → lib}/harness-posthog.ts +3 -0
  138. package/.pi/lib/harness-run-context-responses.ts +9 -0
  139. package/.pi/lib/harness-run-context.ts +0 -2
  140. package/.pi/{extensions/lib/spawn-policy.ts → lib/harness-spawn-policy.ts} +1 -0
  141. package/.pi/{extensions/lib → lib}/harness-spawn-topology.ts +1 -1
  142. package/.pi/lib/harness-subagent-auth.ts +51 -0
  143. package/.pi/{extensions/lib → lib}/harness-subagent-precheck.ts +10 -7
  144. package/.pi/{extensions/lib → lib}/harness-subagent-submit-pipeline.ts +3 -3
  145. package/.pi/lib/harness-subagent-submit-register.ts +163 -0
  146. package/.pi/{extensions/lib → lib}/harness-subagent-submit-registry.ts +1 -37
  147. package/.pi/{extensions/lib → lib}/harness-subagents-bridge.ts +53 -14
  148. package/.pi/{extensions/lib → lib}/harness-subprocess-bootstrap.ts +1 -1
  149. package/.pi/{extensions/lib → lib}/plan-approval/create-plan.ts +2 -2
  150. package/.pi/{extensions/lib → lib}/plan-approval/format-plan.ts +2 -2
  151. package/.pi/{extensions/lib → lib}/plan-approval/plan-review.ts +162 -201
  152. package/.pi/{extensions/lib → lib}/plan-approval/render.ts +1 -1
  153. package/.pi/{extensions/lib → lib}/plan-approval/resolve-disk.ts +2 -2
  154. package/.pi/{extensions/lib → lib}/plan-approval/types.ts +1 -1
  155. package/.pi/{extensions/lib → lib}/plan-approval/validate.ts +3 -3
  156. package/.pi/{extensions/lib → lib}/plan-debate-envelope.ts +1 -1
  157. package/.pi/{extensions/lib → lib}/plan-debate-gate.ts +1 -1
  158. package/.pi/{extensions/lib → lib}/plan-debate-lane.ts +1 -4
  159. package/.pi/{extensions/lib → lib}/plan-messenger.ts +1 -1
  160. package/.pi/prompts/harness-plan.md +1 -1
  161. package/.pi/prompts/harness-setup.md +37 -64
  162. package/.pi/scripts/README.md +2 -5
  163. package/.pi/scripts/generate-agents-policy-yaml.mjs +148 -0
  164. package/.pi/scripts/harness-agents-manifest.mjs +60 -3
  165. package/.pi/scripts/harness-agt-doctor.ts +36 -0
  166. package/.pi/scripts/harness-cli-verify.sh +9 -2
  167. package/.pi/scripts/harness-verify.mjs +113 -39
  168. package/.pi/scripts/harness-web-policy-guard.mjs +2 -2
  169. package/.pi/scripts/validate-plan-dag.mjs +65 -74
  170. package/.pi/scripts/vendor-pi-vcc-settings.stub.ts +2 -2
  171. package/.pi/scripts/vendor-sync-pi-vcc.sh +1 -1
  172. package/.pi/skills/architecture/broker-domain/SKILL.md +65 -0
  173. package/.pi/skills/architecture/cqrs/SKILL.md +63 -0
  174. package/.pi/skills/architecture/event-driven/SKILL.md +60 -0
  175. package/.pi/skills/architecture/hexagonal-ports-adapters/SKILL.md +66 -0
  176. package/.pi/skills/architecture/layered/SKILL.md +68 -0
  177. package/.pi/skills/architecture/microkernel/SKILL.md +62 -0
  178. package/.pi/skills/architecture/microservices/SKILL.md +64 -0
  179. package/.pi/skills/architecture/modular-monolith/SKILL.md +65 -0
  180. package/.pi/skills/architecture/orchestration-driven-soa/SKILL.md +61 -0
  181. package/.pi/skills/architecture/pipeline/SKILL.md +63 -0
  182. package/.pi/skills/architecture/service-based/SKILL.md +64 -0
  183. package/.pi/skills/architecture/service-mesh/SKILL.md +60 -0
  184. package/.pi/skills/architecture/space-based/SKILL.md +60 -0
  185. package/.pi/skills/ast-grep/SKILL.md +40 -321
  186. package/.pi/skills/delivery/debugging-discipline/SKILL.md +36 -0
  187. package/.pi/skills/delivery/documentation-update/SKILL.md +33 -0
  188. package/.pi/skills/delivery/requirements-to-implementation/SKILL.md +34 -0
  189. package/.pi/skills/delivery/risk-based-verification/SKILL.md +43 -0
  190. package/.pi/skills/delivery/tradeoff-analysis/SKILL.md +34 -0
  191. package/.pi/skills/engineering/api-contract-design/SKILL.md +38 -0
  192. package/.pi/skills/engineering/cohesion-coupling/SKILL.md +43 -0
  193. package/.pi/skills/engineering/complexity-control/SKILL.md +31 -0
  194. package/.pi/skills/engineering/defensive-programming/SKILL.md +38 -0
  195. package/.pi/skills/engineering/dependency-management/SKILL.md +29 -0
  196. package/.pi/skills/engineering/domain-modeling/SKILL.md +32 -0
  197. package/.pi/skills/engineering/error-handling/SKILL.md +37 -0
  198. package/.pi/skills/engineering/legacy-code-seams/SKILL.md +35 -0
  199. package/.pi/skills/engineering/naming-and-intent/SKILL.md +29 -0
  200. package/.pi/skills/engineering/refactoring-safe-evolution/SKILL.md +35 -0
  201. package/.pi/skills/engineering/routine-function-design/SKILL.md +34 -0
  202. package/.pi/skills/engineering/small-change-discipline/SKILL.md +35 -0
  203. package/.pi/skills/lsp-navigation/SKILL.md +89 -0
  204. package/.pi/skills/quality/code-review-self-check/SKILL.md +35 -0
  205. package/.pi/skills/quality/privacy-data-handling/SKILL.md +26 -0
  206. package/.pi/skills/quality/security-review/SKILL.md +34 -0
  207. package/.pi/skills/quality/test-strategy/SKILL.md +33 -0
  208. package/.pi/skills/quality/testability-design/SKILL.md +33 -0
  209. package/.pi/skills/systems/concurrency-safety/SKILL.md +32 -0
  210. package/.pi/skills/systems/data-modeling-migrations/SKILL.md +31 -0
  211. package/.pi/skills/systems/observability-instrumentation/SKILL.md +32 -0
  212. package/.pi/skills/systems/performance-measurement/SKILL.md +35 -0
  213. package/.pi/skills/systems/reliability-design/SKILL.md +32 -0
  214. package/.sentrux/rules.toml +20 -4
  215. package/AGENTS.md +5 -0
  216. package/CHANGELOG.md +14 -0
  217. package/README.md +3 -12
  218. package/THIRD_PARTY_NOTICES.md +12 -21
  219. package/package.json +15 -7
  220. package/vendor/pi-subagents/src/agents.ts +45 -1
  221. package/vendor/pi-subagents/src/subagents.ts +866 -811
  222. package/vendor/pi-vcc/src/core/brief.ts +68 -99
  223. package/vendor/pi-vcc/src/core/settings.ts +2 -2
  224. package/.agents/skills/caveman/SKILL.md +0 -67
  225. package/.pi/agents/harness/meta-optimizer.md +0 -36
  226. package/.pi/extensions/lib/ask-user/dialog.ts +0 -260
  227. package/.pi/extensions/lib/harness-subagent-auth.ts +0 -207
  228. package/.pi/extensions/lib/harness-subagent-policy.ts +0 -236
  229. package/.pi/extensions/pi-model-router-harness.ts +0 -42
  230. package/.pi/harness/evolution/meta-optimizer.mjs +0 -99
  231. package/.pi/harness/specs/router-tuning-proposal.schema.json +0 -114
  232. package/.pi/model-router.example.json +0 -36
  233. package/.pi/prompts/harness-critic.md +0 -10
  234. package/.pi/prompts/harness-eval.md +0 -10
  235. package/.pi/prompts/harness-router-tune.md +0 -52
  236. package/.pi/scripts/harness-generate-model-router.mjs +0 -327
  237. package/.pi/scripts/harness-model-router-routing.test.mjs +0 -97
  238. package/.pi/scripts/harness-sync-model-router.mjs +0 -97
  239. package/.pi/scripts/vendor-sync-pi-model-router.sh +0 -47
  240. package/vendor/pi-model-router/.prettierignore +0 -4
  241. package/vendor/pi-model-router/.prettierrc +0 -5
  242. package/vendor/pi-model-router/AGENTS.md +0 -39
  243. package/vendor/pi-model-router/LICENSE +0 -21
  244. package/vendor/pi-model-router/README.md +0 -99
  245. package/vendor/pi-model-router/UPSTREAM_PIN.md +0 -10
  246. package/vendor/pi-model-router/docs/ARCHITECTURE.md +0 -54
  247. package/vendor/pi-model-router/extensions/commands.ts +0 -720
  248. package/vendor/pi-model-router/extensions/config.ts +0 -348
  249. package/vendor/pi-model-router/extensions/constants.ts +0 -1
  250. package/vendor/pi-model-router/extensions/index.ts +0 -478
  251. package/vendor/pi-model-router/extensions/provider.ts +0 -580
  252. package/vendor/pi-model-router/extensions/routing.ts +0 -564
  253. package/vendor/pi-model-router/extensions/state.ts +0 -52
  254. package/vendor/pi-model-router/extensions/types.ts +0 -95
  255. package/vendor/pi-model-router/extensions/ui.ts +0 -144
  256. package/vendor/pi-model-router/model-router.example.json +0 -48
  257. package/vendor/pi-model-router/package.json +0 -48
  258. package/vendor/pi-model-router/tsconfig.json +0 -16
  259. /package/.pi/{prompts → harness/docs}/planning-rubrics.md +0 -0
  260. /package/.pi/{extensions/lib → lib}/ask-user/fallback.ts +0 -0
  261. /package/.pi/{extensions/lib → lib}/ask-user/render.ts +0 -0
  262. /package/.pi/{extensions/lib → lib}/ask-user/schema.ts +0 -0
  263. /package/.pi/{extensions/lib → lib}/ask-user/types.ts +0 -0
  264. /package/.pi/{extensions/lib → lib}/ask-user/validate-core.mjs +0 -0
  265. /package/.pi/{extensions/lib → lib}/ask-user/validate.ts +0 -0
  266. /package/.pi/{extensions/lib → lib}/harness-cocoindex-refresh.ts +0 -0
  267. /package/.pi/{extensions/lib → lib}/harness-paths.ts +0 -0
  268. /package/.pi/{extensions/lib → lib}/harness-spawn-budget.ts +0 -0
  269. /package/.pi/{extensions/lib → lib}/harness-vcc-settings.ts +0 -0
  270. /package/.pi/{extensions/lib → lib}/harness-web/run-cli.ts +0 -0
  271. /package/.pi/{extensions/lib → lib}/plan-approval/dialog.ts +0 -0
  272. /package/.pi/{extensions/lib → lib}/plan-approval/schema.ts +0 -0
  273. /package/.pi/{extensions/lib → lib}/plan-approval-readiness.ts +0 -0
  274. /package/.pi/{extensions/lib → lib}/plan-debate-eligibility.ts +0 -0
  275. /package/.pi/{extensions/lib → lib}/plan-debate-focus.ts +0 -0
  276. /package/.pi/{extensions/lib → lib}/plan-debate-id.ts +0 -0
  277. /package/.pi/{extensions/lib → lib}/plan-debate-lanes.ts +0 -0
  278. /package/.pi/{extensions/lib → lib}/plan-debate-round-status.ts +0 -0
  279. /package/.pi/{extensions/lib → lib}/plan-debate-write-guard.ts +0 -0
  280. /package/.pi/{extensions/lib → lib}/plan-review-gate.ts +0 -0
  281. /package/.pi/{extensions/lib → lib}/plan-review-integrator-rules.ts +0 -0
  282. /package/.pi/{extensions/lib → lib}/plan-scope-guard.ts +0 -0
  283. /package/.pi/{extensions/lib → lib}/posthog-client.ts +0 -0
  284. /package/.pi/{extensions/lib → lib}/posthog-node.d.ts +0 -0
@@ -4,25 +4,25 @@
4
4
 
5
5
  import { appendFile, mkdir, writeFile } from "node:fs/promises";
6
6
  import { join } from "node:path";
7
+ import {
8
+ type DebateState,
9
+ getDebateState,
10
+ getLastSeverity,
11
+ type SeverityScores,
12
+ setDebateState,
13
+ setLastSeverity,
14
+ } from "./debate-bus-state.js";
7
15
  import {
8
16
  type DebateParticipant,
9
17
  debatePhaseFromId,
10
18
  isPlanDebateId,
11
19
  PLAN_DEBATE_PARTICIPANTS,
12
20
  POST_EXECUTE_DEBATE_PARTICIPANTS,
13
- } from "../../lib/debate-orchestrator-types.js";
21
+ } from "./debate-orchestrator-types.js";
14
22
  import {
15
23
  isHarnessBudgetEnforceOn,
16
24
  shouldEmitBlockingBudgetExhausted,
17
- } from "../../lib/harness-budget-enforce.js";
18
- import {
19
- type DebateState,
20
- getDebateState,
21
- getLastSeverity,
22
- type SeverityScores,
23
- setDebateState,
24
- setLastSeverity,
25
- } from "./debate-bus-state.js";
25
+ } from "./harness-budget-enforce.js";
26
26
  import {
27
27
  type DebateProfile,
28
28
  PLAN_BUDGET_FAST,
@@ -2,7 +2,7 @@
2
2
  * Shared in-process debate bus state (one session per Pi process).
3
3
  */
4
4
 
5
- import type { DebateParticipant } from "../../lib/debate-orchestrator-types.js";
5
+ import type { DebateParticipant } from "./debate-orchestrator-types.js";
6
6
  import type { DebateProfile } from "./plan-debate-eligibility.js";
7
7
  import type { PlanDebateFocus } from "./plan-debate-focus.js";
8
8
 
@@ -1,7 +1,8 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
- import { isHarnessProjectEnabled } from "../../lib/harness-project-config.js";
4
+ import { isAgtGovernanceActive } from "./agt-governance-active.js";
5
+ import { isHarnessProjectEnabled } from "./harness-project-config.js";
5
6
 
6
7
  const LOAD_GUARD_KEY = Symbol.for("ultimate-pi.extension-load-guard");
7
8
 
@@ -39,7 +40,17 @@ export function claimExtensionLoad(key: string, moduleUrl: string): boolean {
39
40
  return true;
40
41
  }
41
42
 
42
- /** Skip duplicate loads and skip all governance extensions when harness is disabled. */
43
+ /** AGT subprocess governance for all subagents when project/harness policy is active. */
44
+ export function claimSubagentGovernanceLoad(
45
+ key: string,
46
+ moduleUrl: string,
47
+ projectRoot?: string,
48
+ ): boolean {
49
+ if (!isAgtGovernanceActive(projectRoot)) return false;
50
+ return claimExtensionLoad(key, moduleUrl);
51
+ }
52
+
53
+ /** Skip duplicate loads and skip harness-only governance when harness is disabled. */
43
54
  export function claimHarnessGovernanceLoad(
44
55
  key: string,
45
56
  moduleUrl: string,
@@ -0,0 +1,5 @@
1
+ export {
2
+ evaluateAgtHarnessToolCall,
3
+ evaluateAgtToolCall,
4
+ type PolicyStateSlice,
5
+ } from "./agt-tool-guard.js";
@@ -6,7 +6,7 @@ import { constants } from "node:fs";
6
6
  import { access, readFile, stat } from "node:fs/promises";
7
7
  import { join } from "node:path";
8
8
  import { parse as parseYaml } from "yaml";
9
- import { validateAgainstHarnessSchema } from "../../lib/harness-schema-validate.js";
9
+ import { validateAgainstHarnessSchema } from "./harness-schema-validate.js";
10
10
 
11
11
  export interface ArtifactGateResult {
12
12
  ok: boolean;
@@ -0,0 +1,14 @@
1
+ export { Type } from "@sinclair/typebox";
2
+ export { parse as parseYaml } from "yaml";
3
+ export type { DebateParticipant } from "./debate-orchestrator-types.js";
4
+ export {
5
+ extractLastSubmitCall,
6
+ type MessageLike,
7
+ } from "./harness-agent-output.js";
8
+ export { captureHarnessEvent } from "./harness-posthog.js";
9
+ export {
10
+ getLatestRunContext,
11
+ getRunIdFromSession,
12
+ } from "./harness-run-context.js";
13
+ export { DEBATE_AGENT_SUBMIT_TOOL } from "./harness-subagent-submit-registry.js";
14
+ export { writeYamlFile } from "./harness-yaml.js";
@@ -0,0 +1,43 @@
1
+ export {
2
+ acceptDebateRound,
3
+ capsForDebate,
4
+ finalizeDebateConsensus,
5
+ openDebateBus,
6
+ } from "./debate-bus-core.js";
7
+ export { getDebateState } from "./debate-bus-state.js";
8
+ export {
9
+ type DebateEligibilityInput,
10
+ harnessPlanDebateEligibility,
11
+ } from "./plan-debate-eligibility.js";
12
+ export {
13
+ buildPlanReviewRoundEnvelope,
14
+ type PlanReviewRoundDraft,
15
+ } from "./plan-debate-envelope.js";
16
+ export {
17
+ getPlanFocusCoverage,
18
+ planDebateOutcomeComplete,
19
+ } from "./plan-debate-focus.js";
20
+ export { normalizePlanDebateId, planDebateIdForRun } from "./plan-debate-id.js";
21
+ export {
22
+ applyDebateLane,
23
+ applyDebateLaneFromDoc,
24
+ type DebateLaneKind,
25
+ debateLaneForAgent,
26
+ formatApplyLaneMessage,
27
+ } from "./plan-debate-lane.js";
28
+ export { getPlanDebateRoundStatus } from "./plan-debate-round-status.js";
29
+ export { withReviewRoundYamlWrite } from "./plan-debate-write-guard.js";
30
+ export {
31
+ formatTranscriptForSpawn,
32
+ getMessengerRoundState,
33
+ initPlanMessenger,
34
+ loadMessengerState,
35
+ messengerRoundDebateReady,
36
+ postMessengerMessage,
37
+ readRoundTranscript,
38
+ } from "./plan-messenger.js";
39
+ export {
40
+ loadValidationTurnYaml,
41
+ validateIntegratorDraft,
42
+ } from "./plan-review-integrator-rules.js";
43
+ export { assessPlanScopeDrift } from "./plan-scope-guard.js";
@@ -0,0 +1 @@
1
+ * text=auto eol=lf
@@ -0,0 +1,88 @@
1
+ import * as nodeFs from "node:fs";
2
+
3
+ export function tryCorrectIndentationMismatchFromContent(
4
+ oldText: string,
5
+ content: string,
6
+ ): string | undefined {
7
+ const normalized = oldText.replace(/\r\n/g, "\n");
8
+ if (content.includes(normalized)) return undefined;
9
+
10
+ const conversions = [
11
+ (s: string) =>
12
+ s
13
+ .split("\n")
14
+ .map((l) => l.replace(/^\t+/, (m) => " ".repeat(m.length)))
15
+ .join("\n"),
16
+ (s: string) =>
17
+ s
18
+ .split("\n")
19
+ .map((l) => l.replace(/^\t+/, (m) => " ".repeat(m.length)))
20
+ .join("\n"),
21
+ (s: string) =>
22
+ s
23
+ .split("\n")
24
+ .map((l) => l.replace(/^( {2})+/, (m) => "\t".repeat(m.length / 2)))
25
+ .join("\n"),
26
+ (s: string) =>
27
+ s
28
+ .split("\n")
29
+ .map((l) => l.replace(/^( {4})+/, (m) => "\t".repeat(m.length / 4)))
30
+ .join("\n"),
31
+ ];
32
+
33
+ for (const convert of conversions) {
34
+ const candidate = convert(normalized);
35
+ if (candidate !== normalized && content.includes(candidate))
36
+ return candidate;
37
+ }
38
+
39
+ return findIndentationInsensitiveCandidate(content, normalized);
40
+ }
41
+
42
+ export function tryCorrectIndentationMismatch(
43
+ oldText: string,
44
+ filePath: string,
45
+ ): string | undefined {
46
+ try {
47
+ return tryCorrectIndentationMismatchFromContent(
48
+ oldText,
49
+ nodeFs.readFileSync(filePath, "utf-8").replace(/\r\n/g, "\n"),
50
+ );
51
+ } catch {
52
+ return undefined;
53
+ }
54
+ }
55
+
56
+ function findIndentationInsensitiveCandidate(
57
+ content: string,
58
+ oldText: string,
59
+ ): string | undefined {
60
+ const contentLines = content.split("\n");
61
+ const oldLines = oldText.split("\n");
62
+ const stripIndent = (line: string) => line.replace(/^[\t ]+/, "").trimEnd();
63
+ const expected = oldLines.map(stripIndent);
64
+
65
+ for (
66
+ let start = 0;
67
+ start <= contentLines.length - oldLines.length;
68
+ start += 1
69
+ ) {
70
+ let matches = true;
71
+ for (let offset = 0; offset < oldLines.length; offset += 1) {
72
+ if (
73
+ stripIndent(contentLines[start + offset] ?? "") !== expected[offset]
74
+ ) {
75
+ matches = false;
76
+ break;
77
+ }
78
+ }
79
+ if (matches) {
80
+ const candidate = contentLines
81
+ .slice(start, start + oldLines.length)
82
+ .join("\n");
83
+ if (candidate !== oldText) return candidate;
84
+ }
85
+ }
86
+
87
+ return undefined;
88
+ }
@@ -0,0 +1,380 @@
1
+ /**
2
+ * File Kind Detection for pi-lens
3
+ *
4
+ * Centralized file type detection to avoid duplication across clients.
5
+ * Maps file extensions and paths to semantic file kinds.
6
+ */
7
+
8
+ import { basename, extname } from "node:path";
9
+
10
+ // --- Types ---
11
+
12
+ export type FileKind =
13
+ | "clojure" // Clojure
14
+ | "cmake" // CMake
15
+ | "csharp" // C#
16
+ | "css" // CSS
17
+ | "cxx" // C/C++
18
+ | "dart" // Dart
19
+ | "docker" // Dockerfile
20
+ | "elixir" // Elixir
21
+ | "fish" // Fish shell
22
+ | "fsharp" // F#
23
+ | "gleam" // Gleam
24
+ | "go" // Go
25
+ | "haskell" // Haskell
26
+ | "html" // HTML
27
+ | "java" // Java
28
+ | "json" // JSON
29
+ | "jsts" // JavaScript/TypeScript/frameworks
30
+ | "kotlin" // Kotlin
31
+ | "lua" // Lua
32
+ | "markdown" // Markdown
33
+ | "nix" // Nix
34
+ | "ocaml" // OCaml
35
+ | "php" // PHP
36
+ | "powershell" // PowerShell
37
+ | "prisma" // Prisma schema
38
+ | "python" // Python
39
+ | "ruby" // Ruby
40
+ | "rust" // Rust
41
+ | "shell" // Shell
42
+ | "sql" // SQL
43
+ | "swift" // Swift
44
+ | "terraform" // Terraform
45
+ | "toml" // TOML
46
+ | "yaml" // YAML
47
+ | "zig"; // Zig
48
+
49
+ // --- Extension Maps ---
50
+
51
+ export const KIND_EXTENSIONS: Record<FileKind, readonly string[]> = {
52
+ clojure: [".clj", ".cljc", ".cljs", ".edn"],
53
+ cmake: [".cmake"],
54
+ csharp: [".cs"],
55
+ css: [".css", ".less", ".sass", ".scss"],
56
+ // From llvm-project/clang/lib/Driver/Types.cpp clang::driver::types::lookupTypeForExtension:
57
+ cxx: [
58
+ // C
59
+ ".c",
60
+ ".h",
61
+ // C++
62
+ ".c++",
63
+ ".cc",
64
+ ".cp",
65
+ ".cpp",
66
+ ".cxx",
67
+ ".hh",
68
+ ".hpp",
69
+ ".hxx",
70
+ // C++ include files
71
+ ".inl",
72
+ ".ipp",
73
+ ".tpp",
74
+ ".txx",
75
+ // C++20 module interface files
76
+ ".c++m",
77
+ ".cppm",
78
+ ".cxxm",
79
+ ".ixx",
80
+ // CUDA
81
+ ".cu",
82
+ // HIP
83
+ ".hip",
84
+ // Objective-C
85
+ ".m",
86
+ ".mm",
87
+ // OpenCL
88
+ ".cl",
89
+ ".clcpp",
90
+ ],
91
+ dart: [".dart"],
92
+ docker: [".dockerfile"],
93
+ elixir: [".ex", ".exs"],
94
+ fish: [".fish"],
95
+ fsharp: [".fs", ".fsi", ".fsx"],
96
+ gleam: [".gleam"],
97
+ go: [".go"],
98
+ haskell: [".hs", ".lhs"],
99
+ html: [".htm", ".html"],
100
+ java: [".java"],
101
+ json: [".json", ".json5", ".jsonc"],
102
+ jsts: [
103
+ ".cjs",
104
+ ".cts",
105
+ ".js",
106
+ ".jsx",
107
+ ".mjs",
108
+ ".mts",
109
+ ".svelte",
110
+ ".ts",
111
+ ".tsx",
112
+ ".vue",
113
+ ],
114
+ kotlin: [".kt", ".kts"],
115
+ lua: [".lua"],
116
+ markdown: [".md", ".mdx"],
117
+ nix: [".nix"],
118
+ ocaml: [".ml", ".mli"],
119
+ php: [".php"],
120
+ powershell: [".ps1", ".psm1", ".psd1"],
121
+ prisma: [".prisma"],
122
+ python: [".py", ".pyi"],
123
+ ruby: [".gemspec", ".rake", ".rb", ".ru"],
124
+ rust: [".rs"],
125
+ shell: [".bash", ".sh", ".zsh"],
126
+ sql: [".sql"],
127
+ swift: [".swift"],
128
+ terraform: [".tf", ".tfvars"],
129
+ toml: [".toml"],
130
+ yaml: [".yaml", ".yml"],
131
+ zig: [".zig", ".zon"],
132
+ };
133
+
134
+ // Reverse map: extension → file kind (for fast lookup)
135
+ const EXT_TO_KIND = new Map<string, FileKind>();
136
+ for (const [kind, exts] of Object.entries(KIND_EXTENSIONS)) {
137
+ for (const ext of exts) {
138
+ EXT_TO_KIND.set(ext.toLowerCase(), kind as FileKind);
139
+ }
140
+ // Also register without leading dot
141
+ for (const ext of exts) {
142
+ if (ext.startsWith(".")) {
143
+ EXT_TO_KIND.set(ext.slice(1).toLowerCase(), kind as FileKind);
144
+ }
145
+ }
146
+ }
147
+
148
+ // Special filenames that indicate a file kind
149
+ const SPECIAL_FILENAMES: Array<{ pattern: RegExp; kind: FileKind }> = [
150
+ { pattern: /^CMakeLists\.txt$/i, kind: "cmake" },
151
+ { pattern: /^Makefile$/i, kind: "shell" },
152
+ { pattern: /^Dockerfile(\.\w+)?$/i, kind: "docker" },
153
+ ];
154
+
155
+ // --- Detection Functions ---
156
+
157
+ /**
158
+ * Detect the file kind from a file path.
159
+ * Returns the semantic file kind or undefined if unknown.
160
+ */
161
+ export function detectFileKind(filePath: string): FileKind | undefined {
162
+ if (!filePath || typeof filePath !== "string") {
163
+ return undefined;
164
+ }
165
+
166
+ // Check special filenames first
167
+ const base = basename(filePath);
168
+ for (const { pattern, kind } of SPECIAL_FILENAMES) {
169
+ if (pattern.test(base)) {
170
+ return kind;
171
+ }
172
+ }
173
+
174
+ // Check by extension
175
+ const ext = extname(filePath).toLowerCase();
176
+ return EXT_TO_KIND.get(ext);
177
+ }
178
+
179
+ /**
180
+ * Check if a file kind is supported by a specific tool or capability.
181
+ *
182
+ * @example
183
+ * // Check if TypeScript file
184
+ * if (isFileKind(filePath, "jsts")) { ... }
185
+ *
186
+ * // Check for multiple kinds
187
+ * if (isFileKind(filePath, ["jsts", "python"])) { ... }
188
+ */
189
+ export function isFileKind(
190
+ filePath: string,
191
+ kind: FileKind | FileKind[],
192
+ ): boolean {
193
+ const detected = detectFileKind(filePath);
194
+ if (!detected) return false;
195
+
196
+ if (Array.isArray(kind)) {
197
+ return kind.includes(detected);
198
+ }
199
+
200
+ return detected === kind;
201
+ }
202
+
203
+ /**
204
+ * Get all file kinds that match a given file extension.
205
+ * Useful for listing which tools might handle a file.
206
+ */
207
+ export function getFileKindsForExtension(ext: string): FileKind[] {
208
+ const normalizedExt = ext.startsWith(".") ? ext : `.${ext}`;
209
+ const kind = EXT_TO_KIND.get(normalizedExt.toLowerCase());
210
+ return kind ? [kind] : [];
211
+ }
212
+
213
+ /**
214
+ * Check if a file kind represents a code file (not config/markdown).
215
+ */
216
+ export function isCodeKind(kind: FileKind): boolean {
217
+ return [
218
+ "jsts",
219
+ "python",
220
+ "go",
221
+ "rust",
222
+ "cxx",
223
+ "fish",
224
+ "shell",
225
+ "ruby",
226
+ "html",
227
+ "php",
228
+ "powershell",
229
+ "prisma",
230
+ "csharp",
231
+ "fsharp",
232
+ "java",
233
+ "kotlin",
234
+ "swift",
235
+ "dart",
236
+ "lua",
237
+ "zig",
238
+ "haskell",
239
+ "elixir",
240
+ "gleam",
241
+ "ocaml",
242
+ "clojure",
243
+ "terraform",
244
+ "nix",
245
+ ].includes(kind);
246
+ }
247
+
248
+ /**
249
+ * Check if a file kind represents a text/config file.
250
+ */
251
+ export function isConfigKind(kind: FileKind): boolean {
252
+ return [
253
+ "json",
254
+ "yaml",
255
+ "markdown",
256
+ "css",
257
+ "sql",
258
+ "docker",
259
+ "cmake",
260
+ "toml",
261
+ ].includes(kind);
262
+ }
263
+
264
+ /**
265
+ * Get human-readable description of a file kind.
266
+ */
267
+ export function getFileKindLabel(kind: FileKind): string {
268
+ const labels: Record<FileKind, string> = {
269
+ jsts: "JavaScript/TypeScript",
270
+ python: "Python",
271
+ go: "Go",
272
+ rust: "Rust",
273
+ cxx: "C/C++",
274
+ cmake: "CMake",
275
+ shell: "Shell",
276
+ json: "JSON",
277
+ markdown: "Markdown",
278
+ css: "CSS",
279
+ yaml: "YAML",
280
+ sql: "SQL",
281
+ ruby: "Ruby",
282
+ html: "HTML",
283
+ docker: "Dockerfile",
284
+ php: "PHP",
285
+ powershell: "PowerShell",
286
+ prisma: "Prisma",
287
+ csharp: "C#",
288
+ fish: "Fish shell",
289
+ fsharp: "F#",
290
+ java: "Java",
291
+ kotlin: "Kotlin",
292
+ swift: "Swift",
293
+ dart: "Dart",
294
+ lua: "Lua",
295
+ zig: "Zig",
296
+ haskell: "Haskell",
297
+ elixir: "Elixir",
298
+ gleam: "Gleam",
299
+ ocaml: "OCaml",
300
+ clojure: "Clojure",
301
+ terraform: "Terraform",
302
+ nix: "Nix",
303
+ toml: "TOML",
304
+ };
305
+ return labels[kind] ?? kind;
306
+ }
307
+
308
+ /**
309
+ * Get file extensions for a file kind.
310
+ */
311
+ export function getExtensionsForKind(kind: FileKind): string[] {
312
+ return [...(KIND_EXTENSIONS[kind] ?? [])];
313
+ }
314
+
315
+ /**
316
+ * Check if a file should be scanned for linting/formatting.
317
+ * Excludes test files, generated files, etc.
318
+ */
319
+ export function isScannableFile(filePath: string): boolean {
320
+ const kind = detectFileKind(filePath);
321
+ if (!kind) return false;
322
+
323
+ // Exclude test files for most kinds
324
+ const base = basename(filePath);
325
+ if (
326
+ base.includes(".test.") ||
327
+ base.includes(".spec.") ||
328
+ base.startsWith("test-") ||
329
+ base.startsWith("spec-")
330
+ ) {
331
+ return false;
332
+ }
333
+
334
+ // Only scan code and config files
335
+ return isCodeKind(kind) || isConfigKind(kind);
336
+ }
337
+
338
+ /**
339
+ * Get the language identifier for LSP/tools that use language IDs.
340
+ */
341
+ export function getLanguageId(kind: FileKind): string {
342
+ const languageIds: Record<FileKind, string> = {
343
+ jsts: "typescript",
344
+ python: "python",
345
+ go: "go",
346
+ rust: "rust",
347
+ cxx: "cpp",
348
+ cmake: "cmake",
349
+ shell: "shell",
350
+ json: "json",
351
+ markdown: "markdown",
352
+ css: "css",
353
+ yaml: "yaml",
354
+ sql: "sql",
355
+ ruby: "ruby",
356
+ html: "html",
357
+ docker: "dockerfile",
358
+ php: "php",
359
+ powershell: "powershell",
360
+ prisma: "prisma",
361
+ csharp: "csharp",
362
+ fish: "fish",
363
+ fsharp: "fsharp",
364
+ java: "java",
365
+ kotlin: "kotlin",
366
+ swift: "swift",
367
+ dart: "dart",
368
+ lua: "lua",
369
+ zig: "zig",
370
+ haskell: "haskell",
371
+ elixir: "elixir",
372
+ gleam: "gleam",
373
+ ocaml: "ocaml",
374
+ clojure: "clojure",
375
+ terraform: "terraform",
376
+ nix: "nix",
377
+ toml: "toml",
378
+ };
379
+ return languageIds[kind] ?? "plaintext";
380
+ }