@aiassesstech/jessie 0.2.17 → 0.5.1
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 +41 -0
- package/agent/AGENTS.md +30 -7
- package/agent/HEARTBEAT.md +34 -6
- package/agent/MISSION_CONTROL.md +2 -2
- package/agent/SOUL.md +12 -19
- package/agent/auto-resolver.md +43 -0
- package/agent/commanders-intent.md +29 -0
- package/agent/meeting-notes.md +71 -0
- package/agent/priority-map.md +40 -0
- package/agent/skills/executive-assistant.md +91 -0
- package/agent/tasks-completed.md +5 -0
- package/agent/tasks.md +30 -0
- package/agent/voice.md +54 -0
- package/dist/channel/channel-config.d.ts +21 -0
- package/dist/channel/channel-config.d.ts.map +1 -0
- package/dist/channel/channel-config.js +45 -0
- package/dist/channel/channel-config.js.map +1 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +47 -11
- package/dist/cli/setup.js.map +1 -1
- package/dist/command/decision-store.d.ts +18 -1
- package/dist/command/decision-store.d.ts.map +1 -1
- package/dist/command/decision-store.js +107 -0
- package/dist/command/decision-store.js.map +1 -1
- package/dist/command/types.d.ts +59 -1
- package/dist/command/types.d.ts.map +1 -1
- package/dist/command/types.js +5 -1
- package/dist/command/types.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +185 -7
- package/dist/plugin.js.map +1 -1
- package/dist/tools/jessie-briefing.d.ts.map +1 -1
- package/dist/tools/jessie-briefing.js +1 -0
- package/dist/tools/jessie-briefing.js.map +1 -1
- package/dist/tools/jessie-correct.d.ts +54 -0
- package/dist/tools/jessie-correct.d.ts.map +1 -0
- package/dist/tools/jessie-correct.js +154 -0
- package/dist/tools/jessie-correct.js.map +1 -0
- package/dist/tools/jessie-meetings.d.ts +71 -0
- package/dist/tools/jessie-meetings.d.ts.map +1 -0
- package/dist/tools/jessie-meetings.js +196 -0
- package/dist/tools/jessie-meetings.js.map +1 -0
- package/dist/tools/jessie-policy.d.ts +42 -0
- package/dist/tools/jessie-policy.d.ts.map +1 -0
- package/dist/tools/jessie-policy.js +225 -0
- package/dist/tools/jessie-policy.js.map +1 -0
- package/dist/tools/jessie-tasks.d.ts +63 -0
- package/dist/tools/jessie-tasks.d.ts.map +1 -0
- package/dist/tools/jessie-tasks.js +229 -0
- package/dist/tools/jessie-tasks.js.map +1 -0
- package/dist/tools/jessie-trends.d.ts +49 -0
- package/dist/tools/jessie-trends.d.ts.map +1 -0
- package/dist/tools/jessie-trends.js +180 -0
- package/dist/tools/jessie-trends.js.map +1 -0
- package/openclaw.plugin.json +23 -6
- package/package.json +4 -3
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* jessie_meetings — Meeting-Note Ingestion Tool
|
|
3
|
+
*
|
|
4
|
+
* Manages the meeting-note ingestion lifecycle:
|
|
5
|
+
* - ingest: Process a new meeting note (extract items, create tasks)
|
|
6
|
+
* - sweep: Check for unprocessed notes in the ledger
|
|
7
|
+
* - status: Show ledger state and processing stats
|
|
8
|
+
* - list: List all processed notes
|
|
9
|
+
*
|
|
10
|
+
* The tool itself does NOT read external sources (Google Docs, etc.) —
|
|
11
|
+
* that requires `gog` or MCP. It processes note content passed to it
|
|
12
|
+
* and manages the processed-doc ledger.
|
|
13
|
+
*/
|
|
14
|
+
export type MeetingsAction = 'ingest' | 'sweep' | 'status' | 'list';
|
|
15
|
+
export declare function createMeetingsTool(getDataDir: () => string | null): {
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
parameters: {
|
|
19
|
+
type: "object";
|
|
20
|
+
properties: {
|
|
21
|
+
action: {
|
|
22
|
+
type: string;
|
|
23
|
+
enum: string[];
|
|
24
|
+
description: string;
|
|
25
|
+
};
|
|
26
|
+
doc_id: {
|
|
27
|
+
type: string;
|
|
28
|
+
description: string;
|
|
29
|
+
};
|
|
30
|
+
title: {
|
|
31
|
+
type: string;
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
34
|
+
meeting_date: {
|
|
35
|
+
type: string;
|
|
36
|
+
description: string;
|
|
37
|
+
};
|
|
38
|
+
content: {
|
|
39
|
+
type: string;
|
|
40
|
+
description: string;
|
|
41
|
+
};
|
|
42
|
+
summary: {
|
|
43
|
+
type: string;
|
|
44
|
+
description: string;
|
|
45
|
+
};
|
|
46
|
+
tasks_created: {
|
|
47
|
+
type: string;
|
|
48
|
+
description: string;
|
|
49
|
+
};
|
|
50
|
+
follow_ups_created: {
|
|
51
|
+
type: string;
|
|
52
|
+
description: string;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
required: string[];
|
|
56
|
+
};
|
|
57
|
+
execute(_toolCallId: string, params: Record<string, unknown>): Promise<{
|
|
58
|
+
content: {
|
|
59
|
+
type: string;
|
|
60
|
+
text: string;
|
|
61
|
+
}[];
|
|
62
|
+
isError: boolean;
|
|
63
|
+
} | {
|
|
64
|
+
content: {
|
|
65
|
+
type: string;
|
|
66
|
+
text: string;
|
|
67
|
+
}[];
|
|
68
|
+
isError?: undefined;
|
|
69
|
+
}>;
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=jessie-meetings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jessie-meetings.d.ts","sourceRoot":"","sources":["../../src/tools/jessie-meetings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAkBpE,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,MAAM,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAgDnC,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;EAkIrE"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* jessie_meetings — Meeting-Note Ingestion Tool
|
|
3
|
+
*
|
|
4
|
+
* Manages the meeting-note ingestion lifecycle:
|
|
5
|
+
* - ingest: Process a new meeting note (extract items, create tasks)
|
|
6
|
+
* - sweep: Check for unprocessed notes in the ledger
|
|
7
|
+
* - status: Show ledger state and processing stats
|
|
8
|
+
* - list: List all processed notes
|
|
9
|
+
*
|
|
10
|
+
* The tool itself does NOT read external sources (Google Docs, etc.) —
|
|
11
|
+
* that requires `gog` or MCP. It processes note content passed to it
|
|
12
|
+
* and manages the processed-doc ledger.
|
|
13
|
+
*/
|
|
14
|
+
import * as fs from 'node:fs';
|
|
15
|
+
import * as path from 'node:path';
|
|
16
|
+
function readLedger(ledgerPath) {
|
|
17
|
+
try {
|
|
18
|
+
if (fs.existsSync(ledgerPath)) {
|
|
19
|
+
const raw = fs.readFileSync(ledgerPath, 'utf-8');
|
|
20
|
+
return JSON.parse(raw);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch { /* fall through */ }
|
|
24
|
+
return { version: 1, processed: [], lastSweep: null };
|
|
25
|
+
}
|
|
26
|
+
function saveLedger(ledgerPath, ledger) {
|
|
27
|
+
const dir = path.dirname(ledgerPath);
|
|
28
|
+
if (!fs.existsSync(dir))
|
|
29
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
30
|
+
fs.writeFileSync(ledgerPath, JSON.stringify(ledger, null, 2));
|
|
31
|
+
}
|
|
32
|
+
export function createMeetingsTool(getDataDir) {
|
|
33
|
+
return {
|
|
34
|
+
name: 'jessie_meetings',
|
|
35
|
+
description: 'Meeting-note ingestion. ' +
|
|
36
|
+
'Actions: ingest (process a note — extract items, record in ledger), ' +
|
|
37
|
+
'sweep (check for unprocessed notes — returns instructions for the LLM), ' +
|
|
38
|
+
'status (ledger stats), list (all processed notes). ' +
|
|
39
|
+
'Note content is passed as a parameter — external source access requires gog/MCP.',
|
|
40
|
+
parameters: {
|
|
41
|
+
type: 'object',
|
|
42
|
+
properties: {
|
|
43
|
+
action: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
enum: ['ingest', 'sweep', 'status', 'list'],
|
|
46
|
+
description: 'Meeting-note action',
|
|
47
|
+
},
|
|
48
|
+
doc_id: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
description: 'Unique identifier for the meeting note (for ingest)',
|
|
51
|
+
},
|
|
52
|
+
title: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
description: 'Title of the meeting note (for ingest)',
|
|
55
|
+
},
|
|
56
|
+
meeting_date: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
description: 'Date of the meeting in YYYY-MM-DD format (for ingest, optional)',
|
|
59
|
+
},
|
|
60
|
+
content: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
description: 'Full text of the meeting note (for ingest)',
|
|
63
|
+
},
|
|
64
|
+
summary: {
|
|
65
|
+
type: 'string',
|
|
66
|
+
description: 'Summary of what was extracted/actioned (for ingest)',
|
|
67
|
+
},
|
|
68
|
+
tasks_created: {
|
|
69
|
+
type: 'number',
|
|
70
|
+
description: 'Number of tasks created from this note (for ingest)',
|
|
71
|
+
},
|
|
72
|
+
follow_ups_created: {
|
|
73
|
+
type: 'number',
|
|
74
|
+
description: 'Number of follow-ups created from this note (for ingest)',
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
required: ['action'],
|
|
78
|
+
},
|
|
79
|
+
async execute(_toolCallId, params) {
|
|
80
|
+
try {
|
|
81
|
+
const action = params.action;
|
|
82
|
+
const dataDir = getDataDir();
|
|
83
|
+
if (!dataDir) {
|
|
84
|
+
return { content: [{ type: 'text', text: 'Meeting notes unavailable — data directory not resolved.' }], isError: true };
|
|
85
|
+
}
|
|
86
|
+
const ledgerPath = path.join(dataDir, 'meeting-notes-state.json');
|
|
87
|
+
if (action === 'ingest') {
|
|
88
|
+
const docId = params.doc_id;
|
|
89
|
+
const title = params.title;
|
|
90
|
+
const summary = params.summary;
|
|
91
|
+
if (!docId || !title) {
|
|
92
|
+
return { content: [{ type: 'text', text: 'ingest requires doc_id and title' }], isError: true };
|
|
93
|
+
}
|
|
94
|
+
const ledger = readLedger(ledgerPath);
|
|
95
|
+
if (ledger.processed.some(p => p.docId === docId)) {
|
|
96
|
+
return { content: [{ type: 'text', text: `Note "${title}" (${docId}) already processed. Skipping.` }] };
|
|
97
|
+
}
|
|
98
|
+
const record = {
|
|
99
|
+
docId,
|
|
100
|
+
title,
|
|
101
|
+
processedAt: new Date().toISOString(),
|
|
102
|
+
meetingDate: params.meeting_date || undefined,
|
|
103
|
+
status: 'processed',
|
|
104
|
+
summary: summary || 'No summary provided',
|
|
105
|
+
tasksCreated: params.tasks_created ?? 0,
|
|
106
|
+
followUpsCreated: params.follow_ups_created ?? 0,
|
|
107
|
+
};
|
|
108
|
+
ledger.processed.push(record);
|
|
109
|
+
saveLedger(ledgerPath, ledger);
|
|
110
|
+
return { content: [{ type: 'text', text: JSON.stringify({
|
|
111
|
+
recorded: true,
|
|
112
|
+
docId,
|
|
113
|
+
title,
|
|
114
|
+
tasksCreated: record.tasksCreated,
|
|
115
|
+
followUpsCreated: record.followUpsCreated,
|
|
116
|
+
instructions: [
|
|
117
|
+
'Note recorded in ledger.',
|
|
118
|
+
'If you extracted action items, create tasks via jessie_tasks.',
|
|
119
|
+
'Classify items through jessie_policy (priority-map and auto-resolver).',
|
|
120
|
+
'Auto-resolve low-risk operational follow-ups.',
|
|
121
|
+
'Escalate legal, financial, or strategically important items to Greg.',
|
|
122
|
+
],
|
|
123
|
+
}, null, 2) }] };
|
|
124
|
+
}
|
|
125
|
+
if (action === 'sweep') {
|
|
126
|
+
const ledger = readLedger(ledgerPath);
|
|
127
|
+
ledger.lastSweep = new Date().toISOString();
|
|
128
|
+
saveLedger(ledgerPath, ledger);
|
|
129
|
+
return { content: [{ type: 'text', text: JSON.stringify({
|
|
130
|
+
action: 'sweep',
|
|
131
|
+
processedCount: ledger.processed.length,
|
|
132
|
+
lastSweep: ledger.lastSweep,
|
|
133
|
+
instructions: [
|
|
134
|
+
'Meeting-note sweep initiated.',
|
|
135
|
+
'Check configured note sources for new/updated meeting notes.',
|
|
136
|
+
'For each unprocessed note:',
|
|
137
|
+
' 1. Read the note content',
|
|
138
|
+
' 2. Extract: action items, follow-ups, decisions, deadlines',
|
|
139
|
+
' 3. Classify through jessie_policy (priority-map + auto-resolver)',
|
|
140
|
+
' 4. Create tasks via jessie_tasks',
|
|
141
|
+
' 5. Record via jessie_meetings ingest',
|
|
142
|
+
'',
|
|
143
|
+
'Note: External source access (Google Docs, etc.) requires gog CLI or MCP.',
|
|
144
|
+
'If gog is not available, prompt Greg for any notes to process.',
|
|
145
|
+
],
|
|
146
|
+
}, null, 2) }] };
|
|
147
|
+
}
|
|
148
|
+
if (action === 'status') {
|
|
149
|
+
const ledger = readLedger(ledgerPath);
|
|
150
|
+
const totalTasks = ledger.processed.reduce((sum, p) => sum + p.tasksCreated, 0);
|
|
151
|
+
const totalFollowUps = ledger.processed.reduce((sum, p) => sum + p.followUpsCreated, 0);
|
|
152
|
+
return { content: [{ type: 'text', text: JSON.stringify({
|
|
153
|
+
processedCount: ledger.processed.length,
|
|
154
|
+
totalTasksCreated: totalTasks,
|
|
155
|
+
totalFollowUpsCreated: totalFollowUps,
|
|
156
|
+
lastSweep: ledger.lastSweep,
|
|
157
|
+
recentNotes: ledger.processed.slice(-5).reverse().map(p => ({
|
|
158
|
+
docId: p.docId,
|
|
159
|
+
title: p.title,
|
|
160
|
+
date: p.processedAt.slice(0, 10),
|
|
161
|
+
tasks: p.tasksCreated,
|
|
162
|
+
followUps: p.followUpsCreated,
|
|
163
|
+
})),
|
|
164
|
+
}, null, 2) }] };
|
|
165
|
+
}
|
|
166
|
+
if (action === 'list') {
|
|
167
|
+
const ledger = readLedger(ledgerPath);
|
|
168
|
+
if (ledger.processed.length === 0) {
|
|
169
|
+
return { content: [{ type: 'text', text: 'No meeting notes processed yet.' }] };
|
|
170
|
+
}
|
|
171
|
+
return { content: [{ type: 'text', text: JSON.stringify({
|
|
172
|
+
total: ledger.processed.length,
|
|
173
|
+
notes: ledger.processed.map(p => ({
|
|
174
|
+
docId: p.docId,
|
|
175
|
+
title: p.title,
|
|
176
|
+
processedAt: p.processedAt,
|
|
177
|
+
meetingDate: p.meetingDate,
|
|
178
|
+
status: p.status,
|
|
179
|
+
summary: p.summary,
|
|
180
|
+
tasksCreated: p.tasksCreated,
|
|
181
|
+
followUpsCreated: p.followUpsCreated,
|
|
182
|
+
})),
|
|
183
|
+
}, null, 2) }] };
|
|
184
|
+
}
|
|
185
|
+
return { content: [{ type: 'text', text: `Unknown action: ${action}` }], isError: true };
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
return {
|
|
189
|
+
content: [{ type: 'text', text: `jessie_meetings error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
190
|
+
isError: true,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=jessie-meetings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jessie-meetings.js","sourceRoot":"","sources":["../../src/tools/jessie-meetings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* jessie_policy — Commander Policy Query Tool
|
|
3
|
+
*
|
|
4
|
+
* Reads priority-map.md and auto-resolver.md at call time (never cached)
|
|
5
|
+
* and exposes structured queries. Other agents can query via fleet-bus
|
|
6
|
+
* policy/query → policy/response protocol.
|
|
7
|
+
*/
|
|
8
|
+
export type PolicyAction = 'get_priority' | 'get_resolution' | 'list_p0' | 'list_escalation_rules' | 'full_priority_map' | 'full_auto_resolver';
|
|
9
|
+
export declare function extractPolicySummary(workspaceDir: string): string;
|
|
10
|
+
export declare function createPolicyTool(getWorkspaceDir: () => string | null): {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
parameters: {
|
|
14
|
+
type: "object";
|
|
15
|
+
properties: {
|
|
16
|
+
action: {
|
|
17
|
+
type: string;
|
|
18
|
+
enum: string[];
|
|
19
|
+
description: string;
|
|
20
|
+
};
|
|
21
|
+
entity: {
|
|
22
|
+
type: string;
|
|
23
|
+
description: string;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
required: string[];
|
|
27
|
+
};
|
|
28
|
+
execute(_toolCallId: string, params: Record<string, unknown>): Promise<{
|
|
29
|
+
content: {
|
|
30
|
+
type: string;
|
|
31
|
+
text: string;
|
|
32
|
+
}[];
|
|
33
|
+
isError: boolean;
|
|
34
|
+
} | {
|
|
35
|
+
content: {
|
|
36
|
+
type: string;
|
|
37
|
+
text: string;
|
|
38
|
+
}[];
|
|
39
|
+
isError?: undefined;
|
|
40
|
+
}>;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=jessie-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jessie-policy.d.ts","sourceRoot":"","sources":["../../src/tools/jessie-policy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,gBAAgB,GAChB,SAAS,GACT,uBAAuB,GACvB,mBAAmB,GACnB,oBAAoB,CAAC;AA4FzB,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAwCjE;AAED,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,MAAM,GAAG,IAAI;;;;;;;;;;;;;;;;;;yBAsBtC,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;EAqFrE"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* jessie_policy — Commander Policy Query Tool
|
|
3
|
+
*
|
|
4
|
+
* Reads priority-map.md and auto-resolver.md at call time (never cached)
|
|
5
|
+
* and exposes structured queries. Other agents can query via fleet-bus
|
|
6
|
+
* policy/query → policy/response protocol.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
function readFileOrNull(filePath) {
|
|
11
|
+
try {
|
|
12
|
+
if (fs.existsSync(filePath))
|
|
13
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
14
|
+
}
|
|
15
|
+
catch { /* fail-open */ }
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
function parsePriorityMap(content) {
|
|
19
|
+
const entries = [];
|
|
20
|
+
const lines = content.split('\n');
|
|
21
|
+
let currentSection = null;
|
|
22
|
+
for (const line of lines) {
|
|
23
|
+
const trimmed = line.trim();
|
|
24
|
+
if (/^##\s+people/i.test(trimmed)) {
|
|
25
|
+
currentSection = 'people';
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (/^##\s+programs/i.test(trimmed)) {
|
|
29
|
+
currentSection = 'programs';
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (/^##\s/.test(trimmed) && currentSection) {
|
|
33
|
+
currentSection = null;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (!currentSection)
|
|
37
|
+
continue;
|
|
38
|
+
const match = trimmed.match(/^-\s+\*\*(P[0-3])\*\*\s*[—–-]\s*(.+?):\s*(.+)$/);
|
|
39
|
+
if (match) {
|
|
40
|
+
entries.push({
|
|
41
|
+
entity: match[2].trim(),
|
|
42
|
+
level: match[1],
|
|
43
|
+
actionMode: match[3].trim(),
|
|
44
|
+
section: currentSection,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return entries;
|
|
49
|
+
}
|
|
50
|
+
function parseResolutionTable(content) {
|
|
51
|
+
const entries = [];
|
|
52
|
+
const lines = content.split('\n');
|
|
53
|
+
let inTable = false;
|
|
54
|
+
for (const line of lines) {
|
|
55
|
+
const trimmed = line.trim();
|
|
56
|
+
if (/fleet-bus method/i.test(trimmed) && trimmed.includes('|')) {
|
|
57
|
+
inTable = true;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (inTable && /^[|]\s*-/.test(trimmed))
|
|
61
|
+
continue;
|
|
62
|
+
if (inTable && trimmed.startsWith('|')) {
|
|
63
|
+
const cells = trimmed.split('|').map(c => c.trim()).filter(Boolean);
|
|
64
|
+
if (cells.length >= 2) {
|
|
65
|
+
entries.push({
|
|
66
|
+
entity: cells[0].replace(/`/g, ''),
|
|
67
|
+
mode: cells[1],
|
|
68
|
+
description: cells[1],
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (inTable && !trimmed.startsWith('|')) {
|
|
73
|
+
inTable = false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return entries;
|
|
77
|
+
}
|
|
78
|
+
function parseResolutionLanes(content) {
|
|
79
|
+
const lanes = [];
|
|
80
|
+
const lines = content.split('\n');
|
|
81
|
+
for (const line of lines) {
|
|
82
|
+
const match = line.trim().match(/^-\s+\*\*(.+?)\s+lane\*\*:\s*(.+)$/i);
|
|
83
|
+
if (match) {
|
|
84
|
+
lanes.push({ lane: match[1].trim(), description: match[2].trim() });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return lanes;
|
|
88
|
+
}
|
|
89
|
+
export function extractPolicySummary(workspaceDir) {
|
|
90
|
+
const sections = [];
|
|
91
|
+
const intentPath = path.join(workspaceDir, 'commanders-intent.md');
|
|
92
|
+
const intentContent = readFileOrNull(intentPath);
|
|
93
|
+
if (intentContent) {
|
|
94
|
+
const focusMatch = intentContent.match(/^##\s+Current Quarter Focus\s*\n(.+)/m);
|
|
95
|
+
if (focusMatch) {
|
|
96
|
+
sections.push(`Intent: ${focusMatch[1].trim()}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const priorityPath = path.join(workspaceDir, 'priority-map.md');
|
|
100
|
+
const priorityContent = readFileOrNull(priorityPath);
|
|
101
|
+
if (priorityContent) {
|
|
102
|
+
const entries = parsePriorityMap(priorityContent);
|
|
103
|
+
const p0 = entries.filter(e => e.level === 'P0');
|
|
104
|
+
if (p0.length) {
|
|
105
|
+
sections.push(`P0: ${p0.map(e => e.entity).join(', ')}`);
|
|
106
|
+
}
|
|
107
|
+
const p1 = entries.filter(e => e.level === 'P1');
|
|
108
|
+
if (p1.length) {
|
|
109
|
+
sections.push(`P1: ${p1.map(e => e.entity).join(', ')}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const resolverPath = path.join(workspaceDir, 'auto-resolver.md');
|
|
113
|
+
const resolverContent = readFileOrNull(resolverPath);
|
|
114
|
+
if (resolverContent) {
|
|
115
|
+
const lanes = parseResolutionLanes(resolverContent);
|
|
116
|
+
if (lanes.length) {
|
|
117
|
+
const short = lanes.map(l => {
|
|
118
|
+
const trigger = l.description.split(/[.,;]/)[0].trim();
|
|
119
|
+
return `${l.lane} → ${trigger}`;
|
|
120
|
+
});
|
|
121
|
+
sections.push(`Resolver lanes: ${short.join(' | ')}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return sections.join('\n');
|
|
125
|
+
}
|
|
126
|
+
export function createPolicyTool(getWorkspaceDir) {
|
|
127
|
+
return {
|
|
128
|
+
name: 'jessie_policy',
|
|
129
|
+
description: 'Query Commander policy files — priority-map.md and auto-resolver.md. ' +
|
|
130
|
+
'Actions: get_priority (entity lookup), get_resolution (resolution mode), ' +
|
|
131
|
+
'list_p0 (all P0 items), list_escalation_rules, full_priority_map, full_auto_resolver.',
|
|
132
|
+
parameters: {
|
|
133
|
+
type: 'object',
|
|
134
|
+
properties: {
|
|
135
|
+
action: {
|
|
136
|
+
type: 'string',
|
|
137
|
+
enum: ['get_priority', 'get_resolution', 'list_p0', 'list_escalation_rules', 'full_priority_map', 'full_auto_resolver'],
|
|
138
|
+
description: 'Policy query action',
|
|
139
|
+
},
|
|
140
|
+
entity: {
|
|
141
|
+
type: 'string',
|
|
142
|
+
description: 'Person, program, or fleet-bus method to look up (for get_priority / get_resolution)',
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
required: ['action'],
|
|
146
|
+
},
|
|
147
|
+
async execute(_toolCallId, params) {
|
|
148
|
+
try {
|
|
149
|
+
const action = params.action;
|
|
150
|
+
const entity = params.entity?.toLowerCase();
|
|
151
|
+
const workspaceDir = getWorkspaceDir();
|
|
152
|
+
if (!workspaceDir) {
|
|
153
|
+
return {
|
|
154
|
+
content: [{ type: 'text', text: 'Policy files unavailable — workspace directory not resolved.' }],
|
|
155
|
+
isError: true,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const priorityPath = path.join(workspaceDir, 'priority-map.md');
|
|
159
|
+
const resolverPath = path.join(workspaceDir, 'auto-resolver.md');
|
|
160
|
+
if (action === 'full_priority_map') {
|
|
161
|
+
const content = readFileOrNull(priorityPath);
|
|
162
|
+
return { content: [{ type: 'text', text: content ?? 'priority-map.md not found' }] };
|
|
163
|
+
}
|
|
164
|
+
if (action === 'full_auto_resolver') {
|
|
165
|
+
const content = readFileOrNull(resolverPath);
|
|
166
|
+
return { content: [{ type: 'text', text: content ?? 'auto-resolver.md not found' }] };
|
|
167
|
+
}
|
|
168
|
+
const priorityContent = readFileOrNull(priorityPath);
|
|
169
|
+
const resolverContent = readFileOrNull(resolverPath);
|
|
170
|
+
if (action === 'get_priority') {
|
|
171
|
+
if (!entity) {
|
|
172
|
+
return { content: [{ type: 'text', text: 'entity parameter required for get_priority' }], isError: true };
|
|
173
|
+
}
|
|
174
|
+
if (!priorityContent) {
|
|
175
|
+
return { content: [{ type: 'text', text: 'priority-map.md not found' }], isError: true };
|
|
176
|
+
}
|
|
177
|
+
const entries = parsePriorityMap(priorityContent);
|
|
178
|
+
const match = entries.find(e => e.entity.toLowerCase().includes(entity));
|
|
179
|
+
if (match) {
|
|
180
|
+
return { content: [{ type: 'text', text: JSON.stringify(match, null, 2) }] };
|
|
181
|
+
}
|
|
182
|
+
return { content: [{ type: 'text', text: `No priority entry found for "${entity}"` }] };
|
|
183
|
+
}
|
|
184
|
+
if (action === 'get_resolution') {
|
|
185
|
+
if (!entity) {
|
|
186
|
+
return { content: [{ type: 'text', text: 'entity parameter required for get_resolution' }], isError: true };
|
|
187
|
+
}
|
|
188
|
+
if (!resolverContent) {
|
|
189
|
+
return { content: [{ type: 'text', text: 'auto-resolver.md not found' }], isError: true };
|
|
190
|
+
}
|
|
191
|
+
const entries = parseResolutionTable(resolverContent);
|
|
192
|
+
const match = entries.find(e => e.entity.toLowerCase().includes(entity));
|
|
193
|
+
if (match) {
|
|
194
|
+
return { content: [{ type: 'text', text: JSON.stringify(match, null, 2) }] };
|
|
195
|
+
}
|
|
196
|
+
return { content: [{ type: 'text', text: `No resolution entry found for "${entity}"` }] };
|
|
197
|
+
}
|
|
198
|
+
if (action === 'list_p0') {
|
|
199
|
+
if (!priorityContent) {
|
|
200
|
+
return { content: [{ type: 'text', text: 'priority-map.md not found' }], isError: true };
|
|
201
|
+
}
|
|
202
|
+
const entries = parsePriorityMap(priorityContent);
|
|
203
|
+
const p0 = entries.filter(e => e.level === 'P0');
|
|
204
|
+
return { content: [{ type: 'text', text: JSON.stringify({ p0_items: p0, count: p0.length }, null, 2) }] };
|
|
205
|
+
}
|
|
206
|
+
if (action === 'list_escalation_rules') {
|
|
207
|
+
if (!resolverContent) {
|
|
208
|
+
return { content: [{ type: 'text', text: 'auto-resolver.md not found' }], isError: true };
|
|
209
|
+
}
|
|
210
|
+
const lanes = parseResolutionLanes(resolverContent);
|
|
211
|
+
const escalation = lanes.filter(l => /escalat/i.test(l.lane));
|
|
212
|
+
return { content: [{ type: 'text', text: JSON.stringify({ escalation_rules: escalation }, null, 2) }] };
|
|
213
|
+
}
|
|
214
|
+
return { content: [{ type: 'text', text: `Unknown action: ${action}` }], isError: true };
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
return {
|
|
218
|
+
content: [{ type: 'text', text: `jessie_policy error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
219
|
+
isError: true,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=jessie-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jessie-policy.js","sourceRoot":"","sources":["../../src/tools/jessie-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* jessie_tasks — Fleet Task Manager Tool
|
|
3
|
+
*
|
|
4
|
+
* Manages fleet-governance tasks in agent/tasks.md.
|
|
5
|
+
* Scope enforcement via keyword validation: when owner=greg,
|
|
6
|
+
* task content must contain fleet-governance keywords or
|
|
7
|
+
* the tool rejects with a structured guidance response.
|
|
8
|
+
*/
|
|
9
|
+
declare const FLEET_GOVERNANCE_KEYWORDS: string[];
|
|
10
|
+
declare function isFleetGovernanceTask(taskText: string): boolean;
|
|
11
|
+
export type TaskAction = 'add' | 'complete' | 'defer' | 'list' | 'prep';
|
|
12
|
+
export declare function createTasksTool(getWorkspaceDir: () => string | null): {
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
parameters: {
|
|
16
|
+
type: "object";
|
|
17
|
+
properties: {
|
|
18
|
+
action: {
|
|
19
|
+
type: string;
|
|
20
|
+
enum: string[];
|
|
21
|
+
description: string;
|
|
22
|
+
};
|
|
23
|
+
task: {
|
|
24
|
+
type: string;
|
|
25
|
+
description: string;
|
|
26
|
+
};
|
|
27
|
+
owner: {
|
|
28
|
+
type: string;
|
|
29
|
+
enum: string[];
|
|
30
|
+
description: string;
|
|
31
|
+
};
|
|
32
|
+
due: {
|
|
33
|
+
type: string;
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
section: {
|
|
37
|
+
type: string;
|
|
38
|
+
enum: string[];
|
|
39
|
+
description: string;
|
|
40
|
+
};
|
|
41
|
+
category: {
|
|
42
|
+
type: string;
|
|
43
|
+
description: string;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
required: string[];
|
|
47
|
+
};
|
|
48
|
+
execute(_toolCallId: string, params: Record<string, unknown>): Promise<{
|
|
49
|
+
content: {
|
|
50
|
+
type: string;
|
|
51
|
+
text: string;
|
|
52
|
+
}[];
|
|
53
|
+
isError: boolean;
|
|
54
|
+
} | {
|
|
55
|
+
content: {
|
|
56
|
+
type: string;
|
|
57
|
+
text: string;
|
|
58
|
+
}[];
|
|
59
|
+
isError?: undefined;
|
|
60
|
+
}>;
|
|
61
|
+
};
|
|
62
|
+
export { FLEET_GOVERNANCE_KEYWORDS, isFleetGovernanceTask };
|
|
63
|
+
//# sourceMappingURL=jessie-tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jessie-tasks.d.ts","sourceRoot":"","sources":["../../src/tools/jessie-tasks.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,QAAA,MAAM,yBAAyB,UAM9B,CAAC;AAEF,iBAAS,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGxD;AAiBD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAExE,wBAAgB,eAAe,CAAC,eAAe,EAAE,MAAM,MAAM,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAwCrC,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;EAqKrE;AAED,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,CAAC"}
|