@rubytech/create-maxy-code 0.1.39 → 0.1.41

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 (132) hide show
  1. package/dist/index.js +35 -101
  2. package/dist/uninstall.js +11 -102
  3. package/package.json +1 -1
  4. package/payload/platform/lib/mcp-stderr-tee/package.json +7 -0
  5. package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +142 -52
  6. package/payload/platform/plugins/docs/references/deployment.md +7 -3
  7. package/payload/platform/plugins/docs/references/platform.md +18 -4
  8. package/payload/platform/plugins/docs/references/plugins-guide.md +2 -0
  9. package/payload/platform/services/claude-session-manager/dist/config.d.ts +17 -0
  10. package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
  11. package/payload/platform/services/claude-session-manager/dist/config.js +37 -1
  12. package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
  13. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +54 -0
  14. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -0
  15. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +516 -0
  16. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -0
  17. package/payload/platform/services/claude-session-manager/dist/hooks-discovery.d.ts +7 -0
  18. package/payload/platform/services/claude-session-manager/dist/hooks-discovery.d.ts.map +1 -0
  19. package/payload/platform/services/claude-session-manager/dist/hooks-discovery.js +90 -0
  20. package/payload/platform/services/claude-session-manager/dist/hooks-discovery.js.map +1 -0
  21. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +3 -1
  22. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  23. package/payload/platform/services/claude-session-manager/dist/http-server.js +426 -204
  24. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  25. package/payload/platform/services/claude-session-manager/dist/index.js +60 -13
  26. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  27. package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +2 -0
  28. package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
  29. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +11 -6
  30. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
  31. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +40 -45
  32. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  33. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +146 -162
  34. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  35. package/payload/platform/services/claude-session-manager/dist/reaper.d.ts +24 -0
  36. package/payload/platform/services/claude-session-manager/dist/reaper.d.ts.map +1 -0
  37. package/payload/platform/services/claude-session-manager/dist/reaper.js +114 -0
  38. package/payload/platform/services/claude-session-manager/dist/reaper.js.map +1 -0
  39. package/payload/platform/services/claude-session-manager/dist/session-store.d.ts +16 -41
  40. package/payload/platform/services/claude-session-manager/dist/session-store.d.ts.map +1 -1
  41. package/payload/platform/services/claude-session-manager/dist/session-store.js +29 -68
  42. package/payload/platform/services/claude-session-manager/dist/session-store.js.map +1 -1
  43. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +54 -0
  44. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  45. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +111 -0
  46. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  47. package/payload/platform/templates/agents/admin/IDENTITY.md +4 -2
  48. package/payload/platform/templates/agents/admin/SOUL.md +8 -14
  49. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.d.ts +51 -0
  50. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.d.ts.map +1 -0
  51. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.js +196 -0
  52. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.js.map +1 -0
  53. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/package.json +7 -0
  54. package/payload/server/{chunk-NNHHGQJL.js → chunk-4P2MPERV.js} +6 -163
  55. package/payload/server/{chunk-3G6JMV7N.js → chunk-MEGIQYUD.js} +1 -1
  56. package/payload/server/{chunk-QC5LHYPH.js → chunk-XJVJ2B2Q.js} +1 -1
  57. package/payload/server/{cloudflare-task-tracker-NEB3X6O2.js → cloudflare-task-tracker-R6MMORFU.js} +2 -2
  58. package/payload/server/maxy-edge.js +2 -2
  59. package/payload/server/public/assets/{Checkbox-CmCjmfJy.js → Checkbox-blxv2XPY.js} +1 -1
  60. package/payload/server/public/assets/{admin-CtodW6As.js → admin-C3EvHpLN.js} +1 -1
  61. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-CfOjbx0H.js → architectureDiagram-Q4EWVU46-bETsVzGS.js} +1 -1
  62. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-D0kA2C9i.js → blockDiagram-DXYQGD6D-5y0GBnfQ.js} +1 -1
  63. package/payload/server/public/assets/{brand-6hKfBgOI.css → brand-DQlLKLDH.css} +1 -1
  64. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-CDgXiXgj.js → c4Diagram-AHTNJAMY-C1znpVGu.js} +1 -1
  65. package/payload/server/public/assets/channel-BWqTaXzb.js +1 -0
  66. package/payload/server/public/assets/{chunk-336JU56O-BfBTcT5X.js → chunk-336JU56O-DlCVUGzQ.js} +2 -2
  67. package/payload/server/public/assets/{chunk-426QAEUC-BdSSZ1Kw.js → chunk-426QAEUC-bGYkmA4z.js} +1 -1
  68. package/payload/server/public/assets/{chunk-4TB4RGXK-UvE1im9g.js → chunk-4TB4RGXK-6Sb0Undm.js} +1 -1
  69. package/payload/server/public/assets/{chunk-5FUZZQ4R-Dx4DslXz.js → chunk-5FUZZQ4R-CAT_Pq2T.js} +1 -1
  70. package/payload/server/public/assets/{chunk-5PVQY5BW-CNHawhLJ.js → chunk-5PVQY5BW-j231ESse.js} +1 -1
  71. package/payload/server/public/assets/{chunk-EDXVE4YY-Rmjv-1et.js → chunk-EDXVE4YY-BAlS4QL7.js} +1 -1
  72. package/payload/server/public/assets/{chunk-ENJZ2VHE-CL-LeH3r.js → chunk-ENJZ2VHE-D3Ku_BMP.js} +1 -1
  73. package/payload/server/public/assets/{chunk-ICPOFSXX-B2MFOJDt.js → chunk-ICPOFSXX-AR86A5WB.js} +1 -1
  74. package/payload/server/public/assets/{chunk-OYMX7WX6-BxcIcCt5.js → chunk-OYMX7WX6-DxGhapkW.js} +1 -1
  75. package/payload/server/public/assets/{chunk-U2HBQHQK-COzwOBrY.js → chunk-U2HBQHQK-DAlqsDo_.js} +1 -1
  76. package/payload/server/public/assets/{chunk-X2U36JSP-B0rjT5hL.js → chunk-X2U36JSP-lZdkkdyB.js} +1 -1
  77. package/payload/server/public/assets/{chunk-YZCP3GAM-pwrIw0XH.js → chunk-YZCP3GAM-CCjtXOFD.js} +1 -1
  78. package/payload/server/public/assets/{chunk-ZZ45TVLE-BXpeAm0k.js → chunk-ZZ45TVLE-ComtdKny.js} +1 -1
  79. package/payload/server/public/assets/classDiagram-6PBFFD2Q-B9hC6fOR.js +1 -0
  80. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-afl_ydIG.js +1 -0
  81. package/payload/server/public/assets/clone-Lj83OaZ3.js +1 -0
  82. package/payload/server/public/assets/{dagre-DjOJn05k.js → dagre-DX8QJeVt.js} +1 -1
  83. package/payload/server/public/assets/{dagre-KV5264BT-PczvQiEh.js → dagre-KV5264BT-BcRbiZ1q.js} +1 -1
  84. package/payload/server/public/assets/data-CS_R5VWQ.js +1 -0
  85. package/payload/server/public/assets/{device-url-actions-C55ZS_Zg.js → device-url-actions-Cag9IJ7n.js} +1 -1
  86. package/payload/server/public/assets/{diagram-5BDNPKRD-D477xo5F.js → diagram-5BDNPKRD-Bw47VwHO.js} +1 -1
  87. package/payload/server/public/assets/{diagram-G4DWMVQ6-C-HAtbtT.js → diagram-G4DWMVQ6-B-aVfhiD.js} +1 -1
  88. package/payload/server/public/assets/{diagram-MMDJMWI5-B9wus4H0.js → diagram-MMDJMWI5-DERz2dKo.js} +1 -1
  89. package/payload/server/public/assets/{diagram-TYMM5635-UMZLloFr.js → diagram-TYMM5635-B7eEX9Ta.js} +1 -1
  90. package/payload/server/public/assets/{erDiagram-SMLLAGMA-B8E52Mp4.js → erDiagram-SMLLAGMA-G_JJq3zB.js} +1 -1
  91. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-CUel34tq.js → flowDiagram-DWJPFMVM-BeY9QaO0.js} +1 -1
  92. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BfwE-Xav.js → ganttDiagram-T4ZO3ILL-IXviGYnx.js} +1 -1
  93. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-2d6tXRIM.js → gitGraphDiagram-UUTBAWPF-GlY6pZQ1.js} +1 -1
  94. package/payload/server/public/assets/graph-DtGkQBFr.js +1 -0
  95. package/payload/server/public/assets/graph-labels-Dwu1ON5v.js +1 -0
  96. package/payload/server/public/assets/{graphlib-CCo9-wNJ.js → graphlib-BWgAjZSb.js} +1 -1
  97. package/payload/server/public/assets/{infoDiagram-42DDH7IO-DB1SVWL6.js → infoDiagram-42DDH7IO-D4YZM0gD.js} +1 -1
  98. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CdeMUTYS.js → ishikawaDiagram-UXIWVN3A-fR71GDOp.js} +1 -1
  99. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-D8x8TUoc.js → journeyDiagram-VCZTEJTY-C1TcY_6m.js} +1 -1
  100. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-Cmkhd1mO.js → kanban-definition-6JOO6SKY-IPZKpnnG.js} +1 -1
  101. package/payload/server/public/assets/{line-CoHkpBv3.js → line-B2JtEL1B.js} +1 -1
  102. package/payload/server/public/assets/{mermaid-parser.core-C7R2PfZC.js → mermaid-parser.core-BKCLXqUh.js} +1 -1
  103. package/payload/server/public/assets/{mermaid.core-lQaq-kll.js → mermaid.core-CmNpCLB-.js} +3 -3
  104. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CsPq3pX1.js → mindmap-definition-QFDTVHPH-BS0E2FPD.js} +1 -1
  105. package/payload/server/public/assets/{page-DwEaAdVp.js → page-BdI3GCun.js} +1 -1
  106. package/payload/server/public/assets/{page-CBKzjUHO.js → page-zIjAkU2y.js} +1 -1
  107. package/payload/server/public/assets/{pieDiagram-DEJITSTG-FZH9sTnP.js → pieDiagram-DEJITSTG-J61JDyk8.js} +1 -1
  108. package/payload/server/public/assets/{public-hGLzxhE_.js → public-C5vaQnC_.js} +4 -4
  109. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-9poxfoqh.js → quadrantDiagram-34T5L4WZ-CLI03OtR.js} +1 -1
  110. package/payload/server/public/assets/{requirementDiagram-MS252O5E-Ce7iOdT_.js → requirementDiagram-MS252O5E-C8MCt5NO.js} +1 -1
  111. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DINuXatI.js → sankeyDiagram-XADWPNL6-DQuugruj.js} +1 -1
  112. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-CSMec3EK.js → sequenceDiagram-FGHM5R23-CoYitwhO.js} +1 -1
  113. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-15DKzypj.js → stateDiagram-FHFEXIEX-G68cHHoI.js} +1 -1
  114. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Dtgpgr_D.js +1 -0
  115. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-BxIRc9Pu.js → timeline-definition-GMOUNBTQ-CelLeJVS.js} +1 -1
  116. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-DdgRyU55.js → vennDiagram-DHZGUBPP-BVgFPkJq.js} +1 -1
  117. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-CKvhU1Uj.js → wardleyDiagram-NUSXRM2D-CzD_8hl2.js} +1 -1
  118. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-d0V1V4PD.js → xychartDiagram-5P7HB3ND-BuTxWdX5.js} +1 -1
  119. package/payload/server/public/data.html +5 -5
  120. package/payload/server/public/graph.html +6 -6
  121. package/payload/server/public/index.html +8 -8
  122. package/payload/server/public/public.html +5 -5
  123. package/payload/server/server.js +1058 -846
  124. package/payload/server/public/assets/channel-DA7MGMzQ.js +0 -1
  125. package/payload/server/public/assets/classDiagram-6PBFFD2Q-DqfmcWSr.js +0 -1
  126. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BVOMSbZ_.js +0 -1
  127. package/payload/server/public/assets/clone-Byp7hagU.js +0 -1
  128. package/payload/server/public/assets/data-A7azIkZU.js +0 -1
  129. package/payload/server/public/assets/graph-Dx83EhtP.js +0 -1
  130. package/payload/server/public/assets/graph-labels-Bg2Bzelb.js +0 -1
  131. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-AcaK_QfD.js +0 -1
  132. /package/payload/server/public/assets/{brand-DXOx08r0.js → brand-D6mXeyxV.js} +0 -0
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /**
3
+ * MCP server stderr tee — dual-destination log capture.
4
+ *
5
+ * Claude Code spawns MCP servers as child processes and consumes their stderr
6
+ * internally. The platform cannot intercept at the spawn level. Each server
7
+ * must tee its own stderr so diagnostic output is retrievable.
8
+ *
9
+ * ┌─────────────────────────┐
10
+ * │ MCP server process │
11
+ * │ │
12
+ * │ console.error("[x] ..") │
13
+ * │ │ │
14
+ * │ ▼ │
15
+ * │ patched stderr.write() │
16
+ * │ │ │
17
+ * │ ├──► original stderr (consumed by Claude Code — opaque)
18
+ * │ │
19
+ * │ ├──► mcp-{name}-stderr-{YYYY-MM-DD}.log (raw chunks, per-plugin)
20
+ * │ │
21
+ * │ └──► $STREAM_LOG_PATH (per-line, prefixed)
22
+ * │ "[<iso>] [mcp:{name}] <line>"
23
+ * └─────────────────────────┘
24
+ *
25
+ * $STREAM_LOG_PATH is set by the spawner (`getMcpServers` in `claude-agent.ts`)
26
+ * to the per-conversation stream log file. The MCP server code itself knows
27
+ * nothing about conversations — it just trusts the spawner's path. This is
28
+ * the scope boundary introduced: the tee is attached per spawn,
29
+ * not per MCP-server process lifetime. Servers spawned for conversation A
30
+ * write to conversation A's file; servers for B write to B's file.
31
+ *
32
+ * Every decision is logged via `[mcp-tee-*]` markers on both the target file
33
+ * and the original stderr so an investigator can confirm from the stream log
34
+ * which tees were wired up, which were skipped, and why.
35
+ */
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.initStderrTee = initStderrTee;
38
+ const node_fs_1 = require("node:fs");
39
+ const node_path_1 = require("node:path");
40
+ const node_string_decoder_1 = require("node:string_decoder");
41
+ // Marker on process.stderr.write so repeat calls to initStderrTee() are
42
+ // detected at runtime, not just warned about in the docstring. A second
43
+ // call would stack patches and double-log every chunk.
44
+ const INIT_MARKER = Symbol.for("maxy.mcpStderrTee.installed");
45
+ /**
46
+ * Patch process.stderr.write to tee to:
47
+ * 1. Per-server raw log (`mcp-<serverName>-stderr-<date>.log` under LOG_DIR).
48
+ * 2. The per-conversation stream log at `STREAM_LOG_PATH` — per-line, prefixed.
49
+ * 3. The original stderr (consumed by Claude Code) — always preserved.
50
+ *
51
+ * LOG_DIR absent → skip per-server raw file (dev mode / tool discovery).
52
+ * STREAM_LOG_PATH absent → skip stream-log destination (older spawner or
53
+ * standalone invocation). In both absent cases, stderr works unchanged —
54
+ * a `[mcp-tee-skip]` marker is written to original stderr so the skip is
55
+ * visible to journalctl-level readers.
56
+ *
57
+ * Safe to call once at MCP server module load. Refused on second call to
58
+ * prevent stacking patches.
59
+ */
60
+ function initStderrTee(serverName) {
61
+ const logDir = process.env.LOG_DIR;
62
+ const streamLogPath = process.env.STREAM_LOG_PATH;
63
+ // Refuse repeat patches — stacking them would double-log every chunk
64
+ // and corrupt the re-entrancy guard (originalWrite would capture the
65
+ // already-patched function on the second call).
66
+ if (process.stderr.write[INIT_MARKER])
67
+ return;
68
+ // Keep a direct reference to the unpatched writer. All diagnostic output
69
+ // from inside this module MUST go through originalWrite to avoid
70
+ // re-entering the patched writer (which would recurse on a tee failure).
71
+ const originalWrite = process.stderr.write.bind(process.stderr);
72
+ const tsPrefix = () => `[${new Date().toISOString()}]`;
73
+ const skipTee = (reason, destination) => {
74
+ originalWrite(`${tsPrefix()} [platform] [mcp-tee-skip] server=${serverName} destination=${destination} reason=${JSON.stringify(reason)}\n`);
75
+ };
76
+ // --- Destination 1: per-server raw file (optional, existing behaviour)
77
+ let perServerStream;
78
+ if (logDir) {
79
+ try {
80
+ (0, node_fs_1.mkdirSync)(logDir, { recursive: true });
81
+ const date = new Date().toISOString().slice(0, 10);
82
+ perServerStream = (0, node_fs_1.createWriteStream)((0, node_path_1.resolve)(logDir, `mcp-${serverName}-stderr-${date}.log`), { flags: "a" });
83
+ perServerStream.on("error", (err) => {
84
+ originalWrite(`${tsPrefix()} [platform] [mcp-tee-error] server=${serverName} destination=per-server reason=${JSON.stringify(err.message)}\n`);
85
+ });
86
+ }
87
+ catch (err) {
88
+ const msg = err instanceof Error ? err.message : String(err);
89
+ skipTee(msg, "per-server");
90
+ perServerStream = undefined;
91
+ }
92
+ }
93
+ else {
94
+ skipTee("LOG_DIR not set", "per-server");
95
+ }
96
+ // --- Destination 2: per-conversation stream log
97
+ let streamLogStream;
98
+ if (streamLogPath) {
99
+ try {
100
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(streamLogPath), { recursive: true });
101
+ const s = (0, node_fs_1.createWriteStream)(streamLogPath, { flags: "a" });
102
+ s.on("error", (err) => {
103
+ originalWrite(`${tsPrefix()} [platform] [mcp-tee-error] server=${serverName} destination=stream-log reason=${JSON.stringify(err.message)}\n`);
104
+ });
105
+ streamLogStream = s;
106
+ // Attach marker lands in the stream log itself so investigators can
107
+ // confirm per-conversation the tee was wired up.
108
+ s.write(`${tsPrefix()} [platform] [mcp-tee-attach] server=${serverName} streamLogPath=${streamLogPath}\n`);
109
+ }
110
+ catch (err) {
111
+ const msg = err instanceof Error ? err.message : String(err);
112
+ skipTee(msg, "stream-log");
113
+ streamLogStream = undefined;
114
+ }
115
+ }
116
+ else {
117
+ skipTee("STREAM_LOG_PATH not set", "stream-log");
118
+ }
119
+ // If neither tee target is available, leave stderr untouched — patching
120
+ // the writer to a no-op tee would still consume event-loop cycles on
121
+ // every write for zero observability gain.
122
+ if (!perServerStream && !streamLogStream) {
123
+ return;
124
+ }
125
+ // Line buffer — accumulates characters written to stderr so complete
126
+ // newline-terminated lines can be prefixed and emitted to the stream log.
127
+ // Partial chunks are held until a newline arrives (or beforeExit flushes).
128
+ let lineBuffer = "";
129
+ // StringDecoder buffers trailing UTF-8 continuation bytes across chunks.
130
+ // Without it, a multi-byte codepoint that straddles a write boundary would
131
+ // render as two U+FFFD replacement characters in the stream log. Only
132
+ // matters when a caller writes Uint8Array chunks directly — console.error
133
+ // produces strings — but plugins piping child-process stderr can hit this.
134
+ const utf8 = new node_string_decoder_1.StringDecoder("utf8");
135
+ const emitCompleteLinesToStreamLog = (chunk) => {
136
+ if (!streamLogStream)
137
+ return;
138
+ lineBuffer += chunk;
139
+ let newlineIndex;
140
+ // eslint-disable-next-line no-cond-assign
141
+ while ((newlineIndex = lineBuffer.indexOf("\n")) !== -1) {
142
+ const line = lineBuffer.slice(0, newlineIndex);
143
+ lineBuffer = lineBuffer.slice(newlineIndex + 1);
144
+ if (line.length === 0)
145
+ continue; // skip blank lines
146
+ if (streamLogStream.destroyed || streamLogStream.writableEnded)
147
+ continue;
148
+ streamLogStream.write(`${tsPrefix()} [mcp:${serverName}] ${line}\n`);
149
+ }
150
+ };
151
+ process.stderr.write = (chunk, ...args) => {
152
+ // 1. Per-server raw file — behaviour (no prefix).
153
+ if (perServerStream && !perServerStream.destroyed) {
154
+ perServerStream.write(chunk);
155
+ }
156
+ // 2. Stream log — per-line, prefixed.
157
+ if (streamLogStream) {
158
+ try {
159
+ const text = typeof chunk === "string"
160
+ ? chunk
161
+ : utf8.write(Buffer.from(chunk));
162
+ emitCompleteLinesToStreamLog(text);
163
+ }
164
+ catch (err) {
165
+ const msg = err instanceof Error ? err.message : String(err);
166
+ originalWrite(`${tsPrefix()} [platform] [mcp-tee-emit-error] server=${serverName} reason=${JSON.stringify(msg)}\n`);
167
+ }
168
+ }
169
+ // 3. Original stderr — Claude Code still gets what it's always got.
170
+ return originalWrite(chunk, ...args);
171
+ };
172
+ // Mark the patch so a second initStderrTee() call is refused at the top.
173
+ process.stderr.write[INIT_MARKER] = true;
174
+ // Flush any trailing unterminated segment on graceful event-loop drain.
175
+ // `beforeExit` can fire repeatedly: each async write to `streamLogStream`
176
+ // schedules I/O that keeps the event loop alive, which drains, which fires
177
+ // `beforeExit` again. With N MCP servers attached, the handler can emit
178
+ // thousands of detach lines per second. The `detached` flag gates the
179
+ // drain+detach emission to a single invocation; subsequent firings are
180
+ // no-ops. Buffer flushing also runs only once — partial-line state at true
181
+ // process exit doesn't change across re-fires.
182
+ let detached = false;
183
+ process.on("beforeExit", () => {
184
+ if (detached)
185
+ return;
186
+ detached = true;
187
+ if (streamLogStream && !streamLogStream.destroyed && !streamLogStream.writableEnded) {
188
+ if (lineBuffer.length > 0) {
189
+ streamLogStream.write(`${tsPrefix()} [mcp:${serverName}] ${lineBuffer}\n`);
190
+ }
191
+ streamLogStream.write(`${tsPrefix()} [platform] [mcp-tee-detach] server=${serverName} reason=process-before-exit\n`);
192
+ }
193
+ lineBuffer = "";
194
+ });
195
+ }
196
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@maxy/mcp-stderr-tee",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "commonjs",
6
+ "main": "dist/index.js"
7
+ }
@@ -86,7 +86,6 @@ function cacheConversationId(cacheKey, conversationId) {
86
86
  }
87
87
  }
88
88
  var GREETING_DIRECTIVE = "[New session. Greet the visitor.]";
89
- var DIRECTIVE_PREFIX = "[New session.";
90
89
  async function ensureConversation(accountId, agentType, cacheKey, visitorId, agentSlug, userId, channelOverride, channelAddressOverride) {
91
90
  const cached = getCachedConversationId(cacheKey);
92
91
  if (cached) return { conversationId: cached, created: false };
@@ -235,8 +234,7 @@ async function persistMessage(conversationId, role, content, accountId, tokens,
235
234
  // :WhatsAppMessage\u2192:UserMessage, crossing the live-channel chain.
236
235
  // The live writer's tail predicate is sublabel-scoped to
237
236
  // :WhatsAppMessage; this clause is the matching defence on the
238
- // agent side. Backward-compatible \u2014 pre-Task-857 graphs only carry
239
- // UserMessage/AssistantMessage sublabels under :Message.
237
+ // agent side.
240
238
  // Capture whether THIS write's guard will fire. Read c.summary
241
239
  // before the SET so the boolean reflects the pre-state, not the
242
240
  // post-state \u2014 a false positive otherwise when a new user message
@@ -560,53 +558,26 @@ async function verifyAndGetConversationUpdatedAt(conversationId, accountId) {
560
558
  await session.close();
561
559
  }
562
560
  }
563
- var LIST_BACKFILL_CAP = 3;
564
561
  async function listAdminSessions(accountId, userId, limit = 20) {
565
562
  const session = getSession();
566
563
  try {
567
564
  const result = await session.run(
568
565
  `MATCH (c:Conversation {accountId: $accountId, agentType: 'admin', userId: $userId})
569
566
  WHERE NOT c:Trashed
570
- WITH c
571
- ORDER BY c.updatedAt DESC
572
- LIMIT $limit
573
- CALL {
574
- WITH c
575
- OPTIONAL MATCH (m:Message)-[:PART_OF]->(c)
576
- WHERE m.role = 'user'
577
- AND c.name IS NULL
578
- AND NOT (m.content STARTS WITH '[New session.')
579
- AND NOT (m.content STARTS WITH '{"')
580
- AND size(m.content) >= 4
581
- RETURN m.content AS content, m.createdAt AS createdAt
582
- ORDER BY m.createdAt ASC
583
- LIMIT 1
584
- }
585
567
  RETURN c.conversationId AS conversationId,
586
568
  c.name AS name,
587
569
  c.updatedAt AS updatedAt,
588
- c.channel AS channel,
589
- content AS firstSubstantiveUserMessage`,
570
+ c.channel AS channel
571
+ ORDER BY c.updatedAt DESC
572
+ LIMIT $limit`,
590
573
  { accountId, userId, limit: neo4j.int(limit) }
591
574
  );
592
- const rows = result.records.map((r) => ({
575
+ return result.records.map((r) => ({
593
576
  conversationId: r.get("conversationId"),
594
577
  name: r.get("name"),
595
578
  updatedAt: String(r.get("updatedAt")),
596
- channel: r.get("channel"),
597
- firstSubstantiveUserMessage: r.get("firstSubstantiveUserMessage")
579
+ channel: r.get("channel")
598
580
  }));
599
- let backfillsKicked = 0;
600
- for (const row of rows) {
601
- if (backfillsKicked >= LIST_BACKFILL_CAP) break;
602
- if (row.name !== null) continue;
603
- const seed = row.firstSubstantiveUserMessage;
604
- if (!seed || !isMessageUseful(seed)) continue;
605
- backfillsKicked++;
606
- autoLabelSession(row.conversationId, seed).catch(() => {
607
- });
608
- }
609
- return rows.map(({ conversationId, name, updatedAt, channel }) => ({ conversationId, name, updatedAt, channel }));
610
581
  } catch (err) {
611
582
  console.error(`[persist] listAdminSessions failed: ${err instanceof Error ? err.message : String(err)}`);
612
583
  return [];
@@ -637,28 +608,11 @@ async function deleteConversation(conversationId) {
637
608
  await session.close();
638
609
  }
639
610
  }
640
- var GENERIC_MESSAGE = /^(h(i|ello|ey|owdy)|yo|sup|thanks|thank you|ok|okay|yes|no|good\s*(morning|afternoon|evening|night)|greetings|what'?s\s*up)[\s!?.,:;]*$/i;
641
611
  var SESSION_LABEL_MSG_CAP = 500;
642
612
  var SESSION_LABEL_TIMEOUT_MS = 15e3;
643
613
  var SESSION_LABEL_MODEL = HAIKU_MODEL;
644
614
  var SESSION_LABEL_MAX_WORDS = 6;
645
- var SESSION_LABEL_MAX_ATTEMPTS = 3;
646
615
  var SESSION_LABEL_MAX_STDERR = 2048;
647
- function isMessageUseful(message) {
648
- const trimmed = message.trim();
649
- if (trimmed.length < 4) return false;
650
- if (trimmed.startsWith('{"')) return false;
651
- if (GENERIC_MESSAGE.test(trimmed)) return false;
652
- if (trimmed.startsWith(DIRECTIVE_PREFIX)) return false;
653
- return true;
654
- }
655
- function totalFailures(f) {
656
- return f.skip + f.error;
657
- }
658
- function failureBreakdown(f) {
659
- return `skip:${f.skip} error:${f.error}`;
660
- }
661
- var labelAccumulator = /* @__PURE__ */ new Map();
662
616
  var _spawnOverride = null;
663
617
  var SESSION_LABEL_SYSTEM = `You are a session labeler. Given the opening messages of a conversation with an AI assistant, produce a concise topic label.
664
618
 
@@ -729,117 +683,6 @@ ${userContent}`;
729
683
  });
730
684
  });
731
685
  }
732
- async function autoLabelSession(conversationId, userMessage) {
733
- if (!conversationId) return;
734
- if (!isMessageUseful(userMessage)) {
735
- const trimmed = userMessage.trim();
736
- const reason = trimmed.startsWith('{"') ? "JSON envelope" : trimmed.startsWith(DIRECTIVE_PREFIX) ? "directive" : GENERIC_MESSAGE.test(trimmed) ? "greeting" : trimmed.length < 4 ? "too short" : "directive";
737
- console.error(`[persist] autoLabel: skipped ${conversationId.slice(0, 8)}\u2026 \u2014 ${reason}`);
738
- return;
739
- }
740
- try {
741
- const preCheck = getSession();
742
- try {
743
- const res = await preCheck.run(
744
- `MATCH (c:Conversation {conversationId: $conversationId})
745
- OPTIONAL MATCH (m:Message)-[:PART_OF]->(c)
746
- WHERE m.role = 'user'
747
- WITH c, count(m) AS userCount
748
- RETURN c.name AS name, userCount`,
749
- { conversationId }
750
- );
751
- const firstRecord = res.records[0];
752
- const existingName = firstRecord?.get("name");
753
- const userCountRaw = firstRecord?.get("userCount");
754
- const userCount = typeof userCountRaw === "object" && userCountRaw !== null ? Number(userCountRaw) : Number(userCountRaw ?? 0);
755
- if (existingName) {
756
- console.error(`[persist] autoLabel: already named ${conversationId.slice(0, 8)}\u2026 \u2014 skipping`);
757
- labelAccumulator.delete(conversationId);
758
- return;
759
- }
760
- if (userCount > 3) {
761
- console.error(`[persist] autoLabel: past autolabel window ${conversationId.slice(0, 8)}\u2026 \u2014 userCount=${userCount}, skipping`);
762
- labelAccumulator.delete(conversationId);
763
- return;
764
- }
765
- } finally {
766
- await preCheck.close();
767
- }
768
- } catch (err) {
769
- console.error(`[persist] autoLabel: pre-check read failed for ${conversationId.slice(0, 8)}\u2026 \u2014 proceeding: ${err instanceof Error ? err.message : String(err)}`);
770
- }
771
- let entry = labelAccumulator.get(conversationId);
772
- if (!entry) {
773
- entry = {
774
- messages: [],
775
- pending: false,
776
- failures: { skip: 0, error: 0 }
777
- };
778
- labelAccumulator.set(conversationId, entry);
779
- }
780
- if (totalFailures(entry.failures) >= SESSION_LABEL_MAX_ATTEMPTS) {
781
- console.error(`[persist] autoLabel: evicted ${conversationId.slice(0, 8)}\u2026 after ${SESSION_LABEL_MAX_ATTEMPTS} failed-attempts (${failureBreakdown(entry.failures)})`);
782
- labelAccumulator.delete(conversationId);
783
- return;
784
- }
785
- entry.messages.push(userMessage.trim());
786
- if (entry.pending) {
787
- console.error(`[persist] autoLabel: accumulated for ${conversationId.slice(0, 8)}\u2026 (pending, ${entry.messages.length} msgs)`);
788
- return;
789
- }
790
- entry.pending = true;
791
- try {
792
- const label = await generateSessionLabel(entry.messages);
793
- if (!label) {
794
- entry.failures.skip++;
795
- console.error(`[persist] autoLabel: generateSessionLabel returned null for ${conversationId.slice(0, 8)}\u2026 (failures ${failureBreakdown(entry.failures)}, ${entry.messages.length} msgs)`);
796
- entry.pending = false;
797
- return;
798
- }
799
- const fullLabel = `${label} \xB7 ${conversationId.slice(0, 8)}`;
800
- let embedding = null;
801
- try {
802
- embedding = await embed(fullLabel);
803
- } catch (err) {
804
- console.error(`[persist] Conversation embedding failed, labelling without: ${err instanceof Error ? err.message : String(err)}`);
805
- }
806
- const session = getSession();
807
- try {
808
- const result = await session.run(
809
- `MATCH (c:Conversation {conversationId: $conversationId})
810
- WHERE c.name IS NULL
811
- WITH c
812
- OPTIONAL MATCH (m:Message)-[:PART_OF]->(c)
813
- WHERE m.role = 'user'
814
- WITH c, count(m) AS userCount
815
- WHERE userCount <= 3
816
- SET c.name = $label, c.updatedAt = datetime()
817
- ${embedding ? ", c.embedding = $embedding" : ""}
818
- RETURN c.name AS name`,
819
- { conversationId, label: fullLabel, ...embedding ? { embedding } : {} }
820
- );
821
- if (result.records.length > 0) {
822
- console.error(`[persist] autoLabel: commit ${conversationId.slice(0, 8)}\u2026 name="${fullLabel}"${embedding ? " (embedded)" : ""}`);
823
- labelAccumulator.delete(conversationId);
824
- } else {
825
- console.error(`[persist] autoLabel: no-op commit ${conversationId.slice(0, 8)}\u2026 (name already set or userCount>3)`);
826
- labelAccumulator.delete(conversationId);
827
- }
828
- } catch (err) {
829
- entry.failures.error++;
830
- console.error(`[persist] autoLabelSession failed: ${err instanceof Error ? err.message : String(err)} (failures ${failureBreakdown(entry.failures)})`);
831
- } finally {
832
- await session.close();
833
- }
834
- } catch (err) {
835
- const currentEntry = labelAccumulator.get(conversationId);
836
- if (currentEntry) currentEntry.failures.error++;
837
- console.error(`[persist] autoLabel: unexpected error \u2014 ${err instanceof Error ? err.message : String(err)}${currentEntry ? ` (failures ${failureBreakdown(currentEntry.failures)})` : ""}`);
838
- } finally {
839
- const currentEntry = labelAccumulator.get(conversationId);
840
- if (currentEntry) currentEntry.pending = false;
841
- }
842
- }
843
686
  async function renameConversation(conversationId, label) {
844
687
  let embedding = null;
845
688
  try {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getConversationOwner
3
- } from "./chunk-NNHHGQJL.js";
3
+ } from "./chunk-4P2MPERV.js";
4
4
 
5
5
  // node_modules/hono/dist/compose.js
6
6
  var compose = (middleware, onError, onNotFound) => {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getSession
3
- } from "./chunk-NNHHGQJL.js";
3
+ } from "./chunk-4P2MPERV.js";
4
4
  import {
5
5
  __commonJS,
6
6
  __toESM
@@ -7,8 +7,8 @@ import {
7
7
  readTunnelState,
8
8
  recoverRunningCloudflareTasks,
9
9
  resolveUnitGoneVerdict
10
- } from "./chunk-QC5LHYPH.js";
11
- import "./chunk-NNHHGQJL.js";
10
+ } from "./chunk-XJVJ2B2Q.js";
11
+ import "./chunk-4P2MPERV.js";
12
12
  import "./chunk-JSBRDJBE.js";
13
13
  export {
14
14
  CLOUDFLARE_TASK_DIAGNOSTICS,
@@ -18,8 +18,8 @@ import {
18
18
  streamActionEvents,
19
19
  vncLog,
20
20
  websockifyLog
21
- } from "./chunk-3G6JMV7N.js";
22
- import "./chunk-NNHHGQJL.js";
21
+ } from "./chunk-MEGIQYUD.js";
22
+ import "./chunk-4P2MPERV.js";
23
23
  import "./chunk-JSBRDJBE.js";
24
24
 
25
25
  // server/edge.ts
@@ -1 +1 @@
1
- import{a as e}from"./brand-DXOx08r0.js";var t=e();function n({checked:e,onChange:n,label:r,disabled:i}){return(0,t.jsxs)(`label`,{className:`maxy-checkbox${i?` maxy-checkbox--disabled`:``}`,children:[(0,t.jsx)(`input`,{type:`checkbox`,checked:e,onChange:e=>n(e.target.checked),disabled:i}),(0,t.jsx)(`span`,{className:`maxy-checkbox__box`,children:`✱`}),r&&(0,t.jsx)(`span`,{className:`maxy-checkbox__label`,children:r})]})}export{n as t};
1
+ import{a as e}from"./brand-D6mXeyxV.js";var t=e();function n({checked:e,onChange:n,label:r,disabled:i}){return(0,t.jsxs)(`label`,{className:`maxy-checkbox${i?` maxy-checkbox--disabled`:``}`,children:[(0,t.jsx)(`input`,{type:`checkbox`,checked:e,onChange:e=>n(e.target.checked),disabled:i}),(0,t.jsx)(`span`,{className:`maxy-checkbox__box`,children:`✱`}),r&&(0,t.jsx)(`span`,{className:`maxy-checkbox__label`,children:r})]})}export{n as t};