jfl 0.1.0 → 0.2.0
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/README.md +443 -145
- package/clawdbot-plugin/clawdbot.plugin.json +20 -0
- package/clawdbot-plugin/index.js +555 -0
- package/clawdbot-plugin/index.ts +582 -0
- package/clawdbot-skill/SKILL.md +33 -336
- package/clawdbot-skill/index.ts +491 -321
- package/clawdbot-skill/skill.json +4 -13
- package/dist/commands/clawdbot.d.ts +11 -0
- package/dist/commands/clawdbot.d.ts.map +1 -0
- package/dist/commands/clawdbot.js +215 -0
- package/dist/commands/clawdbot.js.map +1 -0
- package/dist/commands/context-hub.d.ts +5 -0
- package/dist/commands/context-hub.d.ts.map +1 -1
- package/dist/commands/context-hub.js +394 -28
- package/dist/commands/context-hub.js.map +1 -1
- package/dist/commands/gtm-process-update.d.ts +10 -0
- package/dist/commands/gtm-process-update.d.ts.map +1 -0
- package/dist/commands/gtm-process-update.js +101 -0
- package/dist/commands/gtm-process-update.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +278 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +32 -33
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/memory.d.ts +38 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +229 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/migrate-services.d.ts +8 -0
- package/dist/commands/migrate-services.d.ts.map +1 -0
- package/dist/commands/migrate-services.js +182 -0
- package/dist/commands/migrate-services.js.map +1 -0
- package/dist/commands/onboard.d.ts +24 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +663 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/openclaw.d.ts +56 -0
- package/dist/commands/openclaw.d.ts.map +1 -0
- package/dist/commands/openclaw.js +700 -0
- package/dist/commands/openclaw.js.map +1 -0
- package/dist/commands/orchestrate.d.ts +14 -0
- package/dist/commands/orchestrate.d.ts.map +1 -0
- package/dist/commands/orchestrate.js +270 -0
- package/dist/commands/orchestrate.js.map +1 -0
- package/dist/commands/profile.d.ts +46 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +498 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/repair.d.ts.map +1 -1
- package/dist/commands/repair.js +37 -0
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/service-agent.d.ts +16 -0
- package/dist/commands/service-agent.d.ts.map +1 -0
- package/dist/commands/service-agent.js +375 -0
- package/dist/commands/service-agent.js.map +1 -0
- package/dist/commands/service-manager.d.ts +12 -0
- package/dist/commands/service-manager.d.ts.map +1 -0
- package/dist/commands/service-manager.js +967 -0
- package/dist/commands/service-manager.js.map +1 -0
- package/dist/commands/service-validate.d.ts +12 -0
- package/dist/commands/service-validate.d.ts.map +1 -0
- package/dist/commands/service-validate.js +611 -0
- package/dist/commands/service-validate.js.map +1 -0
- package/dist/commands/services-create.d.ts +15 -0
- package/dist/commands/services-create.d.ts.map +1 -0
- package/dist/commands/services-create.js +1452 -0
- package/dist/commands/services-create.js.map +1 -0
- package/dist/commands/services-scan.d.ts +13 -0
- package/dist/commands/services-scan.d.ts.map +1 -0
- package/dist/commands/services-scan.js +251 -0
- package/dist/commands/services-scan.js.map +1 -0
- package/dist/commands/services-sync-agents.d.ts +23 -0
- package/dist/commands/services-sync-agents.d.ts.map +1 -0
- package/dist/commands/services-sync-agents.js +207 -0
- package/dist/commands/services-sync-agents.js.map +1 -0
- package/dist/commands/services.d.ts +19 -0
- package/dist/commands/services.d.ts.map +1 -0
- package/dist/commands/services.js +742 -0
- package/dist/commands/services.js.map +1 -0
- package/dist/commands/session.d.ts +5 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +68 -586
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +17 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +75 -21
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate-settings.d.ts +37 -0
- package/dist/commands/validate-settings.d.ts.map +1 -0
- package/dist/commands/validate-settings.js +197 -0
- package/dist/commands/validate-settings.js.map +1 -0
- package/dist/commands/voice.d.ts +0 -1
- package/dist/commands/voice.d.ts.map +1 -1
- package/dist/commands/voice.js +16 -15
- package/dist/commands/voice.js.map +1 -1
- package/dist/index.js +395 -141
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-generator.d.ts +26 -0
- package/dist/lib/agent-generator.d.ts.map +1 -0
- package/dist/lib/agent-generator.js +331 -0
- package/dist/lib/agent-generator.js.map +1 -0
- package/dist/lib/memory-db.d.ts +102 -0
- package/dist/lib/memory-db.d.ts.map +1 -0
- package/dist/lib/memory-db.js +313 -0
- package/dist/lib/memory-db.js.map +1 -0
- package/dist/lib/memory-indexer.d.ts +47 -0
- package/dist/lib/memory-indexer.d.ts.map +1 -0
- package/dist/lib/memory-indexer.js +215 -0
- package/dist/lib/memory-indexer.js.map +1 -0
- package/dist/lib/memory-search.d.ts +41 -0
- package/dist/lib/memory-search.d.ts.map +1 -0
- package/dist/lib/memory-search.js +246 -0
- package/dist/lib/memory-search.js.map +1 -0
- package/dist/lib/openclaw-registry.d.ts +48 -0
- package/dist/lib/openclaw-registry.d.ts.map +1 -0
- package/dist/lib/openclaw-registry.js +181 -0
- package/dist/lib/openclaw-registry.js.map +1 -0
- package/dist/lib/openclaw-sdk.d.ts +107 -0
- package/dist/lib/openclaw-sdk.d.ts.map +1 -0
- package/dist/lib/openclaw-sdk.js +208 -0
- package/dist/lib/openclaw-sdk.js.map +1 -0
- package/dist/lib/peer-agent-generator.d.ts +44 -0
- package/dist/lib/peer-agent-generator.d.ts.map +1 -0
- package/dist/lib/peer-agent-generator.js +286 -0
- package/dist/lib/peer-agent-generator.js.map +1 -0
- package/dist/lib/service-dependencies.d.ts +44 -0
- package/dist/lib/service-dependencies.d.ts.map +1 -0
- package/dist/lib/service-dependencies.js +314 -0
- package/dist/lib/service-dependencies.js.map +1 -0
- package/dist/lib/service-detector.d.ts +61 -0
- package/dist/lib/service-detector.d.ts.map +1 -0
- package/dist/lib/service-detector.js +521 -0
- package/dist/lib/service-detector.js.map +1 -0
- package/dist/lib/service-gtm.d.ts +157 -0
- package/dist/lib/service-gtm.d.ts.map +1 -0
- package/dist/lib/service-gtm.js +786 -0
- package/dist/lib/service-gtm.js.map +1 -0
- package/dist/lib/service-mcp-base.d.ts +103 -0
- package/dist/lib/service-mcp-base.d.ts.map +1 -0
- package/dist/lib/service-mcp-base.js +263 -0
- package/dist/lib/service-mcp-base.js.map +1 -0
- package/dist/lib/service-utils.d.ts +103 -0
- package/dist/lib/service-utils.d.ts.map +1 -0
- package/dist/lib/service-utils.js +368 -0
- package/dist/lib/service-utils.js.map +1 -0
- package/dist/lib/skill-generator.d.ts +21 -0
- package/dist/lib/skill-generator.d.ts.map +1 -0
- package/dist/lib/skill-generator.js +253 -0
- package/dist/lib/skill-generator.js.map +1 -0
- package/dist/lib/stratus-client.d.ts +100 -0
- package/dist/lib/stratus-client.d.ts.map +1 -0
- package/dist/lib/stratus-client.js +255 -0
- package/dist/lib/stratus-client.js.map +1 -0
- package/dist/mcp/context-hub-mcp.js +135 -53
- package/dist/mcp/context-hub-mcp.js.map +1 -1
- package/dist/mcp/service-mcp-server.d.ts +12 -0
- package/dist/mcp/service-mcp-server.d.ts.map +1 -0
- package/dist/mcp/service-mcp-server.js +434 -0
- package/dist/mcp/service-mcp-server.js.map +1 -0
- package/dist/mcp/service-peer-mcp.d.ts +36 -0
- package/dist/mcp/service-peer-mcp.d.ts.map +1 -0
- package/dist/mcp/service-peer-mcp.js +220 -0
- package/dist/mcp/service-peer-mcp.js.map +1 -0
- package/dist/mcp/service-registry-mcp.d.ts +13 -0
- package/dist/mcp/service-registry-mcp.d.ts.map +1 -0
- package/dist/mcp/service-registry-mcp.js +330 -0
- package/dist/mcp/service-registry-mcp.js.map +1 -0
- package/dist/ui/banner.js +1 -1
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/context-hub-logs.d.ts +10 -0
- package/dist/ui/context-hub-logs.d.ts.map +1 -0
- package/dist/ui/context-hub-logs.js +175 -0
- package/dist/ui/context-hub-logs.js.map +1 -0
- package/dist/ui/service-dashboard.d.ts +11 -0
- package/dist/ui/service-dashboard.d.ts.map +1 -0
- package/dist/ui/service-dashboard.js +357 -0
- package/dist/ui/service-dashboard.js.map +1 -0
- package/dist/ui/services-manager.d.ts +11 -0
- package/dist/ui/services-manager.d.ts.map +1 -0
- package/dist/ui/services-manager.js +507 -0
- package/dist/ui/services-manager.js.map +1 -0
- package/dist/utils/auth-guard.d.ts.map +1 -1
- package/dist/utils/auth-guard.js +8 -9
- package/dist/utils/auth-guard.js.map +1 -1
- package/dist/utils/claude-md-generator.d.ts +10 -0
- package/dist/utils/claude-md-generator.d.ts.map +1 -0
- package/dist/utils/claude-md-generator.js +215 -0
- package/dist/utils/claude-md-generator.js.map +1 -0
- package/dist/utils/ensure-context-hub.d.ts +20 -0
- package/dist/utils/ensure-context-hub.d.ts.map +1 -0
- package/dist/utils/ensure-context-hub.js +65 -0
- package/dist/utils/ensure-context-hub.js.map +1 -0
- package/dist/utils/ensure-project.d.ts.map +1 -1
- package/dist/utils/ensure-project.js +3 -4
- package/dist/utils/ensure-project.js.map +1 -1
- package/dist/utils/jfl-config.d.ts +19 -0
- package/dist/utils/jfl-config.d.ts.map +1 -0
- package/dist/utils/jfl-config.js +112 -0
- package/dist/utils/jfl-config.js.map +1 -0
- package/dist/utils/jfl-migration.d.ts +29 -0
- package/dist/utils/jfl-migration.d.ts.map +1 -0
- package/dist/utils/jfl-migration.js +142 -0
- package/dist/utils/jfl-migration.js.map +1 -0
- package/dist/utils/jfl-paths.d.ts +55 -0
- package/dist/utils/jfl-paths.d.ts.map +1 -0
- package/dist/utils/jfl-paths.js +120 -0
- package/dist/utils/jfl-paths.js.map +1 -0
- package/dist/utils/settings-validator.d.ts +73 -0
- package/dist/utils/settings-validator.d.ts.map +1 -0
- package/dist/utils/settings-validator.js +222 -0
- package/dist/utils/settings-validator.js.map +1 -0
- package/package.json +19 -3
- package/scripts/commit-gtm.sh +56 -0
- package/scripts/commit-product.sh +68 -0
- package/scripts/context-query.sh +45 -0
- package/scripts/session/auto-commit.sh +297 -0
- package/scripts/session/jfl-doctor.sh +707 -0
- package/scripts/session/session-cleanup.sh +268 -0
- package/scripts/session/session-end.sh +198 -0
- package/scripts/session/session-init.sh +350 -0
- package/scripts/session/session-init.sh.backup +292 -0
- package/scripts/session/session-sync.sh +167 -0
- package/scripts/session/test-context-preservation.sh +160 -0
- package/scripts/session/test-critical-infrastructure.sh +293 -0
- package/scripts/session/test-experience-level.sh +336 -0
- package/scripts/session/test-session-cleanup.sh +268 -0
- package/scripts/session/test-session-sync.sh +320 -0
- package/scripts/voice-start.sh +36 -8
- package/scripts/where-am-i.sh +78 -0
- package/template/.claude/service-settings.json +32 -0
- package/template/.claude/settings.json +14 -1
- package/template/.claude/skills/end/SKILL.md +1780 -0
- package/template/.jfl/config.json +2 -1
- package/template/CLAUDE.md +1039 -134
- package/template/CLAUDE.md.bak +1187 -0
- package/template/scripts/commit-gtm.sh +56 -0
- package/template/scripts/commit-product.sh +68 -0
- package/template/scripts/migrate-to-branch-sessions.sh +201 -0
- package/template/scripts/session/auto-commit.sh +58 -6
- package/template/scripts/session/jfl-doctor.sh +137 -17
- package/template/scripts/session/session-cleanup.sh +268 -0
- package/template/scripts/session/session-end.sh +4 -0
- package/template/scripts/session/session-init.sh +253 -66
- package/template/scripts/session/test-critical-infrastructure.sh +293 -0
- package/template/scripts/session/test-experience-level.sh +336 -0
- package/template/scripts/session/test-session-cleanup.sh +268 -0
- package/template/scripts/session/test-session-sync.sh +320 -0
- package/template/scripts/where-am-i.sh +78 -0
- package/template/templates/service-agent/.claude/settings.json +32 -0
- package/template/templates/service-agent/CLAUDE.md +334 -0
- package/template/templates/service-agent/knowledge/ARCHITECTURE.md +115 -0
- package/template/templates/service-agent/knowledge/DEPLOYMENT.md +199 -0
- package/template/templates/service-agent/knowledge/RUNBOOK.md +412 -0
- package/template/templates/service-agent/knowledge/SERVICE_SPEC.md +77 -0
- package/dist/commands/session-mgmt.d.ts +0 -33
- package/dist/commands/session-mgmt.d.ts.map +0 -1
- package/dist/commands/session-mgmt.js +0 -404
- package/dist/commands/session-mgmt.js.map +0 -1
- package/template/scripts/session/auto-merge.sh +0 -325
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stratus X1 Reasoning API Client
|
|
3
|
+
*
|
|
4
|
+
* Provides reasoning-based analysis and synthesis capabilities
|
|
5
|
+
* for Context Hub journal entries and project documentation.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Client for calling Stratus X1 reasoning API to synthesize context
|
|
8
|
+
*/
|
|
9
|
+
interface StratusResponse {
|
|
10
|
+
id: string;
|
|
11
|
+
object: string;
|
|
12
|
+
created: number;
|
|
13
|
+
model: string;
|
|
14
|
+
choices: Array<{
|
|
15
|
+
index: number;
|
|
16
|
+
message: {
|
|
17
|
+
role: string;
|
|
18
|
+
content: string;
|
|
19
|
+
};
|
|
20
|
+
finish_reason: string;
|
|
21
|
+
}>;
|
|
22
|
+
usage?: {
|
|
23
|
+
prompt_tokens: number;
|
|
24
|
+
completion_tokens: number;
|
|
25
|
+
total_tokens: number;
|
|
26
|
+
};
|
|
27
|
+
stratus?: {
|
|
28
|
+
model: string;
|
|
29
|
+
execution_llm: string;
|
|
30
|
+
confidence: number;
|
|
31
|
+
planning_time_ms: number;
|
|
32
|
+
execution_time_ms: number;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
interface JournalEntry {
|
|
36
|
+
v?: number;
|
|
37
|
+
ts?: string;
|
|
38
|
+
session?: string;
|
|
39
|
+
type?: string;
|
|
40
|
+
status?: string;
|
|
41
|
+
title?: string;
|
|
42
|
+
summary?: string;
|
|
43
|
+
detail?: string;
|
|
44
|
+
files?: string[];
|
|
45
|
+
decision?: string;
|
|
46
|
+
incomplete?: string[];
|
|
47
|
+
next?: string;
|
|
48
|
+
learned?: string[];
|
|
49
|
+
}
|
|
50
|
+
interface SynthesisResult {
|
|
51
|
+
summary: string;
|
|
52
|
+
decisions: Array<{
|
|
53
|
+
decision: string;
|
|
54
|
+
rationale: string;
|
|
55
|
+
}>;
|
|
56
|
+
problemsSolved: Array<{
|
|
57
|
+
problem: string;
|
|
58
|
+
solution: string;
|
|
59
|
+
}>;
|
|
60
|
+
incompleteItems: string[];
|
|
61
|
+
nextSteps: string[];
|
|
62
|
+
rawResponse: string;
|
|
63
|
+
confidence?: number;
|
|
64
|
+
executionTime?: number;
|
|
65
|
+
}
|
|
66
|
+
export declare class StratusClient {
|
|
67
|
+
private baseUrl;
|
|
68
|
+
private apiKey;
|
|
69
|
+
private model;
|
|
70
|
+
private timeout;
|
|
71
|
+
constructor(options?: {
|
|
72
|
+
baseUrl?: string;
|
|
73
|
+
apiKey?: string;
|
|
74
|
+
model?: string;
|
|
75
|
+
timeout?: number;
|
|
76
|
+
});
|
|
77
|
+
/**
|
|
78
|
+
* Call Stratus reasoning API with a prompt
|
|
79
|
+
*/
|
|
80
|
+
reason(prompt: string, options?: {
|
|
81
|
+
temperature?: number;
|
|
82
|
+
maxTokens?: number;
|
|
83
|
+
}): Promise<StratusResponse>;
|
|
84
|
+
/**
|
|
85
|
+
* Synthesize journal entries into structured summary
|
|
86
|
+
*/
|
|
87
|
+
synthesizeJournalEntries(entries: JournalEntry[], options?: {
|
|
88
|
+
focus?: "decisions" | "problems" | "progress" | "all";
|
|
89
|
+
}): Promise<SynthesisResult>;
|
|
90
|
+
/**
|
|
91
|
+
* Parse Stratus response into structured format
|
|
92
|
+
*/
|
|
93
|
+
private parseStructuredSummary;
|
|
94
|
+
/**
|
|
95
|
+
* Format synthesis result as human-readable text
|
|
96
|
+
*/
|
|
97
|
+
formatSynthesis(synthesis: SynthesisResult): string;
|
|
98
|
+
}
|
|
99
|
+
export {};
|
|
100
|
+
//# sourceMappingURL=stratus-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratus-client.d.ts","sourceRoot":"","sources":["../../src/lib/stratus-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stratus X1 Reasoning API Client
|
|
3
|
+
*
|
|
4
|
+
* Provides reasoning-based analysis and synthesis capabilities
|
|
5
|
+
* for Context Hub journal entries and project documentation.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Client for calling Stratus X1 reasoning API to synthesize context
|
|
8
|
+
*/
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Stratus Client
|
|
11
|
+
// ============================================================================
|
|
12
|
+
export class StratusClient {
|
|
13
|
+
baseUrl;
|
|
14
|
+
apiKey;
|
|
15
|
+
model;
|
|
16
|
+
timeout;
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
this.baseUrl = options.baseUrl || process.env.STRATUS_API_URL || "http://212.115.124.137:8000";
|
|
19
|
+
this.apiKey = options.apiKey || process.env.STRATUS_API_KEY || "";
|
|
20
|
+
this.model = options.model || "stratus-x1ac-base-claude-sonnet-4";
|
|
21
|
+
this.timeout = options.timeout || 30000; // 30 seconds default
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Call Stratus reasoning API with a prompt
|
|
25
|
+
*/
|
|
26
|
+
async reason(prompt, options = {}) {
|
|
27
|
+
const controller = new AbortController();
|
|
28
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
29
|
+
try {
|
|
30
|
+
const request = {
|
|
31
|
+
model: this.model,
|
|
32
|
+
messages: [{ role: "user", content: prompt }],
|
|
33
|
+
temperature: options.temperature ?? 0.7,
|
|
34
|
+
max_tokens: options.maxTokens ?? 2000
|
|
35
|
+
};
|
|
36
|
+
const headers = {
|
|
37
|
+
"Content-Type": "application/json"
|
|
38
|
+
};
|
|
39
|
+
if (this.apiKey) {
|
|
40
|
+
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
41
|
+
}
|
|
42
|
+
const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers,
|
|
45
|
+
body: JSON.stringify(request),
|
|
46
|
+
signal: controller.signal
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const errorText = await response.text();
|
|
50
|
+
throw new Error(`Stratus API error (${response.status}): ${errorText}`);
|
|
51
|
+
}
|
|
52
|
+
return await response.json();
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (error.name === "AbortError") {
|
|
56
|
+
throw new Error(`Stratus request timed out after ${this.timeout}ms`);
|
|
57
|
+
}
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
clearTimeout(timeoutId);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Synthesize journal entries into structured summary
|
|
66
|
+
*/
|
|
67
|
+
async synthesizeJournalEntries(entries, options = {}) {
|
|
68
|
+
const focus = options.focus || "all";
|
|
69
|
+
// Build focused prompt based on what user wants
|
|
70
|
+
const focusInstructions = {
|
|
71
|
+
decisions: "Focus on key decisions made, including the options considered and rationale for each choice.",
|
|
72
|
+
problems: "Focus on problems encountered and how they were solved, including root causes and learnings.",
|
|
73
|
+
progress: "Focus on what was accomplished, current status, and momentum toward goals.",
|
|
74
|
+
all: "Provide a comprehensive analysis covering decisions, problems solved, progress made, and next steps."
|
|
75
|
+
};
|
|
76
|
+
const prompt = `Analyze these journal entries from a software project.
|
|
77
|
+
|
|
78
|
+
Journal Entries:
|
|
79
|
+
${JSON.stringify(entries, null, 2)}
|
|
80
|
+
|
|
81
|
+
${focusInstructions[focus]}
|
|
82
|
+
|
|
83
|
+
Provide a structured summary in the following format:
|
|
84
|
+
|
|
85
|
+
## Summary
|
|
86
|
+
{2-3 sentence overview of what happened}
|
|
87
|
+
|
|
88
|
+
## Key Decisions Made
|
|
89
|
+
{List decisions with brief rationale - format: "Decision: Rationale"}
|
|
90
|
+
|
|
91
|
+
## Problems Solved
|
|
92
|
+
{List problems and their solutions - format: "Problem: Solution"}
|
|
93
|
+
|
|
94
|
+
## Incomplete Items
|
|
95
|
+
{List what's stubbed, planned, or not yet done}
|
|
96
|
+
|
|
97
|
+
## Next Steps
|
|
98
|
+
{What should happen next}
|
|
99
|
+
|
|
100
|
+
Be concise but specific. Cite entry timestamps when referencing specific work.`;
|
|
101
|
+
const startTime = Date.now();
|
|
102
|
+
const response = await this.reason(prompt, {
|
|
103
|
+
temperature: 0.7,
|
|
104
|
+
maxTokens: 2000
|
|
105
|
+
});
|
|
106
|
+
const executionTime = Date.now() - startTime;
|
|
107
|
+
const content = response.choices[0]?.message?.content || "";
|
|
108
|
+
// Parse structured response
|
|
109
|
+
const synthesis = this.parseStructuredSummary(content);
|
|
110
|
+
return {
|
|
111
|
+
...synthesis,
|
|
112
|
+
rawResponse: content,
|
|
113
|
+
confidence: response.stratus?.confidence,
|
|
114
|
+
executionTime
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Parse Stratus response into structured format
|
|
119
|
+
*/
|
|
120
|
+
parseStructuredSummary(content) {
|
|
121
|
+
const result = {
|
|
122
|
+
summary: "",
|
|
123
|
+
decisions: [],
|
|
124
|
+
problemsSolved: [],
|
|
125
|
+
incompleteItems: [],
|
|
126
|
+
nextSteps: []
|
|
127
|
+
};
|
|
128
|
+
// Extract summary
|
|
129
|
+
const summaryMatch = content.match(/## Summary\s*\n([\s\S]*?)(?=\n##|$)/i);
|
|
130
|
+
if (summaryMatch) {
|
|
131
|
+
result.summary = summaryMatch[1].trim();
|
|
132
|
+
}
|
|
133
|
+
// Extract decisions
|
|
134
|
+
const decisionsMatch = content.match(/## Key Decisions Made\s*\n([\s\S]*?)(?=\n##|$)/i);
|
|
135
|
+
if (decisionsMatch) {
|
|
136
|
+
const decisionsText = decisionsMatch[1].trim();
|
|
137
|
+
const lines = decisionsText.split('\n').filter(l => l.trim());
|
|
138
|
+
for (const line of lines) {
|
|
139
|
+
const match = line.match(/[-*]\s*(.+?):\s*(.+)/);
|
|
140
|
+
if (match) {
|
|
141
|
+
result.decisions.push({
|
|
142
|
+
decision: match[1].trim(),
|
|
143
|
+
rationale: match[2].trim()
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
else if (line.startsWith('-') || line.startsWith('*')) {
|
|
147
|
+
// Fallback for lines without clear separator
|
|
148
|
+
const text = line.replace(/^[-*]\s*/, '').trim();
|
|
149
|
+
result.decisions.push({
|
|
150
|
+
decision: text,
|
|
151
|
+
rationale: ""
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Extract problems solved
|
|
157
|
+
const problemsMatch = content.match(/## Problems Solved\s*\n([\s\S]*?)(?=\n##|$)/i);
|
|
158
|
+
if (problemsMatch) {
|
|
159
|
+
const problemsText = problemsMatch[1].trim();
|
|
160
|
+
const lines = problemsText.split('\n').filter(l => l.trim());
|
|
161
|
+
for (const line of lines) {
|
|
162
|
+
const match = line.match(/[-*]\s*(.+?):\s*(.+)/);
|
|
163
|
+
if (match) {
|
|
164
|
+
result.problemsSolved.push({
|
|
165
|
+
problem: match[1].trim(),
|
|
166
|
+
solution: match[2].trim()
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
else if (line.startsWith('-') || line.startsWith('*')) {
|
|
170
|
+
const text = line.replace(/^[-*]\s*/, '').trim();
|
|
171
|
+
result.problemsSolved.push({
|
|
172
|
+
problem: text,
|
|
173
|
+
solution: ""
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Extract incomplete items
|
|
179
|
+
const incompleteMatch = content.match(/## Incomplete Items\s*\n([\s\S]*?)(?=\n##|$)/i);
|
|
180
|
+
if (incompleteMatch) {
|
|
181
|
+
const incompleteText = incompleteMatch[1].trim();
|
|
182
|
+
result.incompleteItems = incompleteText
|
|
183
|
+
.split('\n')
|
|
184
|
+
.filter(l => l.trim())
|
|
185
|
+
.map(l => l.replace(/^[-*]\s*/, '').trim());
|
|
186
|
+
}
|
|
187
|
+
// Extract next steps
|
|
188
|
+
const nextStepsMatch = content.match(/## Next Steps\s*\n([\s\S]*?)(?=\n##|$)/i);
|
|
189
|
+
if (nextStepsMatch) {
|
|
190
|
+
const nextStepsText = nextStepsMatch[1].trim();
|
|
191
|
+
result.nextSteps = nextStepsText
|
|
192
|
+
.split('\n')
|
|
193
|
+
.filter(l => l.trim())
|
|
194
|
+
.map(l => l.replace(/^[-*]\s*/, '').trim());
|
|
195
|
+
}
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Format synthesis result as human-readable text
|
|
200
|
+
*/
|
|
201
|
+
formatSynthesis(synthesis) {
|
|
202
|
+
const lines = [];
|
|
203
|
+
lines.push("# Context Synthesis\n");
|
|
204
|
+
if (synthesis.summary) {
|
|
205
|
+
lines.push(synthesis.summary);
|
|
206
|
+
lines.push("");
|
|
207
|
+
}
|
|
208
|
+
if (synthesis.decisions.length > 0) {
|
|
209
|
+
lines.push("## Key Decisions");
|
|
210
|
+
for (const { decision, rationale } of synthesis.decisions) {
|
|
211
|
+
if (rationale) {
|
|
212
|
+
lines.push(`- **${decision}**: ${rationale}`);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
lines.push(`- ${decision}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
lines.push("");
|
|
219
|
+
}
|
|
220
|
+
if (synthesis.problemsSolved.length > 0) {
|
|
221
|
+
lines.push("## Problems Solved");
|
|
222
|
+
for (const { problem, solution } of synthesis.problemsSolved) {
|
|
223
|
+
if (solution) {
|
|
224
|
+
lines.push(`- **${problem}**: ${solution}`);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
lines.push(`- ${problem}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
lines.push("");
|
|
231
|
+
}
|
|
232
|
+
if (synthesis.incompleteItems.length > 0) {
|
|
233
|
+
lines.push("## Incomplete Items");
|
|
234
|
+
for (const item of synthesis.incompleteItems) {
|
|
235
|
+
lines.push(`- ${item}`);
|
|
236
|
+
}
|
|
237
|
+
lines.push("");
|
|
238
|
+
}
|
|
239
|
+
if (synthesis.nextSteps.length > 0) {
|
|
240
|
+
lines.push("## Next Steps");
|
|
241
|
+
for (const step of synthesis.nextSteps) {
|
|
242
|
+
lines.push(`- ${step}`);
|
|
243
|
+
}
|
|
244
|
+
lines.push("");
|
|
245
|
+
}
|
|
246
|
+
if (synthesis.confidence !== undefined) {
|
|
247
|
+
lines.push(`_Confidence: ${(synthesis.confidence * 100).toFixed(0)}%_`);
|
|
248
|
+
}
|
|
249
|
+
if (synthesis.executionTime !== undefined) {
|
|
250
|
+
lines.push(`_Analysis time: ${(synthesis.executionTime / 1000).toFixed(1)}s_`);
|
|
251
|
+
}
|
|
252
|
+
return lines.join("\n");
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=stratus-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratus-client.js","sourceRoot":"","sources":["../../src/lib/stratus-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -83,7 +83,7 @@ const TOOLS = [
|
|
|
83
83
|
},
|
|
84
84
|
{
|
|
85
85
|
name: "context_sessions",
|
|
86
|
-
description: "See activity from other sessions
|
|
86
|
+
description: "See activity from other sessions (informational only).",
|
|
87
87
|
inputSchema: {
|
|
88
88
|
type: "object",
|
|
89
89
|
properties: {
|
|
@@ -93,6 +93,64 @@ const TOOLS = [
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: "memory_search",
|
|
99
|
+
description: "Search through indexed journal entries and memories. Finds relevant past work, decisions, and learnings across all sessions.",
|
|
100
|
+
inputSchema: {
|
|
101
|
+
type: "object",
|
|
102
|
+
properties: {
|
|
103
|
+
query: {
|
|
104
|
+
type: "string",
|
|
105
|
+
description: "Search query (e.g., 'what did we decide about pricing?')"
|
|
106
|
+
},
|
|
107
|
+
type: {
|
|
108
|
+
type: "string",
|
|
109
|
+
enum: ["feature", "fix", "decision", "discovery", "milestone", "all"],
|
|
110
|
+
description: "Filter by entry type (optional)"
|
|
111
|
+
},
|
|
112
|
+
maxItems: {
|
|
113
|
+
type: "number",
|
|
114
|
+
description: "Maximum results to return (default: 10)"
|
|
115
|
+
},
|
|
116
|
+
since: {
|
|
117
|
+
type: "string",
|
|
118
|
+
description: "ISO date - only return entries after this date (optional)"
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
required: ["query"]
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: "memory_add",
|
|
126
|
+
description: "Manually add a memory or note. Useful for capturing insights not in journal.",
|
|
127
|
+
inputSchema: {
|
|
128
|
+
type: "object",
|
|
129
|
+
properties: {
|
|
130
|
+
title: {
|
|
131
|
+
type: "string",
|
|
132
|
+
description: "Short title for the memory"
|
|
133
|
+
},
|
|
134
|
+
content: {
|
|
135
|
+
type: "string",
|
|
136
|
+
description: "Full content/description"
|
|
137
|
+
},
|
|
138
|
+
tags: {
|
|
139
|
+
type: "array",
|
|
140
|
+
items: { type: "string" },
|
|
141
|
+
description: "Tags for categorization (optional)"
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
required: ["title", "content"]
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: "memory_status",
|
|
149
|
+
description: "Get memory system statistics and health.",
|
|
150
|
+
inputSchema: {
|
|
151
|
+
type: "object",
|
|
152
|
+
properties: {}
|
|
153
|
+
}
|
|
96
154
|
}
|
|
97
155
|
];
|
|
98
156
|
async function callContextHub(endpoint, body) {
|
|
@@ -151,6 +209,37 @@ function formatContextItems(items) {
|
|
|
151
209
|
}
|
|
152
210
|
return sections.join("\n\n");
|
|
153
211
|
}
|
|
212
|
+
function formatMemoryResults(results) {
|
|
213
|
+
if (results.length === 0) {
|
|
214
|
+
return "No memories found.";
|
|
215
|
+
}
|
|
216
|
+
const items = results.map((result, index) => {
|
|
217
|
+
const { memory, score, relevance } = result;
|
|
218
|
+
// Format relevance badge
|
|
219
|
+
const relevanceBadge = relevance === 'high' ? '●' : relevance === 'medium' ? '◐' : '○';
|
|
220
|
+
// Format type
|
|
221
|
+
const type = memory.type || 'unknown';
|
|
222
|
+
// Format date
|
|
223
|
+
const date = new Date(memory.created_at).toISOString().split('T')[0];
|
|
224
|
+
// Extract files from metadata
|
|
225
|
+
let files = '';
|
|
226
|
+
if (memory.metadata) {
|
|
227
|
+
try {
|
|
228
|
+
const metadata = JSON.parse(memory.metadata);
|
|
229
|
+
if (metadata.files && metadata.files.length > 0) {
|
|
230
|
+
files = `\n Files: ${metadata.files.slice(0, 3).join(', ')}${metadata.files.length > 3 ? '...' : ''}`;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// Ignore parse errors
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return `${index + 1}. [${type}] ${memory.title}
|
|
238
|
+
${date} | ${relevanceBadge} Relevance: ${score.toFixed(2)}
|
|
239
|
+
${memory.summary || memory.content.slice(0, 150)}${files}`;
|
|
240
|
+
}).join('\n\n');
|
|
241
|
+
return `Found ${results.length} ${results.length === 1 ? 'memory' : 'memories'}:\n\n${items}`;
|
|
242
|
+
}
|
|
154
243
|
function findRepoRoot() {
|
|
155
244
|
let dir = process.cwd();
|
|
156
245
|
const root = path.parse(dir).root;
|
|
@@ -223,25 +312,25 @@ function getSessionsActivity(hours) {
|
|
|
223
312
|
const currentBranch = execSync('git branch --show-current', { cwd: repoRoot, encoding: 'utf-8' }).trim();
|
|
224
313
|
const sessions = [];
|
|
225
314
|
try {
|
|
226
|
-
// Get all
|
|
227
|
-
const
|
|
228
|
-
const
|
|
315
|
+
// Get all session branches
|
|
316
|
+
const branchOutput = execSync('git branch --list "session-*"', { cwd: repoRoot, encoding: 'utf-8' });
|
|
317
|
+
const branches = branchOutput.split('\n')
|
|
318
|
+
.map(b => b.trim().replace(/^\*\s+/, ''))
|
|
319
|
+
.filter(b => b.startsWith('session-'));
|
|
229
320
|
// Get journal directory (should be in main repo)
|
|
230
321
|
const journalDir = path.join(repoRoot, '.jfl', 'journal');
|
|
231
|
-
for (const
|
|
232
|
-
if (!wt.branch.startsWith('session-'))
|
|
233
|
-
continue;
|
|
322
|
+
for (const branch of branches) {
|
|
234
323
|
const session = {
|
|
235
|
-
name:
|
|
236
|
-
path:
|
|
237
|
-
branch:
|
|
238
|
-
isActive:
|
|
239
|
-
recentCommits: getRecentCommits(repoRoot,
|
|
324
|
+
name: branch,
|
|
325
|
+
path: repoRoot, // All sessions work in main repo now
|
|
326
|
+
branch: branch,
|
|
327
|
+
isActive: branch === currentBranch, // Active if it's the current branch
|
|
328
|
+
recentCommits: getRecentCommits(repoRoot, branch, 3),
|
|
240
329
|
journalSummary: '',
|
|
241
330
|
workingOn: ''
|
|
242
331
|
};
|
|
243
332
|
// Read journal for this session
|
|
244
|
-
const journalFile = path.join(journalDir, `${
|
|
333
|
+
const journalFile = path.join(journalDir, `${branch}.jsonl`);
|
|
245
334
|
if (fs.existsSync(journalFile)) {
|
|
246
335
|
const entries = readJournalEntries(journalFile, hours);
|
|
247
336
|
if (entries.length > 0) {
|
|
@@ -311,46 +400,7 @@ function getSessionsActivity(hours) {
|
|
|
311
400
|
}
|
|
312
401
|
return lines.join('\n');
|
|
313
402
|
}
|
|
314
|
-
|
|
315
|
-
const worktrees = [];
|
|
316
|
-
const lines = output.split('\n');
|
|
317
|
-
let currentPath = '';
|
|
318
|
-
for (const line of lines) {
|
|
319
|
-
if (line.startsWith('worktree ')) {
|
|
320
|
-
currentPath = line.substring(9);
|
|
321
|
-
}
|
|
322
|
-
else if (line.startsWith('branch refs/heads/')) {
|
|
323
|
-
const branch = line.substring(18);
|
|
324
|
-
if (currentPath) {
|
|
325
|
-
worktrees.push({ path: currentPath, branch });
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
return worktrees;
|
|
330
|
-
}
|
|
331
|
-
function checkIfActive(worktreePath) {
|
|
332
|
-
// Check for auto-commit PID
|
|
333
|
-
const pidFile = path.join(worktreePath, '.jfl', 'auto-commit.pid');
|
|
334
|
-
if (fs.existsSync(pidFile)) {
|
|
335
|
-
try {
|
|
336
|
-
const pid = parseInt(fs.readFileSync(pidFile, 'utf-8').trim(), 10);
|
|
337
|
-
if (pid > 0) {
|
|
338
|
-
// Check if process is running
|
|
339
|
-
try {
|
|
340
|
-
process.kill(pid, 0); // Doesn't kill, just checks if it exists
|
|
341
|
-
return true;
|
|
342
|
-
}
|
|
343
|
-
catch {
|
|
344
|
-
// Process not running
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
catch {
|
|
349
|
-
// Ignore read errors
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
return false;
|
|
353
|
-
}
|
|
403
|
+
// Removed parseWorktrees and checkIfActive functions - no longer needed since we use branches instead of worktrees
|
|
354
404
|
function getRecentCommits(repoRoot, branch, count) {
|
|
355
405
|
try {
|
|
356
406
|
const output = execSync(`git log --oneline -${count} "${branch}" 2>/dev/null`, { cwd: repoRoot, encoding: 'utf-8' });
|
|
@@ -431,6 +481,38 @@ async function handleToolCall(name, args) {
|
|
|
431
481
|
case "context_sessions": {
|
|
432
482
|
return getSessionsActivity(args.hours || 24);
|
|
433
483
|
}
|
|
484
|
+
case "memory_search": {
|
|
485
|
+
if (!args.query) {
|
|
486
|
+
throw new Error("query is required");
|
|
487
|
+
}
|
|
488
|
+
const result = await callContextHub("/api/memory/search", {
|
|
489
|
+
query: args.query,
|
|
490
|
+
type: args.type,
|
|
491
|
+
maxItems: args.maxItems || 10,
|
|
492
|
+
since: args.since
|
|
493
|
+
});
|
|
494
|
+
return formatMemoryResults(result.results);
|
|
495
|
+
}
|
|
496
|
+
case "memory_add": {
|
|
497
|
+
if (!args.title || !args.content) {
|
|
498
|
+
throw new Error("title and content are required");
|
|
499
|
+
}
|
|
500
|
+
const result = await callContextHub("/api/memory/add", {
|
|
501
|
+
title: args.title,
|
|
502
|
+
content: args.content,
|
|
503
|
+
tags: args.tags || []
|
|
504
|
+
});
|
|
505
|
+
return `Memory added successfully (ID: ${result.id})`;
|
|
506
|
+
}
|
|
507
|
+
case "memory_status": {
|
|
508
|
+
const result = await callContextHub("/api/memory/status");
|
|
509
|
+
return `Memory System Status:
|
|
510
|
+
- Total memories: ${result.total_memories}
|
|
511
|
+
- By type: ${Object.entries(result.by_type).map(([k, v]) => `${k}(${v})`).join(', ')}
|
|
512
|
+
- Date range: ${result.date_range.earliest ? new Date(result.date_range.earliest).toISOString().split('T')[0] : 'N/A'} to ${result.date_range.latest ? new Date(result.date_range.latest).toISOString().split('T')[0] : 'N/A'}
|
|
513
|
+
- Embeddings: ${result.embeddings.available ? `✓ ${result.embeddings.count} indexed` : '✗ Not available'}
|
|
514
|
+
- Last index: ${result.last_index ? new Date(result.last_index).toISOString() : 'N/A'}`;
|
|
515
|
+
}
|
|
434
516
|
default:
|
|
435
517
|
throw new Error(`Unknown tool: ${name}`);
|
|
436
518
|
}
|