jfl 0.9.6 → 0.9.8

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 (212) hide show
  1. package/dist/commands/agents.js +1 -1
  2. package/dist/commands/agents.js.map +1 -1
  3. package/dist/commands/context-hub.d.ts.map +1 -1
  4. package/dist/commands/context-hub.js +77 -18
  5. package/dist/commands/context-hub.js.map +1 -1
  6. package/dist/commands/deploy.js +1 -1
  7. package/dist/commands/deploy.js.map +1 -1
  8. package/dist/commands/feedback.js +1 -1
  9. package/dist/commands/feedback.js.map +1 -1
  10. package/dist/commands/hud.js +1 -1
  11. package/dist/commands/hud.js.map +1 -1
  12. package/dist/commands/init-from-service.js +1 -1
  13. package/dist/commands/init-from-service.js.map +1 -1
  14. package/dist/commands/init.js +1 -1
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/kanban.js +6 -6
  17. package/dist/commands/kanban.js.map +1 -1
  18. package/dist/commands/login.d.ts +2 -13
  19. package/dist/commands/login.d.ts.map +1 -1
  20. package/dist/commands/login.js +6 -44
  21. package/dist/commands/login.js.map +1 -1
  22. package/dist/commands/organize.d.ts +16 -0
  23. package/dist/commands/organize.d.ts.map +1 -0
  24. package/dist/commands/organize.js +334 -0
  25. package/dist/commands/organize.js.map +1 -0
  26. package/dist/commands/peter.d.ts.map +1 -1
  27. package/dist/commands/peter.js +273 -0
  28. package/dist/commands/peter.js.map +1 -1
  29. package/dist/commands/pi.d.ts.map +1 -1
  30. package/dist/commands/pi.js +11 -5
  31. package/dist/commands/pi.js.map +1 -1
  32. package/dist/commands/repair.js +1 -1
  33. package/dist/commands/repair.js.map +1 -1
  34. package/dist/commands/setup.d.ts.map +1 -1
  35. package/dist/commands/setup.js +113 -45
  36. package/dist/commands/setup.js.map +1 -1
  37. package/dist/commands/status.d.ts.map +1 -1
  38. package/dist/commands/status.js +4 -4
  39. package/dist/commands/status.js.map +1 -1
  40. package/dist/commands/update.d.ts.map +1 -1
  41. package/dist/commands/update.js +66 -0
  42. package/dist/commands/update.js.map +1 -1
  43. package/dist/index.d.ts +0 -6
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +60 -19
  46. package/dist/index.js.map +1 -1
  47. package/dist/lib/agent-config.d.ts.map +1 -1
  48. package/dist/lib/agent-config.js +24 -2
  49. package/dist/lib/agent-config.js.map +1 -1
  50. package/dist/lib/hub-health.d.ts.map +1 -1
  51. package/dist/lib/hub-health.js +14 -2
  52. package/dist/lib/hub-health.js.map +1 -1
  53. package/dist/lib/resource-optimizer-middleware.d.ts.map +1 -1
  54. package/dist/lib/resource-optimizer-middleware.js +8 -2
  55. package/dist/lib/resource-optimizer-middleware.js.map +1 -1
  56. package/dist/lib/telemetry.d.ts.map +1 -1
  57. package/dist/lib/telemetry.js +13 -12
  58. package/dist/lib/telemetry.js.map +1 -1
  59. package/dist/utils/auth-status.d.ts +21 -0
  60. package/dist/utils/auth-status.d.ts.map +1 -0
  61. package/dist/utils/auth-status.js +53 -0
  62. package/dist/utils/auth-status.js.map +1 -0
  63. package/package.json +3 -2
  64. package/packages/pi/dist/agent-grid.d.ts +24 -0
  65. package/packages/pi/dist/agent-grid.d.ts.map +1 -0
  66. package/packages/pi/dist/agent-grid.js +162 -0
  67. package/packages/pi/dist/agent-grid.js.map +1 -0
  68. package/packages/pi/dist/agent-names.d.ts +43 -0
  69. package/packages/pi/dist/agent-names.d.ts.map +1 -0
  70. package/packages/pi/dist/agent-names.js +156 -0
  71. package/packages/pi/dist/agent-names.js.map +1 -0
  72. package/packages/pi/dist/autoresearch.d.ts +15 -0
  73. package/packages/pi/dist/autoresearch.d.ts.map +1 -0
  74. package/packages/pi/dist/autoresearch.js +372 -0
  75. package/packages/pi/dist/autoresearch.js.map +1 -0
  76. package/packages/pi/dist/bookmarks.d.ts +15 -0
  77. package/packages/pi/dist/bookmarks.d.ts.map +1 -0
  78. package/packages/pi/dist/bookmarks.js +77 -0
  79. package/packages/pi/dist/bookmarks.js.map +1 -0
  80. package/packages/pi/dist/context.d.ts +17 -0
  81. package/packages/pi/dist/context.d.ts.map +1 -0
  82. package/packages/pi/dist/context.js +152 -0
  83. package/packages/pi/dist/context.js.map +1 -0
  84. package/packages/pi/dist/crm-tool.d.ts +12 -0
  85. package/packages/pi/dist/crm-tool.d.ts.map +1 -0
  86. package/packages/pi/dist/crm-tool.js +58 -0
  87. package/packages/pi/dist/crm-tool.js.map +1 -0
  88. package/packages/pi/dist/eval-tool.d.ts +11 -0
  89. package/packages/pi/dist/eval-tool.d.ts.map +1 -0
  90. package/packages/pi/dist/eval-tool.js +188 -0
  91. package/packages/pi/dist/eval-tool.js.map +1 -0
  92. package/packages/pi/dist/eval.d.ts +12 -0
  93. package/packages/pi/dist/eval.d.ts.map +1 -0
  94. package/packages/pi/dist/eval.js +43 -0
  95. package/packages/pi/dist/eval.js.map +1 -0
  96. package/packages/pi/dist/footer.d.ts +20 -0
  97. package/packages/pi/dist/footer.d.ts.map +1 -0
  98. package/packages/pi/dist/footer.js +222 -0
  99. package/packages/pi/dist/footer.js.map +1 -0
  100. package/packages/pi/dist/header.d.ts +17 -0
  101. package/packages/pi/dist/header.d.ts.map +1 -0
  102. package/packages/pi/dist/header.js +156 -0
  103. package/packages/pi/dist/header.js.map +1 -0
  104. package/packages/pi/dist/hub-resolver.d.ts +11 -0
  105. package/packages/pi/dist/hub-resolver.d.ts.map +1 -0
  106. package/packages/pi/dist/hub-resolver.js +58 -0
  107. package/packages/pi/dist/hub-resolver.js.map +1 -0
  108. package/packages/pi/dist/hub-tools.d.ts +14 -0
  109. package/packages/pi/dist/hub-tools.d.ts.map +1 -0
  110. package/packages/pi/dist/hub-tools.js +266 -0
  111. package/packages/pi/dist/hub-tools.js.map +1 -0
  112. package/packages/pi/dist/hud-tool.d.ts +17 -0
  113. package/packages/pi/dist/hud-tool.d.ts.map +1 -0
  114. package/packages/pi/dist/hud-tool.js +297 -0
  115. package/packages/pi/dist/hud-tool.js.map +1 -0
  116. package/packages/pi/dist/index.d.ts +12 -0
  117. package/packages/pi/dist/index.d.ts.map +1 -0
  118. package/packages/pi/dist/index.js +436 -0
  119. package/packages/pi/dist/index.js.map +1 -0
  120. package/packages/pi/dist/jfl-resolve.d.ts +29 -0
  121. package/packages/pi/dist/jfl-resolve.d.ts.map +1 -0
  122. package/packages/pi/dist/jfl-resolve.js +89 -0
  123. package/packages/pi/dist/jfl-resolve.js.map +1 -0
  124. package/packages/pi/dist/journal.d.ts +23 -0
  125. package/packages/pi/dist/journal.d.ts.map +1 -0
  126. package/packages/pi/dist/journal.js +250 -0
  127. package/packages/pi/dist/journal.js.map +1 -0
  128. package/packages/pi/dist/map-bridge.d.ts +20 -0
  129. package/packages/pi/dist/map-bridge.d.ts.map +1 -0
  130. package/packages/pi/dist/map-bridge.js +181 -0
  131. package/packages/pi/dist/map-bridge.js.map +1 -0
  132. package/packages/pi/dist/memory-tool.d.ts +11 -0
  133. package/packages/pi/dist/memory-tool.d.ts.map +1 -0
  134. package/packages/pi/dist/memory-tool.js +148 -0
  135. package/packages/pi/dist/memory-tool.js.map +1 -0
  136. package/packages/pi/dist/notifications.d.ts +15 -0
  137. package/packages/pi/dist/notifications.d.ts.map +1 -0
  138. package/packages/pi/dist/notifications.js +65 -0
  139. package/packages/pi/dist/notifications.js.map +1 -0
  140. package/packages/pi/dist/onboarding-v1.d.ts +15 -0
  141. package/packages/pi/dist/onboarding-v1.d.ts.map +1 -0
  142. package/packages/pi/dist/onboarding-v1.js +417 -0
  143. package/packages/pi/dist/onboarding-v1.js.map +1 -0
  144. package/packages/pi/dist/onboarding-v2.d.ts +18 -0
  145. package/packages/pi/dist/onboarding-v2.d.ts.map +1 -0
  146. package/packages/pi/dist/onboarding-v2.js +402 -0
  147. package/packages/pi/dist/onboarding-v2.js.map +1 -0
  148. package/packages/pi/dist/onboarding-v3.d.ts +13 -0
  149. package/packages/pi/dist/onboarding-v3.d.ts.map +1 -0
  150. package/packages/pi/dist/onboarding-v3.js +581 -0
  151. package/packages/pi/dist/onboarding-v3.js.map +1 -0
  152. package/packages/pi/dist/peter-parker.d.ts +12 -0
  153. package/packages/pi/dist/peter-parker.d.ts.map +1 -0
  154. package/packages/pi/dist/peter-parker.js +162 -0
  155. package/packages/pi/dist/peter-parker.js.map +1 -0
  156. package/packages/pi/dist/pivot-tool.d.ts +11 -0
  157. package/packages/pi/dist/pivot-tool.d.ts.map +1 -0
  158. package/packages/pi/dist/pivot-tool.js +56 -0
  159. package/packages/pi/dist/pivot-tool.js.map +1 -0
  160. package/packages/pi/dist/policy-head-tool.d.ts +15 -0
  161. package/packages/pi/dist/policy-head-tool.d.ts.map +1 -0
  162. package/packages/pi/dist/policy-head-tool.js +220 -0
  163. package/packages/pi/dist/policy-head-tool.js.map +1 -0
  164. package/packages/pi/dist/portfolio-bridge.d.ts +12 -0
  165. package/packages/pi/dist/portfolio-bridge.d.ts.map +1 -0
  166. package/packages/pi/dist/portfolio-bridge.js +81 -0
  167. package/packages/pi/dist/portfolio-bridge.js.map +1 -0
  168. package/packages/pi/dist/service-skills.d.ts +15 -0
  169. package/packages/pi/dist/service-skills.d.ts.map +1 -0
  170. package/packages/pi/dist/service-skills.js +198 -0
  171. package/packages/pi/dist/service-skills.js.map +1 -0
  172. package/packages/pi/dist/session.d.ts +24 -0
  173. package/packages/pi/dist/session.d.ts.map +1 -0
  174. package/packages/pi/dist/session.js +394 -0
  175. package/packages/pi/dist/session.js.map +1 -0
  176. package/packages/pi/dist/shortcuts.d.ts +11 -0
  177. package/packages/pi/dist/shortcuts.d.ts.map +1 -0
  178. package/packages/pi/dist/shortcuts.js +231 -0
  179. package/packages/pi/dist/shortcuts.js.map +1 -0
  180. package/packages/pi/dist/startup-briefing.d.ts +13 -0
  181. package/packages/pi/dist/startup-briefing.d.ts.map +1 -0
  182. package/packages/pi/dist/startup-briefing.js +271 -0
  183. package/packages/pi/dist/startup-briefing.js.map +1 -0
  184. package/packages/pi/dist/stratus-bridge.d.ts +14 -0
  185. package/packages/pi/dist/stratus-bridge.d.ts.map +1 -0
  186. package/packages/pi/dist/stratus-bridge.js +104 -0
  187. package/packages/pi/dist/stratus-bridge.js.map +1 -0
  188. package/packages/pi/dist/subway-mesh.d.ts +88 -0
  189. package/packages/pi/dist/subway-mesh.d.ts.map +1 -0
  190. package/packages/pi/dist/subway-mesh.js +813 -0
  191. package/packages/pi/dist/subway-mesh.js.map +1 -0
  192. package/packages/pi/dist/synopsis-tool.d.ts +12 -0
  193. package/packages/pi/dist/synopsis-tool.d.ts.map +1 -0
  194. package/packages/pi/dist/synopsis-tool.js +84 -0
  195. package/packages/pi/dist/synopsis-tool.js.map +1 -0
  196. package/packages/pi/dist/tool-renderers.d.ts +55 -0
  197. package/packages/pi/dist/tool-renderers.d.ts.map +1 -0
  198. package/packages/pi/dist/tool-renderers.js +349 -0
  199. package/packages/pi/dist/tool-renderers.js.map +1 -0
  200. package/packages/pi/dist/training-buffer-tool.d.ts +16 -0
  201. package/packages/pi/dist/training-buffer-tool.d.ts.map +1 -0
  202. package/packages/pi/dist/training-buffer-tool.js +319 -0
  203. package/packages/pi/dist/training-buffer-tool.js.map +1 -0
  204. package/packages/pi/dist/types.d.ts +195 -0
  205. package/packages/pi/dist/types.d.ts.map +1 -0
  206. package/packages/pi/dist/types.js +11 -0
  207. package/packages/pi/dist/types.js.map +1 -0
  208. package/packages/pi/extensions/session.ts +115 -8
  209. package/packages/pi/extensions/training-buffer-tool.ts +15 -8
  210. package/packages/pi/extensions/types.ts +1 -0
  211. package/packages/pi/package.json +2 -3
  212. package/scripts/postinstall.js +52 -4
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Custom Footer Extension
3
+ *
4
+ * Rich status footer showing project name, branch, turn count, session
5
+ * duration, model, pipeline deals, active agents, and eval score.
6
+ * Reactive to branch changes and turn updates.
7
+ *
8
+ * Layout: ◆ project [branch] │ T3 2m │ model │ 3 deals │ ✓ 0.89
9
+ *
10
+ * @purpose Custom footer with live project telemetry
11
+ */
12
+ import type { PiContext, JflConfig } from "./types.js";
13
+ interface FooterState {
14
+ turnCount: () => number;
15
+ sessionStart: () => number;
16
+ model: () => string;
17
+ }
18
+ export declare function setupFooter(ctx: PiContext, config: JflConfig, footerState: FooterState): void;
19
+ export {};
20
+ //# sourceMappingURL=footer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../extensions/footer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAW,SAAS,EAAE,MAAM,YAAY,CAAA;AAE/D,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,MAAM,CAAA;IAC1B,KAAK,EAAE,MAAM,MAAM,CAAA;CACpB;AA8FD,wBAAgB,WAAW,CACzB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,WAAW,GACvB,IAAI,CAkGN"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Custom Footer Extension
3
+ *
4
+ * Rich status footer showing project name, branch, turn count, session
5
+ * duration, model, pipeline deals, active agents, and eval score.
6
+ * Reactive to branch changes and turn updates.
7
+ *
8
+ * Layout: ◆ project [branch] │ T3 2m │ model │ 3 deals │ ✓ 0.89
9
+ *
10
+ * @purpose Custom footer with live project telemetry
11
+ */
12
+ import { existsSync, readFileSync, readdirSync } from "fs";
13
+ import { join } from "path";
14
+ import { execSync } from "child_process";
15
+ let projectRoot = "";
16
+ let projectName = "";
17
+ let projectType = "";
18
+ let state;
19
+ let cachedPipelineCount = null;
20
+ let pipelineCacheTime = 0;
21
+ let cachedEvalScore = null;
22
+ let evalCacheTime = 0;
23
+ function formatDuration(ms) {
24
+ const s = Math.floor(ms / 1000);
25
+ if (s < 60)
26
+ return `${s}s`;
27
+ const m = Math.floor(s / 60);
28
+ if (m < 60)
29
+ return `${m}m`;
30
+ const h = Math.floor(m / 60);
31
+ const rm = m % 60;
32
+ return `${h}h${rm > 0 ? `${rm}m` : ""}`;
33
+ }
34
+ function getPipelineCount() {
35
+ const now = Date.now();
36
+ if (cachedPipelineCount !== null && now - pipelineCacheTime < 60000)
37
+ return cachedPipelineCount;
38
+ try {
39
+ const output = execSync("./crm list --compact 2>/dev/null | wc -l", {
40
+ cwd: projectRoot,
41
+ timeout: 3000,
42
+ encoding: "utf-8",
43
+ }).trim();
44
+ cachedPipelineCount = parseInt(output, 10) || 0;
45
+ pipelineCacheTime = now;
46
+ return cachedPipelineCount;
47
+ }
48
+ catch {
49
+ return cachedPipelineCount;
50
+ }
51
+ }
52
+ function getActiveAgentCount() {
53
+ try {
54
+ const journalDir = join(projectRoot, ".jfl", "journal");
55
+ if (!existsSync(journalDir))
56
+ return 0;
57
+ const files = readdirSync(journalDir).filter(f => f.startsWith("session-") && f.endsWith(".jsonl"));
58
+ const now = Date.now();
59
+ let active = 0;
60
+ for (const f of files) {
61
+ try {
62
+ const stat = require("fs").statSync(join(journalDir, f));
63
+ if (now - stat.mtimeMs < 300000)
64
+ active++;
65
+ }
66
+ catch { }
67
+ }
68
+ return active;
69
+ }
70
+ catch {
71
+ return 0;
72
+ }
73
+ }
74
+ function getEvalScore() {
75
+ const now = Date.now();
76
+ if (cachedEvalScore !== null && now - evalCacheTime < 30000)
77
+ return cachedEvalScore;
78
+ try {
79
+ const evalPath = join(projectRoot, ".jfl", "eval-store.jsonl");
80
+ if (!existsSync(evalPath))
81
+ return null;
82
+ const lines = readFileSync(evalPath, "utf-8").trim().split("\n").filter(Boolean);
83
+ if (lines.length === 0)
84
+ return null;
85
+ const last = JSON.parse(lines[lines.length - 1]);
86
+ if (last.composite !== undefined) {
87
+ cachedEvalScore = last.composite.toFixed(2);
88
+ evalCacheTime = now;
89
+ return cachedEvalScore;
90
+ }
91
+ return null;
92
+ }
93
+ catch {
94
+ return cachedEvalScore;
95
+ }
96
+ }
97
+ function getJournalCount() {
98
+ try {
99
+ const journalDir = join(projectRoot, ".jfl", "journal");
100
+ if (!existsSync(journalDir))
101
+ return 0;
102
+ let count = 0;
103
+ for (const f of readdirSync(journalDir).filter(f => f.endsWith(".jsonl"))) {
104
+ const content = readFileSync(join(journalDir, f), "utf-8").trim();
105
+ count += content.split("\n").filter(Boolean).length;
106
+ }
107
+ return count;
108
+ }
109
+ catch {
110
+ return 0;
111
+ }
112
+ }
113
+ export function setupFooter(ctx, config, footerState) {
114
+ projectRoot = ctx.session.projectRoot;
115
+ state = footerState;
116
+ const configPath = join(projectRoot, ".jfl", "config.json");
117
+ if (existsSync(configPath)) {
118
+ try {
119
+ const cfg = JSON.parse(readFileSync(configPath, "utf-8"));
120
+ projectName = cfg.name ?? projectRoot.split("/").pop() ?? "JFL";
121
+ projectType = cfg.type ?? "gtm";
122
+ }
123
+ catch {
124
+ projectName = projectRoot.split("/").pop() ?? "JFL";
125
+ projectType = "gtm";
126
+ }
127
+ }
128
+ else {
129
+ projectName = projectRoot.split("/").pop() ?? "JFL";
130
+ projectType = "gtm";
131
+ }
132
+ if (config.pi?.disable_footer)
133
+ return;
134
+ ctx.ui.setFooter((tui, theme, footerData) => {
135
+ let disposed = false;
136
+ const unsub = footerData?.onBranchChange?.(() => {
137
+ if (!disposed)
138
+ tui.requestRender();
139
+ });
140
+ return {
141
+ dispose: () => {
142
+ disposed = true;
143
+ if (typeof unsub === "function")
144
+ unsub();
145
+ },
146
+ invalidate() { },
147
+ render(width) {
148
+ const turns = state.turnCount();
149
+ const elapsed = formatDuration(Date.now() - state.sessionStart());
150
+ const model = state.model();
151
+ const branch = footerData?.getGitBranch?.() ?? ctx.session.branch;
152
+ // ─── Left side: project identity + session info ───────────────
153
+ const bullet = theme.fg("accent", "◆");
154
+ const name = theme.fg("text", projectName);
155
+ const branchStr = theme.fg("muted", `[${branch}]`);
156
+ const turnStr = theme.fg("dim", `T${turns}`);
157
+ const timeStr = theme.fg("dim", elapsed);
158
+ const modelStr = model ? theme.fg("muted", model.split("/").pop() ?? model) : "";
159
+ const leftParts = [
160
+ `${bullet} ${name} ${branchStr}`,
161
+ `${turnStr} ${timeStr}`,
162
+ modelStr,
163
+ ].filter(Boolean);
164
+ const left = leftParts.join(theme.fg("dim", " │ "));
165
+ // ─── Right side: pipeline + agents + eval ─────────────────────
166
+ const rightParts = [];
167
+ const pipeline = getPipelineCount();
168
+ if (pipeline !== null && pipeline > 0) {
169
+ rightParts.push(theme.fg("accent", `${pipeline} deal${pipeline !== 1 ? "s" : ""}`));
170
+ }
171
+ const agents = getActiveAgentCount();
172
+ if (agents > 0) {
173
+ rightParts.push(theme.fg("warning", `${agents} agent${agents !== 1 ? "s" : ""}`));
174
+ }
175
+ const journals = getJournalCount();
176
+ if (journals > 0) {
177
+ rightParts.push(theme.fg("dim", `${journals}j`));
178
+ }
179
+ const evalScore = getEvalScore();
180
+ if (evalScore) {
181
+ const score = parseFloat(evalScore);
182
+ const color = score >= 0.8 ? "success" : score >= 0.5 ? "warning" : "error";
183
+ rightParts.push(theme.fg(color, `✓${evalScore}`));
184
+ }
185
+ const right = rightParts.join(theme.fg("dim", " │ "));
186
+ // ─── Compose line ─────────────────────────────────────────────
187
+ const leftLen = stripAnsi(left).length;
188
+ const rightLen = stripAnsi(right).length;
189
+ const gap = Math.max(1, width - leftLen - rightLen);
190
+ const line = left + " ".repeat(gap) + right;
191
+ return [truncateVisible(line, width)];
192
+ },
193
+ };
194
+ });
195
+ ctx.on("turn:start", () => {
196
+ // Footer auto-rerenders via requestRender when data changes
197
+ });
198
+ }
199
+ function stripAnsi(str) {
200
+ return str.replace(/\x1b\[[0-9;]*m/g, "");
201
+ }
202
+ function truncateVisible(str, maxWidth) {
203
+ const visible = stripAnsi(str);
204
+ if (visible.length <= maxWidth)
205
+ return str;
206
+ // Rough truncation — find where visible chars exceed width
207
+ let visCount = 0;
208
+ let i = 0;
209
+ while (i < str.length && visCount < maxWidth - 1) {
210
+ if (str[i] === "\x1b") {
211
+ const end = str.indexOf("m", i);
212
+ if (end !== -1) {
213
+ i = end + 1;
214
+ continue;
215
+ }
216
+ }
217
+ visCount++;
218
+ i++;
219
+ }
220
+ return str.slice(0, i) + "…";
221
+ }
222
+ //# sourceMappingURL=footer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footer.js","sourceRoot":"","sources":["../extensions/footer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * TENET Header
3
+ *
4
+ * Replaces Pi's default startup header (logo + keybinding hints) with a
5
+ * branded TENET identity line. Shows project name, branch, and key system
6
+ * indicators in a single compact row. This owns "above the fold" —
7
+ * everything the user sees before any messages.
8
+ *
9
+ * @purpose Branded header replacing Pi's default — owns above-the-fold identity
10
+ */
11
+ import type { PiContext, JflConfig } from "./types.js";
12
+ export declare function refreshHeaderData(root: string, config: JflConfig): void;
13
+ export declare function setHeaderHubStatus(online: boolean): void;
14
+ export declare function setHeaderAutoCommit(running: boolean): void;
15
+ export declare function setHeaderBranch(b: string): void;
16
+ export declare function setupHeader(ctx: PiContext, config: JflConfig): void;
17
+ //# sourceMappingURL=header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../extensions/header.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAW,SAAS,EAAE,MAAM,YAAY,CAAA;AA6D/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAQvE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAExD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE1D;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAE/C;AA6DD,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAenE"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * TENET Header
3
+ *
4
+ * Replaces Pi's default startup header (logo + keybinding hints) with a
5
+ * branded TENET identity line. Shows project name, branch, and key system
6
+ * indicators in a single compact row. This owns "above the fold" —
7
+ * everything the user sees before any messages.
8
+ *
9
+ * @purpose Branded header replacing Pi's default — owns above-the-fold identity
10
+ */
11
+ import { existsSync, readFileSync, readdirSync } from "fs";
12
+ import { join } from "path";
13
+ // ─── Cached state ────────────────────────────────────────────────────────────
14
+ let projectRoot = "";
15
+ let projectName = "";
16
+ let branch = "";
17
+ let journalCount = 0;
18
+ let tupleCount = 0;
19
+ let sessionCount = 0;
20
+ let hubOnline = false;
21
+ let autoCommitRunning = false;
22
+ let evalScore = null;
23
+ // ─── Data helpers ────────────────────────────────────────────────────────────
24
+ function countJournals(root) {
25
+ const dir = join(root, ".jfl", "journal");
26
+ if (!existsSync(dir))
27
+ return { entries: 0, sessions: 0 };
28
+ try {
29
+ const files = readdirSync(dir).filter(f => f.endsWith(".jsonl"));
30
+ let entries = 0;
31
+ for (const f of files) {
32
+ entries += readFileSync(join(dir, f), "utf-8").trim().split("\n").filter(Boolean).length;
33
+ }
34
+ return { entries, sessions: files.length };
35
+ }
36
+ catch {
37
+ return { entries: 0, sessions: 0 };
38
+ }
39
+ }
40
+ function countTuples(root) {
41
+ const p = join(root, ".jfl", "training-buffer.jsonl");
42
+ if (!existsSync(p))
43
+ return 0;
44
+ try {
45
+ return readFileSync(p, "utf-8").trim().split("\n").filter(Boolean).length;
46
+ }
47
+ catch {
48
+ return 0;
49
+ }
50
+ }
51
+ function getLatestEval(root) {
52
+ try {
53
+ const p = join(root, ".jfl", "eval.jsonl");
54
+ if (!existsSync(p))
55
+ return null;
56
+ const lines = readFileSync(p, "utf-8").trim().split("\n").filter(Boolean);
57
+ for (let i = lines.length - 1; i >= Math.max(0, lines.length - 20); i--) {
58
+ try {
59
+ const e = JSON.parse(lines[i]);
60
+ const s = e.composite ?? e.score;
61
+ if (s != null)
62
+ return Number(s).toFixed(2);
63
+ }
64
+ catch { }
65
+ }
66
+ return null;
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ }
72
+ // ─── Refresh on-demand (called from onboarding probes or session_start) ──────
73
+ export function refreshHeaderData(root, config) {
74
+ projectRoot = root;
75
+ projectName = config.name ?? root.split("/").pop() ?? "TENET";
76
+ const { entries, sessions } = countJournals(root);
77
+ journalCount = entries;
78
+ sessionCount = sessions;
79
+ tupleCount = countTuples(root);
80
+ evalScore = getLatestEval(root);
81
+ }
82
+ export function setHeaderHubStatus(online) {
83
+ hubOnline = online;
84
+ }
85
+ export function setHeaderAutoCommit(running) {
86
+ autoCommitRunning = running;
87
+ }
88
+ export function setHeaderBranch(b) {
89
+ branch = b;
90
+ }
91
+ // ─── ANSI helpers ────────────────────────────────────────────────────────────
92
+ function visLen(s) {
93
+ return s.replace(/\x1b\[[0-9;]*m/g, "").length;
94
+ }
95
+ function truncAnsi(s, max) {
96
+ let vis = 0;
97
+ let i = 0;
98
+ while (i < s.length && vis < max) {
99
+ if (s[i] === "\x1b") {
100
+ const end = s.indexOf("m", i);
101
+ if (end !== -1) {
102
+ i = end + 1;
103
+ continue;
104
+ }
105
+ }
106
+ vis++;
107
+ i++;
108
+ }
109
+ return vis >= max ? s.slice(0, i) : s;
110
+ }
111
+ // ─── Render ──────────────────────────────────────────────────────────────────
112
+ function renderHeader(width, theme) {
113
+ // Line 1: ◆ TENET · project-name · branch
114
+ const diamond = theme.fg("warning", "◆");
115
+ const brand = theme.bold(theme.fg("accent", "TENET"));
116
+ const name = theme.fg("text", projectName);
117
+ const branchStr = theme.fg("muted", branch || "main");
118
+ // Line 2: compact system indicators
119
+ const hubIcon = hubOnline
120
+ ? theme.fg("success", "✓") + theme.fg("dim", " Hub")
121
+ : theme.fg("error", "✗") + theme.fg("dim", " Hub");
122
+ const acIcon = autoCommitRunning
123
+ ? theme.fg("success", "✓") + theme.fg("dim", " Auto-commit")
124
+ : theme.fg("dim", "– Auto-commit");
125
+ const parts = [hubIcon, acIcon];
126
+ if (journalCount > 0) {
127
+ parts.push(theme.fg("dim", `${journalCount} entries · ${sessionCount} sessions`));
128
+ }
129
+ if (tupleCount > 0) {
130
+ parts.push(theme.fg("dim", `${tupleCount} tuples`));
131
+ }
132
+ if (evalScore) {
133
+ parts.push(theme.fg("warning", evalScore) + theme.fg("dim", " eval"));
134
+ }
135
+ const sep = theme.fg("dim", " · ");
136
+ const line1 = truncAnsi(` ${diamond} ${brand}${sep}${name}${sep}${branchStr}`, width);
137
+ const line2 = truncAnsi(` ${parts.join(theme.fg("dim", " │ "))}`, width);
138
+ return [line1, line2];
139
+ }
140
+ // ─── Setup ───────────────────────────────────────────────────────────────────
141
+ export function setupHeader(ctx, config) {
142
+ if (!ctx.ui.hasUI)
143
+ return;
144
+ projectRoot = ctx.session.projectRoot;
145
+ branch = ctx.session.branch;
146
+ refreshHeaderData(projectRoot, config);
147
+ // Use the raw Pi setHeader API (available on latestPiCtx.ui)
148
+ // We access it through the shim's setHeader if available
149
+ ctx.ui.setHeader?.((tui, theme) => ({
150
+ render(width) {
151
+ return renderHeader(width, theme);
152
+ },
153
+ invalidate() { },
154
+ }));
155
+ }
156
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.js","sourceRoot":"","sources":["../extensions/header.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Hub Resolver
3
+ *
4
+ * Resolves the active Context Hub URL for a project using runtime artifacts,
5
+ * persisted config, MCP config, and deterministic per-project fallback.
6
+ *
7
+ * @purpose Shared Context Hub URL/token resolution for Pi extensions
8
+ */
9
+ export declare function readToken(root: string): string | null;
10
+ export declare function readHubUrl(root: string): string;
11
+ //# sourceMappingURL=hub-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub-resolver.d.ts","sourceRoot":"","sources":["../extensions/hub-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA2BH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMrD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoB/C"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Hub Resolver
3
+ *
4
+ * Resolves the active Context Hub URL for a project using runtime artifacts,
5
+ * persisted config, MCP config, and deterministic per-project fallback.
6
+ *
7
+ * @purpose Shared Context Hub URL/token resolution for Pi extensions
8
+ */
9
+ import { existsSync, readFileSync } from "fs";
10
+ import { join, resolve } from "path";
11
+ const PORT_MIN = 4200;
12
+ const PORT_MAX = 4999;
13
+ const PORT_RANGE = PORT_MAX - PORT_MIN + 1;
14
+ function computePortFromPath(projectPath) {
15
+ const normalized = resolve(projectPath);
16
+ let hash = 5381;
17
+ for (let i = 0; i < normalized.length; i++) {
18
+ hash = ((hash << 5) + hash + normalized.charCodeAt(i)) >>> 0;
19
+ }
20
+ return PORT_MIN + (hash % PORT_RANGE);
21
+ }
22
+ function readJson(filePath) {
23
+ if (!existsSync(filePath))
24
+ return null;
25
+ try {
26
+ return JSON.parse(readFileSync(filePath, "utf-8"));
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ export function readToken(root) {
33
+ const tokenPath = join(root, ".jfl", "context-hub.token");
34
+ if (existsSync(tokenPath)) {
35
+ return readFileSync(tokenPath, "utf-8").trim() || null;
36
+ }
37
+ return null;
38
+ }
39
+ export function readHubUrl(root) {
40
+ const portFile = join(root, ".jfl", "context-hub.port");
41
+ if (existsSync(portFile)) {
42
+ const port = readFileSync(portFile, "utf-8").trim();
43
+ if (port)
44
+ return `http://localhost:${port}`;
45
+ }
46
+ const projectConfig = readJson(join(root, ".jfl", "config.json"));
47
+ const configuredPort = projectConfig?.contextHub?.port;
48
+ if (configuredPort) {
49
+ return `http://localhost:${configuredPort}`;
50
+ }
51
+ const mcpConfig = readJson(join(root, ".mcp.json"));
52
+ const mcpUrl = mcpConfig?.mcpServers?.["jfl-context"]?.env?.CONTEXT_HUB_URL;
53
+ if (typeof mcpUrl === "string" && mcpUrl.trim()) {
54
+ return mcpUrl.trim();
55
+ }
56
+ return `http://localhost:${computePortFromPath(root)}`;
57
+ }
58
+ //# sourceMappingURL=hub-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub-resolver.js","sourceRoot":"","sources":["../extensions/hub-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEpC,MAAM,QAAQ,GAAG,IAAI,CAAA;AACrB,MAAM,QAAQ,GAAG,IAAI,CAAA;AACrB,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAA;AAE1C,SAAS,mBAAmB,CAAC,WAAmB;IAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACvC,IAAI,IAAI,GAAG,IAAI,CAAA;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IAC9D,CAAC;IACD,OAAO,QAAQ,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,CAAA;AACvC,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB;IAChC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAA;IACtC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAA;IACzD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAA;IACxD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAA;IACvD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;QACnD,IAAI,IAAI;YAAE,OAAO,oBAAoB,IAAI,EAAE,CAAA;IAC7C,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAA;IACjE,MAAM,cAAc,GAAG,aAAa,EAAE,UAAU,EAAE,IAAI,CAAA;IACtD,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,oBAAoB,cAAc,EAAE,CAAA;IAC7C,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAA;IACnD,MAAM,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,eAAe,CAAA;IAC3E,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC;IAED,OAAO,oBAAoB,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAA;AACxD,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Hub Tools Extension
3
+ *
4
+ * Registers tools for direct Context Hub interaction that were previously
5
+ * only available via MCP: events_publish, events_recent, context_status,
6
+ * context_sessions, query_experiment_history.
7
+ *
8
+ * Closes the parity gap between Claude Code (MCP) and Pi (extensions).
9
+ *
10
+ * @purpose Hub API tools — events, status, sessions, experiments (MCP parity)
11
+ */
12
+ import type { PiContext, JflConfig } from "./types.js";
13
+ export declare function setupHubTools(ctx: PiContext, _config: JflConfig): Promise<void>;
14
+ //# sourceMappingURL=hub-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub-tools.d.ts","sourceRoot":"","sources":["../extensions/hub-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAoCtD,wBAAsB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA0NrF"}