@hassangameryt/freeflow 0.7.1 → 0.7.3

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 (147) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.cursor-plugin/plugin.json +1 -1
  5. package/README.md +153 -128
  6. package/capabilities/cognitive-routing/SKILL.md +126 -274
  7. package/command-surface.json +7 -1
  8. package/gemini-extension.json +1 -1
  9. package/package.json +4 -4
  10. package/pi-extension/dist/cognitive-routing-v2/budget.js +42 -0
  11. package/pi-extension/dist/cognitive-routing-v2/config.js +136 -0
  12. package/pi-extension/dist/cognitive-routing-v2/projection.js +330 -0
  13. package/pi-extension/dist/cognitive-routing-v2/render.js +252 -0
  14. package/pi-extension/dist/cognitive-routing-v2/runtime.js +2181 -0
  15. package/pi-extension/dist/cognitive-routing-v2/schemas.js +173 -0
  16. package/pi-extension/dist/cognitive-routing-v2/state.js +828 -0
  17. package/pi-extension/dist/cognitive-routing-v2/tools.js +60 -0
  18. package/pi-extension/dist/cognitive-routing-v2/types.js +48 -0
  19. package/pi-extension/dist/context-virtualization/runtime.js +29 -7
  20. package/pi-extension/dist/freeflow-context/tool.js +12 -6
  21. package/pi-extension/dist/index.js +302 -626
  22. package/pi-extension/dist/provider-support/astra/adapter.js +110 -0
  23. package/pi-extension/dist/provider-support/astra/history.js +125 -0
  24. package/pi-extension/dist/provider-support/astra/index.js +11 -0
  25. package/pi-extension/dist/provider-support/astra/session-state.js +114 -0
  26. package/pi-extension/dist/provider-support/index.js +4 -0
  27. package/pi-extension/dist/runtime/request-history.js +216 -0
  28. package/pi-extension/dist/runtime/runtime-context.js +85 -16
  29. package/pi-extension/dist/session-sources/events.js +217 -0
  30. package/pi-extension/dist/session-sources/provenance.js +32 -0
  31. package/pi-extension/dist/session-sources/read-only-session.js +148 -0
  32. package/pi-extension/dist/session-sources/sources.js +277 -0
  33. package/pi-extension/dist/settings/settings-ui.js +274 -147
  34. package/pi-extension/src/cognitive-routing-v2/budget.ts +42 -0
  35. package/pi-extension/src/cognitive-routing-v2/config.ts +173 -0
  36. package/pi-extension/src/cognitive-routing-v2/projection.ts +375 -0
  37. package/pi-extension/src/cognitive-routing-v2/render.ts +277 -0
  38. package/pi-extension/src/cognitive-routing-v2/runtime.ts +2241 -0
  39. package/pi-extension/src/cognitive-routing-v2/schemas.ts +180 -0
  40. package/pi-extension/src/cognitive-routing-v2/state.ts +839 -0
  41. package/pi-extension/src/cognitive-routing-v2/tools.ts +62 -0
  42. package/pi-extension/src/cognitive-routing-v2/types.ts +254 -0
  43. package/pi-extension/src/context-virtualization/runtime.ts +30 -8
  44. package/pi-extension/src/freeflow-context/tool.ts +12 -6
  45. package/pi-extension/src/index.ts +308 -675
  46. package/pi-extension/src/provider-support/astra/adapter.ts +108 -0
  47. package/pi-extension/src/provider-support/astra/history.ts +145 -0
  48. package/pi-extension/src/provider-support/astra/index.ts +12 -0
  49. package/pi-extension/src/provider-support/astra/session-state.ts +113 -0
  50. package/pi-extension/src/provider-support/index.ts +5 -0
  51. package/pi-extension/src/runtime/request-history.ts +243 -0
  52. package/pi-extension/src/runtime/runtime-context.ts +100 -17
  53. package/pi-extension/src/session-sources/events.ts +230 -0
  54. package/pi-extension/src/session-sources/provenance.ts +39 -0
  55. package/pi-extension/src/session-sources/read-only-session.ts +170 -0
  56. package/pi-extension/src/session-sources/sources.ts +334 -0
  57. package/pi-extension/src/settings/settings-ui.ts +311 -158
  58. package/pi-extension/tests/cache-reuse/history.test.js +117 -0
  59. package/pi-extension/tests/cache-reuse/native.test.js +91 -0
  60. package/pi-extension/tests/cache-reuse/settings.test.js +211 -0
  61. package/pi-extension/tests/cognitive-routing-v2/communication.test.js +577 -0
  62. package/pi-extension/tests/cognitive-routing-v2/compaction-input.test.js +183 -0
  63. package/pi-extension/tests/cognitive-routing-v2/delegation.test.js +557 -0
  64. package/pi-extension/tests/cognitive-routing-v2/native.test.js +474 -0
  65. package/pi-extension/tests/cognitive-routing-v2/performance.test.js +87 -0
  66. package/pi-extension/tests/cognitive-routing-v2/persistence.test.js +300 -0
  67. package/pi-extension/tests/cognitive-routing-v2/projection.test.js +241 -0
  68. package/pi-extension/tests/cognitive-routing-v2/recovery.test.js +1034 -0
  69. package/pi-extension/tests/cognitive-routing-v2/render.test.js +244 -0
  70. package/pi-extension/tests/cognitive-routing-v2/runtime.test.js +423 -0
  71. package/pi-extension/tests/cognitive-routing-v2/stabilization.test.js +521 -0
  72. package/pi-extension/tests/cognitive-routing-v2/state.test.js +586 -0
  73. package/pi-extension/tests/context-virtualization/extension.test.js +33 -7
  74. package/pi-extension/tests/context-virtualization/runtime.test.js +17 -3
  75. package/pi-extension/tests/fixtures/routing-native.js +191 -0
  76. package/pi-extension/tests/integration/mode-free-core.test.js +6 -4
  77. package/pi-extension/tests/integration/pi-extension.test.js +655 -59
  78. package/pi-extension/tests/integration/prompt-architecture.test.js +127 -30
  79. package/pi-extension/tests/integration/unaffected-regressions.test.js +78 -11
  80. package/pi-extension/tests/provider-support/astra-boundaries.test.js +75 -0
  81. package/pi-extension/tests/provider-support/astra.test.js +306 -0
  82. package/pi-extension/tests/provider-support/cli.test.js +92 -0
  83. package/pi-extension/tests/provider-support/native.test.js +183 -0
  84. package/plugin.json +1 -1
  85. package/runtime/prompts/cognitive-routing.md +4 -5
  86. package/runtime/prompts/core.md +51 -45
  87. package/runtime/prompts/interaction-contract.md +5 -5
  88. package/skills/action-selection/SKILL.md +57 -97
  89. package/skills/design-for-depth/SKILL.md +58 -193
  90. package/skills/design-for-depth/references/implementation-decisions.md +76 -0
  91. package/skills/diagnose-failure/SKILL.md +64 -196
  92. package/skills/discuss/SKILL.md +64 -123
  93. package/skills/discuss/references/discussion-continuity.md +7 -3
  94. package/skills/execute-work/SKILL.md +69 -88
  95. package/skills/execute-work/references/execute-work-edges.md +9 -3
  96. package/skills/handoff/SKILL.md +44 -54
  97. package/skills/handoff/references/handoff-templates.md +15 -6
  98. package/skills/review-artifact/SKILL.md +80 -127
  99. package/skills/review-artifact/references/independent-artifact-reviewer-contract.md +1 -1
  100. package/skills/review-work/SKILL.md +65 -115
  101. package/skills/review-work/references/independent-work-reviewer-contract.md +1 -1
  102. package/skills/simplify-code/SKILL.md +47 -100
  103. package/skills/track-work/SKILL.md +128 -119
  104. package/skills/track-work/references/working-record-format.md +14 -2
  105. package/skills/verify-work/SKILL.md +58 -62
  106. package/skills/verify-work/references/integration-evidence.md +4 -2
  107. package/skills/verify-work/references/test-design.md +89 -0
  108. package/skills/workflow/SKILL.md +73 -119
  109. package/skills/write-plan/SKILL.md +46 -77
  110. package/skills/write-plan/references/plan-shapes.md +5 -5
  111. package/skills/write-spec/SKILL.md +51 -63
  112. package/skills/write-spec/references/artifact-standards.md +2 -2
  113. package/skills/write-spec/references/decision-records.md +3 -2
  114. package/skills/write-spec/references/spec-shapes.md +15 -0
  115. package/pi-extension/dist/cognitive-routing/commands.js +0 -96
  116. package/pi-extension/dist/cognitive-routing/config.js +0 -232
  117. package/pi-extension/dist/cognitive-routing/controller.js +0 -1292
  118. package/pi-extension/dist/cognitive-routing/history.js +0 -451
  119. package/pi-extension/dist/cognitive-routing/host.js +0 -188
  120. package/pi-extension/dist/cognitive-routing/pi-routing-session.js +0 -414
  121. package/pi-extension/dist/cognitive-routing/pi-session-control.js +0 -320
  122. package/pi-extension/dist/cognitive-routing/runtime.js +0 -43
  123. package/pi-extension/dist/cognitive-routing/tool.js +0 -212
  124. package/pi-extension/dist/cognitive-routing/types.js +0 -6
  125. package/pi-extension/src/cognitive-routing/commands.ts +0 -129
  126. package/pi-extension/src/cognitive-routing/config.ts +0 -303
  127. package/pi-extension/src/cognitive-routing/controller.ts +0 -1628
  128. package/pi-extension/src/cognitive-routing/history.ts +0 -650
  129. package/pi-extension/src/cognitive-routing/host.ts +0 -266
  130. package/pi-extension/src/cognitive-routing/pi-routing-session.ts +0 -538
  131. package/pi-extension/src/cognitive-routing/pi-session-control.ts +0 -444
  132. package/pi-extension/src/cognitive-routing/runtime.ts +0 -57
  133. package/pi-extension/src/cognitive-routing/tool.ts +0 -273
  134. package/pi-extension/src/cognitive-routing/types.ts +0 -89
  135. package/pi-extension/tests/cognitive-routing/commands.test.js +0 -134
  136. package/pi-extension/tests/cognitive-routing/controller.test.js +0 -1128
  137. package/pi-extension/tests/cognitive-routing/extension-lifecycle.test.js +0 -1142
  138. package/pi-extension/tests/cognitive-routing/history.test.js +0 -274
  139. package/pi-extension/tests/cognitive-routing/host-identity.test.js +0 -63
  140. package/pi-extension/tests/cognitive-routing/pi-normal-lifecycle.test.js +0 -434
  141. package/pi-extension/tests/cognitive-routing/pi-session-control.test.js +0 -174
  142. package/pi-extension/tests/cognitive-routing/pi-session-history.test.js +0 -91
  143. package/pi-extension/tests/cognitive-routing/profile-resolution.test.js +0 -279
  144. package/pi-extension/tests/cognitive-routing/tool.test.js +0 -230
  145. package/skills/tdd/SKILL.md +0 -143
  146. package/skills/tdd/references/test-design.md +0 -96
  147. /package/pi-extension/tests/{cognitive-routing/host-fixture.js → fixtures/pi-host.js} +0 -0
@@ -0,0 +1,183 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { fixture, response } from "../fixtures/routing-native.js";
4
+ import { replay } from "../../dist/cognitive-routing-v2/state.js";
5
+ import { RoutingRuntime } from "../../dist/cognitive-routing-v2/runtime.js";
6
+ import { Sources } from "../../dist/session-sources/sources.js";
7
+ import { initialState } from "../../dist/cognitive-routing-v2/state.js";
8
+
9
+ test("delivery identity uses observed ancestry, not unseen storage or an older retained user", () => {
10
+ const state = initialState();
11
+ const entries = ["old", "delivered", "queued"].map((id, i) => ({
12
+ id,
13
+ parentId: i ? ["old", "delivered"][i - 1] : null,
14
+ type: "message",
15
+ message: { role: "user", content: id, timestamp: i },
16
+ }));
17
+ state.executions.set("observed", { basisUserEntryId: "delivered" });
18
+ const read = (branch, active) =>
19
+ RoutingRuntime.prototype.lastDeliveredUser.call({ stateData: () => state }, new Sources(branch, state), active);
20
+ assert.equal(read(entries, []), "delivered", "unseen queued entry is not delivered");
21
+ assert.equal(read(entries, [entries[0].message]), "delivered", "older retained user does not regress delivery");
22
+ assert.equal(read(entries, [entries[2].message]), "queued", "newly represented user advances delivery");
23
+ assert.equal(read(entries.slice(0, 1), []), null, "a basis outside selected ancestry is not inherited");
24
+ assert.equal(read(entries.slice(0, 1), [entries[0].message]), "old");
25
+ });
26
+
27
+ test("reload and explicit resume after compaction keep the outstanding assignment", { timeout: 30000 }, async () => {
28
+ let assignmentId, basis;
29
+ const result = await fixture(
30
+ (n, body, manager) => {
31
+ if (n === 1)
32
+ return [
33
+ {
34
+ name: "freeflow_delegate",
35
+ args: { operation: "assign", contract: "Read and preserve this assignment through a technical pause." },
36
+ },
37
+ ];
38
+ if (n === 2) {
39
+ const state = replay(manager.getBranch());
40
+ assignmentId = state.assignmentId;
41
+ basis = state.assignments.get(assignmentId).basisUserEntryId;
42
+ return [{ name: "read", args: { path: "evidence.txt" } }];
43
+ }
44
+ if (n === 4) {
45
+ const state = replay(manager.getBranch());
46
+ assert.equal(body.model, "gpt-4.1-mini");
47
+ assert.equal(state.assignmentId, assignmentId);
48
+ assert.equal(state.assignments.size, 1);
49
+ assert.equal(state.resumeBasis.get(assignmentId), basis);
50
+ assert.doesNotMatch(JSON.stringify(body), /New delivered user input requires Coordinator attention/);
51
+ return [{ name: "read", args: { path: "unselected.txt" } }];
52
+ }
53
+ if (n === 5)
54
+ assert.equal(
55
+ manager
56
+ .getBranch()
57
+ .filter((e) => e.message?.toolName === "read")
58
+ .at(-1).message.isError,
59
+ false,
60
+ );
61
+ return [];
62
+ },
63
+ true,
64
+ async ({ session, manager }) => {
65
+ await session.compact();
66
+ assert.equal(
67
+ manager.buildSessionContext().messages.some((m) => m.role === "user"),
68
+ false,
69
+ );
70
+ await session.reload();
71
+ await session.prompt("/freeflow resume");
72
+ await session.waitForIdle();
73
+ },
74
+ );
75
+ assert.equal(result.requests.length, 5);
76
+ });
77
+
78
+ for (const projection of [false, true]) {
79
+ for (const newInput of [false, true]) {
80
+ test(
81
+ `native overflow compaction preserves input identity; projection=${projection}, new input=${newInput}`,
82
+ { timeout: 30000 },
83
+ async () => {
84
+ let session, assignmentId, basis;
85
+ const result = await fixture(
86
+ async (n, body, manager) => {
87
+ const call = (name, args) => [{ name, args }];
88
+ if (n === 1)
89
+ return call("freeflow_delegate", {
90
+ operation: "assign",
91
+ contract: "Read evidence, then continue the same assignment after recovery.",
92
+ });
93
+ if (n === 2) {
94
+ const state = replay(manager.getBranch());
95
+ assignmentId = state.assignmentId;
96
+ basis = state.assignments.get(assignmentId).basisUserEntryId;
97
+ return call("read", { path: "evidence.txt" });
98
+ }
99
+ // The fixture returns one actual provider overflow here. Pi owns the
100
+ // compaction and automatic retry, not a manually invoked routing hook.
101
+ if (n === 3) return [];
102
+ if (n === 4) {
103
+ assert.ok(manager.getEntries().some((e) => e.type === "compaction"));
104
+ assert.equal(
105
+ manager.buildSessionContext().messages.some((m) => m.role === "user"),
106
+ false,
107
+ );
108
+ const state = replay(manager.getBranch());
109
+ assert.equal(state.assignmentId, assignmentId);
110
+ assert.equal(state.assignments.size, 1);
111
+ assert.equal([...state.executions.values()].at(-1).basisUserEntryId, basis);
112
+ assert.doesNotMatch(JSON.stringify(body), /New delivered user input requires Coordinator attention/);
113
+ assert.match(JSON.stringify(body), /Read evidence, then continue the same assignment after recovery/);
114
+ if (newInput) await session.steer("Stop further task reads; report the partial result.");
115
+ return call("read", { path: "unselected.txt" });
116
+ }
117
+ if (n === 5) {
118
+ assert.equal(
119
+ manager
120
+ .getBranch()
121
+ .filter((e) => e.message?.toolName === "read")
122
+ .at(-1).message.isError,
123
+ false,
124
+ );
125
+ if (newInput) {
126
+ assert.match(JSON.stringify(body), /New delivered user input requires Coordinator attention/);
127
+ assert.notEqual([...replay(manager.getBranch()).executions.values()].at(-1).basisUserEntryId, basis);
128
+ return call("read", { path: "evidence.txt" });
129
+ }
130
+ return call("freeflow_return", {
131
+ operation: "submit",
132
+ report: "Same assignment completed after compaction.",
133
+ outcome: "completed",
134
+ });
135
+ }
136
+ if (newInput && n === 6) {
137
+ assert.equal(
138
+ manager
139
+ .getBranch()
140
+ .filter((e) => e.message?.toolName === "read")
141
+ .at(-1).message.isError,
142
+ true,
143
+ );
144
+ return call("freeflow_return", {
145
+ operation: "submit",
146
+ report: "Stopped for genuine new input.",
147
+ outcome: "partial",
148
+ });
149
+ }
150
+ assert.equal(body.model, "gpt-4o");
151
+ assert.equal(replay(manager.getBranch()).assignments.get(assignmentId).state, "returned");
152
+ return [];
153
+ },
154
+ projection,
155
+ async ({ manager }) => {
156
+ assert.equal(manager.getEntries().filter((e) => e.type === "compaction").length, 1);
157
+ },
158
+ true,
159
+ {
160
+ onSession: (s) => {
161
+ session = s;
162
+ },
163
+ settings: { compaction: { enabled: true, keepRecentTokens: 1, reserveTokens: 1 } },
164
+ response: (n, calls) =>
165
+ n === 3
166
+ ? new Response(
167
+ JSON.stringify({
168
+ error: {
169
+ message: "Your input exceeds the context window of this model.",
170
+ type: "invalid_request_error",
171
+ code: "context_length_exceeded",
172
+ },
173
+ }),
174
+ { status: 400, headers: { "content-type": "application/json" } },
175
+ )
176
+ : response(n, calls),
177
+ },
178
+ );
179
+ assert.equal(result.requests.length, newInput ? 7 : 6);
180
+ },
181
+ );
182
+ }
183
+ }