@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
@@ -1,274 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
- import { projectCognitiveRoutingHistory } from "../../dist/cognitive-routing/history.js";
4
-
5
- const standard = { provider: "faux", modelId: "standard", thinkingLevel: "high" };
6
- const reasoning = { provider: "faux", modelId: "reasoning", thinkingLevel: "max" };
7
-
8
- function intent(overrides = {}) {
9
- return {
10
- version: 2,
11
- phase: "prepared",
12
- kind: "profile",
13
- control: "automatic",
14
- source: "agent",
15
- mechanism: "agent-tool",
16
- decisionCorrelationId: "correlation-1",
17
- fromPair: standard,
18
- fromProfile: "standard",
19
- epoch: "epoch-1",
20
- correlationId: "correlation-1",
21
- profile: "reasoning",
22
- target: reasoning,
23
- returnTarget: { provider: "faux", modelId: "return", thinkingLevel: "medium" },
24
- reason: "Need deeper analysis.",
25
- ...overrides,
26
- };
27
- }
28
-
29
- function hostEntry(overrides = {}) {
30
- return {
31
- type: "model_state_change",
32
- id: "state-1",
33
- parentId: "intent-1",
34
- timestamp: "2026-08-23T11:00:00.000Z",
35
- provider: reasoning.provider,
36
- modelId: reasoning.modelId,
37
- thinkingLevel: reasoning.thinkingLevel,
38
- correlationId: "correlation-1",
39
- origin: { source: "piflow", operation: "model-state-control" },
40
- ...overrides,
41
- };
42
- }
43
-
44
- function current(profile = "reasoning", control = "automatic") {
45
- return { profile, control };
46
- }
47
-
48
- test("projects a completed switch from the host representative and captured baseline", () => {
49
- const entries = [
50
- { id: "root", type: "message", parentId: null, timestamp: "2026-08-23T10:59:00.000Z" },
51
- {
52
- id: "intent-1",
53
- type: "custom",
54
- parentId: "root",
55
- timestamp: "2026-08-23T10:59:01.000Z",
56
- customType: "freeflow-cognitive-routing-intent",
57
- data: intent(),
58
- },
59
- hostEntry(),
60
- ];
61
-
62
- const result = projectCognitiveRoutingHistory(entries, {
63
- branchEntries: entries,
64
- current: current(),
65
- });
66
-
67
- assert.deepEqual(result.current, current());
68
- assert.deepEqual(result.summary, {
69
- latestSemanticEventId: "intent:intent-1",
70
- latestCompletedEventId: "intent:intent-1",
71
- unresolvedCount: 0,
72
- anomalyCount: 0,
73
- });
74
- assert.deepEqual(result.events, [
75
- {
76
- id: "intent:intent-1",
77
- timestamp: "2026-08-23T11:00:00.000Z",
78
- jsonlPosition: 2,
79
- entryId: "state-1",
80
- parentId: "intent-1",
81
- branchAnchor: "state-1",
82
- classification: "semantic-switch",
83
- decisionSource: "agent",
84
- mechanism: "agent-tool",
85
- outcome: "completed",
86
- changed: true,
87
- integrity: "valid",
88
- from: "standard",
89
- to: "reasoning",
90
- control: "automatic",
91
- reason: "Need deeper analysis.",
92
- epoch: "epoch-1",
93
- correlationId: "correlation-1",
94
- decisionCorrelationId: "correlation-1",
95
- hostOrigin: { source: "piflow", operation: "model-state-control" },
96
- },
97
- ]);
98
- });
99
-
100
- test("orders completed events by JSONL position and preserves tri-state change semantics", () => {
101
- const entries = [
102
- {
103
- id: "intent-a",
104
- type: "custom",
105
- customType: "freeflow-cognitive-routing-intent",
106
- data: intent({ correlationId: "correlation-a", decisionCorrelationId: "correlation-a" }),
107
- },
108
- hostEntry({ id: "state-a", correlationId: "correlation-a", timestamp: "2026-08-23T11:01:00.000Z" }),
109
- {
110
- id: "intent-b",
111
- type: "custom",
112
- customType: "freeflow-cognitive-routing-intent",
113
- data: intent({
114
- correlationId: "correlation-b",
115
- decisionCorrelationId: "correlation-b",
116
- fromPair: standard,
117
- fromProfile: "standard",
118
- profile: "standard",
119
- target: standard,
120
- }),
121
- },
122
- hostEntry({
123
- id: "state-b",
124
- correlationId: "correlation-b",
125
- timestamp: "not-a-timestamp",
126
- provider: standard.provider,
127
- modelId: standard.modelId,
128
- thinkingLevel: standard.thinkingLevel,
129
- }),
130
- {
131
- id: "intent-c",
132
- type: "custom",
133
- customType: "freeflow-cognitive-routing-intent",
134
- data: intent({
135
- version: 1,
136
- correlationId: "correlation-c",
137
- decisionCorrelationId: undefined,
138
- fromPair: undefined,
139
- fromProfile: undefined,
140
- }),
141
- },
142
- hostEntry({ id: "state-c", correlationId: "correlation-c", timestamp: undefined }),
143
- ];
144
-
145
- const result = projectCognitiveRoutingHistory(entries, { current: current() });
146
-
147
- assert.deepEqual(
148
- result.events.map(({ id, jsonlPosition, changed, timestamp }) => ({ id, jsonlPosition, changed, timestamp })),
149
- [
150
- { id: "intent:intent-c", jsonlPosition: 5, changed: "unknown", timestamp: undefined },
151
- { id: "intent:intent-b", jsonlPosition: 3, changed: false, timestamp: undefined },
152
- { id: "intent:intent-a", jsonlPosition: 1, changed: true, timestamp: "2026-08-23T11:01:00.000Z" },
153
- ],
154
- );
155
- assert.equal(result.summary.latestCompletedEventId, "intent:intent-c");
156
- });
157
-
158
- test("keeps unresolved and anomalous evidence distinct from the anomalies view", () => {
159
- const entries = [
160
- {
161
- id: "intent-unresolved",
162
- type: "custom",
163
- customType: "freeflow-cognitive-routing-intent",
164
- data: intent({ correlationId: "correlation-unresolved", decisionCorrelationId: "correlation-unresolved" }),
165
- },
166
- {
167
- id: "intent-mismatch",
168
- type: "custom",
169
- customType: "freeflow-cognitive-routing-intent",
170
- data: intent({ correlationId: "correlation-mismatch", decisionCorrelationId: "correlation-mismatch" }),
171
- },
172
- hostEntry({
173
- id: "state-mismatch",
174
- correlationId: "correlation-mismatch",
175
- provider: standard.provider,
176
- modelId: standard.modelId,
177
- thinkingLevel: standard.thinkingLevel,
178
- }),
179
- ];
180
-
181
- const result = projectCognitiveRoutingHistory(entries, { current: current() });
182
- assert.equal(result.summary.unresolvedCount, 2);
183
- assert.equal(result.summary.anomalyCount, 1);
184
- assert.deepEqual(
185
- result.events.map(({ id, outcome, integrity, anomalyReason }) => ({ id, outcome, integrity, anomalyReason })),
186
- [
187
- {
188
- id: "intent:intent-mismatch",
189
- outcome: "unresolved",
190
- integrity: "anomaly",
191
- anomalyReason: "host_target_mismatch",
192
- },
193
- { id: "intent:intent-unresolved", outcome: "unresolved", integrity: "unknown", anomalyReason: undefined },
194
- ],
195
- );
196
-
197
- const anomalies = projectCognitiveRoutingHistory(entries, { current: current(), anomaliesOnly: true });
198
- assert.equal(anomalies.summary.unresolvedCount, 2);
199
- assert.equal(anomalies.summary.anomalyCount, 1);
200
- assert.deepEqual(
201
- anomalies.events.map(({ id }) => id),
202
- ["intent:intent-mismatch"],
203
- );
204
- });
205
-
206
- test("projects control-only entries without fabricating a profile transition", () => {
207
- const entries = [
208
- {
209
- id: "control-1",
210
- type: "custom",
211
- customType: "freeflow-cognitive-routing-control",
212
- data: {
213
- version: 2,
214
- control: "automatic",
215
- source: "user",
216
- mechanism: "profile-command",
217
- epoch: "epoch-1",
218
- reason: "manual hold release",
219
- },
220
- },
221
- ];
222
-
223
- const result = projectCognitiveRoutingHistory(entries, { current: current() });
224
-
225
- assert.deepEqual(result.summary, {
226
- unresolvedCount: 0,
227
- anomalyCount: 0,
228
- });
229
- assert.deepEqual(result.events, [
230
- {
231
- id: "control:control-1",
232
- jsonlPosition: 0,
233
- entryId: "control-1",
234
- branchAnchor: "control-1",
235
- classification: "control-only",
236
- decisionSource: "user",
237
- mechanism: "profile-command",
238
- outcome: "completed",
239
- changed: false,
240
- integrity: "valid",
241
- control: "automatic",
242
- reason: "manual hold release",
243
- epoch: "epoch-1",
244
- },
245
- ]);
246
- });
247
-
248
- test("latest completed transition ignores later control-only entries", () => {
249
- const entries = [
250
- {
251
- id: "intent-completed",
252
- type: "custom",
253
- customType: "freeflow-cognitive-routing-intent",
254
- data: intent(),
255
- },
256
- hostEntry({ id: "state-completed" }),
257
- {
258
- id: "control-later",
259
- type: "custom",
260
- customType: "freeflow-cognitive-routing-control",
261
- data: {
262
- version: 2,
263
- control: "automatic",
264
- source: "user",
265
- mechanism: "profile-command",
266
- epoch: "epoch-1",
267
- },
268
- },
269
- ];
270
-
271
- const result = projectCognitiveRoutingHistory(entries, { current: current() });
272
-
273
- assert.equal(result.summary.latestCompletedEventId, "intent:intent-completed");
274
- });
@@ -1,63 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
- import freeflowExtension from "../../dist/index.js";
4
-
5
- const PIFLOW_HOST = Object.freeze({
6
- distribution: Object.freeze({ id: "piflow", version: "test" }),
7
- capabilities: Object.freeze({ sessionModelStateControl: 1 }),
8
- });
9
-
10
- function loadExtension(host) {
11
- const tools = [];
12
- const commands = [];
13
- const handlers = new Map();
14
- const pi = {
15
- host,
16
- registerTool(tool) {
17
- tools.push(tool);
18
- },
19
- registerCommand(name, definition) {
20
- commands.push({ name, definition });
21
- },
22
- on(event, handler) {
23
- handlers.set(event, handler);
24
- },
25
- };
26
- freeflowExtension(pi);
27
- return { tools, commands, handlers };
28
- }
29
-
30
- test("does not activate PiFlow behavior from FREEFLOW_RUNTIME without host metadata", () => {
31
- const previousRuntime = process.env.FREEFLOW_RUNTIME;
32
- process.env.FREEFLOW_RUNTIME = "piflow";
33
- try {
34
- const { tools, commands } = loadExtension(undefined);
35
- assert.equal(
36
- tools.some((tool) => tool.name === "freeflow_switch_profile"),
37
- false,
38
- );
39
- const freeflowCommand = commands.find((command) => command.name === "freeflow");
40
- assert.ok(freeflowCommand);
41
- assert.equal(
42
- freeflowCommand.definition.getArgumentCompletions("").some((item) => item.value === "profile"),
43
- false,
44
- );
45
- } finally {
46
- if (previousRuntime === undefined) delete process.env.FREEFLOW_RUNTIME;
47
- else process.env.FREEFLOW_RUNTIME = previousRuntime;
48
- }
49
- });
50
-
51
- test("activates PiFlow behavior only with the complete host descriptor", () => {
52
- const { tools, commands } = loadExtension(PIFLOW_HOST);
53
- assert.equal(
54
- tools.some((tool) => tool.name === "freeflow_switch_profile"),
55
- true,
56
- );
57
- const freeflowCommand = commands.find((command) => command.name === "freeflow");
58
- assert.ok(freeflowCommand);
59
- assert.equal(
60
- freeflowCommand.definition.getArgumentCompletions("").some((item) => item.value === "profile"),
61
- true,
62
- );
63
- });