jfl 0.9.6 → 0.9.7
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.
- package/dist/commands/agents.js +1 -1
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/context-hub.d.ts.map +1 -1
- package/dist/commands/context-hub.js +77 -18
- package/dist/commands/context-hub.js.map +1 -1
- package/dist/commands/deploy.js +1 -1
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/feedback.js +1 -1
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/hud.js +1 -1
- package/dist/commands/hud.js.map +1 -1
- package/dist/commands/init-from-service.js +1 -1
- package/dist/commands/init-from-service.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +2 -13
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +6 -44
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/organize.d.ts +16 -0
- package/dist/commands/organize.d.ts.map +1 -0
- package/dist/commands/organize.js +334 -0
- package/dist/commands/organize.js.map +1 -0
- package/dist/commands/peter.d.ts.map +1 -1
- package/dist/commands/peter.js +273 -0
- package/dist/commands/peter.js.map +1 -1
- package/dist/commands/pi.d.ts.map +1 -1
- package/dist/commands/pi.js +8 -2
- package/dist/commands/pi.js.map +1 -1
- package/dist/commands/repair.js +1 -1
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +113 -45
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +4 -4
- package/dist/commands/status.js.map +1 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +60 -19
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-config.d.ts.map +1 -1
- package/dist/lib/agent-config.js +24 -2
- package/dist/lib/agent-config.js.map +1 -1
- package/dist/lib/hub-health.d.ts.map +1 -1
- package/dist/lib/hub-health.js +14 -2
- package/dist/lib/hub-health.js.map +1 -1
- package/dist/lib/resource-optimizer-middleware.d.ts.map +1 -1
- package/dist/lib/resource-optimizer-middleware.js +8 -2
- package/dist/lib/resource-optimizer-middleware.js.map +1 -1
- package/dist/lib/telemetry.d.ts.map +1 -1
- package/dist/lib/telemetry.js +13 -12
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/utils/auth-status.d.ts +21 -0
- package/dist/utils/auth-status.d.ts.map +1 -0
- package/dist/utils/auth-status.js +53 -0
- package/dist/utils/auth-status.js.map +1 -0
- package/package.json +3 -2
- package/packages/pi/dist/agent-grid.d.ts +24 -0
- package/packages/pi/dist/agent-grid.d.ts.map +1 -0
- package/packages/pi/dist/agent-grid.js +162 -0
- package/packages/pi/dist/agent-grid.js.map +1 -0
- package/packages/pi/dist/agent-names.d.ts +43 -0
- package/packages/pi/dist/agent-names.d.ts.map +1 -0
- package/packages/pi/dist/agent-names.js +156 -0
- package/packages/pi/dist/agent-names.js.map +1 -0
- package/packages/pi/dist/autoresearch.d.ts +15 -0
- package/packages/pi/dist/autoresearch.d.ts.map +1 -0
- package/packages/pi/dist/autoresearch.js +372 -0
- package/packages/pi/dist/autoresearch.js.map +1 -0
- package/packages/pi/dist/bookmarks.d.ts +15 -0
- package/packages/pi/dist/bookmarks.d.ts.map +1 -0
- package/packages/pi/dist/bookmarks.js +77 -0
- package/packages/pi/dist/bookmarks.js.map +1 -0
- package/packages/pi/dist/context.d.ts +17 -0
- package/packages/pi/dist/context.d.ts.map +1 -0
- package/packages/pi/dist/context.js +152 -0
- package/packages/pi/dist/context.js.map +1 -0
- package/packages/pi/dist/crm-tool.d.ts +12 -0
- package/packages/pi/dist/crm-tool.d.ts.map +1 -0
- package/packages/pi/dist/crm-tool.js +58 -0
- package/packages/pi/dist/crm-tool.js.map +1 -0
- package/packages/pi/dist/eval-tool.d.ts +11 -0
- package/packages/pi/dist/eval-tool.d.ts.map +1 -0
- package/packages/pi/dist/eval-tool.js +188 -0
- package/packages/pi/dist/eval-tool.js.map +1 -0
- package/packages/pi/dist/eval.d.ts +12 -0
- package/packages/pi/dist/eval.d.ts.map +1 -0
- package/packages/pi/dist/eval.js +43 -0
- package/packages/pi/dist/eval.js.map +1 -0
- package/packages/pi/dist/footer.d.ts +20 -0
- package/packages/pi/dist/footer.d.ts.map +1 -0
- package/packages/pi/dist/footer.js +222 -0
- package/packages/pi/dist/footer.js.map +1 -0
- package/packages/pi/dist/header.d.ts +17 -0
- package/packages/pi/dist/header.d.ts.map +1 -0
- package/packages/pi/dist/header.js +156 -0
- package/packages/pi/dist/header.js.map +1 -0
- package/packages/pi/dist/hub-resolver.d.ts +11 -0
- package/packages/pi/dist/hub-resolver.d.ts.map +1 -0
- package/packages/pi/dist/hub-resolver.js +58 -0
- package/packages/pi/dist/hub-resolver.js.map +1 -0
- package/packages/pi/dist/hub-tools.d.ts +14 -0
- package/packages/pi/dist/hub-tools.d.ts.map +1 -0
- package/packages/pi/dist/hub-tools.js +266 -0
- package/packages/pi/dist/hub-tools.js.map +1 -0
- package/packages/pi/dist/hud-tool.d.ts +17 -0
- package/packages/pi/dist/hud-tool.d.ts.map +1 -0
- package/packages/pi/dist/hud-tool.js +297 -0
- package/packages/pi/dist/hud-tool.js.map +1 -0
- package/packages/pi/dist/index.d.ts +12 -0
- package/packages/pi/dist/index.d.ts.map +1 -0
- package/packages/pi/dist/index.js +436 -0
- package/packages/pi/dist/index.js.map +1 -0
- package/packages/pi/dist/jfl-resolve.d.ts +29 -0
- package/packages/pi/dist/jfl-resolve.d.ts.map +1 -0
- package/packages/pi/dist/jfl-resolve.js +89 -0
- package/packages/pi/dist/jfl-resolve.js.map +1 -0
- package/packages/pi/dist/journal.d.ts +23 -0
- package/packages/pi/dist/journal.d.ts.map +1 -0
- package/packages/pi/dist/journal.js +250 -0
- package/packages/pi/dist/journal.js.map +1 -0
- package/packages/pi/dist/map-bridge.d.ts +20 -0
- package/packages/pi/dist/map-bridge.d.ts.map +1 -0
- package/packages/pi/dist/map-bridge.js +181 -0
- package/packages/pi/dist/map-bridge.js.map +1 -0
- package/packages/pi/dist/memory-tool.d.ts +11 -0
- package/packages/pi/dist/memory-tool.d.ts.map +1 -0
- package/packages/pi/dist/memory-tool.js +148 -0
- package/packages/pi/dist/memory-tool.js.map +1 -0
- package/packages/pi/dist/notifications.d.ts +15 -0
- package/packages/pi/dist/notifications.d.ts.map +1 -0
- package/packages/pi/dist/notifications.js +65 -0
- package/packages/pi/dist/notifications.js.map +1 -0
- package/packages/pi/dist/onboarding-v1.d.ts +15 -0
- package/packages/pi/dist/onboarding-v1.d.ts.map +1 -0
- package/packages/pi/dist/onboarding-v1.js +417 -0
- package/packages/pi/dist/onboarding-v1.js.map +1 -0
- package/packages/pi/dist/onboarding-v2.d.ts +18 -0
- package/packages/pi/dist/onboarding-v2.d.ts.map +1 -0
- package/packages/pi/dist/onboarding-v2.js +402 -0
- package/packages/pi/dist/onboarding-v2.js.map +1 -0
- package/packages/pi/dist/onboarding-v3.d.ts +13 -0
- package/packages/pi/dist/onboarding-v3.d.ts.map +1 -0
- package/packages/pi/dist/onboarding-v3.js +581 -0
- package/packages/pi/dist/onboarding-v3.js.map +1 -0
- package/packages/pi/dist/peter-parker.d.ts +12 -0
- package/packages/pi/dist/peter-parker.d.ts.map +1 -0
- package/packages/pi/dist/peter-parker.js +162 -0
- package/packages/pi/dist/peter-parker.js.map +1 -0
- package/packages/pi/dist/pivot-tool.d.ts +11 -0
- package/packages/pi/dist/pivot-tool.d.ts.map +1 -0
- package/packages/pi/dist/pivot-tool.js +56 -0
- package/packages/pi/dist/pivot-tool.js.map +1 -0
- package/packages/pi/dist/policy-head-tool.d.ts +15 -0
- package/packages/pi/dist/policy-head-tool.d.ts.map +1 -0
- package/packages/pi/dist/policy-head-tool.js +220 -0
- package/packages/pi/dist/policy-head-tool.js.map +1 -0
- package/packages/pi/dist/portfolio-bridge.d.ts +12 -0
- package/packages/pi/dist/portfolio-bridge.d.ts.map +1 -0
- package/packages/pi/dist/portfolio-bridge.js +81 -0
- package/packages/pi/dist/portfolio-bridge.js.map +1 -0
- package/packages/pi/dist/service-skills.d.ts +15 -0
- package/packages/pi/dist/service-skills.d.ts.map +1 -0
- package/packages/pi/dist/service-skills.js +198 -0
- package/packages/pi/dist/service-skills.js.map +1 -0
- package/packages/pi/dist/session.d.ts +24 -0
- package/packages/pi/dist/session.d.ts.map +1 -0
- package/packages/pi/dist/session.js +394 -0
- package/packages/pi/dist/session.js.map +1 -0
- package/packages/pi/dist/shortcuts.d.ts +11 -0
- package/packages/pi/dist/shortcuts.d.ts.map +1 -0
- package/packages/pi/dist/shortcuts.js +231 -0
- package/packages/pi/dist/shortcuts.js.map +1 -0
- package/packages/pi/dist/startup-briefing.d.ts +13 -0
- package/packages/pi/dist/startup-briefing.d.ts.map +1 -0
- package/packages/pi/dist/startup-briefing.js +271 -0
- package/packages/pi/dist/startup-briefing.js.map +1 -0
- package/packages/pi/dist/stratus-bridge.d.ts +14 -0
- package/packages/pi/dist/stratus-bridge.d.ts.map +1 -0
- package/packages/pi/dist/stratus-bridge.js +104 -0
- package/packages/pi/dist/stratus-bridge.js.map +1 -0
- package/packages/pi/dist/subway-mesh.d.ts +88 -0
- package/packages/pi/dist/subway-mesh.d.ts.map +1 -0
- package/packages/pi/dist/subway-mesh.js +813 -0
- package/packages/pi/dist/subway-mesh.js.map +1 -0
- package/packages/pi/dist/synopsis-tool.d.ts +12 -0
- package/packages/pi/dist/synopsis-tool.d.ts.map +1 -0
- package/packages/pi/dist/synopsis-tool.js +84 -0
- package/packages/pi/dist/synopsis-tool.js.map +1 -0
- package/packages/pi/dist/tool-renderers.d.ts +55 -0
- package/packages/pi/dist/tool-renderers.d.ts.map +1 -0
- package/packages/pi/dist/tool-renderers.js +349 -0
- package/packages/pi/dist/tool-renderers.js.map +1 -0
- package/packages/pi/dist/training-buffer-tool.d.ts +16 -0
- package/packages/pi/dist/training-buffer-tool.d.ts.map +1 -0
- package/packages/pi/dist/training-buffer-tool.js +319 -0
- package/packages/pi/dist/training-buffer-tool.js.map +1 -0
- package/packages/pi/dist/types.d.ts +195 -0
- package/packages/pi/dist/types.d.ts.map +1 -0
- package/packages/pi/dist/types.js +11 -0
- package/packages/pi/dist/types.js.map +1 -0
- package/packages/pi/extensions/session.ts +115 -8
- package/packages/pi/extensions/training-buffer-tool.ts +15 -8
- package/packages/pi/extensions/types.ts +1 -0
- package/packages/pi/package.json +2 -3
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Extension
|
|
3
|
+
*
|
|
4
|
+
* Ensures Context Hub is running and registers the jfl_context tool.
|
|
5
|
+
* On first turn, injects a small amount of recent journal context so
|
|
6
|
+
* the model's greeting is contextual. The model reads CLAUDE.md itself
|
|
7
|
+
* via AGENTS.md instructions — no 45K system prompt injection needed.
|
|
8
|
+
*
|
|
9
|
+
* @purpose Context Hub startup + jfl_context tool registration
|
|
10
|
+
*/
|
|
11
|
+
import { execSync } from "child_process";
|
|
12
|
+
import { contextRenderCall, contextRenderResult } from "./tool-renderers.js";
|
|
13
|
+
import { readHubUrl, readToken } from "./hub-resolver.js";
|
|
14
|
+
let hubBaseUrl = "http://localhost:4242";
|
|
15
|
+
let hubToken = null;
|
|
16
|
+
let projectRoot = "";
|
|
17
|
+
let promptInjected = false;
|
|
18
|
+
export function resetPromptInjected() {
|
|
19
|
+
promptInjected = false;
|
|
20
|
+
}
|
|
21
|
+
function refreshHubUrl() {
|
|
22
|
+
hubBaseUrl = readHubUrl(projectRoot);
|
|
23
|
+
hubToken = readToken(projectRoot);
|
|
24
|
+
}
|
|
25
|
+
async function fetchContext(query, limit = 10) {
|
|
26
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
27
|
+
try {
|
|
28
|
+
const body = { maxItems: limit };
|
|
29
|
+
if (query)
|
|
30
|
+
body.query = query;
|
|
31
|
+
const resp = await fetch(`${hubBaseUrl}/api/context`, {
|
|
32
|
+
method: "POST",
|
|
33
|
+
headers: {
|
|
34
|
+
"Content-Type": "application/json",
|
|
35
|
+
...(hubToken ? { Authorization: `Bearer ${hubToken}` } : {}),
|
|
36
|
+
},
|
|
37
|
+
body: JSON.stringify(body),
|
|
38
|
+
signal: AbortSignal.timeout(5000),
|
|
39
|
+
});
|
|
40
|
+
if (!resp.ok) {
|
|
41
|
+
if (attempt === 0) {
|
|
42
|
+
refreshHubUrl();
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
return "";
|
|
46
|
+
}
|
|
47
|
+
const data = await resp.json();
|
|
48
|
+
if (!data.items?.length)
|
|
49
|
+
return "";
|
|
50
|
+
return data.items
|
|
51
|
+
.map((item) => {
|
|
52
|
+
const prefix = item.source ? `[${item.source}] ` : "";
|
|
53
|
+
return `${prefix}${item.content}`;
|
|
54
|
+
})
|
|
55
|
+
.join("\n\n");
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
if (attempt === 0) {
|
|
59
|
+
refreshHubUrl();
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
return "";
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return "";
|
|
66
|
+
}
|
|
67
|
+
export async function setupContext(ctx, _config) {
|
|
68
|
+
const root = ctx.session.projectRoot;
|
|
69
|
+
projectRoot = root;
|
|
70
|
+
promptInjected = false; // reset on each new session
|
|
71
|
+
// Start Context Hub
|
|
72
|
+
try {
|
|
73
|
+
execSync("jfl context-hub ensure", { cwd: root, stdio: "pipe", timeout: 15000 });
|
|
74
|
+
ctx.log("Context Hub ensured", "debug");
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
78
|
+
ctx.log(`Context Hub ensure failed: ${msg}`, "debug");
|
|
79
|
+
}
|
|
80
|
+
// Read the port hub wrote
|
|
81
|
+
hubBaseUrl = readHubUrl(root);
|
|
82
|
+
hubToken = readToken(root);
|
|
83
|
+
ctx.log(`Context Hub URL: ${hubBaseUrl}`, "debug");
|
|
84
|
+
// Wait for hub to actually accept connections (startDaemon only waits 800ms —
|
|
85
|
+
// not enough for the HTTP server to bind. Without this, session/init races and
|
|
86
|
+
// falls back to ctx.session.branch = "main".)
|
|
87
|
+
for (let i = 0; i < 20; i++) {
|
|
88
|
+
try {
|
|
89
|
+
const resp = await fetch(`${hubBaseUrl}/health`, { signal: AbortSignal.timeout(500) });
|
|
90
|
+
if (resp.ok) {
|
|
91
|
+
ctx.log("Context Hub ready", "debug");
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch { }
|
|
96
|
+
await new Promise(resolve => setTimeout(resolve, 300));
|
|
97
|
+
}
|
|
98
|
+
ctx.registerTool({
|
|
99
|
+
name: "jfl_context",
|
|
100
|
+
description: "Get unified project context: journal entries, knowledge docs, code headers. Use at session start and when you need project state. Equivalent to MCP context_get.",
|
|
101
|
+
promptSnippet: "Get project context: journals, knowledge, code — use at session start",
|
|
102
|
+
promptGuidelines: [
|
|
103
|
+
"Call this tool at the start of every session to understand project state",
|
|
104
|
+
"Use taskType to prioritize context for your current task",
|
|
105
|
+
"Call without query to get general project overview",
|
|
106
|
+
],
|
|
107
|
+
inputSchema: {
|
|
108
|
+
type: "object",
|
|
109
|
+
properties: {
|
|
110
|
+
query: {
|
|
111
|
+
type: "string",
|
|
112
|
+
description: "Optional search query to filter results",
|
|
113
|
+
},
|
|
114
|
+
taskType: {
|
|
115
|
+
type: "string",
|
|
116
|
+
description: "Type of task for context prioritization",
|
|
117
|
+
enum: ["code", "spec", "content", "strategy", "general"],
|
|
118
|
+
},
|
|
119
|
+
limit: {
|
|
120
|
+
type: "number",
|
|
121
|
+
description: "Maximum number of results to return (default: 30)",
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
async handler(input) {
|
|
126
|
+
const { query, limit } = input;
|
|
127
|
+
const result = await fetchContext(query, limit ?? 30);
|
|
128
|
+
return result || "No relevant context found.";
|
|
129
|
+
},
|
|
130
|
+
renderCall: contextRenderCall,
|
|
131
|
+
renderResult: contextRenderResult,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
export async function injectContext(_ctx, _event) {
|
|
135
|
+
// Only on first turn — inject recent journal context so greeting is contextual.
|
|
136
|
+
// The model reads CLAUDE.md itself (AGENTS.md tells it to). No 45K dump needed.
|
|
137
|
+
if (promptInjected)
|
|
138
|
+
return;
|
|
139
|
+
promptInjected = true;
|
|
140
|
+
const context = await fetchContext(undefined, 10);
|
|
141
|
+
if (!context)
|
|
142
|
+
return;
|
|
143
|
+
return {
|
|
144
|
+
systemPromptAddition: [
|
|
145
|
+
"## JFL Project Context",
|
|
146
|
+
"(Recent journal entries and project knowledge)",
|
|
147
|
+
"",
|
|
148
|
+
context,
|
|
149
|
+
].join("\n"),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../extensions/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRM Tool Extension
|
|
3
|
+
*
|
|
4
|
+
* Registers jfl_crm tool with custom TUI rendering.
|
|
5
|
+
* Delegates to ./crm CLI (Google Sheets backed).
|
|
6
|
+
* Renders pipeline data with color-coded deal stages.
|
|
7
|
+
*
|
|
8
|
+
* @purpose jfl_crm tool — themed CRM display with deal status colors
|
|
9
|
+
*/
|
|
10
|
+
import type { PiContext } from "./types.js";
|
|
11
|
+
export declare function setupCrmTool(ctx: PiContext): void;
|
|
12
|
+
//# sourceMappingURL=crm-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crm-tool.d.ts","sourceRoot":"","sources":["../extensions/crm-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAK3C,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CA4CjD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRM Tool Extension
|
|
3
|
+
*
|
|
4
|
+
* Registers jfl_crm tool with custom TUI rendering.
|
|
5
|
+
* Delegates to ./crm CLI (Google Sheets backed).
|
|
6
|
+
* Renders pipeline data with color-coded deal stages.
|
|
7
|
+
*
|
|
8
|
+
* @purpose jfl_crm tool — themed CRM display with deal status colors
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from "child_process";
|
|
11
|
+
import { crmRenderCall, crmRenderResult } from "./tool-renderers.js";
|
|
12
|
+
let projectRoot = "";
|
|
13
|
+
export function setupCrmTool(ctx) {
|
|
14
|
+
projectRoot = ctx.session.projectRoot;
|
|
15
|
+
ctx.registerTool({
|
|
16
|
+
name: "jfl_crm",
|
|
17
|
+
description: "Query or update the JFL CRM (contacts, deals, pipeline). Delegates to ./crm CLI backed by Google Sheets.",
|
|
18
|
+
promptSnippet: "Query CRM pipeline, contacts, and deals via Google Sheets",
|
|
19
|
+
inputSchema: {
|
|
20
|
+
type: "object",
|
|
21
|
+
properties: {
|
|
22
|
+
command: {
|
|
23
|
+
type: "string",
|
|
24
|
+
description: "CRM subcommand: list, prep, stale, priority, touch, update, add",
|
|
25
|
+
},
|
|
26
|
+
args: {
|
|
27
|
+
type: "string",
|
|
28
|
+
description: "Arguments for the subcommand (e.g., contact name, field, value)",
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
required: ["command"],
|
|
32
|
+
},
|
|
33
|
+
async handler(input) {
|
|
34
|
+
const { command, args } = input;
|
|
35
|
+
const fullCmd = args ? `./crm ${command} ${args}` : `./crm ${command}`;
|
|
36
|
+
try {
|
|
37
|
+
const output = execSync(fullCmd, {
|
|
38
|
+
cwd: projectRoot,
|
|
39
|
+
timeout: 15000,
|
|
40
|
+
encoding: "utf-8",
|
|
41
|
+
});
|
|
42
|
+
return output.trim();
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
const error = err;
|
|
46
|
+
if (error.stderr) {
|
|
47
|
+
const stderr = error.stderr.toString().trim();
|
|
48
|
+
if (stderr)
|
|
49
|
+
return `Error: ${stderr}`;
|
|
50
|
+
}
|
|
51
|
+
return `Error running crm: ${error.message ?? String(err)}`;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
renderCall: crmRenderCall,
|
|
55
|
+
renderResult: crmRenderResult,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=crm-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crm-tool.js","sourceRoot":"","sources":["../extensions/crm-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAEpE,IAAI,WAAW,GAAG,EAAE,CAAA;AAEpB,MAAM,UAAU,YAAY,CAAC,GAAc;IACzC,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAA;IAErC,GAAG,CAAC,YAAY,CAAC;QACf,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,0GAA0G;QACvH,aAAa,EAAE,2DAA2D;QAC1E,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iEAAiE;iBAC/E;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iEAAiE;iBAC/E;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;QACD,KAAK,CAAC,OAAO,CAAC,KAAK;YACjB,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAA2C,CAAA;YACrE,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAA;YAEtE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE;oBAC/B,GAAG,EAAE,WAAW;oBAChB,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAA;gBACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;YACtB,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,GAA4C,CAAA;gBAC1D,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;oBAC7C,IAAI,MAAM;wBAAE,OAAO,UAAU,MAAM,EAAE,CAAA;gBACvC,CAAC;gBACD,OAAO,sBAAsB,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;YAC7D,CAAC;QACH,CAAC;QACD,UAAU,EAAE,aAAa;QACzB,YAAY,EAAE,eAAe;KAC9B,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eval Tool
|
|
3
|
+
*
|
|
4
|
+
* Exposes eval scoring and history to the agent. The agent can check
|
|
5
|
+
* project quality, view eval trends, and trigger eval runs.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Pi tool for eval system — check scores, view trends, trigger evals
|
|
8
|
+
*/
|
|
9
|
+
import type { PiContext, JflConfig } from "./types.js";
|
|
10
|
+
export declare function setupEvalTool(ctx: PiContext, _config: JflConfig): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=eval-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-tool.d.ts","sourceRoot":"","sources":["../extensions/eval-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAyCtD,wBAAsB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA2KrF"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eval Tool
|
|
3
|
+
*
|
|
4
|
+
* Exposes eval scoring and history to the agent. The agent can check
|
|
5
|
+
* project quality, view eval trends, and trigger eval runs.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Pi tool for eval system — check scores, view trends, trigger evals
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync } from "fs";
|
|
10
|
+
import { join } from "path";
|
|
11
|
+
let projectRoot = "";
|
|
12
|
+
function readEvals() {
|
|
13
|
+
const evalPath = join(projectRoot, ".jfl", "eval", "eval.jsonl");
|
|
14
|
+
if (!existsSync(evalPath))
|
|
15
|
+
return [];
|
|
16
|
+
const entries = [];
|
|
17
|
+
for (const line of readFileSync(evalPath, "utf-8").split("\n")) {
|
|
18
|
+
if (!line.trim())
|
|
19
|
+
continue;
|
|
20
|
+
try {
|
|
21
|
+
entries.push(JSON.parse(line));
|
|
22
|
+
}
|
|
23
|
+
catch { }
|
|
24
|
+
}
|
|
25
|
+
return entries.sort((a, b) => (a.ts || "").localeCompare(b.ts || ""));
|
|
26
|
+
}
|
|
27
|
+
function readServiceEvents() {
|
|
28
|
+
const eventsPath = join(projectRoot, ".jfl", "service-events.jsonl");
|
|
29
|
+
if (!existsSync(eventsPath))
|
|
30
|
+
return [];
|
|
31
|
+
const entries = [];
|
|
32
|
+
for (const line of readFileSync(eventsPath, "utf-8").split("\n")) {
|
|
33
|
+
if (!line.trim())
|
|
34
|
+
continue;
|
|
35
|
+
try {
|
|
36
|
+
entries.push(JSON.parse(line));
|
|
37
|
+
}
|
|
38
|
+
catch { }
|
|
39
|
+
}
|
|
40
|
+
return entries;
|
|
41
|
+
}
|
|
42
|
+
export async function setupEvalTool(ctx, _config) {
|
|
43
|
+
projectRoot = ctx.session.projectRoot;
|
|
44
|
+
ctx.registerTool({
|
|
45
|
+
name: "jfl_eval_status",
|
|
46
|
+
description: "Get current eval status — latest scores, trends, and quality metrics. Use to understand project health before making changes.",
|
|
47
|
+
inputSchema: {
|
|
48
|
+
type: "object",
|
|
49
|
+
properties: {
|
|
50
|
+
limit: {
|
|
51
|
+
type: "string",
|
|
52
|
+
description: "Number of recent eval entries to show (default: 5)",
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
async handler(input) {
|
|
57
|
+
const { limit: limitStr } = input;
|
|
58
|
+
const limit = parseInt(limitStr || "5", 10);
|
|
59
|
+
const evals = readEvals();
|
|
60
|
+
if (evals.length === 0) {
|
|
61
|
+
return "No eval history found. Run `jfl eval` or push a PR to trigger CI eval.";
|
|
62
|
+
}
|
|
63
|
+
const recent = evals.slice(-limit);
|
|
64
|
+
const latest = recent[recent.length - 1];
|
|
65
|
+
const lines = [
|
|
66
|
+
`Eval History: ${evals.length} total entries`,
|
|
67
|
+
"",
|
|
68
|
+
`Latest composite: ${latest.composite.toFixed(4)}`,
|
|
69
|
+
`Latest agent: ${latest.agent}`,
|
|
70
|
+
`Latest time: ${latest.ts}`,
|
|
71
|
+
];
|
|
72
|
+
if (latest.metrics) {
|
|
73
|
+
lines.push("", "Dimensions:");
|
|
74
|
+
for (const [key, val] of Object.entries(latest.metrics)) {
|
|
75
|
+
if (typeof val === "number") {
|
|
76
|
+
lines.push(` ${key}: ${val.toFixed(4)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (recent.length > 1) {
|
|
81
|
+
lines.push("", "Trend (recent):");
|
|
82
|
+
for (const e of recent) {
|
|
83
|
+
const delta = e.delta ?? 0;
|
|
84
|
+
const sign = delta >= 0 ? "+" : "";
|
|
85
|
+
const improved = e.improved ? "✓" : "✗";
|
|
86
|
+
lines.push(` ${e.ts.slice(0, 16)} ${e.composite.toFixed(4)} (${sign}${delta.toFixed(4)}) ${improved} [${e.agent}]`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const deltas = evals.slice(-10).map(e => e.delta ?? 0);
|
|
90
|
+
const avgDelta = deltas.length > 0 ? deltas.reduce((a, b) => a + b, 0) / deltas.length : 0;
|
|
91
|
+
const improving = deltas.filter(d => d > 0).length;
|
|
92
|
+
lines.push("", `10-run trend: avg delta ${avgDelta >= 0 ? "+" : ""}${avgDelta.toFixed(4)}, ${improving}/${deltas.length} improved`);
|
|
93
|
+
return lines.join("\n");
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
ctx.registerTool({
|
|
97
|
+
name: "jfl_eval_compare",
|
|
98
|
+
description: "Compare two eval snapshots by index (0 = oldest, -1 = latest). Useful for understanding what changed between versions.",
|
|
99
|
+
inputSchema: {
|
|
100
|
+
type: "object",
|
|
101
|
+
properties: {
|
|
102
|
+
a: {
|
|
103
|
+
type: "string",
|
|
104
|
+
description: "Index of first snapshot (default: -2, second-to-last)",
|
|
105
|
+
},
|
|
106
|
+
b: {
|
|
107
|
+
type: "string",
|
|
108
|
+
description: "Index of second snapshot (default: -1, latest)",
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
async handler(input) {
|
|
113
|
+
const { a: aStr, b: bStr } = input;
|
|
114
|
+
const evals = readEvals();
|
|
115
|
+
if (evals.length < 2) {
|
|
116
|
+
return "Need at least 2 eval entries to compare.";
|
|
117
|
+
}
|
|
118
|
+
const idxA = parseInt(aStr || "-2", 10);
|
|
119
|
+
const idxB = parseInt(bStr || "-1", 10);
|
|
120
|
+
const resolveIdx = (idx) => idx < 0 ? evals.length + idx : idx;
|
|
121
|
+
const evalA = evals[resolveIdx(idxA)];
|
|
122
|
+
const evalB = evals[resolveIdx(idxB)];
|
|
123
|
+
if (!evalA || !evalB) {
|
|
124
|
+
return `Invalid indices. Have ${evals.length} entries (0 to ${evals.length - 1}).`;
|
|
125
|
+
}
|
|
126
|
+
const lines = [
|
|
127
|
+
"Eval Comparison",
|
|
128
|
+
"",
|
|
129
|
+
`A: ${evalA.ts.slice(0, 16)} (composite: ${evalA.composite.toFixed(4)}) [${evalA.agent}]`,
|
|
130
|
+
`B: ${evalB.ts.slice(0, 16)} (composite: ${evalB.composite.toFixed(4)}) [${evalB.agent}]`,
|
|
131
|
+
"",
|
|
132
|
+
`Composite delta: ${(evalB.composite - evalA.composite) >= 0 ? "+" : ""}${(evalB.composite - evalA.composite).toFixed(4)}`,
|
|
133
|
+
"",
|
|
134
|
+
"Dimension changes:",
|
|
135
|
+
];
|
|
136
|
+
const allKeys = new Set([
|
|
137
|
+
...Object.keys(evalA.metrics || {}),
|
|
138
|
+
...Object.keys(evalB.metrics || {}),
|
|
139
|
+
]);
|
|
140
|
+
for (const key of allKeys) {
|
|
141
|
+
const valA = evalA.metrics?.[key] ?? 0;
|
|
142
|
+
const valB = evalB.metrics?.[key] ?? 0;
|
|
143
|
+
if (typeof valA !== "number" || typeof valB !== "number")
|
|
144
|
+
continue;
|
|
145
|
+
const diff = valB - valA;
|
|
146
|
+
const sign = diff >= 0 ? "+" : "";
|
|
147
|
+
const arrow = diff > 0.001 ? "↑" : diff < -0.001 ? "↓" : "=";
|
|
148
|
+
lines.push(` ${arrow} ${key}: ${valA.toFixed(4)} → ${valB.toFixed(4)} (${sign}${diff.toFixed(4)})`);
|
|
149
|
+
}
|
|
150
|
+
return lines.join("\n");
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
ctx.registerCommand({
|
|
154
|
+
name: "eval",
|
|
155
|
+
description: "Show eval status and recent scores",
|
|
156
|
+
async handler(_args, ctx) {
|
|
157
|
+
const evals = readEvals();
|
|
158
|
+
if (evals.length === 0) {
|
|
159
|
+
ctx.ui.notify("No eval history. Push a PR or run jfl eval.", { level: "info" });
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const latest = evals[evals.length - 1];
|
|
163
|
+
const recent = evals.slice(-5);
|
|
164
|
+
const lines = [
|
|
165
|
+
`Eval: ${evals.length} entries | Latest: ${latest.composite.toFixed(4)}`,
|
|
166
|
+
"",
|
|
167
|
+
];
|
|
168
|
+
for (const e of recent) {
|
|
169
|
+
const delta = e.delta ?? 0;
|
|
170
|
+
const sign = delta >= 0 ? "+" : "";
|
|
171
|
+
lines.push(` ${e.ts.slice(0, 10)} ${e.composite.toFixed(4)} (${sign}${delta.toFixed(4)}) [${e.agent}]`);
|
|
172
|
+
}
|
|
173
|
+
const serviceEvents = readServiceEvents();
|
|
174
|
+
const recentPRs = serviceEvents
|
|
175
|
+
.filter(e => e.type === "eval:scored")
|
|
176
|
+
.slice(-3);
|
|
177
|
+
if (recentPRs.length > 0) {
|
|
178
|
+
lines.push("", "Recent PR evals:");
|
|
179
|
+
for (const e of recentPRs) {
|
|
180
|
+
const d = e.data || {};
|
|
181
|
+
lines.push(` PR #${d.pr_number || "?"}: ${d.composite?.toFixed(4) || "?"} (delta: ${d.delta?.toFixed(4) || "?"})`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
ctx.ui.notify(lines.join("\n"), { level: "info" });
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=eval-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-tool.js","sourceRoot":"","sources":["../extensions/eval-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eval Extension
|
|
3
|
+
*
|
|
4
|
+
* Captures agent turn metrics and writes eval entries via eval-store.ts.
|
|
5
|
+
* Emits eval:submitted to MAP bus after each captured turn.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Capture per-turn eval data and emit to MAP bus
|
|
8
|
+
*/
|
|
9
|
+
import type { PiContext, JflConfig, AgentEndEvent } from "./types.js";
|
|
10
|
+
export declare function setupEval(ctx: PiContext, _config: JflConfig): Promise<void>;
|
|
11
|
+
export declare function onAgentEnd(ctx: PiContext, event: AgentEndEvent): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=eval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../extensions/eval.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAmBrE,wBAAsB,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjF;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BpF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eval Extension
|
|
3
|
+
*
|
|
4
|
+
* Captures agent turn metrics and writes eval entries via eval-store.ts.
|
|
5
|
+
* Emits eval:submitted to MAP bus after each captured turn.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Capture per-turn eval data and emit to MAP bus
|
|
8
|
+
*/
|
|
9
|
+
import { randomUUID } from "crypto";
|
|
10
|
+
import { jflImport } from "./jfl-resolve.js";
|
|
11
|
+
import { emitCustomEvent } from "./map-bridge.js";
|
|
12
|
+
let projectRoot = "";
|
|
13
|
+
export async function setupEval(ctx, _config) {
|
|
14
|
+
projectRoot = ctx.session.projectRoot;
|
|
15
|
+
}
|
|
16
|
+
export async function onAgentEnd(ctx, event) {
|
|
17
|
+
// Pi's AgentEndEvent has messages array; use length as turn count
|
|
18
|
+
const turnCount = event.messages?.length ?? event.turnCount ?? 0;
|
|
19
|
+
if (turnCount < 1)
|
|
20
|
+
return;
|
|
21
|
+
const entry = {
|
|
22
|
+
id: randomUUID(),
|
|
23
|
+
session_id: ctx.session.id,
|
|
24
|
+
ts: new Date().toISOString(),
|
|
25
|
+
model: event.model,
|
|
26
|
+
turn_count: turnCount,
|
|
27
|
+
tools_used: event.toolsUsed,
|
|
28
|
+
files_changed: event.filesChanged,
|
|
29
|
+
duration_ms: event.duration,
|
|
30
|
+
exit_reason: event.exitReason,
|
|
31
|
+
project_root: projectRoot,
|
|
32
|
+
};
|
|
33
|
+
try {
|
|
34
|
+
// @ts-ignore — resolved from jfl package at runtime
|
|
35
|
+
const { appendEval } = await jflImport("eval-store");
|
|
36
|
+
appendEval(entry, projectRoot);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// eval-store may not be available in all contexts — non-fatal
|
|
40
|
+
}
|
|
41
|
+
await emitCustomEvent(ctx, "eval:submitted", entry);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../extensions/eval.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAejD,IAAI,WAAW,GAAG,EAAE,CAAA;AAEpB,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAc,EAAE,OAAkB;IAChE,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAA;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAc,EAAE,KAAoB;IACnE,kEAAkE;IAClE,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,CAAA;IAChE,IAAI,SAAS,GAAG,CAAC;QAAE,OAAM;IAEzB,MAAM,KAAK,GAAc;QACvB,EAAE,EAAE,UAAU,EAAE;QAChB,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE;QAC1B,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,KAAK,CAAC,SAAS;QAC3B,aAAa,EAAE,KAAK,CAAC,YAAY;QACjC,WAAW,EAAE,KAAK,CAAC,QAAQ;QAC3B,WAAW,EAAE,KAAK,CAAC,UAAU;QAC7B,YAAY,EAAE,WAAW;KAC1B,CAAA;IAED,IAAI,CAAC;QACH,oDAAoD;QACpD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,CAAA;QACpD,UAAU,CAAC,KAAyC,EAAE,WAAW,CAAC,CAAA;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,8DAA8D;IAChE,CAAC;IAED,MAAM,eAAe,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAA;AACrD,CAAC"}
|
|
@@ -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"}
|