@rubytech/create-maxy-code 0.1.387 → 0.1.389

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.
Files changed (101) hide show
  1. package/dist/__tests__/joblogic-excluded.test.js +39 -0
  2. package/dist/index.js +21 -0
  3. package/package.json +1 -1
  4. package/payload/platform/config/brand.json +1 -1
  5. package/payload/platform/plugins/.claude-plugin/marketplace.json +0 -5
  6. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +21 -2
  7. package/payload/platform/plugins/docs/references/admin-session.md +4 -0
  8. package/payload/platform/plugins/docs/references/admin-ui.md +18 -1
  9. package/payload/platform/plugins/docs/references/joblogic.md +2 -0
  10. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +7 -3
  11. package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +2 -0
  12. package/payload/platform/plugins/work/PLUGIN.md +3 -0
  13. package/payload/platform/plugins/work/mcp/dist/__tests__/session-metering.test.d.ts +2 -0
  14. package/payload/platform/plugins/work/mcp/dist/__tests__/session-metering.test.d.ts.map +1 -0
  15. package/payload/platform/plugins/work/mcp/dist/__tests__/session-metering.test.js +98 -0
  16. package/payload/platform/plugins/work/mcp/dist/__tests__/session-metering.test.js.map +1 -0
  17. package/payload/platform/plugins/work/mcp/dist/index.js +16 -0
  18. package/payload/platform/plugins/work/mcp/dist/index.js.map +1 -1
  19. package/payload/platform/plugins/work/mcp/dist/tools/session-metering.d.ts +53 -0
  20. package/payload/platform/plugins/work/mcp/dist/tools/session-metering.d.ts.map +1 -0
  21. package/payload/platform/plugins/work/mcp/dist/tools/session-metering.js +80 -0
  22. package/payload/platform/plugins/work/mcp/dist/tools/session-metering.js.map +1 -0
  23. package/payload/platform/plugins/work/mcp/package.json +2 -1
  24. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  25. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
  26. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  27. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  28. package/payload/platform/services/claude-session-manager/dist/http-server.js +98 -8
  29. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  30. package/payload/platform/services/claude-session-manager/dist/pricing.d.ts +45 -0
  31. package/payload/platform/services/claude-session-manager/dist/pricing.d.ts.map +1 -0
  32. package/payload/platform/services/claude-session-manager/dist/pricing.js +57 -0
  33. package/payload/platform/services/claude-session-manager/dist/pricing.js.map +1 -0
  34. package/payload/platform/services/claude-session-manager/dist/session-metering.d.ts +38 -0
  35. package/payload/platform/services/claude-session-manager/dist/session-metering.d.ts.map +1 -0
  36. package/payload/platform/services/claude-session-manager/dist/session-metering.js +292 -0
  37. package/payload/platform/services/claude-session-manager/dist/session-metering.js.map +1 -0
  38. package/payload/platform/templates/specialists/agents/project-manager.md +1 -1
  39. package/payload/server/public/assets/{AdminLoginScreens-BejIjbmU.js → AdminLoginScreens-CerrEc_m.js} +1 -1
  40. package/payload/server/public/assets/AdminShell-cRTvNRbo.js +1 -0
  41. package/payload/server/public/assets/{Checkbox-1F1tzqca.js → Checkbox-Dh2pLMFN.js} +1 -1
  42. package/payload/server/public/assets/{Transcript-DkGa4CQH.js → Transcript-B_GVJujB.js} +1 -1
  43. package/payload/server/public/assets/{admin-DqQARkjy.js → admin-BXaYelnR.js} +1 -1
  44. package/payload/server/public/assets/{browser-nDtEK6RC.js → browser-fhjGE7fH.js} +1 -1
  45. package/payload/server/public/assets/calendar-PnZudAtc.js +1 -0
  46. package/payload/server/public/assets/chat-Dy_zrjKS.js +1 -0
  47. package/payload/server/public/assets/chevron-left-IB6TmMZ_.js +1 -0
  48. package/payload/server/public/assets/data-B2IcjAj6.js +1 -0
  49. package/payload/server/public/assets/{graph-DFyicKd7.js → graph-CycO3tkW.js} +2 -2
  50. package/payload/server/public/assets/{graph-labels-D3BQdcpD.js → graph-labels-DlSsSpBV.js} +1 -1
  51. package/payload/server/public/assets/{operator-BxrjWdT9.js → operator-L4kBC-zS.js} +1 -1
  52. package/payload/server/public/assets/page-D5E-Ng4D.js +1 -0
  53. package/payload/server/public/assets/page-M8sD9LOi.js +32 -0
  54. package/payload/server/public/assets/{public-DbdqfdYq.js → public-BmnajF3K.js} +1 -1
  55. package/payload/server/public/assets/{rotate-ccw-BkX8HODe.js → rotate-ccw-W5HhvAbo.js} +1 -1
  56. package/payload/server/public/assets/useSubAccountSwitcher-D1TI1xvd.css +1 -0
  57. package/payload/server/public/assets/useSubAccountSwitcher-UqZbmzYy.js +9 -0
  58. package/payload/server/public/browser.html +4 -4
  59. package/payload/server/public/calendar.html +5 -5
  60. package/payload/server/public/chat.html +8 -8
  61. package/payload/server/public/data.html +7 -7
  62. package/payload/server/public/graph.html +8 -8
  63. package/payload/server/public/index.html +10 -10
  64. package/payload/server/public/operator.html +10 -10
  65. package/payload/server/public/public.html +8 -8
  66. package/payload/server/server.js +444 -315
  67. package/payload/platform/plugins/joblogic/.claude-plugin/plugin.json +0 -21
  68. package/payload/platform/plugins/joblogic/PLUGIN.md +0 -182
  69. package/payload/platform/plugins/joblogic/lib/mcp-spawn-tee/index.js +0 -193
  70. package/payload/platform/plugins/joblogic/lib/mcp-spawn-tee/package.json +0 -3
  71. package/payload/platform/plugins/joblogic/mcp/dist/index.d.ts +0 -2
  72. package/payload/platform/plugins/joblogic/mcp/dist/index.d.ts.map +0 -1
  73. package/payload/platform/plugins/joblogic/mcp/dist/index.js +0 -229
  74. package/payload/platform/plugins/joblogic/mcp/dist/index.js.map +0 -1
  75. package/payload/platform/plugins/joblogic/mcp/dist/lib/auth.d.ts +0 -31
  76. package/payload/platform/plugins/joblogic/mcp/dist/lib/auth.d.ts.map +0 -1
  77. package/payload/platform/plugins/joblogic/mcp/dist/lib/auth.js +0 -78
  78. package/payload/platform/plugins/joblogic/mcp/dist/lib/auth.js.map +0 -1
  79. package/payload/platform/plugins/joblogic/mcp/dist/lib/client.d.ts +0 -35
  80. package/payload/platform/plugins/joblogic/mcp/dist/lib/client.d.ts.map +0 -1
  81. package/payload/platform/plugins/joblogic/mcp/dist/lib/client.js +0 -106
  82. package/payload/platform/plugins/joblogic/mcp/dist/lib/client.js.map +0 -1
  83. package/payload/platform/plugins/joblogic/mcp/dist/lib/idempotency.d.ts +0 -8
  84. package/payload/platform/plugins/joblogic/mcp/dist/lib/idempotency.d.ts.map +0 -1
  85. package/payload/platform/plugins/joblogic/mcp/dist/lib/idempotency.js +0 -41
  86. package/payload/platform/plugins/joblogic/mcp/dist/lib/idempotency.js.map +0 -1
  87. package/payload/platform/plugins/joblogic/mcp/dist/lib/secrets.d.ts +0 -21
  88. package/payload/platform/plugins/joblogic/mcp/dist/lib/secrets.d.ts.map +0 -1
  89. package/payload/platform/plugins/joblogic/mcp/dist/lib/secrets.js +0 -47
  90. package/payload/platform/plugins/joblogic/mcp/dist/lib/secrets.js.map +0 -1
  91. package/payload/platform/plugins/joblogic/mcp/package.json +0 -10
  92. package/payload/platform/plugins/joblogic/skills/joblogic/SKILL.md +0 -32
  93. package/payload/server/public/assets/AdminShell-D2-uBSB5.js +0 -1
  94. package/payload/server/public/assets/calendar-CO4Bwmho.js +0 -1
  95. package/payload/server/public/assets/chat-DeIge_bC.js +0 -1
  96. package/payload/server/public/assets/chevron-left-DhVdq0aN.js +0 -1
  97. package/payload/server/public/assets/data-B1GIdzHk.js +0 -1
  98. package/payload/server/public/assets/page-ByDLq_o1.js +0 -1
  99. package/payload/server/public/assets/page-D-Ep4bXd.js +0 -32
  100. package/payload/server/public/assets/useSubAccountSwitcher-DMbRhLPv.js +0 -9
  101. package/payload/server/public/assets/useSubAccountSwitcher-DS0iqSkP.css +0 -1
@@ -0,0 +1,53 @@
1
+ /** Token classes for one day or the total (byte-shape of the endpoint JSON). */
2
+ export interface MeteringTokens {
3
+ output: number;
4
+ input: number;
5
+ cacheWrite: number;
6
+ cacheRead: number;
7
+ }
8
+ export interface MeteringDay {
9
+ date: string;
10
+ activeMs: {
11
+ thinking: number;
12
+ messaging: number;
13
+ toolUse: number;
14
+ };
15
+ idleMs: number;
16
+ turns: number;
17
+ tools: number;
18
+ tokens: MeteringTokens;
19
+ costGBP: {
20
+ opus: number;
21
+ sonnet: number;
22
+ };
23
+ }
24
+ export interface MeteringSummary {
25
+ sessionId: string;
26
+ days: MeteringDay[];
27
+ totals: Omit<MeteringDay, "date">;
28
+ corrOutputVsActive: number;
29
+ pricing: {
30
+ opusPriceDate: string;
31
+ usdPerGbp: number;
32
+ tokenizerFactor: number;
33
+ };
34
+ }
35
+ export interface SessionMeteringParams {
36
+ sessionId: string;
37
+ /** Loopback manager base — `http://127.0.0.1:${CLAUDE_SESSION_MANAGER_PORT}`.
38
+ * Defaults from env at call time. */
39
+ managerBase?: string;
40
+ /** Test hook — defaults to global `fetch`. */
41
+ fetchImpl?: typeof fetch;
42
+ }
43
+ export interface SessionMeteringResult {
44
+ ok: boolean;
45
+ status: number;
46
+ summary?: MeteringSummary;
47
+ error?: string;
48
+ }
49
+ export declare function sessionMetering(params: SessionMeteringParams): Promise<SessionMeteringResult>;
50
+ /** Markdown table matching the operator usage modal's columns, so the agent
51
+ * surface and the modal present the same figures. */
52
+ export declare function renderMeteringTable(s: MeteringSummary): string;
53
+ //# sourceMappingURL=session-metering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-metering.d.ts","sourceRoot":"","sources":["../../src/tools/session-metering.ts"],"names":[],"mappings":"AAKA,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AACD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAClE,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,cAAc,CAAA;IACtB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAC1C;AACD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,WAAW,EAAE,CAAA;IACnB,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IACjC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/E;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB;0CACsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAWD,wBAAsB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA+BnG;AAkBD;sDACsD;AACtD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAY9D"}
@@ -0,0 +1,80 @@
1
+ // Task 1384 — loopback wrapper. The admin-agent MCP tool and the operator usage
2
+ // modal share ONE implementation and ONE result by both calling
3
+ // GET /:sessionId/metering on the claude-session-manager over the local port.
4
+ // Port resolution mirrors memory-empty-trash.ts.
5
+ function resolveManagerBase(explicit) {
6
+ if (explicit)
7
+ return explicit;
8
+ const port = process.env.CLAUDE_SESSION_MANAGER_PORT;
9
+ if (!port)
10
+ return null;
11
+ const parsed = Number(port);
12
+ if (!Number.isFinite(parsed) || parsed <= 0 || parsed >= 65536)
13
+ return null;
14
+ return `http://127.0.0.1:${parsed}`;
15
+ }
16
+ export async function sessionMetering(params) {
17
+ const base = resolveManagerBase(params.managerBase);
18
+ if (!base) {
19
+ return {
20
+ ok: false,
21
+ status: 0,
22
+ error: "CLAUDE_SESSION_MANAGER_PORT is not set — this MCP instance cannot reach the session manager for metering.",
23
+ };
24
+ }
25
+ const fetchImpl = params.fetchImpl ?? fetch;
26
+ const url = `${base}/${encodeURIComponent(params.sessionId)}/metering`;
27
+ let res;
28
+ try {
29
+ res = await fetchImpl(url, { method: "GET" });
30
+ }
31
+ catch (err) {
32
+ return { ok: false, status: 0, error: `request failed: ${err instanceof Error ? err.message : String(err)}` };
33
+ }
34
+ if (res.status !== 200) {
35
+ let detail = `manager returned ${res.status}`;
36
+ try {
37
+ const body = (await res.json());
38
+ if (typeof body.detail === "string")
39
+ detail = body.detail;
40
+ else if (typeof body.error === "string")
41
+ detail = body.error;
42
+ }
43
+ catch {
44
+ // body was not JSON — keep the status-code message
45
+ }
46
+ return { ok: false, status: res.status, error: detail };
47
+ }
48
+ const summary = (await res.json());
49
+ return { ok: true, status: 200, summary };
50
+ }
51
+ function fmtActive(ms) {
52
+ const totalMin = Math.round(ms / 60000);
53
+ const h = Math.floor(totalMin / 60);
54
+ const m = totalMin % 60;
55
+ return `${h}h ${String(m).padStart(2, "0")}m`;
56
+ }
57
+ function activeMs(d) {
58
+ return d.activeMs.thinking + d.activeMs.messaging + d.activeMs.toolUse;
59
+ }
60
+ function fmtTok(n) {
61
+ return n.toLocaleString("en-GB");
62
+ }
63
+ function fmtGBP(n) {
64
+ return `£${n.toFixed(2)}`;
65
+ }
66
+ /** Markdown table matching the operator usage modal's columns, so the agent
67
+ * surface and the modal present the same figures. */
68
+ export function renderMeteringTable(s) {
69
+ const header = "| Day | Active | Output tok | Input tok | Cache write | Cache read | Opus 4.8 (GBP) | Sonnet 4.6 (GBP) |\n" +
70
+ "|-----|--:|--:|--:|--:|--:|--:|--:|";
71
+ const rowFor = (label, d, bold = false) => {
72
+ const cell = (x) => (bold ? `**${x}**` : x);
73
+ return `| ${cell(label)} | ${cell(fmtActive(activeMs(d)))} | ${cell(fmtTok(d.tokens.output))} | ${cell(fmtTok(d.tokens.input))} | ${cell(fmtTok(d.tokens.cacheWrite))} | ${cell(fmtTok(d.tokens.cacheRead))} | ${cell(fmtGBP(d.costGBP.opus))} | ${cell(fmtGBP(d.costGBP.sonnet))} |`;
74
+ };
75
+ const body = s.days.map((d) => rowFor(d.date, d)).join("\n");
76
+ const total = rowFor(`TOTAL (${s.days.length} d)`, s.totals, true);
77
+ const foot = `\nPrices dated ${s.pricing.opusPriceDate} · £/$ = ${s.pricing.usdPerGbp} · Sonnet tokenizer factor ${s.pricing.tokenizerFactor}. Sonnet is a tokenizer-adjusted estimate; cache read dominates cost.`;
78
+ return [header, body, total].join("\n") + "\n" + foot;
79
+ }
80
+ //# sourceMappingURL=session-metering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-metering.js","sourceRoot":"","sources":["../../src/tools/session-metering.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,8 @@
6
6
  "main": "dist/index.js",
7
7
  "scripts": {
8
8
  "build": "tsc",
9
- "start": "node dist/index.js"
9
+ "start": "node dist/index.js",
10
+ "test": "vitest run"
10
11
  },
11
12
  "dependencies": {
12
13
  "@modelcontextprotocol/sdk": "^1.12.1",
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-tool-names.generated.d.ts","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAoB7C,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EA2PtD,CAAA"}
1
+ {"version":3,"file":"canonical-tool-names.generated.d.ts","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAoB7C,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EA4PtD,CAAA"}
@@ -263,6 +263,7 @@ export const CANONICAL_MAXY_TOOL_NAMES = [
263
263
  "mcp__plugin_work_work__project-list",
264
264
  "mcp__plugin_work_work__project-update",
265
265
  "mcp__plugin_work_work__session-list",
266
+ "mcp__plugin_work_work__session-metering",
266
267
  "mcp__plugin_work_work__session-name",
267
268
  "mcp__plugin_work_work__work-complete",
268
269
  "mcp__plugin_work_work__work-create",
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-tool-names.generated.js","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canonical-tool-names.generated.js","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAe3B,OAAO,EAkBL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AA4BzB,OAAO,KAAK,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAA;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAgFlE,eAAO,MAAM,kBAAkB,QAA2B,CAAA;AAS1D,eAAO,MAAM,4BAA4B,QAAS,CAAA;AAIlD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7E;;qEAEiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;IAC9B;kFAC8E;IAC9E,WAAW,EAAE,kBAAkB,CAAA;IAC/B;;gFAE4E;IAC5E,cAAc,EAAE,cAAc,CAAA;IAC9B;;;6BAGyB;IACzB,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC;;;sCAGkC;IAClC,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C;;gFAE4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAsFD;;;;;;mEAMmE;AACnE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAiC9D;AAMD;;;;;;iBAMiB;AACjB,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAmCvF;AAID;;;;;;yBAMyB;AACzB,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAiCzD;AAkCD,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpG;AAgBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAUD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMvE;AAMD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,MAAM,CAER;AAkCD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe5F;AAwJD;;;kEAGkE;AAClE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG;IAC3B,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACpD;;;+CAG2C;IAC3C,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAChD,CAAA;AA8CD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CA6qFpD"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAe3B,OAAO,EAkBL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AA6BzB,OAAO,KAAK,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAA;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAyFlE,eAAO,MAAM,kBAAkB,QAA2B,CAAA;AAS1D,eAAO,MAAM,4BAA4B,QAAS,CAAA;AAIlD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7E;;qEAEiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;IAC9B;kFAC8E;IAC9E,WAAW,EAAE,kBAAkB,CAAA;IAC/B;;gFAE4E;IAC5E,cAAc,EAAE,cAAc,CAAA;IAC9B;;;6BAGyB;IACzB,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC;;;sCAGkC;IAClC,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C;;gFAE4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAsFD;;;;;;mEAMmE;AACnE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAiC9D;AAMD;;;;;;iBAMiB;AACjB,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAmCvF;AAID;;;;;;yBAMyB;AACzB,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAiCzD;AAkCD,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpG;AAgBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAUD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMvE;AAMD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,MAAM,CAER;AAkCD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe5F;AAwJD;;;kEAGkE;AAClE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG;IAC3B,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACpD;;;+CAG2C;IAC3C,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAChD,CAAA;AA8CD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CA4vFpD"}
@@ -27,7 +27,7 @@ import { buildWebchatChannelMcpServers, buildWebchatChannelArgv, webchatChannelM
27
27
  import { buildTelegramChannelMcpServers, buildTelegramChannelArgv, telegramChannelMcpConfigPath } from './telegram-channel-mcp.js';
28
28
  import { buildChannelMcpServers, buildChannelArgv, channelMcpConfigPath } from './channel-mcp.js';
29
29
  import { mergeTarget, isMultiTarget, targetKinds } from './channel-targets.js';
30
- import { randomUUID } from 'node:crypto';
30
+ import { randomUUID, createHash } from 'node:crypto';
31
31
  import { execFile, execFileSync } from 'node:child_process';
32
32
  import { buildRcChildEnv, reapplyAdminLevers } from './rc-daemon.js';
33
33
  import { runConnectorAuthLogin } from './connector-auth.js';
@@ -44,6 +44,7 @@ import { createRcChildLog } from './rc-child-log.js';
44
44
  // --append-system-prompt for channel-bound admin sessions.
45
45
  import { extractVoiceSection } from './system-prompt.js';
46
46
  import { readJsonlSession } from './jsonl-enumerator.js';
47
+ import { computeMetering } from './session-metering.js';
47
48
  import { claudeStateRoot, projectSlugForCwd, jsonlPathForSessionId, sidecarPathForSessionId, permissionModeLogPathForSessionId, findExistingJsonlForSessionId, slugForExistingJsonl, jsonlPathForSlug, sidecarPathForSlug, detectRemoteControlSlug, classifyBindBlocker, } from './jsonl-path.js';
48
49
  import { basename, dirname, join } from 'node:path';
49
50
  import { validateUserTitle } from './user-title-store.js';
@@ -54,6 +55,15 @@ const CHANNELS = ['browser', 'whatsapp', 'telegram', 'webchat', 'email'];
54
55
  // sessionId UUID (v4) minted by createNewAdminConversation in
55
56
  // platform/ui/app/lib/neo4j-store.ts.
56
57
  const UUID_PATTERN = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
58
+ // Task 1392 — the WhatsApp-channel launch-param override. Every WhatsApp admin
59
+ // session runs Sonnet 5 / effort max / bypass, overriding the Task 956 fixed admin
60
+ // params (Opus 4.8 / medium, resolved from settings.json). Expressed as an explicit
61
+ // constant set mirroring the rc-daemon `ADMIN_*` shape. Permission mode is already
62
+ // bypassPermissions (settings.json), so only model + effort are asserted here. `max`
63
+ // is session-only and invalid as a settings.json `effortLevel`, so it rides the
64
+ // `--effort max` argv flag, not the inline settings.
65
+ const WHATSAPP_ADMIN_MODEL = SONNET_MODEL;
66
+ const WHATSAPP_ADMIN_EFFORT = 'max';
57
67
  function parseAboutOwner(raw) {
58
68
  if (!raw || typeof raw !== 'object')
59
69
  return undefined;
@@ -1402,6 +1412,37 @@ export function buildHttpApp(deps) {
1402
1412
  timed(deps.logger, 'GET', `/${id}/meta`, 200, Date.now() - start);
1403
1413
  return c.json(payload, 200);
1404
1414
  });
1415
+ // Task 1384 — deterministic per-day usage & GBP cost for one session. Reads
1416
+ // whichever location holds the JSONL (top level or archive subdir), runs the
1417
+ // full-parse metering core (no AI), and returns the summary. The `op=surface`
1418
+ // checksum lets the http and MCP callers be proven to agree on one session.
1419
+ app.get('/:sessionId/metering', async (c) => {
1420
+ const start = Date.now();
1421
+ const id = c.req.param('sessionId');
1422
+ if (!SESSION_ID_PATTERN.test(id)) {
1423
+ timed(deps.logger, 'GET', `/${id}/metering`, 400, Date.now() - start);
1424
+ return c.json({ error: 'invalid-session-id' }, 400);
1425
+ }
1426
+ const row = resolveRow(deps.watcher, id);
1427
+ if (!row) {
1428
+ timed(deps.logger, 'GET', `/${id}/metering`, 404, Date.now() - start);
1429
+ return c.json({ error: 'session-not-found' }, 404);
1430
+ }
1431
+ const topJsonl = jsonlPathForSessionId(deps.spawnCwd, row.sessionId);
1432
+ const archivedJsonl = jsonlPathForSessionId(deps.spawnCwd, row.sessionId, { archived: true });
1433
+ const jsonlPath = existsSync(topJsonl) ? topJsonl : archivedJsonl;
1434
+ if (!existsSync(jsonlPath)) {
1435
+ timed(deps.logger, 'GET', `/${id}/metering`, 404, Date.now() - start);
1436
+ return c.json({ error: 'session-not-found' }, 404);
1437
+ }
1438
+ const summary = await computeMetering(jsonlPath, { logger: deps.logger });
1439
+ const checksum = createHash('sha256').update(JSON.stringify(summary)).digest('hex').slice(0, 16);
1440
+ const bytes = statSync(jsonlPath).size;
1441
+ deps.logger(`[metering] op=surface caller=http sessionId=${row.sessionId.slice(0, 8)} checksum=${checksum}`);
1442
+ deps.logger(`[metering] op=http sessionId=${row.sessionId.slice(0, 8)} ms=${Date.now() - start} bytes=${bytes}`);
1443
+ timed(deps.logger, 'GET', `/${id}/metering`, 200, Date.now() - start);
1444
+ return c.json(summary, 200);
1445
+ });
1405
1446
  app.post('/:sessionId/archive', async (c) => {
1406
1447
  const start = Date.now();
1407
1448
  const id = c.req.param('sessionId');
@@ -2394,6 +2435,28 @@ export function buildHttpApp(deps) {
2394
2435
  // ingest, public, specialist, channel cold-start) on the settings defaults
2395
2436
  // even if a future caller were to put model/effort on its body.
2396
2437
  const freshAdminLevers = mode === 'fresh' && rcRole === 'admin';
2438
+ // Task 1392 — resolve whether this spawn runs under the WhatsApp Sonnet-5/max
2439
+ // override, for BOTH the argv and the reported launch params below. Only
2440
+ // sessions BORN under the override adopt it, so an existing Opus-born WhatsApp
2441
+ // session finishes its life on Opus:
2442
+ // - fresh: a WhatsApp admin spawn (gateway body carries role:'admin',
2443
+ // channel:'whatsapp', and waChannel) is birthed under the override. The
2444
+ // channel gate matches exactly what the classification sidecar records
2445
+ // (`classifyChannel`), so the argv override and the born-stamp can never
2446
+ // disagree.
2447
+ // - resume: the override is inherited iff the session's classification
2448
+ // sidecar was stamped model=SONNET_MODEL at birth. A bare operator/PIN
2449
+ // resume omits role/channel/waChannel, so the sidecar — not the request
2450
+ // body — is the authoritative born-under-override signal (no other spawn
2451
+ // path stamps a WhatsApp-admin sidecar with a Sonnet model).
2452
+ const whatsappResumeSidecar = mode === 'resume' && sessionId
2453
+ ? readSidecar(sidecarPathForSessionId(effectiveAccountDir, sessionId), deps.logger).sidecar
2454
+ : null;
2455
+ const whatsappSonnetSpawn = mode === 'fresh'
2456
+ ? rcRole === 'admin' && adminChannel === 'whatsapp' && waChannel !== undefined
2457
+ : whatsappResumeSidecar?.role === 'admin' &&
2458
+ whatsappResumeSidecar?.channel === 'whatsapp' &&
2459
+ whatsappResumeSidecar?.model === WHATSAPP_ADMIN_MODEL;
2397
2460
  const argv = ['--remote-control'];
2398
2461
  // Task 945 — `name` is the row's display label, never a prompt. It must NOT
2399
2462
  // be pushed as a positional: the CLI treats a bare positional as the initial
@@ -2419,11 +2482,16 @@ export function buildHttpApp(deps) {
2419
2482
  }
2420
2483
  else if (sessionId) {
2421
2484
  argv.push(mode === 'resume' ? '--resume' : '--session-id', sessionId);
2422
- // Task 969 — a fresh new-session spawn (the /chat new-session popover)
2423
- // carries the picked model as the canonical --model flag. A resume keeps
2424
- // the model its JSONL already ran under, and an absent/invalid model
2485
+ // Task 1392 — a WhatsApp admin session (fresh spawn or a resume born under
2486
+ // the override) is pinned to Sonnet 5 on both branches, so the model holds
2487
+ // for the session's whole life and cannot revert to the settings default.
2488
+ // Task 969 — otherwise, a fresh new-session spawn (the /chat new-session
2489
+ // popover) carries the picked model as the canonical --model flag. A resume
2490
+ // keeps the model its JSONL already ran under, and an absent/invalid model
2425
2491
  // (reseatModel null) leaves the settings.json default model in force.
2426
- if (freshAdminLevers && reseatModel)
2492
+ if (whatsappSonnetSpawn)
2493
+ argv.push('--model', WHATSAPP_ADMIN_MODEL);
2494
+ else if (freshAdminLevers && reseatModel)
2427
2495
  argv.push('--model', reseatModel);
2428
2496
  }
2429
2497
  // Task 592 — per-spawn bypass-permissions waiver. The brand settings.json
@@ -2445,6 +2513,14 @@ export function buildHttpApp(deps) {
2445
2513
  if (reseatEffort)
2446
2514
  inlineSettings.effortLevel = reseatEffort;
2447
2515
  }
2516
+ else if (whatsappSonnetSpawn) {
2517
+ // Task 1392 — WhatsApp admin effort is pinned to `max` on both the fresh
2518
+ // spawn and every resume born under the override. `max` is session-only
2519
+ // (invalid as a settings.json effortLevel), so it rides the --effort argv
2520
+ // flag; asserting it on resume too stops the effort reverting to the
2521
+ // settings default (medium) on the session's second turn.
2522
+ argv.push('--effort', WHATSAPP_ADMIN_EFFORT);
2523
+ }
2448
2524
  else if (freshAdminLevers && freshEffort) {
2449
2525
  if (freshEffort === 'max')
2450
2526
  argv.push('--effort', 'max');
@@ -2731,11 +2807,21 @@ export function buildHttpApp(deps) {
2731
2807
  // Task 969 — a fresh new-session spawn carrying picked levers runs under
2732
2808
  // them too (not just a fork), so the sidecar + lifeline + the /chat params
2733
2809
  // row report the model/effort the session actually launched on.
2734
- const effectiveRcModel = (forkFromSessionId !== null || freshAdminLevers) && reseatModel ? reseatModel : resolveSettingsModel(deps.claudeConfigDir);
2810
+ const effectiveRcModel = whatsappSonnetSpawn
2811
+ ? WHATSAPP_ADMIN_MODEL
2812
+ : (forkFromSessionId !== null || freshAdminLevers) && reseatModel
2813
+ ? reseatModel
2814
+ : resolveSettingsModel(deps.claudeConfigDir);
2735
2815
  // Task 970 — the fork path reports its 4-level effort; the fresh path reports
2736
2816
  // its 5-level pick (incl. `max`). Falls back to the settings-resolved effort
2737
2817
  // when neither path carries one (absent on a fork, invalid/absent on a fresh).
2738
- const pickedRcEffort = forkFromSessionId !== null ? reseatEffort : freshAdminLevers ? freshEffort : undefined;
2818
+ const pickedRcEffort = whatsappSonnetSpawn
2819
+ ? WHATSAPP_ADMIN_EFFORT
2820
+ : forkFromSessionId !== null
2821
+ ? reseatEffort
2822
+ : freshAdminLevers
2823
+ ? freshEffort
2824
+ : undefined;
2739
2825
  const effectiveRcEffort = pickedRcEffort ?? resolveSettingsEffort(deps.claudeConfigDir);
2740
2826
  // Step 2 — the exact claude argv (the inner command). The systemd-run
2741
2827
  // wrap is composed by the spawnPty adapter; logging the inner argv
@@ -2859,7 +2945,11 @@ export function buildHttpApp(deps) {
2859
2945
  // passes no --debug=auto-mode.
2860
2946
  permissionMode: effectiveRcPermissionMode,
2861
2947
  effectivePermissionMode: null,
2862
- model: null,
2948
+ // Task 1392 — a fresh WhatsApp admin spawn stamps its Sonnet model
2949
+ // here so a later resume can read this marker back and re-assert the
2950
+ // override; every other spawn leaves this null (the wire `model`
2951
+ // still derives from the JSONL, per the sidecar field contract).
2952
+ model: whatsappSonnetSpawn ? WHATSAPP_ADMIN_MODEL : null,
2863
2953
  hidden: false,
2864
2954
  specialist: null,
2865
2955
  scopeUnitToken: unitToken,