@hassangameryt/freeflow 0.7.1 → 0.7.2

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 (122) 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 +28 -23
  6. package/capabilities/cognitive-routing/SKILL.md +94 -311
  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 +120 -0
  12. package/pi-extension/dist/cognitive-routing-v2/projection.js +321 -0
  13. package/pi-extension/dist/cognitive-routing-v2/render.js +231 -0
  14. package/pi-extension/dist/cognitive-routing-v2/runtime.js +1585 -0
  15. package/pi-extension/dist/cognitive-routing-v2/schemas.js +107 -0
  16. package/pi-extension/dist/cognitive-routing-v2/state.js +612 -0
  17. package/pi-extension/dist/cognitive-routing-v2/tools.js +91 -0
  18. package/pi-extension/dist/cognitive-routing-v2/types.js +44 -0
  19. package/pi-extension/dist/freeflow-context/tool.js +5 -0
  20. package/pi-extension/dist/index.js +279 -624
  21. package/pi-extension/dist/runtime/runtime-context.js +63 -13
  22. package/pi-extension/dist/session-sources/events.js +195 -0
  23. package/pi-extension/dist/session-sources/read-only-session.js +148 -0
  24. package/pi-extension/dist/session-sources/sources.js +233 -0
  25. package/pi-extension/dist/settings/settings-ui.js +44 -117
  26. package/pi-extension/src/cognitive-routing-v2/budget.ts +42 -0
  27. package/pi-extension/src/cognitive-routing-v2/config.ts +143 -0
  28. package/pi-extension/src/cognitive-routing-v2/projection.ts +365 -0
  29. package/pi-extension/src/cognitive-routing-v2/render.ts +256 -0
  30. package/pi-extension/src/cognitive-routing-v2/runtime.ts +1634 -0
  31. package/pi-extension/src/cognitive-routing-v2/schemas.ts +109 -0
  32. package/pi-extension/src/cognitive-routing-v2/state.ts +622 -0
  33. package/pi-extension/src/cognitive-routing-v2/tools.ts +93 -0
  34. package/pi-extension/src/cognitive-routing-v2/types.ts +222 -0
  35. package/pi-extension/src/freeflow-context/tool.ts +5 -0
  36. package/pi-extension/src/index.ts +285 -674
  37. package/pi-extension/src/runtime/runtime-context.ts +75 -14
  38. package/pi-extension/src/session-sources/events.ts +208 -0
  39. package/pi-extension/src/session-sources/read-only-session.ts +170 -0
  40. package/pi-extension/src/session-sources/sources.ts +263 -0
  41. package/pi-extension/src/settings/settings-ui.ts +54 -131
  42. package/pi-extension/tests/cognitive-routing-v2/communication.test.js +484 -0
  43. package/pi-extension/tests/cognitive-routing-v2/compaction-input.test.js +183 -0
  44. package/pi-extension/tests/cognitive-routing-v2/native.test.js +441 -0
  45. package/pi-extension/tests/cognitive-routing-v2/performance.test.js +87 -0
  46. package/pi-extension/tests/cognitive-routing-v2/persistence.test.js +245 -0
  47. package/pi-extension/tests/cognitive-routing-v2/projection.test.js +241 -0
  48. package/pi-extension/tests/cognitive-routing-v2/recovery.test.js +236 -0
  49. package/pi-extension/tests/cognitive-routing-v2/render.test.js +230 -0
  50. package/pi-extension/tests/cognitive-routing-v2/runtime.test.js +153 -0
  51. package/pi-extension/tests/cognitive-routing-v2/stabilization.test.js +521 -0
  52. package/pi-extension/tests/cognitive-routing-v2/state.test.js +275 -0
  53. package/pi-extension/tests/context-virtualization/extension.test.js +16 -0
  54. package/pi-extension/tests/fixtures/routing-native.js +188 -0
  55. package/pi-extension/tests/integration/mode-free-core.test.js +3 -2
  56. package/pi-extension/tests/integration/pi-extension.test.js +154 -37
  57. package/pi-extension/tests/integration/prompt-architecture.test.js +87 -6
  58. package/pi-extension/tests/integration/unaffected-regressions.test.js +77 -10
  59. package/plugin.json +1 -1
  60. package/runtime/prompts/cognitive-routing.md +4 -5
  61. package/runtime/prompts/core.md +51 -45
  62. package/runtime/prompts/interaction-contract.md +5 -5
  63. package/skills/action-selection/SKILL.md +57 -97
  64. package/skills/design-for-depth/SKILL.md +58 -193
  65. package/skills/design-for-depth/references/implementation-decisions.md +76 -0
  66. package/skills/diagnose-failure/SKILL.md +64 -196
  67. package/skills/discuss/SKILL.md +64 -123
  68. package/skills/discuss/references/discussion-continuity.md +7 -3
  69. package/skills/execute-work/SKILL.md +69 -88
  70. package/skills/execute-work/references/execute-work-edges.md +9 -3
  71. package/skills/handoff/SKILL.md +44 -54
  72. package/skills/handoff/references/handoff-templates.md +15 -6
  73. package/skills/review-artifact/SKILL.md +80 -127
  74. package/skills/review-artifact/references/independent-artifact-reviewer-contract.md +1 -1
  75. package/skills/review-work/SKILL.md +65 -115
  76. package/skills/review-work/references/independent-work-reviewer-contract.md +1 -1
  77. package/skills/simplify-code/SKILL.md +47 -100
  78. package/skills/track-work/SKILL.md +128 -119
  79. package/skills/track-work/references/working-record-format.md +14 -2
  80. package/skills/verify-work/SKILL.md +58 -62
  81. package/skills/verify-work/references/integration-evidence.md +4 -2
  82. package/skills/verify-work/references/test-design.md +89 -0
  83. package/skills/workflow/SKILL.md +73 -119
  84. package/skills/write-plan/SKILL.md +46 -77
  85. package/skills/write-plan/references/plan-shapes.md +5 -5
  86. package/skills/write-spec/SKILL.md +51 -63
  87. package/skills/write-spec/references/artifact-standards.md +2 -2
  88. package/skills/write-spec/references/decision-records.md +3 -2
  89. package/skills/write-spec/references/spec-shapes.md +15 -0
  90. package/pi-extension/dist/cognitive-routing/commands.js +0 -96
  91. package/pi-extension/dist/cognitive-routing/config.js +0 -232
  92. package/pi-extension/dist/cognitive-routing/controller.js +0 -1292
  93. package/pi-extension/dist/cognitive-routing/history.js +0 -451
  94. package/pi-extension/dist/cognitive-routing/host.js +0 -188
  95. package/pi-extension/dist/cognitive-routing/pi-routing-session.js +0 -414
  96. package/pi-extension/dist/cognitive-routing/pi-session-control.js +0 -320
  97. package/pi-extension/dist/cognitive-routing/runtime.js +0 -43
  98. package/pi-extension/dist/cognitive-routing/tool.js +0 -212
  99. package/pi-extension/dist/cognitive-routing/types.js +0 -6
  100. package/pi-extension/src/cognitive-routing/commands.ts +0 -129
  101. package/pi-extension/src/cognitive-routing/config.ts +0 -303
  102. package/pi-extension/src/cognitive-routing/controller.ts +0 -1628
  103. package/pi-extension/src/cognitive-routing/history.ts +0 -650
  104. package/pi-extension/src/cognitive-routing/host.ts +0 -266
  105. package/pi-extension/src/cognitive-routing/pi-routing-session.ts +0 -538
  106. package/pi-extension/src/cognitive-routing/pi-session-control.ts +0 -444
  107. package/pi-extension/src/cognitive-routing/runtime.ts +0 -57
  108. package/pi-extension/src/cognitive-routing/tool.ts +0 -273
  109. package/pi-extension/src/cognitive-routing/types.ts +0 -89
  110. package/pi-extension/tests/cognitive-routing/commands.test.js +0 -134
  111. package/pi-extension/tests/cognitive-routing/controller.test.js +0 -1128
  112. package/pi-extension/tests/cognitive-routing/extension-lifecycle.test.js +0 -1142
  113. package/pi-extension/tests/cognitive-routing/history.test.js +0 -274
  114. package/pi-extension/tests/cognitive-routing/host-identity.test.js +0 -63
  115. package/pi-extension/tests/cognitive-routing/pi-normal-lifecycle.test.js +0 -434
  116. package/pi-extension/tests/cognitive-routing/pi-session-control.test.js +0 -174
  117. package/pi-extension/tests/cognitive-routing/pi-session-history.test.js +0 -91
  118. package/pi-extension/tests/cognitive-routing/profile-resolution.test.js +0 -279
  119. package/pi-extension/tests/cognitive-routing/tool.test.js +0 -230
  120. package/skills/tdd/SKILL.md +0 -143
  121. package/skills/tdd/references/test-design.md +0 -96
  122. /package/pi-extension/tests/{cognitive-routing/host-fixture.js → fixtures/pi-host.js} +0 -0
@@ -0,0 +1,91 @@
1
+ import { ROUTING_TOOLS } from "./runtime.js";
2
+ import { ROUTING_SCHEMAS, matches, schemaForProfile } from "./schemas.js";
3
+ export { ROUTING_SCHEMAS } from "./schemas.js";
4
+ import { renderRoutingCall, renderRoutingResult } from "./render.js";
5
+ const descriptions = {
6
+ freeflow_delegate:
7
+ "Save a supported assignment contract and request Executor execution. Explicit replace supersedes a quiescent outstanding assignment in the same unit.",
8
+ freeflow_return:
9
+ "Save or revise the actual assignment report, or retry its saved handoff without resubmitting text. Returning does not accept or close the unit.",
10
+ freeflow_unit:
11
+ "Inspect current responsibility, paginated work history, or exact saved contract/report details. Coordinator can also restore a suspended assessment or close a unit without clearing its history.",
12
+ freeflow_project:
13
+ "Inspect current selection and scoped candidates, then add or remove completed exposed Executor sources. #text refs select exact visible assistant text; plain refs retain whole-native meaning. Eligibility and target readiness are distinct.",
14
+ };
15
+ const guidance = {
16
+ freeflow_delegate: [
17
+ "freeflow_delegate is Coordinator-only under Automatic control. Put the contract in the input. Use replace only for explicit same-unit replacement; do not supply IDs.",
18
+ ],
19
+ freeflow_return: [
20
+ "freeflow_return submit saves/revises the actual report; retry completes the saved return without text. Stop ordinary task work after reportSaved. Keep the handoff last; do not batch it with new task tools.",
21
+ ],
22
+ freeflow_unit: [
23
+ "freeflow_unit inspect defaults to current state; view history returns work refs and view detail with ref reads saved contracts/reports. Coordinator assess restores a suspended evidence obligation; close changes work status without clearing communication or completing a Working Record task.",
24
+ ],
25
+ freeflow_project: [
26
+ "freeflow_project inspect shows selection and scoped candidates. Use history scope for earlier exposed evidence. #text refs select exact visible assistant text; plain refs retain whole-native meaning. Select actual result bodies for execution claims, not merely calls. Correct or explicitly withdraw unresolved items with a limitation. Known previously exposed bodies resolve automatically; target-representation gaps are not successful delivery.",
27
+ ],
28
+ };
29
+ const unitDefinitions = new WeakMap();
30
+ export function registerRoutingTools(pi, runtime) {
31
+ for (const name of ROUTING_TOOLS) {
32
+ const definition = {
33
+ name,
34
+ label: name.replace("freeflow_", "Routing "),
35
+ description: descriptions[name],
36
+ parameters: ROUTING_SCHEMAS[name],
37
+ executionMode: "sequential",
38
+ promptGuidelines: guidance[name],
39
+ renderCall: (args, _theme, context) => renderRoutingCall(name, args, context),
40
+ renderResult: (result, options, _theme, context) => renderRoutingResult(result, options, name, context),
41
+ async execute(id, input, signal, _update, ctx) {
42
+ if (!matches(input, ROUTING_SCHEMAS[name]))
43
+ throw new Error("Invalid routing arguments; no operation accepted.");
44
+ return runtime.invoke(name, id, input, signal, ctx);
45
+ },
46
+ };
47
+ pi.registerTool(definition);
48
+ if (name === "freeflow_unit") unitDefinitions.set(pi, { definition });
49
+ }
50
+ }
51
+ export function applyRoutingToolVisibility(pi, runtime, available) {
52
+ if (!pi.getActiveTools || !pi.setActiveTools) return;
53
+ const current = new Set(pi.getActiveTools());
54
+ const state = runtime.state();
55
+ const unit = unitDefinitions.get(pi);
56
+ const coordinator = state.effective && state.controlMode === "automatic" && state.activeProfile === "coordinator";
57
+ const signature = coordinator ? "coordinator" : "inspection";
58
+ if (unit && unit.signature !== signature) {
59
+ pi.registerTool({
60
+ ...unit.definition,
61
+ description: coordinator
62
+ ? unit.definition.description
63
+ : "Inspect current routing responsibility, work history, or exact saved contract/report detail. This profile cannot assess or close units.",
64
+ promptGuidelines: coordinator
65
+ ? unit.definition.promptGuidelines
66
+ : [
67
+ "freeflow_unit inspect reads current state, view history lists work refs, and view detail with ref reads historical communication. Historical content is not current permission.",
68
+ ],
69
+ parameters: schemaForProfile("freeflow_unit", coordinator),
70
+ });
71
+ unit.signature = signature;
72
+ }
73
+ for (const name of ROUTING_TOOLS) {
74
+ const enabled =
75
+ available &&
76
+ (name === "freeflow_unit" ||
77
+ (state.effective &&
78
+ state.controlMode === "automatic" &&
79
+ (name === "freeflow_delegate"
80
+ ? state.activeProfile === "coordinator"
81
+ : state.activeProfile === "executor"))) &&
82
+ (name !== "freeflow_project" || runtime.projectionEnabled);
83
+ if (enabled) current.add(name);
84
+ else current.delete(name);
85
+ }
86
+ // Retired experimental tools must never remain available beside the replacement.
87
+ current.delete("freeflow_switch_profile");
88
+ current.delete("freeflow_cognitive_routing_history");
89
+ const next = [...current];
90
+ if (JSON.stringify(next) !== JSON.stringify(pi.getActiveTools())) pi.setActiveTools(next);
91
+ }
@@ -0,0 +1,44 @@
1
+ export const ROUTING_ENTRY = "freeflow-routing-v2";
2
+ export const ROUTING_MESSAGE = "freeflow-routing-v2-state";
3
+ export const PROFILES = ["coordinator", "executor"];
4
+ export const EFFORTS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
5
+ export class RoutingError extends Error {
6
+ code;
7
+ problems;
8
+ constructor(code, message, problems = []) {
9
+ super(message);
10
+ this.code = code;
11
+ this.problems = problems;
12
+ this.name = "RoutingError";
13
+ }
14
+ }
15
+ export function fail(code, message) {
16
+ throw new RoutingError(code, message);
17
+ }
18
+ export function requireCondition(condition, code, message = code) {
19
+ if (!condition) fail(code, message);
20
+ }
21
+ export function isObject(value) {
22
+ return !!value && typeof value === "object" && !Array.isArray(value);
23
+ }
24
+ export function canonical(value) {
25
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
26
+ if (isObject(value))
27
+ return `{${Object.keys(value)
28
+ .filter((k) => value[k] !== undefined)
29
+ .sort()
30
+ .map((k) => `${JSON.stringify(k)}:${canonical(value[k])}`)
31
+ .join(",")}}`;
32
+ return JSON.stringify(value) ?? "null";
33
+ }
34
+ export function samePair(left, right) {
35
+ return !!left && !!right && canonical(left) === canonical(right);
36
+ }
37
+ export const eventKey = (event) => JSON.stringify([event.operationId, event.data.type, event.stepId]);
38
+ export const eventValue = (event) =>
39
+ canonical({ version: event.version, operationId: event.operationId, stepId: event.stepId, data: event.data });
40
+ export const emptySelection = () => ({ revision: 0, selected: [], unresolved: [], withdrawals: [] });
41
+ export const refFor = (id) => `ctx:${id}`;
42
+ export function idFor(ref) {
43
+ return /^ctx:([^\s:#]+)(?:#text)?$/.exec(ref)?.[1];
44
+ }
@@ -93,6 +93,11 @@ function contextParameters(features) {
93
93
  operationSchema(CONVERSATION_HISTORY_RETRIEVE_PROPERTIES, ["operation", "refs"]),
94
94
  );
95
95
  }
96
+ if (oneOf.length === 0) {
97
+ // Codex rejects an empty oneOf even when the tool is inactive. Keep the
98
+ // placeholder schema valid until capability-specific operations are enabled.
99
+ return { type: "object", additionalProperties: false, properties: {} };
100
+ }
96
101
  return { type: "object", oneOf };
97
102
  }
98
103
  function resultText(result) {