@hassangameryt/freeflow 0.7.3 → 0.9.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 (426) hide show
  1. package/.agents/plugins/marketplace.json +2 -2
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/.claude-plugin/plugin.json +2 -2
  4. package/.codex-plugin/plugin.json +3 -3
  5. package/.cursor-plugin/plugin.json +1 -1
  6. package/NOTICE +14 -0
  7. package/README.md +101 -159
  8. package/capabilities/cognitive-routing/SKILL.md +47 -210
  9. package/capabilities/cognitive-routing/references/coordinator.md +163 -0
  10. package/capabilities/cognitive-routing/references/worker.md +38 -0
  11. package/capabilities/compaction/SKILL.md +49 -0
  12. package/capabilities/compaction/references/summary-format.md +250 -0
  13. package/capabilities/messaging/SKILL.md +49 -0
  14. package/capabilities/task-memory/SKILL.md +87 -0
  15. package/command-surface.json +8 -52
  16. package/gemini-extension.json +1 -1
  17. package/hooks/claude/hooks.json +13 -3
  18. package/hooks/codex/hooks.json +2 -1
  19. package/hooks/shared/runtime-context.mjs +73 -83
  20. package/licenses/Apache-2.0.txt +55 -0
  21. package/package.json +42 -12
  22. package/pi-extension/README.md +41 -0
  23. package/pi-extension/dist/ask-user/ask.js +108 -0
  24. package/pi-extension/dist/ask-user/form.js +250 -0
  25. package/pi-extension/dist/ask-user/questions.js +66 -0
  26. package/pi-extension/dist/ask-user/tool.js +124 -0
  27. package/pi-extension/dist/cognitive-routing/assembler.js +417 -0
  28. package/pi-extension/dist/cognitive-routing/bootstrap.js +90 -0
  29. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/config.js +8 -6
  30. package/pi-extension/dist/cognitive-routing/economics.js +45 -0
  31. package/pi-extension/dist/cognitive-routing/event-schema.js +388 -0
  32. package/pi-extension/dist/{session-sources/events.js → cognitive-routing/event-store.js} +107 -41
  33. package/pi-extension/dist/cognitive-routing/gate.js +256 -0
  34. package/pi-extension/dist/cognitive-routing/handlers.js +901 -0
  35. package/pi-extension/dist/cognitive-routing/handoffs.js +350 -0
  36. package/pi-extension/dist/cognitive-routing/model-control.js +476 -0
  37. package/pi-extension/dist/cognitive-routing/projection.js +520 -0
  38. package/pi-extension/dist/cognitive-routing/provenance.js +83 -0
  39. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/render.js +15 -15
  40. package/pi-extension/dist/cognitive-routing/runtime.js +398 -0
  41. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/schemas.js +47 -11
  42. package/pi-extension/dist/cognitive-routing/session.js +223 -0
  43. package/pi-extension/dist/{session-sources → cognitive-routing}/sources.js +126 -87
  44. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/state.js +55 -386
  45. package/pi-extension/dist/cognitive-routing/status.js +81 -0
  46. package/pi-extension/dist/cognitive-routing/tools.js +74 -0
  47. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/types.js +14 -11
  48. package/pi-extension/dist/compaction/carry.js +205 -0
  49. package/pi-extension/dist/compaction/config.js +24 -0
  50. package/pi-extension/dist/compaction/controller.js +494 -0
  51. package/pi-extension/dist/compaction/harness.js +93 -0
  52. package/pi-extension/dist/compaction/results.js +159 -0
  53. package/pi-extension/dist/compaction/thresholds.js +35 -0
  54. package/pi-extension/dist/compaction/tool.js +57 -0
  55. package/pi-extension/dist/host/branch.js +13 -0
  56. package/pi-extension/dist/host/canonical.js +12 -0
  57. package/pi-extension/dist/host/catalog.js +62 -0
  58. package/pi-extension/dist/host/config-validation.js +233 -0
  59. package/pi-extension/dist/host/config.js +361 -0
  60. package/pi-extension/dist/host/inbound.js +142 -0
  61. package/pi-extension/dist/host/projection-tags.js +60 -0
  62. package/pi-extension/dist/host/prompts.js +93 -0
  63. package/pi-extension/dist/{session-sources → host}/read-only-session.js +117 -1
  64. package/pi-extension/dist/{runtime → host}/request-history.js +125 -39
  65. package/pi-extension/dist/host/rows.js +25 -0
  66. package/pi-extension/dist/host/runtime-state.js +204 -0
  67. package/pi-extension/dist/host/section-keeper.js +85 -0
  68. package/pi-extension/dist/host/settings/freeflow-command.js +2323 -0
  69. package/pi-extension/dist/{settings/settings-tui.js → host/settings/settings-view.js} +205 -73
  70. package/pi-extension/dist/host/staging.js +28 -0
  71. package/pi-extension/dist/host/status.js +115 -0
  72. package/pi-extension/dist/index.js +1004 -188
  73. package/pi-extension/dist/messaging/config.js +27 -0
  74. package/pi-extension/dist/messaging/messaging.js +398 -0
  75. package/pi-extension/dist/messaging/registry.js +57 -0
  76. package/pi-extension/dist/messaging/render.js +90 -0
  77. package/pi-extension/dist/messaging/tools.js +109 -0
  78. package/pi-extension/dist/messaging/transport.js +101 -0
  79. package/pi-extension/dist/provider-support/cache/anchor.js +21 -0
  80. package/pi-extension/dist/provider-support/cache/anthropic.js +102 -0
  81. package/pi-extension/dist/provider-support/cache/health.js +73 -0
  82. package/pi-extension/dist/provider-support/cache/index.js +58 -0
  83. package/pi-extension/dist/provider-support/cache/keepalive.js +222 -0
  84. package/pi-extension/dist/provider-support/cache/monitor.js +17 -0
  85. package/pi-extension/dist/provider-support/cache/openai-responses.js +48 -0
  86. package/pi-extension/dist/provider-support/effort.js +13 -0
  87. package/pi-extension/dist/provider-support/index.js +44 -3
  88. package/pi-extension/dist/provider-support/{astra → openai}/adapter.js +46 -29
  89. package/pi-extension/dist/provider-support/{astra → openai}/history.js +10 -8
  90. package/pi-extension/dist/provider-support/{astra → openai}/index.js +8 -4
  91. package/pi-extension/dist/provider-support/{astra → openai}/session-state.js +29 -38
  92. package/pi-extension/dist/provider-support/routes.js +17 -0
  93. package/pi-extension/dist/task-memory/config.js +49 -0
  94. package/pi-extension/dist/task-memory/registry.js +119 -0
  95. package/pi-extension/dist/task-memory/render.js +107 -0
  96. package/pi-extension/dist/task-memory/runtime.js +994 -0
  97. package/pi-extension/dist/task-memory/tool.js +233 -0
  98. package/pi-extension/dist/tool-execution/apply-patch/grammar.js +23 -0
  99. package/pi-extension/dist/tool-execution/apply-patch/match.js +38 -0
  100. package/pi-extension/dist/tool-execution/apply-patch/parser.js +177 -0
  101. package/pi-extension/dist/tool-execution/apply-patch/plan.js +201 -0
  102. package/pi-extension/dist/tool-execution/apply-patch/tool.js +84 -0
  103. package/pi-extension/dist/tool-execution/background.js +430 -0
  104. package/pi-extension/dist/tool-execution/bash-guard.js +23 -0
  105. package/pi-extension/dist/tool-execution/config.js +33 -0
  106. package/pi-extension/dist/tool-execution/edit-messages.js +120 -0
  107. package/pi-extension/dist/tool-execution/file-state.js +138 -0
  108. package/pi-extension/dist/tool-execution/file-tracking.js +163 -0
  109. package/pi-extension/dist/tool-execution/guidance-notices.js +124 -0
  110. package/pi-extension/dist/tool-execution/prompt.js +54 -0
  111. package/pi-extension/dist/tool-execution/skill-reads.js +143 -0
  112. package/pi-extension/dist/tool-execution/tools.js +16 -0
  113. package/pi-extension/freeflow/README.md +9 -0
  114. package/runtime/prompts/cognitive-routing.md +4 -4
  115. package/runtime/prompts/core.md +29 -72
  116. package/runtime/prompts/interaction-contract.md +18 -8
  117. package/runtime/prompts/tool-execution.md +25 -0
  118. package/runtime/prompts/working-method.md +25 -0
  119. package/skills/deliver-work/SKILL.md +76 -0
  120. package/skills/deliver-work/references/branch-closeout.md +134 -0
  121. package/skills/deliver-work/references/commit.md +83 -0
  122. package/skills/deliver-work/references/launch.md +94 -0
  123. package/skills/deliver-work/references/release.md +85 -0
  124. package/skills/deliver-work/scripts/commit-state.mjs +139 -0
  125. package/skills/deliver-work/scripts/delivery-state.mjs +107 -0
  126. package/skills/deliver-work/scripts/lib/git-state.mjs +178 -0
  127. package/skills/deliver-work/scripts/push-route.mjs +122 -0
  128. package/skills/deliver-work/scripts/release-preflight.mjs +177 -0
  129. package/skills/discuss-work/SKILL.md +148 -0
  130. package/skills/{discuss → discuss-work}/references/discussion-continuity.md +13 -50
  131. package/skills/discuss-work/references/learning-action.md +36 -0
  132. package/skills/discuss-work/scripts/choices.mjs +101 -0
  133. package/skills/discuss-work/scripts/lib/choices.mjs +159 -0
  134. package/skills/evaluate-behavior/SKILL.md +107 -0
  135. package/skills/evaluate-behavior/references/authoring.md +381 -0
  136. package/skills/evaluate-behavior/references/coding-tasks.md +145 -0
  137. package/skills/evaluate-behavior/references/conversations-pipelines-judges.md +177 -0
  138. package/skills/evaluate-behavior/references/design-and-measurement.md +273 -0
  139. package/skills/evaluate-behavior/references/running-and-evidence.md +245 -0
  140. package/skills/evaluate-behavior/scripts/claude-guard.mjs +76 -0
  141. package/skills/evaluate-behavior/scripts/guard-rules.mjs +309 -0
  142. package/skills/evaluate-behavior/scripts/lib/agreement.mjs +90 -0
  143. package/skills/evaluate-behavior/scripts/lib/arms.mjs +55 -0
  144. package/skills/evaluate-behavior/scripts/lib/budget.mjs +87 -0
  145. package/skills/evaluate-behavior/scripts/lib/build-source.mjs +287 -0
  146. package/skills/evaluate-behavior/scripts/lib/clear.mjs +74 -0
  147. package/skills/evaluate-behavior/scripts/lib/container.mjs +395 -0
  148. package/skills/evaluate-behavior/scripts/lib/decision.mjs +418 -0
  149. package/skills/evaluate-behavior/scripts/lib/definitions.mjs +1072 -0
  150. package/skills/evaluate-behavior/scripts/lib/freeflow.mjs +103 -0
  151. package/skills/evaluate-behavior/scripts/lib/grade-command.mjs +591 -0
  152. package/skills/evaluate-behavior/scripts/lib/grade-comparison.mjs +90 -0
  153. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/grade-interaction.mjs +19 -18
  154. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/grade-support.mjs +32 -5
  155. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/grade-workspace.mjs +28 -12
  156. package/skills/evaluate-behavior/scripts/lib/grade.mjs +101 -0
  157. package/skills/evaluate-behavior/scripts/lib/hooks.mjs +98 -0
  158. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/confinement.mjs +196 -0
  159. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/constraints.mjs +111 -0
  160. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/index.mjs +48 -0
  161. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/isolation.mjs +74 -0
  162. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/launch.mjs +123 -0
  163. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/model-call.mjs +73 -0
  164. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/recorder.mjs +178 -0
  165. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/session.mjs +494 -0
  166. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/skills.mjs +81 -0
  167. package/skills/evaluate-behavior/scripts/lib/hosts/index.mjs +31 -0
  168. package/skills/evaluate-behavior/scripts/lib/hosts/names.mjs +3 -0
  169. package/skills/evaluate-behavior/scripts/lib/hosts/pi/confinement.mjs +173 -0
  170. package/skills/evaluate-behavior/scripts/lib/hosts/pi/host.mjs +148 -0
  171. package/skills/evaluate-behavior/scripts/lib/hosts/pi/index.mjs +70 -0
  172. package/skills/evaluate-behavior/scripts/lib/hosts/pi/isolation.mjs +81 -0
  173. package/skills/evaluate-behavior/scripts/lib/hosts/pi/model-call.mjs +79 -0
  174. package/skills/evaluate-behavior/scripts/lib/hosts/pi/process.mjs +241 -0
  175. package/skills/{evaluate-skill/scripts/lib → evaluate-behavior/scripts/lib/hosts/pi}/rpc.mjs +144 -26
  176. package/skills/evaluate-behavior/scripts/lib/identity.mjs +82 -0
  177. package/skills/evaluate-behavior/scripts/lib/judge.mjs +688 -0
  178. package/skills/evaluate-behavior/scripts/lib/metrics.mjs +332 -0
  179. package/skills/evaluate-behavior/scripts/lib/model-call.mjs +17 -0
  180. package/skills/evaluate-behavior/scripts/lib/participants.mjs +616 -0
  181. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/process.mjs +22 -0
  182. package/skills/evaluate-behavior/scripts/lib/queue.mjs +54 -0
  183. package/skills/evaluate-behavior/scripts/lib/reference.mjs +343 -0
  184. package/skills/evaluate-behavior/scripts/lib/reuse.mjs +277 -0
  185. package/skills/evaluate-behavior/scripts/lib/review.mjs +933 -0
  186. package/skills/evaluate-behavior/scripts/lib/runner.mjs +732 -0
  187. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/sandbox.mjs +121 -14
  188. package/skills/evaluate-behavior/scripts/lib/scan-shell.mjs +457 -0
  189. package/skills/evaluate-behavior/scripts/lib/scan.mjs +479 -0
  190. package/skills/evaluate-behavior/scripts/lib/seal.mjs +91 -0
  191. package/skills/evaluate-behavior/scripts/lib/shell.mjs +560 -0
  192. package/skills/evaluate-behavior/scripts/lib/source-override.mjs +64 -0
  193. package/skills/evaluate-behavior/scripts/lib/subject-file.mjs +88 -0
  194. package/skills/{evaluate-skill/scripts/lib/pi.mjs → evaluate-behavior/scripts/lib/subject.mjs} +239 -262
  195. package/skills/evaluate-behavior/scripts/lib/task-copy.mjs +124 -0
  196. package/skills/evaluate-behavior/scripts/lib/trials.mjs +524 -0
  197. package/skills/evaluate-behavior/scripts/lib/validity.mjs +68 -0
  198. package/skills/evaluate-behavior/scripts/lib/view-html.mjs +454 -0
  199. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/view.mjs +218 -11
  200. package/skills/evaluate-behavior/scripts/pi-command-tool.mjs +159 -0
  201. package/skills/evaluate-behavior/scripts/pi-container-route.mjs +23 -0
  202. package/skills/evaluate-behavior/scripts/pi-guard.mjs +77 -0
  203. package/skills/evaluate-behavior/scripts/pi-login-refresh.mjs +31 -0
  204. package/skills/evaluate-behavior/scripts/skill-eval.mjs +586 -0
  205. package/skills/execute-work/SKILL.md +96 -72
  206. package/skills/execute-work/references/code-practices.md +27 -49
  207. package/skills/execute-work/references/design.md +271 -0
  208. package/skills/execute-work/references/diagnose.md +117 -0
  209. package/skills/execute-work/references/migration.md +108 -0
  210. package/skills/execute-work/references/simplify.md +65 -0
  211. package/skills/execute-work/scripts/self-review.mjs +422 -0
  212. package/skills/execute-work/scripts/touch-map.mjs +290 -0
  213. package/skills/review-work/SKILL.md +94 -64
  214. package/skills/review-work/references/adjudication.md +94 -0
  215. package/skills/review-work/references/artifact.md +198 -0
  216. package/skills/review-work/references/evals-and-judges.md +66 -0
  217. package/skills/review-work/references/work.md +177 -0
  218. package/skills/review-work/scripts/check-brief.mjs +128 -0
  219. package/skills/review-work/scripts/review-packet.mjs +233 -0
  220. package/skills/setup-freeflow/SKILL.md +69 -16
  221. package/skills/track-work/SKILL.md +135 -151
  222. package/skills/track-work/references/handoff.md +190 -0
  223. package/skills/track-work/references/projects.md +51 -0
  224. package/skills/track-work/references/working-record-format.md +201 -344
  225. package/skills/track-work/scripts/lib/document.mjs +79 -19
  226. package/skills/track-work/scripts/lib/format.mjs +18 -1
  227. package/skills/track-work/scripts/lib/recover.mjs +254 -0
  228. package/skills/track-work/scripts/lib/registry.mjs +656 -0
  229. package/skills/track-work/scripts/lib/search.mjs +40 -0
  230. package/skills/track-work/scripts/lib/store.mjs +53 -21
  231. package/skills/track-work/scripts/lib/transitions.mjs +79 -4
  232. package/skills/track-work/scripts/lib/views.mjs +50 -1
  233. package/skills/track-work/scripts/working-record.mjs +263 -22
  234. package/skills/verify-work/SKILL.md +64 -47
  235. package/skills/verify-work/references/feature-map.md +120 -0
  236. package/skills/verify-work/references/runtime-evidence.md +203 -0
  237. package/skills/verify-work/references/test-design.md +27 -6
  238. package/skills/verify-work/scripts/test-changes.mjs +246 -0
  239. package/skills/write-docs/SKILL.md +171 -0
  240. package/skills/write-docs/references/documentation-shapes.md +184 -0
  241. package/skills/write-docs/references/spec-and-plan-shapes.md +308 -0
  242. package/skills/write-docs/scripts/artifact-check.mjs +148 -0
  243. package/skills/write-docs/scripts/docs-check.mjs +229 -0
  244. package/skills/write-docs/scripts/plan-lint.mjs +123 -0
  245. package/skills/write-skill/SKILL.md +165 -165
  246. package/skills/write-skill/references/activation-and-wording.md +143 -0
  247. package/skills/write-skill/references/placement-and-dependencies.md +154 -0
  248. package/skills/write-skill/scripts/lib/compare.mjs +701 -0
  249. package/skills/write-skill/scripts/lib/similarity.mjs +56 -0
  250. package/skills/write-skill/scripts/lib/skill-author.mjs +197 -3
  251. package/skills/write-skill/scripts/skill-author.mjs +67 -8
  252. package/capabilities/context-virtualization/SKILL.md +0 -103
  253. package/capabilities/conversation-history/SKILL.md +0 -53
  254. package/hooks/tests/check-host-adapters.test.mjs +0 -82
  255. package/hooks/tests/check-runtime-context-hook.sh +0 -212
  256. package/pi-extension/dist/cognitive-routing-v2/projection.js +0 -330
  257. package/pi-extension/dist/cognitive-routing-v2/runtime.js +0 -2181
  258. package/pi-extension/dist/cognitive-routing-v2/tools.js +0 -60
  259. package/pi-extension/dist/context-virtualization/commands.js +0 -89
  260. package/pi-extension/dist/context-virtualization/projector.js +0 -42
  261. package/pi-extension/dist/context-virtualization/runtime.js +0 -378
  262. package/pi-extension/dist/context-virtualization/state.js +0 -57
  263. package/pi-extension/dist/context-virtualization/types.js +0 -10
  264. package/pi-extension/dist/conversation-history/passages.js +0 -66
  265. package/pi-extension/dist/conversation-history/ranking.js +0 -105
  266. package/pi-extension/dist/conversation-history/runtime.js +0 -226
  267. package/pi-extension/dist/conversation-history/search.js +0 -56
  268. package/pi-extension/dist/conversation-history/types.js +0 -1
  269. package/pi-extension/dist/freeflow-context/resolver.js +0 -120
  270. package/pi-extension/dist/freeflow-context/runtime.js +0 -80
  271. package/pi-extension/dist/freeflow-context/source-projector.js +0 -95
  272. package/pi-extension/dist/freeflow-context/tool.js +0 -314
  273. package/pi-extension/dist/freeflow-context/types.js +0 -12
  274. package/pi-extension/dist/freeflow-context/visibility.js +0 -28
  275. package/pi-extension/dist/integrations/mcp-config.js +0 -29
  276. package/pi-extension/dist/runtime/runtime-context.js +0 -754
  277. package/pi-extension/dist/runtime/runtime-identity.js +0 -5
  278. package/pi-extension/dist/session-sources/provenance.js +0 -32
  279. package/pi-extension/dist/settings/settings-ui.js +0 -1360
  280. package/pi-extension/dist/ui/text-component.js +0 -57
  281. package/pi-extension/src/cognitive-routing-v2/budget.ts +0 -42
  282. package/pi-extension/src/cognitive-routing-v2/config.ts +0 -173
  283. package/pi-extension/src/cognitive-routing-v2/projection.ts +0 -375
  284. package/pi-extension/src/cognitive-routing-v2/render.ts +0 -277
  285. package/pi-extension/src/cognitive-routing-v2/runtime.ts +0 -2241
  286. package/pi-extension/src/cognitive-routing-v2/schemas.ts +0 -180
  287. package/pi-extension/src/cognitive-routing-v2/state.ts +0 -839
  288. package/pi-extension/src/cognitive-routing-v2/tools.ts +0 -62
  289. package/pi-extension/src/cognitive-routing-v2/types.ts +0 -254
  290. package/pi-extension/src/context-virtualization/commands.ts +0 -111
  291. package/pi-extension/src/context-virtualization/projector.ts +0 -62
  292. package/pi-extension/src/context-virtualization/runtime.ts +0 -428
  293. package/pi-extension/src/context-virtualization/state.ts +0 -79
  294. package/pi-extension/src/context-virtualization/types.ts +0 -92
  295. package/pi-extension/src/conversation-history/passages.ts +0 -81
  296. package/pi-extension/src/conversation-history/ranking.ts +0 -155
  297. package/pi-extension/src/conversation-history/runtime.ts +0 -250
  298. package/pi-extension/src/conversation-history/search.ts +0 -79
  299. package/pi-extension/src/conversation-history/types.ts +0 -31
  300. package/pi-extension/src/freeflow-context/resolver.ts +0 -139
  301. package/pi-extension/src/freeflow-context/runtime.ts +0 -100
  302. package/pi-extension/src/freeflow-context/source-projector.ts +0 -106
  303. package/pi-extension/src/freeflow-context/tool.ts +0 -366
  304. package/pi-extension/src/freeflow-context/types.ts +0 -70
  305. package/pi-extension/src/freeflow-context/visibility.ts +0 -53
  306. package/pi-extension/src/index.ts +0 -390
  307. package/pi-extension/src/integrations/mcp-config.ts +0 -32
  308. package/pi-extension/src/provider-support/astra/adapter.ts +0 -108
  309. package/pi-extension/src/provider-support/astra/history.ts +0 -145
  310. package/pi-extension/src/provider-support/astra/index.ts +0 -12
  311. package/pi-extension/src/provider-support/astra/session-state.ts +0 -113
  312. package/pi-extension/src/provider-support/index.ts +0 -5
  313. package/pi-extension/src/runtime/request-history.ts +0 -243
  314. package/pi-extension/src/runtime/runtime-context.ts +0 -860
  315. package/pi-extension/src/runtime/runtime-identity.ts +0 -8
  316. package/pi-extension/src/session-sources/events.ts +0 -230
  317. package/pi-extension/src/session-sources/provenance.ts +0 -39
  318. package/pi-extension/src/session-sources/read-only-session.ts +0 -170
  319. package/pi-extension/src/session-sources/sources.ts +0 -334
  320. package/pi-extension/src/settings/settings-tui.ts +0 -501
  321. package/pi-extension/src/settings/settings-ui.ts +0 -1652
  322. package/pi-extension/src/ui/text-component.ts +0 -66
  323. package/pi-extension/tests/cache-reuse/history.test.js +0 -117
  324. package/pi-extension/tests/cache-reuse/native.test.js +0 -91
  325. package/pi-extension/tests/cache-reuse/settings.test.js +0 -211
  326. package/pi-extension/tests/cognitive-routing-v2/communication.test.js +0 -577
  327. package/pi-extension/tests/cognitive-routing-v2/compaction-input.test.js +0 -183
  328. package/pi-extension/tests/cognitive-routing-v2/delegation.test.js +0 -557
  329. package/pi-extension/tests/cognitive-routing-v2/native.test.js +0 -474
  330. package/pi-extension/tests/cognitive-routing-v2/performance.test.js +0 -87
  331. package/pi-extension/tests/cognitive-routing-v2/persistence.test.js +0 -300
  332. package/pi-extension/tests/cognitive-routing-v2/projection.test.js +0 -241
  333. package/pi-extension/tests/cognitive-routing-v2/recovery.test.js +0 -1034
  334. package/pi-extension/tests/cognitive-routing-v2/render.test.js +0 -244
  335. package/pi-extension/tests/cognitive-routing-v2/runtime.test.js +0 -423
  336. package/pi-extension/tests/cognitive-routing-v2/stabilization.test.js +0 -521
  337. package/pi-extension/tests/cognitive-routing-v2/state.test.js +0 -586
  338. package/pi-extension/tests/context-virtualization/extension.test.js +0 -775
  339. package/pi-extension/tests/context-virtualization/projector.test.js +0 -110
  340. package/pi-extension/tests/context-virtualization/runtime.test.js +0 -230
  341. package/pi-extension/tests/conversation-history/runtime.test.js +0 -98
  342. package/pi-extension/tests/conversation-history/search.test.js +0 -97
  343. package/pi-extension/tests/fixtures/pi-host.js +0 -4
  344. package/pi-extension/tests/fixtures/routing-native.js +0 -191
  345. package/pi-extension/tests/integration/mode-free-core.test.js +0 -220
  346. package/pi-extension/tests/integration/pi-extension.test.js +0 -1447
  347. package/pi-extension/tests/integration/prompt-architecture.test.js +0 -447
  348. package/pi-extension/tests/integration/unaffected-regressions.test.js +0 -478
  349. package/pi-extension/tests/provider-support/astra-boundaries.test.js +0 -75
  350. package/pi-extension/tests/provider-support/astra.test.js +0 -306
  351. package/pi-extension/tests/provider-support/cli.test.js +0 -92
  352. package/pi-extension/tests/provider-support/native.test.js +0 -183
  353. package/pi-extension/tests/settings/settings-tui.test.js +0 -243
  354. package/pi-extension/tsconfig.json +0 -16
  355. package/plugin.json +0 -33
  356. package/runtime/prompts/context-virtualization.md +0 -3
  357. package/runtime/prompts/conversation-history.md +0 -3
  358. package/skills/action-selection/SKILL.md +0 -100
  359. package/skills/action-selection/references/trajectory-stalls.md +0 -71
  360. package/skills/bypass/SKILL.md +0 -153
  361. package/skills/commit-work/SKILL.md +0 -145
  362. package/skills/commit-work/references/git-state-edges.md +0 -94
  363. package/skills/commit-work/references/simple-push.md +0 -92
  364. package/skills/commit-work/references/staging-decisions.md +0 -106
  365. package/skills/decision-gate/SKILL.md +0 -106
  366. package/skills/design-for-depth/SKILL.md +0 -117
  367. package/skills/design-for-depth/references/design-pressure-signals.md +0 -182
  368. package/skills/design-for-depth/references/implementation-decisions.md +0 -76
  369. package/skills/design-for-depth/references/interface-design-loop.md +0 -136
  370. package/skills/design-for-depth/references/module-and-dependency-design.md +0 -147
  371. package/skills/design-for-depth/references/software-design-philosophy.md +0 -202
  372. package/skills/design-for-depth/references/state-and-failure-boundaries.md +0 -136
  373. package/skills/diagnose-failure/SKILL.md +0 -125
  374. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +0 -48
  375. package/skills/diagnose-failure/references/flaky-and-performance-diagnosis.md +0 -51
  376. package/skills/discuss/SKILL.md +0 -116
  377. package/skills/evaluate-skill/SKILL.md +0 -219
  378. package/skills/evaluate-skill/references/evaluation-definition-schema.md +0 -385
  379. package/skills/evaluate-skill/references/evaluation-design.md +0 -112
  380. package/skills/evaluate-skill/references/execution-and-evidence.md +0 -90
  381. package/skills/evaluate-skill/references/review-and-revision.md +0 -92
  382. package/skills/evaluate-skill/scripts/lib/definitions.mjs +0 -407
  383. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +0 -60
  384. package/skills/evaluate-skill/scripts/lib/grade.mjs +0 -64
  385. package/skills/evaluate-skill/scripts/lib/runner.mjs +0 -368
  386. package/skills/evaluate-skill/scripts/pi-guard.mjs +0 -164
  387. package/skills/evaluate-skill/scripts/skill-eval.mjs +0 -102
  388. package/skills/execute-work/references/execute-work-edges.md +0 -68
  389. package/skills/finish-branch/SKILL.md +0 -117
  390. package/skills/finish-branch/references/integration-options.md +0 -80
  391. package/skills/handoff/SKILL.md +0 -82
  392. package/skills/handoff/references/handoff-templates.md +0 -150
  393. package/skills/launch-work/SKILL.md +0 -116
  394. package/skills/launch-work/references/launch-readiness.md +0 -85
  395. package/skills/migration-work/SKILL.md +0 -115
  396. package/skills/migration-work/references/migration-lifecycle.md +0 -82
  397. package/skills/release-work/SKILL.md +0 -118
  398. package/skills/release-work/references/release-evidence.md +0 -78
  399. package/skills/review-artifact/SKILL.md +0 -142
  400. package/skills/review-artifact/references/adjudicate-artifact-review.md +0 -101
  401. package/skills/review-artifact/references/independent-artifact-reviewer-contract.md +0 -159
  402. package/skills/review-work/references/adjudicate-work-review.md +0 -97
  403. package/skills/review-work/references/independent-work-reviewer-contract.md +0 -139
  404. package/skills/review-work/references/security-risk-lens.md +0 -69
  405. package/skills/setup-freeflow/references/activation-contract.md +0 -109
  406. package/skills/setup-freeflow/references/host-setup.md +0 -67
  407. package/skills/simplify-code/SKILL.md +0 -85
  408. package/skills/simplify-code/references/simplification-patterns.md +0 -70
  409. package/skills/verify-work/references/browser-runtime-evidence.md +0 -55
  410. package/skills/verify-work/references/integration-evidence.md +0 -47
  411. package/skills/verify-work/references/performance-evidence.md +0 -57
  412. package/skills/workflow/SKILL.md +0 -127
  413. package/skills/workflow/references/domain-skill-composition.md +0 -43
  414. package/skills/write-plan/SKILL.md +0 -92
  415. package/skills/write-plan/references/plan-shapes.md +0 -156
  416. package/skills/write-skill/references/activation-boundaries.md +0 -104
  417. package/skills/write-skill/references/agent-first-instructions.md +0 -121
  418. package/skills/write-skill/references/progressive-disclosure.md +0 -127
  419. package/skills/write-skill/references/skill-dependency-graphs.md +0 -190
  420. package/skills/write-spec/SKILL.md +0 -92
  421. package/skills/write-spec/references/artifact-standards.md +0 -86
  422. package/skills/write-spec/references/decision-records.md +0 -78
  423. package/skills/write-spec/references/spec-shapes.md +0 -143
  424. /package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/budget.js +0 -0
  425. /package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/evidence.mjs +0 -0
  426. /package/skills/{evaluate-skill → evaluate-behavior}/scripts/pi-observer.mjs +0 -0
@@ -0,0 +1,74 @@
1
+ import { ROUTING_TOOLS } from "./types.js";
2
+ import { ROUTING_SCHEMAS, explainRoutingArguments, matches } from "./schemas.js";
3
+ export { ROUTING_SCHEMAS } from "./schemas.js";
4
+ import { renderRoutingCall, renderRoutingResult } from "./render.js";
5
+ /** What Pi shows for each tool, as the other Freeflow tools name theirs. */
6
+ const ROUTING_LABELS = {
7
+ delegate_work: "Delegate",
8
+ return_work: "Return",
9
+ routing_unit: "Routing unit",
10
+ select_evidence: "Evidence",
11
+ };
12
+ const descriptions = {
13
+ delegate_work:
14
+ "Save a supported assignment contract and request enabled worker execution. Explicit replace supersedes a quiescent outstanding assignment in the same unit.",
15
+ return_work:
16
+ "Save or revise the actual assignment report, save an attached recovery supplement, or retry the current saved return without resubmitting text. Returning does not accept or close the unit.",
17
+ routing_unit:
18
+ "Inspect current responsibility, paginated work history, or exact saved communication. Coordinator can restore an assessment, request or cancel attached evidence recovery, or close a unit without clearing history.",
19
+ select_evidence:
20
+ "Inspect current selection and scoped candidates when needed, then add or remove exposed worker task-evidence refs. Strict shapes: inspect uses operation plus optional scope/cursor; add uses operation plus eligible refs only; remove uses operation plus currently selected or unresolved refs plus required reason. Reason is remove-only. Only tool results are evidence; put anything you would say in the report.",
21
+ };
22
+ const guidance = {
23
+ delegate_work: [
24
+ "delegate_work is Coordinator-only under Automatic control. Put the contract in the input. Choose worker when both Helper and Executor are enabled; the sole worker is inferred otherwise. Use replace only for explicit same-unit replacement; do not supply IDs.",
25
+ ],
26
+ return_work: [
27
+ "return_work submit saves/revises the assignment report; supplement saves separate recovery communication; retry completes the current unchanged saved return without text. Stop ordinary task or recovery-read work after its communication is saved. Keep the handoff last; do not batch it with new task tools.",
28
+ ],
29
+ routing_unit: [
30
+ "routing_unit inspect defaults to current state; view history returns work refs and detail reads saved communication. Coordinator recover requests bounded evidence work against the current returned assessment; cancel-recovery ends only that recovery; assess restores a suspended evidence obligation; close changes work status without clearing communication or completing a Working Record task.",
31
+ ],
32
+ select_evidence: [
33
+ "Use exactly one shape: inspect {operation, scope?, cursor?}; add {operation, refs} with no reason; remove {operation, refs, reason}. Reason is required only for remove and invalid for add/inspect. Add exact eligible visible refs directly when identity and eligibility are clear; inspect when identity, eligibility, representation or selection state is unclear. Never add refs marked not offered for new evidence selection. For remove, use currently selected or unresolved refs; a non-selectable ref may be named only to clear its unresolved request and requires a reason. Only tool results are evidence: select the result bodies behind your claims, not calls or your own messages, and say everything else in the report. Correct or explicitly withdraw unresolved items with a limitation. Known previously exposed bodies resolve automatically; target-representation gaps are not successful delivery.",
34
+ ],
35
+ };
36
+ export function registerRoutingTools(pi, runtime) {
37
+ for (const name of ROUTING_TOOLS) {
38
+ const definition = {
39
+ name,
40
+ label: ROUTING_LABELS[name],
41
+ description: descriptions[name],
42
+ parameters: ROUTING_SCHEMAS[name],
43
+ // Handoffs and evidence selection are assistant-issued boundaries: codemode scripts must not call them.
44
+ exposure: "model-only",
45
+ // Declared only while routing is effective: hidden until applyRoutingToolVisibility adds them, like Freeflow's
46
+ // other tools, so no loadout before Freeflow's first update carries them (Pi 1.4.0 activates tools by default).
47
+ defaultActive: false,
48
+ executionMode: "sequential",
49
+ promptGuidelines: guidance[name],
50
+ renderCall: (args, _theme, context) => renderRoutingCall(name, args, context),
51
+ renderResult: (result, options, _theme, context) => renderRoutingResult(result, options, name, context),
52
+ async execute(id, input, signal, _update, ctx) {
53
+ if (!matches(input, ROUTING_SCHEMAS[name])) throw new Error(explainRoutingArguments(name, input));
54
+ return runtime.invoke(name, id, input, signal, ctx);
55
+ },
56
+ };
57
+ pi.registerTool(definition);
58
+ }
59
+ }
60
+ export function applyRoutingToolVisibility(pi, _runtime, available = true) {
61
+ if (!pi.getActiveTools || !pi.setActiveTools) return;
62
+ const current = pi.getActiveTools();
63
+ // Declared only while routing is effective (Task 003 D-002); turning it on or off costs one cache write (D-001).
64
+ // Missing routing tools are appended and present ones keep their place, so tools another extension adds later
65
+ // (tool_search, for one) are never reordered around them.
66
+ const kept = current.filter(
67
+ (name) =>
68
+ name !== "freeflow_switch_profile" &&
69
+ name !== "freeflow_cognitive_routing_history" &&
70
+ (available || !ROUTING_TOOLS.includes(name)),
71
+ );
72
+ const next = available ? [...kept, ...ROUTING_TOOLS.filter((name) => !kept.includes(name))] : kept;
73
+ if (JSON.stringify(next) !== JSON.stringify(current)) pi.setActiveTools(next);
74
+ }
@@ -1,5 +1,7 @@
1
+ import { canonical } from "../host/canonical.js";
1
2
  export const ROUTING_ENTRY = "freeflow-routing-v2";
2
3
  export const ROUTING_MESSAGE = "freeflow-routing-v2-state";
4
+ export const ROUTING_ATTENTION_MESSAGE = "freeflow-routing-attention";
3
5
  export const WORKER_PROFILES = ["helper", "executor"];
4
6
  export const PROFILES = ["coordinator", ...WORKER_PROFILES];
5
7
  export const DELEGATION_MODES = ["executor", "helper", "both"];
@@ -25,16 +27,6 @@ export function requireCondition(condition, code, message = code) {
25
27
  export function isObject(value) {
26
28
  return !!value && typeof value === "object" && !Array.isArray(value);
27
29
  }
28
- export function canonical(value) {
29
- if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
30
- if (isObject(value))
31
- return `{${Object.keys(value)
32
- .filter((k) => value[k] !== undefined)
33
- .sort()
34
- .map((k) => `${JSON.stringify(k)}:${canonical(value[k])}`)
35
- .join(",")}}`;
36
- return JSON.stringify(value) ?? "null";
37
- }
38
30
  export function samePair(left, right) {
39
31
  return !!left && !!right && canonical(left) === canonical(right);
40
32
  }
@@ -44,5 +36,16 @@ export const eventValue = (event) =>
44
36
  export const emptySelection = () => ({ revision: 0, selected: [], unresolved: [], withdrawals: [] });
45
37
  export const refFor = (id) => `ctx:${id}`;
46
38
  export function idFor(ref) {
47
- return /^ctx:([^\s:#]+)(?:#text)?$/.exec(ref)?.[1];
39
+ return /^ctx:([^\s:#]+)$/.exec(ref)?.[1];
48
40
  }
41
+ export { canonical };
42
+ export const ROUTING_TOOLS = ["delegate_work", "return_work", "routing_unit", "select_evidence"];
43
+ /** The routing tools' names before Task 003's rename; sessions saved earlier still hold them in their history. */
44
+ export const LEGACY_ROUTING_TOOLS = {
45
+ freeflow_delegate: "delegate_work",
46
+ freeflow_return: "return_work",
47
+ freeflow_unit: "routing_unit",
48
+ freeflow_project: "select_evidence",
49
+ };
50
+ /** A routing tool's current name, for a name read from saved history. */
51
+ export const routingToolName = (name) => LEGACY_ROUTING_TOOLS[name] ?? name;
@@ -0,0 +1,205 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { resolveToolPath } from "../tool-execution/file-state.js";
3
+ /**
4
+ * Carried context: what a Freeflow compaction delivers again after the summary. The latest user messages are always
5
+ * carried, word for word; files the agent selects are read from disk at compaction time, never copied from an older
6
+ * read. Everything is copied into one message, so a reopened session needs no Freeflow lookup to rebuild it.
7
+ */
8
+ /** A planning estimate, as Pi's own compaction uses: about four characters per token. */
9
+ export const estimateTokens = (text) => Math.ceil(text.length / 4);
10
+ export const SUMMARY_LIMIT_TOKENS = 8_000;
11
+ /** The latest user messages are carried outside the budget, up to this many and this size. */
12
+ export const USER_MESSAGE_LIMIT = { count: 3, tokens: 8_000 };
13
+ /**
14
+ * Carry budget: 15% of the context window, never above 40k tokens, and never above a quarter of the warning point.
15
+ * The next cycle starts from the carried context plus the summary and the methods the agent reloads; when Pi's reserve
16
+ * is large, a budget from the window alone refills the cycle to the warning before any work.
17
+ */
18
+ export function carryBudget(contextWindow, warning) {
19
+ const fromWindow = typeof contextWindow === "number" && contextWindow > 0 ? Math.floor(contextWindow * 0.15) : 40_000;
20
+ const fromWarning = typeof warning === "number" && warning > 0 ? Math.floor(warning / 4) : Infinity;
21
+ return Math.min(fromWindow, 40_000, fromWarning);
22
+ }
23
+ export const isCarryResult = (item) => typeof item?.result === "string";
24
+ /** Read one selected file as it is now. */
25
+ export async function readCarriedFile(item, cwd) {
26
+ let raw;
27
+ try {
28
+ raw = await readFile(resolveToolPath(item.file, cwd), "utf8");
29
+ } catch (error) {
30
+ return { path: item.file, error: error?.code === "ENOENT" ? "file not found" : "file could not be read" };
31
+ }
32
+ if (raw.includes("\u0000")) return { path: item.file, error: "binary file, not carried" };
33
+ if (!item.lines) return { path: item.file, text: raw };
34
+ const [first, last] = item.lines;
35
+ return {
36
+ path: item.file,
37
+ lines: item.lines,
38
+ text: raw
39
+ .split("\n")
40
+ .slice(first - 1, last)
41
+ .join("\n"),
42
+ };
43
+ }
44
+ /** The reason a carry selection is unusable, or undefined. */
45
+ export function carryProblem(item) {
46
+ const value = item;
47
+ if (typeof value === "object" && value !== null && typeof value.result === "string") {
48
+ if (value.file !== undefined || value.lines !== undefined)
49
+ return `${value.result}: give a result id or a file, not both`;
50
+ return value.result.trim() ? undefined : "a result id must not be empty";
51
+ }
52
+ if (typeof value !== "object" || value === null || typeof value.file !== "string" || value.file.length === 0)
53
+ return "each carry item needs a file path or a result id";
54
+ if (value.lines === undefined) return undefined;
55
+ const lines = value.lines;
56
+ if (
57
+ !Array.isArray(lines) ||
58
+ lines.length !== 2 ||
59
+ !lines.every((n) => Number.isSafeInteger(n) && n >= 1) ||
60
+ lines[0] > lines[1]
61
+ )
62
+ return `${value.file}: lines must be [first, last], 1-based, first <= last`;
63
+ return undefined;
64
+ }
65
+ const text = (content) =>
66
+ typeof content === "string"
67
+ ? content
68
+ : Array.isArray(content)
69
+ ? content.map((part) => (part?.type === "text" ? part.text : "")).join("")
70
+ : "";
71
+ /**
72
+ * The latest user messages on the branch, oldest first, within the carried limit. Freeflow's own /freeflow compact
73
+ * request is a custom message, not a user message, so it is never among them.
74
+ */
75
+ export function latestUserMessages(branch) {
76
+ const messages = branch
77
+ .filter((entry) => entry?.type === "message" && entry.message?.role === "user")
78
+ .map((entry) => text(entry.message.content).trim())
79
+ .filter(Boolean)
80
+ .slice(-USER_MESSAGE_LIMIT.count);
81
+ const kept = [];
82
+ let left = USER_MESSAGE_LIMIT.tokens;
83
+ for (const message of messages.reverse()) {
84
+ if (left <= 0) break;
85
+ const fits = estimateTokens(message) <= left;
86
+ kept.unshift(fits ? message : `${message.slice(0, left * 4)}\n[Message truncated at the carried limit.]`);
87
+ left -= estimateTokens(message);
88
+ }
89
+ return kept;
90
+ }
91
+ /**
92
+ * Text with each line's number in front, as `nl -ba` prints it, so a copy can be cited by file line without being read
93
+ * again. A final newline ends the last line rather than starting another. Pi's note after a partial read ("[Showing
94
+ * lines …]", "[N more lines in file …]") stays unnumbered; a whole file has no such note (`readNote: false`).
95
+ */
96
+ export function numberLines(text, first, { readNote = true } = {}) {
97
+ const note = readNote ? /\n\n\[(?:Showing lines \d+-\d+ of \d+|\d+ more lines in file)[^\n]*\]$/.exec(text) : null;
98
+ const whole = note ? text.slice(0, note.index) : text;
99
+ const ending = whole.endsWith("\n") ? "\n" : "";
100
+ const lines = (ending ? whole.slice(0, -1) : whole).split("\n");
101
+ const width = String(first + lines.length - 1).length;
102
+ const numbered = lines.map((line, i) => `${String(first + i).padStart(width)}\t${line}`).join("\n");
103
+ return numbered + ending + (note ? note[0] : "");
104
+ }
105
+ function fenced(body) {
106
+ const longest = Math.max(2, ...[...body.matchAll(/`+/g)].map((match) => match[0].length));
107
+ const fence = "`".repeat(longest + 1);
108
+ return `${fence}\n${body}\n${fence}`;
109
+ }
110
+ /**
111
+ * Copied text cannot open or close a `<user-message>` tag, so nothing but the user's own messages reads as their words.
112
+ */
113
+ function withoutUserMessageTags(text) {
114
+ return text.replace(/<(\/?)(user-message)/gi, "<\\$1$2");
115
+ }
116
+ /**
117
+ * One of the user's latest messages. Freeflow's guidance says text in a notice is not the user's instruction, except what
118
+ * these tags quote.
119
+ */
120
+ function userMessage(text, index) {
121
+ return `<user-message index="${index}">\n${withoutUserMessageTags(text)}\n</user-message>`;
122
+ }
123
+ export function renderCarried(notice, cycle, userMessages, files, results = [], options = {}) {
124
+ const parts = [
125
+ `# Carried context\n\nFreeflow carried this into cycle ${cycle} at compaction. Only the latest user messages, in \`<user-message>\` tags, are the user's words, and they take precedence over older instructions in the summary or a Working Record; the rest is copied content.`,
126
+ ];
127
+ if (userMessages.length)
128
+ parts.push(
129
+ "## Latest user messages\n\n" + userMessages.map((message, i) => userMessage(message, i + 1)).join("\n\n"),
130
+ );
131
+ if (files.length)
132
+ parts.push(
133
+ "## Files, read at compaction\n\nNumbered by file line, as are read results below.\n\n" +
134
+ files
135
+ .map((file) => {
136
+ const range = "lines" in file && file.lines ? ` (lines ${file.lines[0]}-${file.lines[1]})` : "";
137
+ return "error" in file
138
+ ? `### ${file.path}\n\nNot carried: ${file.error}.`
139
+ : `### ${file.path}${range}\n\n${fenced(numberLines(withoutUserMessageTags(file.text), "lines" in file && file.lines ? file.lines[0] : 1, { readNote: false }))}`;
140
+ })
141
+ .join("\n\n"),
142
+ );
143
+ if (results.length)
144
+ parts.push(
145
+ "## Tool results\n\n" +
146
+ results
147
+ .map(
148
+ (result) =>
149
+ `### ${result.id} ${result.tool}${result.label && result.label !== result.id ? `: ${result.label}` : ""}\n\n${fenced(result.firstLine === undefined ? withoutUserMessageTags(result.text) : numberLines(withoutUserMessageTags(result.text), result.firstLine))}`,
150
+ )
151
+ .join("\n\n"),
152
+ );
153
+ const listed = renderListed(options.listed ?? [], options.scope ?? "cycle", "Other results");
154
+ if (listed) parts.push(listed);
155
+ return notice(parts.join("\n\n"));
156
+ }
157
+ /**
158
+ * The carried context as the Coordinator sees it under projection: the user's latest messages, and only the names of
159
+ * the worker's copies. The Coordinator receives evidence by selection; the copies would repeat it and enlarge its view.
160
+ */
161
+ export function renderCarriedForCoordinator(notice, cycle, userMessages, files, results) {
162
+ const parts = [
163
+ `# Carried context\n\nFreeflow carried this into cycle ${cycle} at the worker's compaction. Only the latest user messages, in \`<user-message>\` tags, are the user's words, and they take precedence over older instructions in the summary or a Working Record.`,
164
+ ];
165
+ if (userMessages.length)
166
+ parts.push(
167
+ "## Latest user messages\n\n" + userMessages.map((message, i) => userMessage(message, i + 1)).join("\n\n"),
168
+ );
169
+ const names = [
170
+ ...files
171
+ .filter((file) => "text" in file)
172
+ .map(
173
+ (file) => `- ${file.path}${"lines" in file && file.lines ? ` (lines ${file.lines[0]}-${file.lines[1]})` : ""}`,
174
+ ),
175
+ ...results.map(
176
+ (result) =>
177
+ `- ${result.id} ${result.tool}${result.label && result.label !== result.id ? `: ${result.label}` : ""}`,
178
+ ),
179
+ ];
180
+ if (names.length)
181
+ parts.push(
182
+ "## Carried for the worker\n\nThe worker's copies are left out of this view; evidence it selects reaches you as usual.\n\n" +
183
+ names.join("\n"),
184
+ );
185
+ return notice(parts.join("\n\n"));
186
+ }
187
+ /** Results of the work in progress named by ref, so the agent knows they exist without their content in context. */
188
+ export function renderListed(listed, scope, heading, intro) {
189
+ if (!listed.length) return "";
190
+ const assignment = scope === "assignment";
191
+ return (
192
+ `## ${heading} of this ${assignment ? "assignment" : "cycle"}\n\n` +
193
+ (intro ??
194
+ (assignment
195
+ ? "Not carried. They are still stored: select one as evidence by its ref, carry it at a later compaction, or read it again if you need its content."
196
+ : "Not carried. Carry one by its id at a later compaction, or read it again if you need its content.")) +
197
+ "\n\n" +
198
+ listed
199
+ .map(
200
+ (result) =>
201
+ `- ${result.id} ${result.tool} ${result.label} ~${result.tokens} tokens${result.selected ? " (selected as evidence)" : ""}`,
202
+ )
203
+ .join("\n")
204
+ );
205
+ }
@@ -0,0 +1,24 @@
1
+ /** Freeflow compaction is on whenever Freeflow is, unless a config turns it off. */
2
+ export const DEFAULT_COMPACTION_ENABLED = true;
3
+ export const DEFAULT_COMPACTION_CARRY = true;
4
+ /** The keys `compaction` accepts; the settings test checks each has a /freeflow settings row. */
5
+ export const COMPACTION_KEYS = ["enabled", "carry"];
6
+ function record(value) {
7
+ return typeof value === "object" && value !== null && !Array.isArray(value);
8
+ }
9
+ export function validateCompactionConfig(value) {
10
+ if (!record(value)) return "compaction must be an object";
11
+ const unknown = Object.keys(value).find((key) => !COMPACTION_KEYS.includes(key));
12
+ if (unknown) return `compaction has unsupported key: ${unknown}`;
13
+ for (const key of COMPACTION_KEYS)
14
+ if (value[key] !== undefined && typeof value[key] !== "boolean") return `compaction.${key} must be a boolean`;
15
+ return null;
16
+ }
17
+ export function resolveCompactionConfig(repository, local, freeflowEnabled) {
18
+ const repositoryConfig = record(repository.compaction) ? repository.compaction : {};
19
+ const localConfig = record(local.compaction) ? local.compaction : {};
20
+ const layered = (key) => (Object.hasOwn(localConfig, key) ? localConfig[key] : repositoryConfig[key]);
21
+ const enabled = layered("enabled") === undefined ? DEFAULT_COMPACTION_ENABLED : layered("enabled") === true;
22
+ const carry = layered("carry") === undefined ? DEFAULT_COMPACTION_CARRY : layered("carry") === true;
23
+ return { enabled, effective: freeflowEnabled && enabled, carry };
24
+ }