projectionlab-mcp 1.0.0 → 1.1.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/HOW-IT-WORKS.md +1 -1
- package/MANUAL-SETUP.md +64 -0
- package/README.md +33 -271
- package/REFERENCE.md +212 -0
- package/SETUP-FOR-AGENTS.md +37 -0
- package/dist/bootstrap.js +16 -1
- package/dist/bootstrap.js.map +1 -1
- package/dist/clonePlan.d.ts +9 -0
- package/dist/clonePlan.js +15 -14
- package/dist/clonePlan.js.map +1 -1
- package/dist/currentFinances.d.ts +12 -1
- package/dist/currentFinances.js +60 -0
- package/dist/currentFinances.js.map +1 -1
- package/dist/dataModel.d.ts +58 -0
- package/dist/dataModel.js +1429 -0
- package/dist/dataModel.js.map +1 -0
- package/dist/deletePlan.d.ts +17 -0
- package/dist/deletePlan.js +72 -0
- package/dist/deletePlan.js.map +1 -0
- package/dist/diff.d.ts +288 -0
- package/dist/diff.js +744 -0
- package/dist/diff.js.map +1 -0
- package/dist/errors.js +4 -1
- package/dist/errors.js.map +1 -1
- package/dist/extensionBridge.d.ts +2 -1
- package/dist/extensionBridge.js +31 -4
- package/dist/extensionBridge.js.map +1 -1
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.js +2 -1
- package/dist/instructions.js.map +1 -1
- package/dist/pathPatch.d.ts +5 -2
- package/dist/pathPatch.js +11 -2
- package/dist/pathPatch.js.map +1 -1
- package/dist/planSettings.d.ts +1 -1
- package/dist/planSettings.js +3 -3
- package/dist/planSettings.js.map +1 -1
- package/dist/plans.d.ts +28 -0
- package/dist/plans.js +67 -0
- package/dist/plans.js.map +1 -1
- package/dist/prompts/index.js +7 -4
- package/dist/prompts/index.js.map +1 -1
- package/dist/realEstate.d.ts +22 -0
- package/dist/realEstate.js +118 -0
- package/dist/realEstate.js.map +1 -0
- package/dist/redact.d.ts +2 -0
- package/dist/redact.js +2 -1
- package/dist/redact.js.map +1 -1
- package/dist/resources/dataModel.d.ts +3 -0
- package/dist/resources/dataModel.js +66 -0
- package/dist/resources/dataModel.js.map +1 -0
- package/dist/resources/knowledge.js +189 -47
- package/dist/resources/knowledge.js.map +1 -1
- package/dist/snapshot.d.ts +21 -0
- package/dist/snapshot.js +98 -1
- package/dist/snapshot.js.map +1 -1
- package/dist/summary.js +19 -6
- package/dist/summary.js.map +1 -1
- package/dist/tools/clonePlan.js +14 -5
- package/dist/tools/clonePlan.js.map +1 -1
- package/dist/tools/connection.js +8 -1
- package/dist/tools/connection.js.map +1 -1
- package/dist/tools/deletePlan.d.ts +4 -0
- package/dist/tools/deletePlan.js +103 -0
- package/dist/tools/deletePlan.js.map +1 -0
- package/dist/tools/diff.d.ts +4 -0
- package/dist/tools/diff.js +417 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/getCurrentFinances.js +27 -4
- package/dist/tools/getCurrentFinances.js.map +1 -1
- package/dist/tools/getPlanSection.js +2 -1
- package/dist/tools/getPlanSection.js.map +1 -1
- package/dist/tools/getPlanSettings.js +7 -3
- package/dist/tools/getPlanSettings.js.map +1 -1
- package/dist/tools/schema.js +28 -4
- package/dist/tools/schema.js.map +1 -1
- package/dist/tools/snapshots.d.ts +1 -1
- package/dist/tools/snapshots.js +36 -5
- package/dist/tools/snapshots.js.map +1 -1
- package/dist/tools/summary.js +3 -2
- package/dist/tools/summary.js.map +1 -1
- package/dist/tools/updateAccount.js +9 -7
- package/dist/tools/updateAccount.js.map +1 -1
- package/dist/tools/updatePlanEvent.js +15 -3
- package/dist/tools/updatePlanEvent.js.map +1 -1
- package/dist/tools/updatePlanSection.js +8 -28
- package/dist/tools/updatePlanSection.js.map +1 -1
- package/dist/tools/updatePlanSettings.js +8 -4
- package/dist/tools/updatePlanSettings.js.map +1 -1
- package/dist/types/projectionlab.d.ts +3 -1
- package/package.json +6 -3
- package/skills/projectionlab/SKILL.md +286 -26
package/dist/snapshot.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import type { Snapshot } from "./types/projectionlab.js";
|
|
2
|
+
/** The three mutually exclusive ways a caller can name one snapshot. */
|
|
3
|
+
export interface SnapshotSelectorArgs {
|
|
4
|
+
snapshotId?: string | null;
|
|
5
|
+
nBack?: number | null;
|
|
6
|
+
beforeTime?: string | null;
|
|
7
|
+
}
|
|
2
8
|
export declare class SnapshotManager {
|
|
3
9
|
private dir;
|
|
4
10
|
private initialized;
|
|
@@ -8,3 +14,18 @@ export declare class SnapshotManager {
|
|
|
8
14
|
list(): Promise<Omit<Snapshot, "data">[]>;
|
|
9
15
|
get(snapshotId: string): Promise<Snapshot>;
|
|
10
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a snapshot selector to one snapshot. Shared by
|
|
19
|
+
* projectionlab_rollback and projectionlab_diff so both pick the same
|
|
20
|
+
* snapshot for the same selector.
|
|
21
|
+
*
|
|
22
|
+
* nBack and beforeTime rank snapshots newest first, the order
|
|
23
|
+
* projectionlab_list_snapshots shows, and count every saved snapshot including
|
|
24
|
+
* the rollback_pre_* snapshot a confirmed rollback itself writes. nBack: 1 is
|
|
25
|
+
* therefore always the top of that list, which is the state saved just before
|
|
26
|
+
* a confirmed rollback, so a rollback is undone by rolling back once more.
|
|
27
|
+
*
|
|
28
|
+
* `subject` names the selector in the errors, for example "rollback snapshot"
|
|
29
|
+
* or "from snapshot".
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveSnapshot(snapshots: SnapshotManager, args: SnapshotSelectorArgs, subject?: string): Promise<Snapshot>;
|
package/dist/snapshot.js
CHANGED
|
@@ -8,6 +8,49 @@ import { secureMkdir, secureWriteFile } from "./secureFs.js";
|
|
|
8
8
|
import { log } from "./logger.js";
|
|
9
9
|
const RETENTION_DAYS = 30;
|
|
10
10
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
11
|
+
const SELECTOR_KEYS = ["snapshotId", "nBack", "beforeTime"];
|
|
12
|
+
const SELECTOR_HELP = "Supply exactly one of snapshotId (an exact ID from projectionlab_list_snapshots), " +
|
|
13
|
+
"nBack (how many snapshots back, 1 being the most recent) or " +
|
|
14
|
+
"beforeTime (an ISO 8601 time with an explicit Z or ±HH:MM offset)";
|
|
15
|
+
// Snapshot timestamps are UTC instants. Date.parse reads an offset-less
|
|
16
|
+
// date-time in the host's zone and accepts loose text such as "12345" or
|
|
17
|
+
// "November 8 2026", so beforeTime has to carry its own offset to name one
|
|
18
|
+
// unambiguous instant. A bare date is refused for the same reason: it states
|
|
19
|
+
// no time of day.
|
|
20
|
+
const ISO_TIME_WITH_OFFSET = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d+))?)?(Z|[+-]\d{2}:\d{2})$/i;
|
|
21
|
+
/** The instant a beforeTime names, or NaN when it is not a usable one. */
|
|
22
|
+
function parseBeforeTime(value) {
|
|
23
|
+
const parts = ISO_TIME_WITH_OFFSET.exec(value);
|
|
24
|
+
if (!parts)
|
|
25
|
+
return NaN;
|
|
26
|
+
const ms = Date.parse(value);
|
|
27
|
+
if (Number.isNaN(ms))
|
|
28
|
+
return NaN;
|
|
29
|
+
const offset = parts[8].toUpperCase();
|
|
30
|
+
const offsetMinutes = offset === "Z"
|
|
31
|
+
? 0
|
|
32
|
+
: (offset[0] === "-" ? -1 : 1) *
|
|
33
|
+
(Number(offset.slice(1, 3)) * 60 + Number(offset.slice(4, 6)));
|
|
34
|
+
// Date.parse rolls 31 February over instead of rejecting it, so the wall
|
|
35
|
+
// clock the caller wrote has to survive the round trip.
|
|
36
|
+
const wall = new Date(ms + offsetMinutes * 60_000);
|
|
37
|
+
const matches = wall.getUTCFullYear() === Number(parts[1]) &&
|
|
38
|
+
wall.getUTCMonth() === Number(parts[2]) - 1 &&
|
|
39
|
+
wall.getUTCDate() === Number(parts[3]) &&
|
|
40
|
+
wall.getUTCHours() === Number(parts[4]) &&
|
|
41
|
+
wall.getUTCMinutes() === Number(parts[5]);
|
|
42
|
+
return matches ? ms : NaN;
|
|
43
|
+
}
|
|
44
|
+
function pickSelector(args, subject) {
|
|
45
|
+
const supplied = SELECTOR_KEYS.filter((key) => args[key] !== undefined && args[key] !== null);
|
|
46
|
+
if (supplied.length !== 1) {
|
|
47
|
+
throw new ProjectionLabError("INVALID_INPUT", supplied.length === 0
|
|
48
|
+
? `No ${subject} selector supplied`
|
|
49
|
+
: `Supply exactly one ${subject} selector, received ${supplied.join(" and ")}`, SELECTOR_HELP);
|
|
50
|
+
}
|
|
51
|
+
// Exactly one key is present and is neither undefined nor null.
|
|
52
|
+
return { kind: supplied[0], value: args[supplied[0]] };
|
|
53
|
+
}
|
|
11
54
|
export class SnapshotManager {
|
|
12
55
|
dir = config.snapshotDir;
|
|
13
56
|
initialized = false;
|
|
@@ -75,7 +118,10 @@ export class SnapshotManager {
|
|
|
75
118
|
log.warn("snapshot", `Failed to read snapshot file: ${file}`);
|
|
76
119
|
}
|
|
77
120
|
}
|
|
78
|
-
|
|
121
|
+
// Newest first, with equal millisecond timestamps ordered by id so a
|
|
122
|
+
// recency-based rollback selector picks the same snapshot every time.
|
|
123
|
+
return snapshots.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime() ||
|
|
124
|
+
(a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
79
125
|
}
|
|
80
126
|
async get(snapshotId) {
|
|
81
127
|
await this.ensureDir();
|
|
@@ -99,4 +145,55 @@ export class SnapshotManager {
|
|
|
99
145
|
}
|
|
100
146
|
}
|
|
101
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Resolve a snapshot selector to one snapshot. Shared by
|
|
150
|
+
* projectionlab_rollback and projectionlab_diff so both pick the same
|
|
151
|
+
* snapshot for the same selector.
|
|
152
|
+
*
|
|
153
|
+
* nBack and beforeTime rank snapshots newest first, the order
|
|
154
|
+
* projectionlab_list_snapshots shows, and count every saved snapshot including
|
|
155
|
+
* the rollback_pre_* snapshot a confirmed rollback itself writes. nBack: 1 is
|
|
156
|
+
* therefore always the top of that list, which is the state saved just before
|
|
157
|
+
* a confirmed rollback, so a rollback is undone by rolling back once more.
|
|
158
|
+
*
|
|
159
|
+
* `subject` names the selector in the errors, for example "rollback snapshot"
|
|
160
|
+
* or "from snapshot".
|
|
161
|
+
*/
|
|
162
|
+
export async function resolveSnapshot(snapshots, args, subject = "rollback snapshot") {
|
|
163
|
+
const selector = pickSelector(args, subject);
|
|
164
|
+
switch (selector.kind) {
|
|
165
|
+
case "snapshotId":
|
|
166
|
+
return snapshots.get(selector.value);
|
|
167
|
+
case "nBack": {
|
|
168
|
+
const nBack = selector.value;
|
|
169
|
+
if (!Number.isInteger(nBack) || nBack < 1) {
|
|
170
|
+
throw new ProjectionLabError("INVALID_INPUT", `nBack must be a positive integer with 1 as the most recent snapshot, received ${String(nBack)}`, SELECTOR_HELP);
|
|
171
|
+
}
|
|
172
|
+
const list = await snapshots.list();
|
|
173
|
+
if (nBack > list.length) {
|
|
174
|
+
const existence = list.length === 0
|
|
175
|
+
? "no snapshots exist"
|
|
176
|
+
: `only ${list.length} snapshot${list.length === 1 ? "" : "s"} exist${list.length === 1 ? "s" : ""}`;
|
|
177
|
+
throw new ProjectionLabError("SNAPSHOT_NOT_FOUND", `nBack ${nBack} is out of range; ${existence}`, "Use projectionlab_list_snapshots to see them, or a smaller nBack. " +
|
|
178
|
+
"Snapshots are saved automatically before confirmed writes");
|
|
179
|
+
}
|
|
180
|
+
return snapshots.get(list[nBack - 1].id);
|
|
181
|
+
}
|
|
182
|
+
case "beforeTime": {
|
|
183
|
+
const cutoff = parseBeforeTime(selector.value);
|
|
184
|
+
if (Number.isNaN(cutoff)) {
|
|
185
|
+
throw new ProjectionLabError("INVALID_INPUT", `beforeTime "${selector.value}" is not an ISO 8601 time with an explicit Z or ±HH:MM offset`, "Use a time such as 2026-11-08T15:30:00Z or 2026-11-08T15:30:00+02:00. " +
|
|
186
|
+
"projectionlab_list_snapshots shows snapshot times in that form");
|
|
187
|
+
}
|
|
188
|
+
const list = await snapshots.list();
|
|
189
|
+
const match = list.find((entry) => Date.parse(entry.timestamp) < cutoff);
|
|
190
|
+
if (!match) {
|
|
191
|
+
throw new ProjectionLabError("SNAPSHOT_NOT_FOUND", list.length === 0
|
|
192
|
+
? "No snapshots exist, so nothing predates that beforeTime"
|
|
193
|
+
: `No snapshot predates ${selector.value}; the oldest is ${list[list.length - 1].timestamp}`, "Use projectionlab_list_snapshots to see the saved snapshot times, or a later beforeTime");
|
|
194
|
+
}
|
|
195
|
+
return snapshots.get(match.id);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
102
199
|
//# sourceMappingURL=snapshot.js.map
|
package/dist/snapshot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,OAAO,GACX,iEAAiE,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/summary.js
CHANGED
|
@@ -23,15 +23,28 @@ export function buildSummary(data) {
|
|
|
23
23
|
for (const item of items) {
|
|
24
24
|
if (item && typeof item === "object") {
|
|
25
25
|
const obj = item;
|
|
26
|
-
const balance = Number(obj.balance ?? obj.value ?? 0);
|
|
27
26
|
group.count++;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
if (section === "assets") {
|
|
28
|
+
// In today.assets, amount is market value and balance is the loan balance.
|
|
29
|
+
const marketValue = Number(obj.amount ?? obj.value ?? 0);
|
|
30
|
+
group.total += marketValue;
|
|
31
|
+
totalNetWorth += marketValue;
|
|
32
|
+
// An outstanding loan balance on an asset is subtracted from net worth
|
|
33
|
+
// as a liability. Paid-in-full assets carry balance: 0.
|
|
34
|
+
const loanBalance = Number(obj.balance ?? 0);
|
|
35
|
+
if (loanBalance > 0) {
|
|
36
|
+
totalNetWorth -= loanBalance;
|
|
37
|
+
}
|
|
32
38
|
}
|
|
33
39
|
else {
|
|
34
|
-
|
|
40
|
+
const balance = Number(obj.balance ?? obj.value ?? 0);
|
|
41
|
+
group.total += balance;
|
|
42
|
+
if (section === "debts") {
|
|
43
|
+
totalNetWorth -= Math.abs(balance);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
totalNetWorth += balance;
|
|
47
|
+
}
|
|
35
48
|
}
|
|
36
49
|
}
|
|
37
50
|
}
|
package/dist/summary.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAO7C;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAkB;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAA4C,CAAC;IACnE,MAAM,cAAc,GAAqD,EAAE,CAAC;IAC5E,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG;YACf,oBAAoB;YACpB,iBAAiB;YACjB,OAAO;YACP,QAAQ;SACT,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAI,QAAoC,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,SAAS;YAEpC,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrC,MAAM,GAAG,GAAG,IAA+B,CAAC;oBAC5C,
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/clonePlan.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { buildPlanClone, verifyPlanClone } from "../clonePlan.js";
|
|
3
3
|
import { config } from "../config.js";
|
|
4
|
+
import { currentFinancesProblems } from "../currentFinances.js";
|
|
4
5
|
import { ProjectionLabError, errorResult } from "../errors.js";
|
|
5
6
|
import { log } from "../logger.js";
|
|
6
7
|
import { assertPlansUnchanged } from "../planVersion.js";
|
|
@@ -13,7 +14,8 @@ export function registerClonePlanTool(server, bridge, snapshots) {
|
|
|
13
14
|
"plan is left as it is; the copy is appended. Event ids are kept, as ProjectionLab's own " +
|
|
14
15
|
"plan duplication does, so references between events, milestones and accounts stay intact. " +
|
|
15
16
|
"When confirm is false (default), returns a dry-run preview. When confirm is true, " +
|
|
16
|
-
"auto-snapshots all plans, appends the copy, and verifies the other plans are
|
|
17
|
+
"auto-snapshots all plans, appends the copy, and verifies the other plans are " +
|
|
18
|
+
"unchanged and that no Current Finances balance moved. " +
|
|
17
19
|
"Edit the copy afterwards with projectionlab_update_plan_event or " +
|
|
18
20
|
"projectionlab_update_plan_settings. projectionlab_rollback on the snapshot removes the copy.",
|
|
19
21
|
inputSchema: {
|
|
@@ -85,8 +87,17 @@ export function registerClonePlanTool(server, bridge, snapshots) {
|
|
|
85
87
|
await bridge.restorePlans([...plans, clone]);
|
|
86
88
|
const verifyData = await bridge.exportData({ fresh: true });
|
|
87
89
|
const after = Array.isArray(verifyData.plans) ? verifyData.plans : [];
|
|
88
|
-
const
|
|
90
|
+
const planProblems = verifyPlanClone(plans, after, clone);
|
|
91
|
+
const financeProblems = currentFinancesProblems(data.today, verifyData.today);
|
|
92
|
+
const problems = [...planProblems, ...financeProblems];
|
|
89
93
|
const verified = problems.length === 0;
|
|
94
|
+
let message = "Plan copied and verified. Snapshot saved; projectionlab_rollback with this snapshotId removes the copy.";
|
|
95
|
+
if (!verified) {
|
|
96
|
+
message =
|
|
97
|
+
planProblems.length > 0
|
|
98
|
+
? `Copy sent but verification found problems. Check the plans in ProjectionLab; projectionlab_rollback with snapshotId ${snapshot.id} restores the previous plans.`
|
|
99
|
+
: "Copy landed, but Current Finances changed while the write was in flight. Cloning a plan does not write Current Finances, so this may be an edit made in ProjectionLab. The snapshot holds plans only, so rolling it back removes the copy and restores nothing else.";
|
|
100
|
+
}
|
|
90
101
|
return {
|
|
91
102
|
content: [
|
|
92
103
|
{
|
|
@@ -97,9 +108,7 @@ export function registerClonePlanTool(server, bridge, snapshots) {
|
|
|
97
108
|
verified,
|
|
98
109
|
...(verified ? {} : { verificationProblems: problems }),
|
|
99
110
|
snapshotId: snapshot.id,
|
|
100
|
-
message
|
|
101
|
-
? "Plan copied and verified. Snapshot saved; projectionlab_rollback with this snapshotId removes the copy."
|
|
102
|
-
: `Copy sent but verification found problems. Check the plans in ProjectionLab; projectionlab_rollback with snapshotId ${snapshot.id} restores the previous plans.`,
|
|
111
|
+
message,
|
|
103
112
|
}),
|
|
104
113
|
},
|
|
105
114
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clonePlan.js","sourceRoot":"","sources":["../../src/tools/clonePlan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EACL,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,YAAY,GAEb,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,MAAc,EACd,SAA0B;IAE1B,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,uFAAuF;YACvF,0FAA0F;YAC1F,4FAA4F;YAC5F,oFAAoF;YACpF,
|
|
1
|
+
{"version":3,"file":"clonePlan.js","sourceRoot":"","sources":["../../src/tools/clonePlan.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/connection.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { config } from "../config.js";
|
|
2
3
|
import { errorResult } from "../errors.js";
|
|
3
4
|
import { toJson } from "../json.js";
|
|
4
5
|
export function registerConnectionTool(server, bridge) {
|
|
@@ -6,6 +7,8 @@ export function registerConnectionTool(server, bridge) {
|
|
|
6
7
|
title: "Check Connection",
|
|
7
8
|
description: "Verify connectivity to ProjectionLab. Checks that the browser is running, " +
|
|
8
9
|
"the ProjectionLab page is loaded, the Plugin API is accessible, and the API key is valid. " +
|
|
10
|
+
"Also reports writesEnabled, which is false while the server is in read-only mode " +
|
|
11
|
+
"(PL_READ_ONLY is not \"false\") and every write tool, dry runs included, is refused. " +
|
|
9
12
|
"Call this first in every session, before any other ProjectionLab tool. If any check " +
|
|
10
13
|
"fails, read the projectionlab://guide resource and walk the user through the fix.",
|
|
11
14
|
outputSchema: {
|
|
@@ -14,6 +17,7 @@ export function registerConnectionTool(server, bridge) {
|
|
|
14
17
|
apiAvailable: z.boolean(),
|
|
15
18
|
apiKeyValid: z.boolean(),
|
|
16
19
|
errors: z.array(z.string()),
|
|
20
|
+
writesEnabled: z.boolean(),
|
|
17
21
|
},
|
|
18
22
|
annotations: {
|
|
19
23
|
readOnlyHint: true,
|
|
@@ -22,7 +26,10 @@ export function registerConnectionTool(server, bridge) {
|
|
|
22
26
|
},
|
|
23
27
|
}, async () => {
|
|
24
28
|
try {
|
|
25
|
-
const status =
|
|
29
|
+
const status = {
|
|
30
|
+
...(await bridge.checkConnection()),
|
|
31
|
+
writesEnabled: !config.readOnly,
|
|
32
|
+
};
|
|
26
33
|
return {
|
|
27
34
|
content: [{ type: "text", text: toJson(status) }],
|
|
28
35
|
structuredContent: { ...status },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/tools/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,MAAc;IAEd,MAAM,CAAC,YAAY,CACjB,gCAAgC,EAChC;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,4EAA4E;YAC5E,4FAA4F;YAC5F,sFAAsF;YACtF,mFAAmF;QACrF,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;YACpB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;YACvB,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE;YACzB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE;YACxB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/tools/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,MAAc;IAEd,MAAM,CAAC,YAAY,CACjB,gCAAgC,EAChC;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,4EAA4E;YAC5E,4FAA4F;YAC5F,mFAAmF;YACnF,uFAAuF;YACvF,sFAAsF;YACtF,mFAAmF;QACrF,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;YACpB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;YACvB,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE;YACzB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE;YACxB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAC3B,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE;SAC3B;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG;gBACb,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;gBACnC,aAAa,EAAE,CAAC,MAAM,CAAC,QAAQ;aAChC,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjD,iBAAiB,EAAE,EAAE,GAAG,MAAM,EAAE;aACjC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,mCAAmC,EACnC;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,mFAAmF;YACnF,kFAAkF;YAClF,uEAAuE;QACzE,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;aAC/C,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { Bridge } from "../bridge.js";
|
|
3
|
+
import type { SnapshotManager } from "../snapshot.js";
|
|
4
|
+
export declare function registerDeletePlanTool(server: McpServer, bridge: Bridge, snapshots: SnapshotManager): void;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
import { selectPlanForDeletion, verifyPlanDeletion, withoutPlan } from "../deletePlan.js";
|
|
4
|
+
import { ProjectionLabError, errorResult } from "../errors.js";
|
|
5
|
+
import { log } from "../logger.js";
|
|
6
|
+
import { assertPlansUnchanged } from "../planVersion.js";
|
|
7
|
+
import { toJson } from "../json.js";
|
|
8
|
+
import { getEvents, requirePlans } from "../plans.js";
|
|
9
|
+
export function registerDeletePlanTool(server, bridge, snapshots) {
|
|
10
|
+
server.registerTool("projectionlab_delete_plan", {
|
|
11
|
+
title: "Delete Plan",
|
|
12
|
+
description: "Permanently removes one plan by exact plan ID; names are never matched, so get the ID " +
|
|
13
|
+
"from projectionlab_describe_schema first. Refuses the last remaining plan. " +
|
|
14
|
+
"When confirm is false (default), returns a dry-run preview. When confirm is true, " +
|
|
15
|
+
"auto-snapshots all plans, writes the remaining plans, and verifies the deleted plan is " +
|
|
16
|
+
"gone while every other plan is unchanged. projectionlab_rollback on the snapshot " +
|
|
17
|
+
"restores the deleted plan.",
|
|
18
|
+
inputSchema: {
|
|
19
|
+
planId: z
|
|
20
|
+
.string()
|
|
21
|
+
.trim()
|
|
22
|
+
.min(1)
|
|
23
|
+
.describe("Exact plan ID only (from projectionlab_describe_schema). Names are not accepted for deletion."),
|
|
24
|
+
confirm: z
|
|
25
|
+
.boolean()
|
|
26
|
+
.default(false)
|
|
27
|
+
.describe("Set to true to execute. Default false returns a dry-run preview."),
|
|
28
|
+
},
|
|
29
|
+
annotations: {
|
|
30
|
+
readOnlyHint: false,
|
|
31
|
+
destructiveHint: true,
|
|
32
|
+
idempotentHint: false,
|
|
33
|
+
openWorldHint: true,
|
|
34
|
+
},
|
|
35
|
+
}, async ({ planId, confirm }) => {
|
|
36
|
+
try {
|
|
37
|
+
if (config.readOnly) {
|
|
38
|
+
throw new ProjectionLabError("READ_ONLY_MODE", "Write operations are disabled (read-only mode; PL_READ_ONLY is not \"false\")", "Ask the user whether to enable writes: set PL_READ_ONLY=false in the MCP host env block or ~/.projectionlab-mcp/.env, then restart the server");
|
|
39
|
+
}
|
|
40
|
+
const data = await bridge.exportData({ fresh: true });
|
|
41
|
+
const plans = requirePlans(data);
|
|
42
|
+
const target = selectPlanForDeletion(plans, planId);
|
|
43
|
+
const preview = {
|
|
44
|
+
plan: { name: target.name, id: target.id },
|
|
45
|
+
planCount: `${plans.length} → ${plans.length - 1}`,
|
|
46
|
+
eventCounts: {
|
|
47
|
+
income: getEvents(target.income).length,
|
|
48
|
+
expenses: getEvents(target.expenses).length,
|
|
49
|
+
accounts: getEvents(target.accounts).length,
|
|
50
|
+
assets: getEvents(target.assets).length,
|
|
51
|
+
milestones: getEvents(target.milestones).length,
|
|
52
|
+
priorities: getEvents(target.priorities).length,
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
if (!confirm) {
|
|
56
|
+
return {
|
|
57
|
+
content: [
|
|
58
|
+
{
|
|
59
|
+
type: "text",
|
|
60
|
+
text: toJson({
|
|
61
|
+
dryRun: true,
|
|
62
|
+
operation: "deletePlan",
|
|
63
|
+
...preview,
|
|
64
|
+
warning: `This will delete plan "${String(target.name)}" and all of its events. Set confirm=true to proceed. The plans are snapshotted first, so projectionlab_rollback can restore the plan.`,
|
|
65
|
+
}),
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const snapshot = await snapshots.create("deletePlan", ["plans"], {
|
|
71
|
+
plans,
|
|
72
|
+
});
|
|
73
|
+
await assertPlansUnchanged(bridge, plans);
|
|
74
|
+
log.info("deletePlan", `Deleting plan "${String(target.name)}"`);
|
|
75
|
+
await bridge.restorePlans(withoutPlan(plans, String(target.id)));
|
|
76
|
+
const verifyData = await bridge.exportData({ fresh: true });
|
|
77
|
+
const after = Array.isArray(verifyData.plans) ? verifyData.plans : [];
|
|
78
|
+
const problems = verifyPlanDeletion(plans, after, String(target.id));
|
|
79
|
+
const verified = problems.length === 0;
|
|
80
|
+
return {
|
|
81
|
+
content: [
|
|
82
|
+
{
|
|
83
|
+
type: "text",
|
|
84
|
+
text: toJson({
|
|
85
|
+
success: true,
|
|
86
|
+
...preview,
|
|
87
|
+
verified,
|
|
88
|
+
...(verified ? {} : { verificationProblems: problems }),
|
|
89
|
+
snapshotId: snapshot.id,
|
|
90
|
+
message: verified
|
|
91
|
+
? "Plan deleted and verified. Snapshot saved; projectionlab_rollback with this snapshotId restores the plan."
|
|
92
|
+
: `Delete sent but verification found problems. Check the plans in ProjectionLab; projectionlab_rollback with snapshotId ${snapshot.id} restores the previous plans.`,
|
|
93
|
+
}),
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
return errorResult(err);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=deletePlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deletePlan.js","sourceRoot":"","sources":["../../src/tools/deletePlan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { Bridge } from "../bridge.js";
|
|
3
|
+
import { type SnapshotManager } from "../snapshot.js";
|
|
4
|
+
export declare function registerDiffTool(server: McpServer, bridge: Bridge, snapshots: SnapshotManager): void;
|