@planu/cli 0.20.0 → 0.22.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/dist/config/license-plans.json +4 -0
- package/dist/engine/license-validator/core.js +1 -1
- package/dist/engine/license-validator/core.js.map +1 -1
- package/dist/engine/usage-tracker/core.d.ts +20 -0
- package/dist/engine/usage-tracker/core.d.ts.map +1 -0
- package/dist/engine/usage-tracker/core.js +68 -0
- package/dist/engine/usage-tracker/core.js.map +1 -0
- package/dist/engine/usage-tracker/index.d.ts +5 -0
- package/dist/engine/usage-tracker/index.d.ts.map +1 -0
- package/dist/engine/usage-tracker/index.js +6 -0
- package/dist/engine/usage-tracker/index.js.map +1 -0
- package/dist/engine/usage-tracker/rate-limiter.d.ts +14 -0
- package/dist/engine/usage-tracker/rate-limiter.d.ts.map +1 -0
- package/dist/engine/usage-tracker/rate-limiter.js +73 -0
- package/dist/engine/usage-tracker/rate-limiter.js.map +1 -0
- package/dist/engine/usage-tracker/stats.d.ts +11 -0
- package/dist/engine/usage-tracker/stats.d.ts.map +1 -0
- package/dist/engine/usage-tracker/stats.js +85 -0
- package/dist/engine/usage-tracker/stats.js.map +1 -0
- package/dist/engine/usage-tracker/trial.d.ts +22 -0
- package/dist/engine/usage-tracker/trial.d.ts.map +1 -0
- package/dist/engine/usage-tracker/trial.js +41 -0
- package/dist/engine/usage-tracker/trial.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/usage-store.d.ts +9 -0
- package/dist/storage/usage-store.d.ts.map +1 -0
- package/dist/storage/usage-store.js +74 -0
- package/dist/storage/usage-store.js.map +1 -0
- package/dist/tools/activate-license.js +1 -1
- package/dist/tools/activate-license.js.map +1 -1
- package/dist/tools/license-status.js +1 -1
- package/dist/tools/license-status.js.map +1 -1
- package/dist/tools/register-usage-tools.d.ts +3 -0
- package/dist/tools/register-usage-tools.d.ts.map +1 -0
- package/dist/tools/register-usage-tools.js +33 -0
- package/dist/tools/register-usage-tools.js.map +1 -0
- package/dist/tools/usage-report.d.ts +3 -0
- package/dist/tools/usage-report.d.ts.map +1 -0
- package/dist/tools/usage-report.js +35 -0
- package/dist/tools/usage-report.js.map +1 -0
- package/dist/tools/usage-stats.d.ts +3 -0
- package/dist/tools/usage-stats.d.ts.map +1 -0
- package/dist/tools/usage-stats.js +33 -0
- package/dist/tools/usage-stats.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/usage.d.ts +69 -0
- package/dist/types/usage.d.ts.map +1 -0
- package/dist/types/usage.js +4 -0
- package/dist/types/usage.js.map +1 -0
- package/package.json +1 -1
- package/src/config/license-plans.json +4 -0
|
@@ -65,7 +65,7 @@ export function checkToolAccess(toolName, tier) {
|
|
|
65
65
|
message: [
|
|
66
66
|
`🔒 "${toolName}" requires a Pro or higher plan.`,
|
|
67
67
|
`You are currently on the Free plan (20 tools available).`,
|
|
68
|
-
`Upgrade at ${config.upgradeUrl} to unlock all
|
|
68
|
+
`Upgrade at ${config.upgradeUrl} to unlock all 65 tools.`,
|
|
69
69
|
'',
|
|
70
70
|
'To activate a license key:',
|
|
71
71
|
' → Use the activate_license tool with your license key.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/license-validator/core.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8FAA8F;AAQ9F,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,UAAU;AAE9D,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,UAAU,kBAAkB,CAAC,KAA0B;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,MAAM,WAAW,GAAgC;IAC/C,GAAG,EAAE,KAAK;IACV,WAAW,EAAE,KAAK;IAClB,mBAAmB,EAAE,KAAK;IAC1B,kBAAkB,EAAE,KAAK;IACzB,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,MAAM;IACpB,oBAAoB,EAAE,MAAM;IAC5B,mBAAmB,EAAE,MAAM;IAC3B,UAAU,EAAE,YAAY;IACxB,kBAAkB,EAAE,YAAY;IAChC,0BAA0B,EAAE,YAAY;IACxC,yBAAyB,EAAE,YAAY;CACxC,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACpD,OAAO,WAAW,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;AAC1C,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAiB;IAC/D,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,iDAAiD;IACjD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,IAAiB;IACjE,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC9F,CAAC;IACD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,OAAO;QACL,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,KAAK;QACnB,OAAO,EAAE;YACP,OAAO,QAAQ,kCAAkC;YACjD,0DAA0D;YAC1D,cAAc,MAAM,CAAC,UAAU,
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/license-validator/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { UsageEvent, PricingTier } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a new UsageEvent object. Does NOT persist — that is storage's job.
|
|
4
|
+
*/
|
|
5
|
+
export declare function recordUsageEvent(toolName: string, tier: PricingTier, success: boolean): UsageEvent;
|
|
6
|
+
/**
|
|
7
|
+
* Returns events within the specified time period relative to now.
|
|
8
|
+
* 'all' returns the full array unchanged.
|
|
9
|
+
*/
|
|
10
|
+
export declare function filterEventsByPeriod(events: readonly UsageEvent[], period: '7d' | '30d' | 'all'): readonly UsageEvent[];
|
|
11
|
+
/**
|
|
12
|
+
* Counts events whose timestamp matches the given YYYY-MM-DD date string.
|
|
13
|
+
* Comparison is based on UTC date extraction from ISO 8601 timestamps.
|
|
14
|
+
*/
|
|
15
|
+
export declare function countEventsForDate(events: readonly UsageEvent[], date: string): number;
|
|
16
|
+
/**
|
|
17
|
+
* Returns the most recent event's timestamp, or null if the array is empty.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getLastEventTimestamp(events: readonly UsageEvent[]): string | null;
|
|
20
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/engine/usage-tracker/core.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMpE;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,OAAO,GACf,UAAU,CAOZ;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,MAAM,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,GAC3B,SAAS,UAAU,EAAE,CAcvB;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtF;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI,CAalF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// engine/usage-tracker/core.ts — Core usage event recording and filtering logic.
|
|
2
|
+
// All functions are pure (no I/O). Storage layer handles persistence.
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Event creation
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
/**
|
|
7
|
+
* Creates a new UsageEvent object. Does NOT persist — that is storage's job.
|
|
8
|
+
*/
|
|
9
|
+
export function recordUsageEvent(toolName, tier, success) {
|
|
10
|
+
return {
|
|
11
|
+
toolName,
|
|
12
|
+
tier,
|
|
13
|
+
timestamp: new Date().toISOString(),
|
|
14
|
+
success,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Period filtering
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/**
|
|
21
|
+
* Returns events within the specified time period relative to now.
|
|
22
|
+
* 'all' returns the full array unchanged.
|
|
23
|
+
*/
|
|
24
|
+
export function filterEventsByPeriod(events, period) {
|
|
25
|
+
if (period === 'all') {
|
|
26
|
+
return events;
|
|
27
|
+
}
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
const periodDays = period === '7d' ? 7 : 30;
|
|
30
|
+
const cutoffMs = periodDays * 24 * 60 * 60 * 1000;
|
|
31
|
+
const cutoffTime = now - cutoffMs;
|
|
32
|
+
return events.filter((event) => {
|
|
33
|
+
const eventTime = new Date(event.timestamp).getTime();
|
|
34
|
+
return eventTime >= cutoffTime;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Date-based counting
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
/**
|
|
41
|
+
* Counts events whose timestamp matches the given YYYY-MM-DD date string.
|
|
42
|
+
* Comparison is based on UTC date extraction from ISO 8601 timestamps.
|
|
43
|
+
*/
|
|
44
|
+
export function countEventsForDate(events, date) {
|
|
45
|
+
return events.filter((event) => {
|
|
46
|
+
const eventDate = event.timestamp.slice(0, 10);
|
|
47
|
+
return eventDate === date;
|
|
48
|
+
}).length;
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Timestamp helpers
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
/**
|
|
54
|
+
* Returns the most recent event's timestamp, or null if the array is empty.
|
|
55
|
+
*/
|
|
56
|
+
export function getLastEventTimestamp(events) {
|
|
57
|
+
if (events.length === 0) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
let latest = events[0];
|
|
61
|
+
for (const event of events) {
|
|
62
|
+
if (event.timestamp > (latest?.timestamp ?? '')) {
|
|
63
|
+
latest = event;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return latest?.timestamp ?? null;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/usage-tracker/core.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,sEAAsE;AAItE,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,IAAiB,EACjB,OAAgB;IAEhB,OAAO;QACL,QAAQ;QACR,IAAI;QACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;KACR,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAA6B,EAC7B,MAA4B;IAE5B,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAClD,MAAM,UAAU,GAAG,GAAG,GAAG,QAAQ,CAAC;IAElC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QACtD,OAAO,SAAS,IAAI,UAAU,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA6B,EAAE,IAAY;IAC5E,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,SAAS,KAAK,IAAI,CAAC;IAC5B,CAAC,CAAC,CAAC,MAAM,CAAC;AACZ,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA6B;IACjE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACvB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;YAChD,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { recordUsageEvent, filterEventsByPeriod, countEventsForDate, getLastEventTimestamp, } from './core.js';
|
|
2
|
+
export { calculateUsageStats, formatStatsAsMarkdown } from './stats.js';
|
|
3
|
+
export { TRIAL_DAYS, calculateDaysSinceFirstRun, isTrialActive, getTrialLimits } from './trial.js';
|
|
4
|
+
export { COOLDOWN_MS, checkDailyLimit, checkCooldown } from './rate-limiter.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/usage-tracker/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,0BAA0B,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEnG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// engine/usage-tracker/index.ts — Barrel re-export for usage-tracker engine module.
|
|
2
|
+
export { recordUsageEvent, filterEventsByPeriod, countEventsForDate, getLastEventTimestamp, } from './core.js';
|
|
3
|
+
export { calculateUsageStats, formatStatsAsMarkdown } from './stats.js';
|
|
4
|
+
export { TRIAL_DAYS, calculateDaysSinceFirstRun, isTrialActive, getTrialLimits } from './trial.js';
|
|
5
|
+
export { COOLDOWN_MS, checkDailyLimit, checkCooldown } from './rate-limiter.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/usage-tracker/index.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,0BAA0B,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEnG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RateLimitResult } from '../../types/index.js';
|
|
2
|
+
/** Minimum milliseconds required between consecutive tool calls. */
|
|
3
|
+
export declare const COOLDOWN_MS = 2000;
|
|
4
|
+
/**
|
|
5
|
+
* Checks whether the caller has exceeded the daily call limit.
|
|
6
|
+
* Returns an allowed result when maxCalls is -1 (unlimited).
|
|
7
|
+
*/
|
|
8
|
+
export declare function checkDailyLimit(callCount: number, maxCalls: number): RateLimitResult;
|
|
9
|
+
/**
|
|
10
|
+
* Checks whether enough time has passed since the last tool call.
|
|
11
|
+
* Passes when lastCallAt is null (no previous call recorded).
|
|
12
|
+
*/
|
|
13
|
+
export declare function checkCooldown(lastCallAt: string | null, now: Date): RateLimitResult;
|
|
14
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../src/engine/usage-tracker/rate-limiter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAM5D,oEAAoE;AACpE,eAAO,MAAM,WAAW,OAAO,CAAC;AAMhC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CA2BpF;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,eAAe,CA6BnF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// engine/usage-tracker/rate-limiter.ts — Rate limiting logic (pure functions, no I/O).
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Constants
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/** Minimum milliseconds required between consecutive tool calls. */
|
|
6
|
+
export const COOLDOWN_MS = 2000;
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Daily limit check
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
/**
|
|
11
|
+
* Checks whether the caller has exceeded the daily call limit.
|
|
12
|
+
* Returns an allowed result when maxCalls is -1 (unlimited).
|
|
13
|
+
*/
|
|
14
|
+
export function checkDailyLimit(callCount, maxCalls) {
|
|
15
|
+
if (maxCalls === -1) {
|
|
16
|
+
return {
|
|
17
|
+
allowed: true,
|
|
18
|
+
reason: null,
|
|
19
|
+
message: 'Unlimited calls available.',
|
|
20
|
+
remainingCalls: -1,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const remaining = maxCalls - callCount;
|
|
24
|
+
if (remaining <= 0) {
|
|
25
|
+
return {
|
|
26
|
+
allowed: false,
|
|
27
|
+
reason: 'daily_limit',
|
|
28
|
+
message: `Daily call limit of ${String(maxCalls)} reached. Limit resets at midnight UTC.`,
|
|
29
|
+
remainingCalls: 0,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
allowed: true,
|
|
34
|
+
reason: null,
|
|
35
|
+
message: `${String(remaining)} of ${String(maxCalls)} daily calls remaining.`,
|
|
36
|
+
remainingCalls: remaining,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Cooldown check
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/**
|
|
43
|
+
* Checks whether enough time has passed since the last tool call.
|
|
44
|
+
* Passes when lastCallAt is null (no previous call recorded).
|
|
45
|
+
*/
|
|
46
|
+
export function checkCooldown(lastCallAt, now) {
|
|
47
|
+
if (lastCallAt === null) {
|
|
48
|
+
return {
|
|
49
|
+
allowed: true,
|
|
50
|
+
reason: null,
|
|
51
|
+
message: 'No previous call recorded.',
|
|
52
|
+
remainingCalls: -1,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const lastCallMs = new Date(lastCallAt).getTime();
|
|
56
|
+
const elapsedMs = now.getTime() - lastCallMs;
|
|
57
|
+
if (elapsedMs < COOLDOWN_MS) {
|
|
58
|
+
const waitMs = COOLDOWN_MS - elapsedMs;
|
|
59
|
+
return {
|
|
60
|
+
allowed: false,
|
|
61
|
+
reason: 'cooldown',
|
|
62
|
+
message: `Rate limit: please wait ${String(waitMs)}ms before the next call.`,
|
|
63
|
+
remainingCalls: -1,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
allowed: true,
|
|
68
|
+
reason: null,
|
|
69
|
+
message: 'Cooldown period elapsed.',
|
|
70
|
+
remainingCalls: -1,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/engine/usage-tracker/rate-limiter.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAIvF,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,oEAAoE;AACpE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAEhC,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,QAAgB;IACjE,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,4BAA4B;YACrC,cAAc,EAAE,CAAC,CAAC;SACnB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAEvC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,uBAAuB,MAAM,CAAC,QAAQ,CAAC,yCAAyC;YACzF,cAAc,EAAE,CAAC;SAClB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,MAAM,CAAC,QAAQ,CAAC,yBAAyB;QAC7E,cAAc,EAAE,SAAS;KAC1B,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,UAAyB,EAAE,GAAS;IAChE,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,4BAA4B;YACrC,cAAc,EAAE,CAAC,CAAC;SACnB,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IAClD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC;IAE7C,IAAI,SAAS,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,2BAA2B,MAAM,CAAC,MAAM,CAAC,0BAA0B;YAC5E,cAAc,EAAE,CAAC,CAAC;SACnB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,0BAA0B;QACnC,cAAc,EAAE,CAAC,CAAC;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { UsageEvent, UsageStats, PricingTier } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Computes full UsageStats from a set of events and runtime context.
|
|
4
|
+
* All parameters are passed in — no I/O performed here.
|
|
5
|
+
*/
|
|
6
|
+
export declare function calculateUsageStats(events: readonly UsageEvent[], activeSpecs: number, activeProjects: number, currentTier: PricingTier, daysSinceFirstRun: number, isTrialActive: boolean, remainingDailyCalls: number): UsageStats;
|
|
7
|
+
/**
|
|
8
|
+
* Formats a UsageStats object as a readable markdown report.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatStatsAsMarkdown(stats: UsageStats): string;
|
|
11
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/engine/usage-tracker/stats.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMhF;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,MAAM,EACzB,aAAa,EAAE,OAAO,EACtB,mBAAmB,EAAE,MAAM,GAC1B,UAAU,CAuBZ;AAoBD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CA8C/D"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// engine/usage-tracker/stats.ts — Usage statistics calculation (pure functions, no I/O).
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Stats calculation
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* Computes full UsageStats from a set of events and runtime context.
|
|
7
|
+
* All parameters are passed in — no I/O performed here.
|
|
8
|
+
*/
|
|
9
|
+
export function calculateUsageStats(events, activeSpecs, activeProjects, currentTier, daysSinceFirstRun, isTrialActive, remainingDailyCalls) {
|
|
10
|
+
const callsByTool = {};
|
|
11
|
+
const callsByTier = {};
|
|
12
|
+
for (const event of events) {
|
|
13
|
+
callsByTool[event.toolName] = (callsByTool[event.toolName] ?? 0) + 1;
|
|
14
|
+
callsByTier[event.tier] = (callsByTier[event.tier] ?? 0) + 1;
|
|
15
|
+
}
|
|
16
|
+
const topTools = buildTopTools(callsByTool, 10);
|
|
17
|
+
return {
|
|
18
|
+
totalCalls: events.length,
|
|
19
|
+
callsByTool,
|
|
20
|
+
callsByTier,
|
|
21
|
+
topTools,
|
|
22
|
+
activeSpecs,
|
|
23
|
+
activeProjects,
|
|
24
|
+
currentTier,
|
|
25
|
+
daysSinceFirstRun,
|
|
26
|
+
isTrialActive,
|
|
27
|
+
remainingDailyCalls,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Top tools helper
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
function buildTopTools(callsByTool, limit) {
|
|
34
|
+
return Object.entries(callsByTool)
|
|
35
|
+
.map(([name, count]) => ({ name, count }))
|
|
36
|
+
.sort((a, b) => b.count - a.count)
|
|
37
|
+
.slice(0, limit);
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Markdown formatting
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/**
|
|
43
|
+
* Formats a UsageStats object as a readable markdown report.
|
|
44
|
+
*/
|
|
45
|
+
export function formatStatsAsMarkdown(stats) {
|
|
46
|
+
const lines = [];
|
|
47
|
+
lines.push('## Usage Statistics');
|
|
48
|
+
lines.push('');
|
|
49
|
+
lines.push(`**Tier:** ${stats.currentTier}`);
|
|
50
|
+
lines.push(`**Days since first run:** ${String(stats.daysSinceFirstRun)}`);
|
|
51
|
+
lines.push(`**Trial active:** ${stats.isTrialActive ? 'Yes' : 'No'}`);
|
|
52
|
+
lines.push(`**Total calls:** ${String(stats.totalCalls)}`);
|
|
53
|
+
lines.push(`**Active specs:** ${String(stats.activeSpecs)}`);
|
|
54
|
+
lines.push(`**Active projects:** ${String(stats.activeProjects)}`);
|
|
55
|
+
if (stats.remainingDailyCalls >= 0) {
|
|
56
|
+
lines.push(`**Remaining daily calls:** ${String(stats.remainingDailyCalls)}`);
|
|
57
|
+
}
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push('### Top Tools');
|
|
60
|
+
lines.push('');
|
|
61
|
+
lines.push('| Tool | Calls |');
|
|
62
|
+
lines.push('|------|-------|');
|
|
63
|
+
for (const tool of stats.topTools) {
|
|
64
|
+
lines.push(`| ${tool.name} | ${String(tool.count)} |`);
|
|
65
|
+
}
|
|
66
|
+
if (stats.topTools.length === 0) {
|
|
67
|
+
lines.push('| *(no calls yet)* | 0 |');
|
|
68
|
+
}
|
|
69
|
+
lines.push('');
|
|
70
|
+
lines.push('### Calls by Tier');
|
|
71
|
+
lines.push('');
|
|
72
|
+
lines.push('| Tier | Calls |');
|
|
73
|
+
lines.push('|------|-------|');
|
|
74
|
+
const tierEntries = Object.entries(stats.callsByTier);
|
|
75
|
+
if (tierEntries.length === 0) {
|
|
76
|
+
lines.push('| *(none)* | 0 |');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
for (const [tier, count] of tierEntries) {
|
|
80
|
+
lines.push(`| ${tier} | ${String(count)} |`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return lines.join('\n');
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/engine/usage-tracker/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Number of days in the full trial period. */
|
|
2
|
+
export declare const TRIAL_DAYS = 14;
|
|
3
|
+
/**
|
|
4
|
+
* Returns the number of whole days elapsed since the given ISO 8601 timestamp.
|
|
5
|
+
*/
|
|
6
|
+
export declare function calculateDaysSinceFirstRun(firstRunAt: string): number;
|
|
7
|
+
/**
|
|
8
|
+
* Returns true if the installation is still within the 14-day trial period.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isTrialActive(firstRunAt: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Returns tool/spec/daily-call limits based on the current trial status.
|
|
13
|
+
*
|
|
14
|
+
* - Day 1–14 (trial active): { tools: 20, specs: 5, dailyCalls: 50 }
|
|
15
|
+
* - Day 15+ (trial expired): { tools: 10, specs: 3, dailyCalls: 30 }
|
|
16
|
+
*/
|
|
17
|
+
export declare function getTrialLimits(firstRunAt: string): {
|
|
18
|
+
tools: number;
|
|
19
|
+
specs: number;
|
|
20
|
+
dailyCalls: number;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=trial.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trial.d.ts","sourceRoot":"","sources":["../../../src/engine/usage-tracker/trial.ts"],"names":[],"mappings":"AAMA,+CAA+C;AAC/C,eAAO,MAAM,UAAU,KAAK,CAAC;AAQ7B;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAKrE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzD;AAMD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAKA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// engine/usage-tracker/trial.ts — Trial period logic (pure functions, no I/O).
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Constants
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/** Number of days in the full trial period. */
|
|
6
|
+
export const TRIAL_DAYS = 14;
|
|
7
|
+
const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Trial calculations
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
/**
|
|
12
|
+
* Returns the number of whole days elapsed since the given ISO 8601 timestamp.
|
|
13
|
+
*/
|
|
14
|
+
export function calculateDaysSinceFirstRun(firstRunAt) {
|
|
15
|
+
const firstRunMs = new Date(firstRunAt).getTime();
|
|
16
|
+
const nowMs = Date.now();
|
|
17
|
+
const elapsedMs = nowMs - firstRunMs;
|
|
18
|
+
return Math.floor(elapsedMs / MS_PER_DAY);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Returns true if the installation is still within the 14-day trial period.
|
|
22
|
+
*/
|
|
23
|
+
export function isTrialActive(firstRunAt) {
|
|
24
|
+
return calculateDaysSinceFirstRun(firstRunAt) < TRIAL_DAYS;
|
|
25
|
+
}
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Limit resolution
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
/**
|
|
30
|
+
* Returns tool/spec/daily-call limits based on the current trial status.
|
|
31
|
+
*
|
|
32
|
+
* - Day 1–14 (trial active): { tools: 20, specs: 5, dailyCalls: 50 }
|
|
33
|
+
* - Day 15+ (trial expired): { tools: 10, specs: 3, dailyCalls: 30 }
|
|
34
|
+
*/
|
|
35
|
+
export function getTrialLimits(firstRunAt) {
|
|
36
|
+
if (isTrialActive(firstRunAt)) {
|
|
37
|
+
return { tools: 20, specs: 5, dailyCalls: 50 };
|
|
38
|
+
}
|
|
39
|
+
return { tools: 10, specs: 3, dailyCalls: 30 };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=trial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trial.js","sourceRoot":"","sources":["../../../src/engine/usage-tracker/trial.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,+CAA+C;AAC/C,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAE7B,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,UAAkB;IAC3D,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,CAAC;IACrC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,0BAA0B,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAC7D,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB;IAK/C,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AACjD,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -21,6 +21,7 @@ import { registerCheckConfigHealthTool } from './tools/check-config-health.js';
|
|
|
21
21
|
import { registerAgentTools } from './tools/register-agent-tools.js';
|
|
22
22
|
import { registerWorkflowTools } from './tools/register-workflow-tools.js';
|
|
23
23
|
import { registerLicenseTools } from './tools/register-license-tools.js';
|
|
24
|
+
import { registerUsageTools } from './tools/register-usage-tools.js';
|
|
24
25
|
import { PLANU_VERSION } from './config/version.js';
|
|
25
26
|
import { handleActivateLicense } from './tools/activate-license.js';
|
|
26
27
|
// ---------------------------------------------------------------------------
|
|
@@ -93,6 +94,7 @@ registerCheckConfigHealthTool(server);
|
|
|
93
94
|
registerAgentTools(server);
|
|
94
95
|
registerWorkflowTools(server);
|
|
95
96
|
registerLicenseTools(server);
|
|
97
|
+
registerUsageTools(server);
|
|
96
98
|
// ---------------------------------------------------------------------------
|
|
97
99
|
// Start server
|
|
98
100
|
// ---------------------------------------------------------------------------
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,+CAA+C;AAC/C,mFAAmF;AAEnF,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;IACE,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,aAAa;CACvB,EACD;IACE,YAAY,EAAE;QACZ,6FAA6F;QAC7F,EAAE;QACF,wDAAwD;QACxD,EAAE;QACF,wFAAwF;QACxF,0FAA0F;QAC1F,qFAAqF;QACrF,8EAA8E;QAC9E,yEAAyE;QACzE,6EAA6E;QAC7E,6EAA6E;QAC7E,+HAA+H;QAC/H,oGAAoG;QACpG,qFAAqF;QACrF,2FAA2F;QAC3F,oGAAoG;QACpG,gHAAgH;QAChH,0FAA0F;QAC1F,qFAAqF;QACrF,gGAAgG;QAChG,yEAAyE;QACzE,kGAAkG;QAClG,sHAAsH;QACtH,yFAAyF;QACzF,yEAAyE;QACzE,qFAAqF;QACrF,EAAE;QACF,6DAA6D;QAC7D,sEAAsE;QACtE,+EAA+E;QAC/E,kFAAkF;QAClF,gFAAgF;QAChF,EAAE;QACF,iDAAiD;QACjD,mHAAmH;QACnH,wHAAwH;QACxH,wFAAwF;QACxF,uGAAuG;QACvG,4IAA4I;KAC7I,CAAC,IAAI,CAAC,IAAI,CAAC;CACb,CACF,CAAC;AAEF,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAE9E,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,6BAA6B,CAAC,MAAM,CAAC,CAAC;AACtC,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,oBAAoB,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -6,4 +6,5 @@ export * as knowledgeStore from './knowledge-store.js';
|
|
|
6
6
|
export * as globalStore from './global-store.js';
|
|
7
7
|
export * as decisionStore from './decision-store.js';
|
|
8
8
|
export * as licenseStore from './license-store.js';
|
|
9
|
+
export * as usageStore from './usage-store.js';
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,QAAQ,EACR,SAAS,EACT,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,QAAQ,EACR,SAAS,EACT,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC"}
|
package/dist/storage/index.js
CHANGED
|
@@ -7,4 +7,5 @@ export * as knowledgeStore from './knowledge-store.js';
|
|
|
7
7
|
export * as globalStore from './global-store.js';
|
|
8
8
|
export * as decisionStore from './decision-store.js';
|
|
9
9
|
export * as licenseStore from './license-store.js';
|
|
10
|
+
export * as usageStore from './usage-store.js';
|
|
10
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,eAAe,EACf,QAAQ,EACR,SAAS,EACT,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,eAAe,EACf,QAAQ,EACR,SAAS,EACT,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { UsageLog, UsageEvent, TrialState } from '../types/index.js';
|
|
2
|
+
export declare function getUsageLog(): Promise<UsageLog>;
|
|
3
|
+
export declare function appendUsageEvent(event: UsageEvent): Promise<void>;
|
|
4
|
+
export declare function rotateUsageLog(): Promise<void>;
|
|
5
|
+
export declare function getTrialState(): Promise<TrialState | null>;
|
|
6
|
+
export declare function ensureTrialState(): Promise<TrialState>;
|
|
7
|
+
export declare function getDailyCallCount(date: string): Promise<number>;
|
|
8
|
+
export declare function getLastCallTimestamp(): Promise<string | null>;
|
|
9
|
+
//# sourceMappingURL=usage-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-store.d.ts","sourceRoot":"","sources":["../../src/storage/usage-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAyB1E,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CAErD;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAWvE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CASpD;AAMD,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAEhE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC,CAQ5D;AAMD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGrE;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOnE"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// storage/usage-store.ts — Persistence layer for usage tracking (data/global/usage.json + first-run.json).
|
|
2
|
+
import { rename } from 'node:fs/promises';
|
|
3
|
+
import { readJson, writeJson, globalDataDir } from './base-store.js';
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Constants
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
const MAX_EVENTS = 10_000;
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Paths
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
function usageFile() {
|
|
12
|
+
return `${globalDataDir()}/usage.json`;
|
|
13
|
+
}
|
|
14
|
+
function firstRunFile() {
|
|
15
|
+
return `${globalDataDir()}/first-run.json`;
|
|
16
|
+
}
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Usage log (data/global/usage.json)
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
export async function getUsageLog() {
|
|
21
|
+
return readJson(usageFile(), { events: [] });
|
|
22
|
+
}
|
|
23
|
+
export async function appendUsageEvent(event) {
|
|
24
|
+
const log = await getUsageLog();
|
|
25
|
+
const events = [...log.events, event];
|
|
26
|
+
if (events.length > MAX_EVENTS) {
|
|
27
|
+
await rotateUsageLog();
|
|
28
|
+
await writeJson(usageFile(), { events: [event] });
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
await writeJson(usageFile(), { events });
|
|
32
|
+
}
|
|
33
|
+
export async function rotateUsageLog() {
|
|
34
|
+
const isoDate = new Date().toISOString().slice(0, 10);
|
|
35
|
+
const archivePath = `${globalDataDir()}/usage-${isoDate}.json`;
|
|
36
|
+
try {
|
|
37
|
+
await rename(usageFile(), archivePath);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// If the current log doesn't exist there is nothing to rotate.
|
|
41
|
+
}
|
|
42
|
+
await writeJson(usageFile(), { events: [] });
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Trial state (data/global/first-run.json)
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
export async function getTrialState() {
|
|
48
|
+
return readJson(firstRunFile(), null);
|
|
49
|
+
}
|
|
50
|
+
export async function ensureTrialState() {
|
|
51
|
+
const existing = await getTrialState();
|
|
52
|
+
if (existing !== null) {
|
|
53
|
+
return existing;
|
|
54
|
+
}
|
|
55
|
+
const state = { firstRunAt: new Date().toISOString() };
|
|
56
|
+
await writeJson(firstRunFile(), state);
|
|
57
|
+
return state;
|
|
58
|
+
}
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// Computed helpers (derived from usage.json — no extra file)
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
export async function getDailyCallCount(date) {
|
|
63
|
+
const log = await getUsageLog();
|
|
64
|
+
return log.events.filter((event) => event.timestamp.startsWith(date)).length;
|
|
65
|
+
}
|
|
66
|
+
export async function getLastCallTimestamp() {
|
|
67
|
+
const log = await getUsageLog();
|
|
68
|
+
if (log.events.length === 0) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
const last = log.events[log.events.length - 1];
|
|
72
|
+
return last?.timestamp ?? null;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=usage-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-store.js","sourceRoot":"","sources":["../../src/storage/usage-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,7 +49,7 @@ export async function handleActivateLicense(args) {
|
|
|
49
49
|
`Instance: ${name}`,
|
|
50
50
|
'',
|
|
51
51
|
tier === 'pro'
|
|
52
|
-
? 'You now have access to all
|
|
52
|
+
? 'You now have access to all 65 Planu tools and increased limits.'
|
|
53
53
|
: `You now have ${tier} access with all tools and unlimited projects/specs.`,
|
|
54
54
|
].join('\n'),
|
|
55
55
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activate-license.js","sourceRoot":"","sources":["../../src/tools/activate-license.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,gFAAgF;AAEhF,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAA0B;IACpE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAE1C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC;YACnE,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,IAAI,SAAS,QAAQ,EAAE,EAAE,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAEhE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,QAAQ,CAAC,KAAK,IAAI,eAAe,EAAE,EAAE;iBAC1F;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,MAAM,KAAK,GAAiB;YAC1B,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG;YACpC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAChC,IAAI;YACJ,WAAW,EAAE,GAAG;YAChB,eAAe,EAAE,GAAG;YACpB,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY;YACvC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa;YACzC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,cAAc;SAC5C,CAAC;QAEF,MAAM,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC3C,mBAAmB,EAAE,CAAC;QAEtB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;wBACJ,mCAAmC;wBACnC,EAAE;wBACF,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;wBACvD,aAAa,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE;wBAC1C,aAAa,IAAI,EAAE;wBACnB,EAAE;wBACF,IAAI,KAAK,KAAK;4BACZ,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"activate-license.js","sourceRoot":"","sources":["../../src/tools/activate-license.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@ export async function handleLicenseStatus(_args) {
|
|
|
29
29
|
if (tier === 'free') {
|
|
30
30
|
lines.push('');
|
|
31
31
|
lines.push('### Upgrade');
|
|
32
|
-
lines.push(`Unlock all
|
|
32
|
+
lines.push(`Unlock all 65 tools, 10 projects, and unlimited specs.`);
|
|
33
33
|
lines.push(`→ ${config.upgradeUrl}`);
|
|
34
34
|
lines.push('');
|
|
35
35
|
lines.push('Already have a key? Use `activate_license` to activate it.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license-status.js","sourceRoot":"","sources":["../../src/tools/license-status.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,sDAAsD;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAyB;IACjE,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;IACnD,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,mBAAmB,EAAE,CAAC;IAE9D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CACR,wBAAwB,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CACzH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CACR,eAAe,MAAM,CAAC,YAAY,CAAC,MAAM,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAC3G,CAAC;IACF,KAAK,CAAC,IAAI,CACR,mBAAmB,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,CACvG,CAAC;IAEF,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"license-status.js","sourceRoot":"","sources":["../../src/tools/license-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-usage-tools.d.ts","sourceRoot":"","sources":["../../src/tools/register-usage-tools.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoC1D"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// tools/register-usage-tools.ts — Registers usage tracking tools on the MCP server.
|
|
2
|
+
// These tools are always accessible (in alwaysAllowed list) — they show usage data.
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { safe } from './safe-handler.js';
|
|
5
|
+
import { handleUsageStats } from './usage-stats.js';
|
|
6
|
+
import { handleUsageReport } from './usage-report.js';
|
|
7
|
+
export function registerUsageTools(server) {
|
|
8
|
+
// usage_stats
|
|
9
|
+
server.registerTool('usage_stats', {
|
|
10
|
+
description: 'View your Planu usage statistics — tool calls, top tools, remaining daily calls. ' +
|
|
11
|
+
'Helps you understand how much of your plan you are using.',
|
|
12
|
+
inputSchema: {
|
|
13
|
+
period: z
|
|
14
|
+
.enum(['7d', '30d', 'all'])
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Time period to analyze. Type: 7d | 30d | all. Defaults to 30d.'),
|
|
17
|
+
},
|
|
18
|
+
annotations: { title: 'Usage Statistics', readOnlyHint: true },
|
|
19
|
+
}, safe(async (args) => handleUsageStats(args)));
|
|
20
|
+
// usage_report
|
|
21
|
+
server.registerTool('usage_report', {
|
|
22
|
+
description: 'Generate a full usage report for your Planu installation. ' +
|
|
23
|
+
'Available in JSON (for integrations) or Markdown (for reading).',
|
|
24
|
+
inputSchema: {
|
|
25
|
+
format: z
|
|
26
|
+
.enum(['json', 'markdown'])
|
|
27
|
+
.optional()
|
|
28
|
+
.describe('Output format. Type: json | markdown. Defaults to markdown.'),
|
|
29
|
+
},
|
|
30
|
+
annotations: { title: 'Usage Report', readOnlyHint: true },
|
|
31
|
+
}, safe(async (args) => handleUsageReport(args)));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=register-usage-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-usage-tools.js","sourceRoot":"","sources":["../../src/tools/register-usage-tools.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,oFAAoF;AAGpF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,cAAc;IACd,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,WAAW,EACT,mFAAmF;YACnF,2DAA2D;QAC7D,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,gEAAgE,CAAC;SAC9E;QACD,WAAW,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,IAAI,EAAE;KAC/D,EACD,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAC7C,CAAC;IAEF,eAAe;IACf,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,WAAW,EACT,4DAA4D;YAC5D,iEAAiE;QACnE,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,6DAA6D,CAAC;SAC3E;QACD,WAAW,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE;KAC3D,EACD,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-report.d.ts","sourceRoot":"","sources":["../../src/tools/usage-report.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAOtE,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAyCnF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// tools/usage-report.ts — Handler for the usage_report MCP tool.
|
|
2
|
+
// Returns a full usage report in JSON or markdown format.
|
|
3
|
+
import { usageStore } from '../storage/index.js';
|
|
4
|
+
import { filterEventsByPeriod } from '../engine/usage-tracker/core.js';
|
|
5
|
+
import { calculateUsageStats, formatStatsAsMarkdown } from '../engine/usage-tracker/stats.js';
|
|
6
|
+
import { calculateDaysSinceFirstRun, isTrialActive } from '../engine/usage-tracker/trial.js';
|
|
7
|
+
import { getCurrentTier } from './license-gate.js';
|
|
8
|
+
export async function handleUsageReport(args) {
|
|
9
|
+
const format = args.format ?? 'markdown';
|
|
10
|
+
const tier = await getCurrentTier();
|
|
11
|
+
// Gather data from storage
|
|
12
|
+
const usageLog = await usageStore.getUsageLog();
|
|
13
|
+
const trialState = await usageStore.ensureTrialState();
|
|
14
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
15
|
+
const todayCount = await usageStore.getDailyCallCount(today);
|
|
16
|
+
// Compute context values
|
|
17
|
+
const daysSinceFirstRun = calculateDaysSinceFirstRun(trialState.firstRunAt);
|
|
18
|
+
const trialActive = isTrialActive(trialState.firstRunAt);
|
|
19
|
+
let remainingDailyCalls = -1;
|
|
20
|
+
if (tier === 'free') {
|
|
21
|
+
const dailyLimit = trialActive ? 50 : 30;
|
|
22
|
+
remainingDailyCalls = Math.max(0, dailyLimit - todayCount);
|
|
23
|
+
}
|
|
24
|
+
// Full report uses all events
|
|
25
|
+
const allEvents = filterEventsByPeriod(usageLog.events, 'all');
|
|
26
|
+
const stats = calculateUsageStats(allEvents, 0, 0, tier, daysSinceFirstRun, trialActive, remainingDailyCalls);
|
|
27
|
+
if (format === 'json') {
|
|
28
|
+
return {
|
|
29
|
+
content: [{ type: 'text', text: JSON.stringify(stats, null, 2) }],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const markdown = formatStatsAsMarkdown(stats);
|
|
33
|
+
return { content: [{ type: 'text', text: markdown }] };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=usage-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-report.js","sourceRoot":"","sources":["../../src/tools/usage-report.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,0DAA0D;AAG1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC9F,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAsB;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IAEpC,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE7D,yBAAyB;IACzB,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAEzD,IAAI,mBAAmB,GAAG,CAAC,CAAC,CAAC;IAC7B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;IAC7D,CAAC;IAED,8BAA8B;IAC9B,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAE/D,MAAM,KAAK,GAAG,mBAAmB,CAC/B,SAAS,EACT,CAAC,EACD,CAAC,EACD,IAAI,EACJ,iBAAiB,EACjB,WAAW,EACX,mBAAmB,CACpB,CAAC;IAEF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAClE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-stats.d.ts","sourceRoot":"","sources":["../../src/tools/usage-stats.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOrE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAqCjF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// tools/usage-stats.ts — Handler for the usage_stats MCP tool.
|
|
2
|
+
// Returns aggregated usage statistics for the current installation.
|
|
3
|
+
import { usageStore } from '../storage/index.js';
|
|
4
|
+
import { filterEventsByPeriod } from '../engine/usage-tracker/core.js';
|
|
5
|
+
import { calculateUsageStats, formatStatsAsMarkdown } from '../engine/usage-tracker/stats.js';
|
|
6
|
+
import { calculateDaysSinceFirstRun, isTrialActive } from '../engine/usage-tracker/trial.js';
|
|
7
|
+
import { getCurrentTier } from './license-gate.js';
|
|
8
|
+
export async function handleUsageStats(args) {
|
|
9
|
+
const period = args.period ?? '30d';
|
|
10
|
+
const tier = await getCurrentTier();
|
|
11
|
+
// Gather data from storage
|
|
12
|
+
const usageLog = await usageStore.getUsageLog();
|
|
13
|
+
const trialState = await usageStore.ensureTrialState();
|
|
14
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
15
|
+
const todayCount = await usageStore.getDailyCallCount(today);
|
|
16
|
+
// Compute context values
|
|
17
|
+
const daysSinceFirstRun = calculateDaysSinceFirstRun(trialState.firstRunAt);
|
|
18
|
+
const trialActive = isTrialActive(trialState.firstRunAt);
|
|
19
|
+
// Remaining daily calls: only relevant for Starter tier
|
|
20
|
+
let remainingDailyCalls = -1;
|
|
21
|
+
if (tier === 'free') {
|
|
22
|
+
const dailyLimit = trialActive ? 50 : 30;
|
|
23
|
+
remainingDailyCalls = Math.max(0, dailyLimit - todayCount);
|
|
24
|
+
}
|
|
25
|
+
// Filter events by period and calculate stats
|
|
26
|
+
const filteredEvents = filterEventsByPeriod(usageLog.events, period);
|
|
27
|
+
const stats = calculateUsageStats(filteredEvents, 0, // activeSpecs — placeholder, no cross-layer access to spec store
|
|
28
|
+
0, // activeProjects — placeholder
|
|
29
|
+
tier, daysSinceFirstRun, trialActive, remainingDailyCalls);
|
|
30
|
+
const markdown = formatStatsAsMarkdown(stats);
|
|
31
|
+
return { content: [{ type: 'text', text: markdown }] };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=usage-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-stats.js","sourceRoot":"","sources":["../../src/tools/usage-stats.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,oEAAoE;AAGpE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC9F,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAqB;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IAEpC,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE7D,yBAAyB;IACzB,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAEzD,wDAAwD;IACxD,IAAI,mBAAmB,GAAG,CAAC,CAAC,CAAC;IAC7B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;IAC7D,CAAC;IAED,8CAA8C;IAC9C,MAAM,cAAc,GAAG,oBAAoB,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAErE,MAAM,KAAK,GAAG,mBAAmB,CAC/B,cAAc,EACd,CAAC,EAAE,iEAAiE;IACpE,CAAC,EAAE,+BAA+B;IAClC,IAAI,EACJ,iBAAiB,EACjB,WAAW,EACX,mBAAmB,CACpB,CAAC;IAEF,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAE9C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACzD,CAAC"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
|
package/dist/types/index.js
CHANGED
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { PricingTier } from './common/primitives.js';
|
|
2
|
+
export interface UsageEvent {
|
|
3
|
+
/** Tool name that was called */
|
|
4
|
+
readonly toolName: string;
|
|
5
|
+
/** Tier at the time of the call */
|
|
6
|
+
readonly tier: PricingTier;
|
|
7
|
+
/** ISO 8601 timestamp */
|
|
8
|
+
readonly timestamp: string;
|
|
9
|
+
/** Whether the call succeeded (not blocked by license gate) */
|
|
10
|
+
readonly success: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface UsageLog {
|
|
13
|
+
/** Array of usage events */
|
|
14
|
+
readonly events: readonly UsageEvent[];
|
|
15
|
+
}
|
|
16
|
+
export interface DailyUsage {
|
|
17
|
+
/** Date string YYYY-MM-DD */
|
|
18
|
+
readonly date: string;
|
|
19
|
+
/** Number of tool calls today */
|
|
20
|
+
readonly callCount: number;
|
|
21
|
+
/** ISO 8601 timestamp of the last tool call */
|
|
22
|
+
readonly lastCallAt: string;
|
|
23
|
+
}
|
|
24
|
+
export interface TrialState {
|
|
25
|
+
/** ISO 8601 timestamp of the first Planu execution ever */
|
|
26
|
+
readonly firstRunAt: string;
|
|
27
|
+
}
|
|
28
|
+
export interface UsageStats {
|
|
29
|
+
/** Total tool calls in the period */
|
|
30
|
+
readonly totalCalls: number;
|
|
31
|
+
/** Calls grouped by tool name */
|
|
32
|
+
readonly callsByTool: Record<string, number>;
|
|
33
|
+
/** Calls grouped by tier */
|
|
34
|
+
readonly callsByTier: Record<string, number>;
|
|
35
|
+
/** Top N most-used tools */
|
|
36
|
+
readonly topTools: readonly {
|
|
37
|
+
readonly name: string;
|
|
38
|
+
readonly count: number;
|
|
39
|
+
}[];
|
|
40
|
+
/** Number of active specs */
|
|
41
|
+
readonly activeSpecs: number;
|
|
42
|
+
/** Number of active projects */
|
|
43
|
+
readonly activeProjects: number;
|
|
44
|
+
/** Current tier */
|
|
45
|
+
readonly currentTier: PricingTier;
|
|
46
|
+
/** Days since first run */
|
|
47
|
+
readonly daysSinceFirstRun: number;
|
|
48
|
+
/** Whether in trial period */
|
|
49
|
+
readonly isTrialActive: boolean;
|
|
50
|
+
/** Remaining daily calls (Starter only, -1 for unlimited) */
|
|
51
|
+
readonly remainingDailyCalls: number;
|
|
52
|
+
}
|
|
53
|
+
export interface RateLimitResult {
|
|
54
|
+
/** Whether the call is allowed */
|
|
55
|
+
readonly allowed: boolean;
|
|
56
|
+
/** If not allowed, the reason */
|
|
57
|
+
readonly reason: 'daily_limit' | 'cooldown' | null;
|
|
58
|
+
/** Human-readable message */
|
|
59
|
+
readonly message: string;
|
|
60
|
+
/** Remaining daily calls (-1 = unlimited) */
|
|
61
|
+
readonly remainingCalls: number;
|
|
62
|
+
}
|
|
63
|
+
export interface UsageStatsInput {
|
|
64
|
+
readonly period?: '7d' | '30d' | 'all';
|
|
65
|
+
}
|
|
66
|
+
export interface UsageReportInput {
|
|
67
|
+
readonly format?: 'json' | 'markdown';
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/types/usage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAM1D,MAAM,WAAW,UAAU;IACzB,gCAAgC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,yBAAyB;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,QAAQ;IACvB,4BAA4B;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CACxC;AAMD,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAMD,MAAM,WAAW,UAAU;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AASD,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iCAAiC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,4BAA4B;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,4BAA4B;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChF,6BAA6B;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gCAAgC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,mBAAmB;IACnB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,2BAA2B;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,8BAA8B;IAC9B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,6DAA6D;IAC7D,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAMD,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,GAAG,IAAI,CAAC;IACnD,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAMD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CACvC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/types/usage.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,mFAAmF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@planu/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "Planu — MCP Server for Spec Driven Development. Manages specs, estimations, reverse engineering, and auto-learning across any language/framework.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|