@rubytech/create-maxy-code 0.1.47 → 0.1.51

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 (103) hide show
  1. package/dist/__tests__/premium-mcp-discover.test.js +85 -0
  2. package/dist/index.js +17 -0
  3. package/dist/lib/premium-mcp-discover.js +34 -0
  4. package/package.json +1 -1
  5. package/payload/platform/plugins/admin/PLUGIN.md +1 -1
  6. package/payload/platform/plugins/admin/hooks/__tests__/turn-completed-graph-write.test.sh +54 -55
  7. package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +40 -47
  8. package/payload/platform/plugins/docs/PLUGIN.md +3 -1
  9. package/payload/platform/plugins/docs/references/admin-session.md +10 -0
  10. package/payload/platform/plugins/docs/references/deployment.md +2 -0
  11. package/payload/platform/plugins/docs/references/internals.md +4 -0
  12. package/payload/platform/plugins/docs/references/platform.md +1 -1
  13. package/payload/platform/plugins/loop/PLUGIN.md +24 -0
  14. package/payload/platform/plugins/loop/mcp/src/__tests__/plugin-md-time-doctrine.test.ts +132 -0
  15. package/payload/platform/plugins/tasks/mcp/dist/index.js +1 -2
  16. package/payload/platform/plugins/tasks/mcp/dist/index.js.map +1 -1
  17. package/payload/platform/plugins/tasks/mcp/dist/tools/session-name.d.ts.map +1 -1
  18. package/payload/platform/plugins/tasks/mcp/dist/tools/session-name.js +3 -2
  19. package/payload/platform/plugins/tasks/mcp/dist/tools/session-name.js.map +1 -1
  20. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  21. package/payload/platform/services/claude-session-manager/dist/http-server.js +17 -2
  22. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  23. package/payload/premium-plugins/real-agent/plugins/loop/PLUGIN.md +24 -0
  24. package/payload/premium-plugins/real-agent/plugins/loop/mcp/src/__tests__/plugin-md-time-doctrine.test.ts +132 -0
  25. package/payload/server/{chunk-MEGIQYUD.js → chunk-CWI7NOWK.js} +1 -1
  26. package/payload/server/{chunk-XJVJ2B2Q.js → chunk-NPZKH5EC.js} +1 -1
  27. package/payload/server/{chunk-4P2MPERV.js → chunk-X3Y6ENKA.js} +0 -90
  28. package/payload/server/{cloudflare-task-tracker-R6MMORFU.js → cloudflare-task-tracker-TL6R364J.js} +2 -2
  29. package/payload/server/maxy-edge.js +2 -2
  30. package/payload/server/public/assets/admin-BbcN8otj.js +216 -0
  31. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Ch-JZ1Q0.js → architectureDiagram-Q4EWVU46-DGHlapUl.js} +1 -1
  32. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-C08tkD4C.js → blockDiagram-DXYQGD6D-Dgnf9J14.js} +1 -1
  33. package/payload/server/public/assets/{brand-DCdOhh-I.css → brand-CtilcX3W.css} +1 -1
  34. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-IceRdWw3.js → c4Diagram-AHTNJAMY-GBVmghhJ.js} +1 -1
  35. package/payload/server/public/assets/channel-p5ZCfK_I.js +1 -0
  36. package/payload/server/public/assets/{chunk-336JU56O-Cey0rxmH.js → chunk-336JU56O-CSVC_J3A.js} +2 -2
  37. package/payload/server/public/assets/{chunk-426QAEUC-Dzk8s0or.js → chunk-426QAEUC-CK1Z0942.js} +1 -1
  38. package/payload/server/public/assets/{chunk-4TB4RGXK-C10nuKc8.js → chunk-4TB4RGXK-CaqJYLxL.js} +1 -1
  39. package/payload/server/public/assets/{chunk-5FUZZQ4R-B1B8871D.js → chunk-5FUZZQ4R-57BmPy_B.js} +1 -1
  40. package/payload/server/public/assets/{chunk-5PVQY5BW-jvHIkgqP.js → chunk-5PVQY5BW-Ud03uYx_.js} +1 -1
  41. package/payload/server/public/assets/{chunk-EDXVE4YY-7nDxvXHS.js → chunk-EDXVE4YY-p5KO0PoG.js} +1 -1
  42. package/payload/server/public/assets/{chunk-ENJZ2VHE-C8lJ1YYn.js → chunk-ENJZ2VHE-CkxgLujt.js} +1 -1
  43. package/payload/server/public/assets/{chunk-ICPOFSXX-CT1d7veI.js → chunk-ICPOFSXX-DwMkY8p7.js} +1 -1
  44. package/payload/server/public/assets/{chunk-OYMX7WX6-LTAfwxv0.js → chunk-OYMX7WX6-CyYOUKBw.js} +1 -1
  45. package/payload/server/public/assets/{chunk-U2HBQHQK-RoGrqrH0.js → chunk-U2HBQHQK-Dk5rfJM6.js} +1 -1
  46. package/payload/server/public/assets/{chunk-X2U36JSP-D89ZBg3z.js → chunk-X2U36JSP-D0qCg9Nq.js} +1 -1
  47. package/payload/server/public/assets/{chunk-YZCP3GAM-Cyg122Hf.js → chunk-YZCP3GAM-C0uFHrdT.js} +1 -1
  48. package/payload/server/public/assets/{chunk-ZZ45TVLE-Dg59YYuG.js → chunk-ZZ45TVLE-C7lSyGRs.js} +1 -1
  49. package/payload/server/public/assets/classDiagram-6PBFFD2Q-DqDM1D4-.js +1 -0
  50. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DeYvPD8H.js +1 -0
  51. package/payload/server/public/assets/clone-60k82qeh.js +1 -0
  52. package/payload/server/public/assets/{dagre-BPzUsxie.js → dagre-BWZ4wr8y.js} +1 -1
  53. package/payload/server/public/assets/{dagre-KV5264BT-CjDNXqPy.js → dagre-KV5264BT-C7mpqRpw.js} +1 -1
  54. package/payload/server/public/assets/data-oXs84UW6.js +1 -0
  55. package/payload/server/public/assets/{device-url-actions-B588ZlnE.js → device-url-actions-347cMDY4.js} +1 -1
  56. package/payload/server/public/assets/{diagram-5BDNPKRD-Bqq0vqWM.js → diagram-5BDNPKRD-BcQRB7_3.js} +1 -1
  57. package/payload/server/public/assets/{diagram-G4DWMVQ6-DSqocDhm.js → diagram-G4DWMVQ6-BLSGUKbc.js} +1 -1
  58. package/payload/server/public/assets/{diagram-MMDJMWI5-DZRWgKRL.js → diagram-MMDJMWI5-Ra1VvGJh.js} +1 -1
  59. package/payload/server/public/assets/{diagram-TYMM5635-DXRm-FXu.js → diagram-TYMM5635-Bx_r1USn.js} +1 -1
  60. package/payload/server/public/assets/{erDiagram-SMLLAGMA-CFVgkUCo.js → erDiagram-SMLLAGMA-CJhoN8dG.js} +1 -1
  61. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-C82XCt9-.js → flowDiagram-DWJPFMVM-Bd5CZIoq.js} +1 -1
  62. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-C4tnImlS.js → ganttDiagram-T4ZO3ILL-BNQJqJFh.js} +1 -1
  63. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DXHutP-a.js → gitGraphDiagram-UUTBAWPF-DoE1AFmA.js} +1 -1
  64. package/payload/server/public/assets/graph-DcpqWbSs.js +1 -0
  65. package/payload/server/public/assets/graph-labels-DJvuUODB.js +1 -0
  66. package/payload/server/public/assets/{graphlib-BvR5tL62.js → graphlib-D7JFfLSw.js} +1 -1
  67. package/payload/server/public/assets/{infoDiagram-42DDH7IO-DgFMqgZy.js → infoDiagram-42DDH7IO-BtsKRO-J.js} +1 -1
  68. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-_5gmh1-V.js → ishikawaDiagram-UXIWVN3A-DapnDR0V.js} +1 -1
  69. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-CNfDVgwI.js → journeyDiagram-VCZTEJTY-BLqfwMMu.js} +1 -1
  70. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-Djifb_Z6.js → kanban-definition-6JOO6SKY-DqiSbvUW.js} +1 -1
  71. package/payload/server/public/assets/{line-0fRVrNiw.js → line-DcwBbbhp.js} +1 -1
  72. package/payload/server/public/assets/{mermaid-parser.core-DXA7LKDt.js → mermaid-parser.core-BZwNRInp.js} +1 -1
  73. package/payload/server/public/assets/{mermaid.core-BCfYtdMJ.js → mermaid.core-DnsyVInc.js} +3 -3
  74. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-sTRvikWi.js → mindmap-definition-QFDTVHPH-MPPO8aDx.js} +1 -1
  75. package/payload/server/public/assets/{page-CQ7ELqGs.js → page-Cz_pVOv_.js} +1 -1
  76. package/payload/server/public/assets/{page-SOCqJGlV.js → page-pXt2BdOS.js} +2 -2
  77. package/payload/server/public/assets/{pieDiagram-DEJITSTG-QLTieded.js → pieDiagram-DEJITSTG-BKzbjD_5.js} +1 -1
  78. package/payload/server/public/assets/{public-rUUducAl.js → public-C-0V5aC8.js} +3 -3
  79. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DOKCcqAZ.js → quadrantDiagram-34T5L4WZ-CvvvRvae.js} +1 -1
  80. package/payload/server/public/assets/{requirementDiagram-MS252O5E-BX6Zpq1X.js → requirementDiagram-MS252O5E-BxXZA7z2.js} +1 -1
  81. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-B05NdgZX.js → sankeyDiagram-XADWPNL6-BRRFjjao.js} +1 -1
  82. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-CHF8ZdUb.js → sequenceDiagram-FGHM5R23-DOy_E8xe.js} +1 -1
  83. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DTAt7Ytz.js → stateDiagram-FHFEXIEX-CDqat01p.js} +1 -1
  84. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DHckg-aj.js +1 -0
  85. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-Dzd6X_ei.js → timeline-definition-GMOUNBTQ-AK1yuR8Z.js} +1 -1
  86. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BAbM4QlQ.js → vennDiagram-DHZGUBPP-CCKJ7H16.js} +1 -1
  87. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-CIOXXKJd.js → wardleyDiagram-NUSXRM2D-CKHKJnG_.js} +1 -1
  88. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-oF9sZesS.js → xychartDiagram-5P7HB3ND-BBD35k9e.js} +1 -1
  89. package/payload/server/public/data.html +5 -5
  90. package/payload/server/public/graph.html +5 -5
  91. package/payload/server/public/index.html +7 -7
  92. package/payload/server/public/public.html +4 -4
  93. package/payload/server/server.js +97 -74
  94. package/payload/server/public/assets/admin-SyUHjvNs.js +0 -216
  95. package/payload/server/public/assets/channel-8QQB2Zoe.js +0 -1
  96. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CViZOOjI.js +0 -1
  97. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Dm7eGBqB.js +0 -1
  98. package/payload/server/public/assets/clone-BC8oes11.js +0 -1
  99. package/payload/server/public/assets/data-DwQ7ZEyy.js +0 -1
  100. package/payload/server/public/assets/graph-CwZkD6GX.js +0 -1
  101. package/payload/server/public/assets/graph-labels-CVkmOHhw.js +0 -1
  102. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-2bJIW7wn.js +0 -1
  103. /package/payload/server/public/assets/{brand-Dln107gD.js → brand-B6pMzF6h.js} +0 -0
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Anti-regression: PLUGIN.md must carry the "Time presentation" doctrine
3
+ * paragraph and enumerate every Loop tool whose response contains a
4
+ * datetime field. The doctrine is the agent's only signal that Loop
5
+ * returns bare UTC strings without a zone marker — silent drop of this
6
+ * section recurs the off-by-one-hour viewing-time failure (Task 126).
7
+ *
8
+ * The expected tool list is derived live from the vendored swagger
9
+ * snapshot, so if Loop adds a new datetime-bearing endpoint and we miss
10
+ * mapping it in PLUGIN.md, the test fails and names the orphan.
11
+ */
12
+
13
+ import { describe, expect, it } from 'vitest';
14
+ import { readFileSync } from 'node:fs';
15
+ import { resolve, dirname } from 'node:path';
16
+ import { fileURLToPath } from 'node:url';
17
+
18
+ const __dirname = dirname(fileURLToPath(import.meta.url));
19
+ const PLUGIN_MD = resolve(__dirname, '../../../PLUGIN.md');
20
+ const SWAGGER_PATH = resolve(__dirname, 'loop-swagger.snapshot.json');
21
+
22
+ interface SwaggerDoc {
23
+ paths: Record<string, Record<string, { responses?: Record<string, { content?: Record<string, { schema?: unknown }> }> }>>;
24
+ components?: { schemas?: Record<string, unknown> };
25
+ }
26
+
27
+ const swagger = JSON.parse(readFileSync(SWAGGER_PATH, 'utf-8')) as SwaggerDoc;
28
+ const plugin = readFileSync(PLUGIN_MD, 'utf-8');
29
+
30
+ // Swagger path → tool name. Every response-bearing GET path that surfaces
31
+ // a datetime field must map to exactly one tool here. Add a row when Loop
32
+ // publishes a new datetime endpoint that we expose.
33
+ const PATH_TO_TOOL: Record<string, string> = {
34
+ '/residential/sales/viewings': 'loop-viewing-search',
35
+ '/residential/lettings/viewings': 'loop-viewing-search',
36
+ '/residential/sales/viewings/{id}': 'loop-viewing-detail',
37
+ '/residential/lettings/viewings/{id}': 'loop-viewing-detail',
38
+ '/feedback/residential/sales/viewings/{id}': 'loop-feedback-get',
39
+ '/feedback/residential/lettings/viewings/{id}': 'loop-feedback-get',
40
+ '/people/renters': 'loop-people-search',
41
+ '/people/{id}': 'loop-people-detail',
42
+ '/people/buyers/{id}': 'loop-people-detail',
43
+ '/people/sellers/{id}': 'loop-people-detail',
44
+ '/people/landlords/{id}': 'loop-people-detail',
45
+ '/people/renters/{id}': 'loop-people-detail',
46
+ '/property/residential/sales/{id}': 'loop-property-detail',
47
+ '/property/residential/lettings/{id}': 'loop-property-detail',
48
+ '/property/residential/sales': 'loop-property-search',
49
+ '/property/residential/lettings': 'loop-property-search',
50
+ '/property/residential/sales/listed/{channel}': 'loop-property-listed',
51
+ '/property/residential/lettings/listed/{channel}': 'loop-property-listed',
52
+ '/property/residential/sales/{id}/preview/{previewHash}': 'loop-property-detail',
53
+ '/property/residential/lettings/{id}/preview/{previewHash}': 'loop-property-detail',
54
+ '/property/residential/sold/{channel}': 'loop-property-sold',
55
+ '/marketing/matching/{id}': 'loop-marketing-match',
56
+ '/marketing/rentals/matching/{id}': 'loop-marketing-match',
57
+ '/marketing/enquiries/auto-responder/{id}/{key}': 'loop-auto-responder',
58
+ '/team/{agentId}/availability/{searchDate}': 'loop-team-availability',
59
+ '/supplier/board-contractor/{code}/{jobid}/job-list': 'loop-supplier',
60
+ '/supplier/maintenance/{quoteCode}/{jobid}/job-list': 'loop-supplier',
61
+ '/supplier/maintenance/{quoteCode}/{jobId}/quote-list': 'loop-supplier',
62
+ };
63
+
64
+ function resolveRef(ref: string): unknown {
65
+ const parts = ref.replace('#/', '').split('/');
66
+ let cur: unknown = swagger;
67
+ for (const p of parts) cur = cur && typeof cur === 'object' ? (cur as Record<string, unknown>)[p] : null;
68
+ return cur;
69
+ }
70
+
71
+ function hasDateField(node: unknown, depth = 0, visited = new WeakSet<object>()): boolean {
72
+ if (!node || typeof node !== 'object' || depth > 12) return false;
73
+ if (visited.has(node as object)) return false;
74
+ visited.add(node as object);
75
+ const n = node as Record<string, unknown>;
76
+ if (typeof n.$ref === 'string') return hasDateField(resolveRef(n.$ref), depth + 1, visited);
77
+ if (n.format === 'date-time' || n.format === 'date') return true;
78
+ if (n.properties && typeof n.properties === 'object') {
79
+ for (const v of Object.values(n.properties as Record<string, unknown>)) {
80
+ if (hasDateField(v, depth + 1, visited)) return true;
81
+ }
82
+ }
83
+ if (n.items && hasDateField(n.items, depth + 1, visited)) return true;
84
+ if (Array.isArray(n.allOf)) {
85
+ for (const v of n.allOf) if (hasDateField(v, depth + 1, visited)) return true;
86
+ }
87
+ return false;
88
+ }
89
+
90
+ function toolsRequiringDoctrine(): Set<string> {
91
+ const tools = new Set<string>();
92
+ for (const [path, methods] of Object.entries(swagger.paths)) {
93
+ const op = methods.get;
94
+ if (!op || !op.responses) continue;
95
+ const anyDate = Object.values(op.responses).some(r =>
96
+ Object.values(r.content || {}).some(sw => hasDateField(sw.schema)),
97
+ );
98
+ if (!anyDate) continue;
99
+ const tool = PATH_TO_TOOL[path];
100
+ if (tool) tools.add(tool);
101
+ else throw new Error(`Swagger GET ${path} returns a datetime but has no PATH_TO_TOOL mapping — add it and list the tool in PLUGIN.md "Time presentation".`);
102
+ }
103
+ return tools;
104
+ }
105
+
106
+ describe('PLUGIN.md time-presentation doctrine', () => {
107
+ it('contains the Time presentation section', () => {
108
+ expect(plugin).toMatch(/^## Time presentation$/m);
109
+ });
110
+
111
+ it('names UTC, Person.timezone, and the Europe/London default', () => {
112
+ expect(plugin).toMatch(/UTC/);
113
+ expect(plugin).toMatch(/Person\.timezone/);
114
+ expect(plugin).toMatch(/Europe\/London/);
115
+ });
116
+
117
+ it('forbids raw UTC presentation', () => {
118
+ // Must state conversion is required before any datetime appears in output.
119
+ expect(plugin).toMatch(/Convert before any datetime appears in agent output/);
120
+ });
121
+
122
+ it('enumerates every tool whose Loop response carries a datetime field', () => {
123
+ const required = toolsRequiringDoctrine();
124
+ const missing: string[] = [];
125
+ for (const tool of required) {
126
+ // Each tool must appear in the doctrine section as a bullet item.
127
+ const re = new RegExp(`^- \`${tool.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')}\``, 'm');
128
+ if (!re.test(plugin)) missing.push(tool);
129
+ }
130
+ expect(missing, `PLUGIN.md "Time presentation" must list: ${missing.join(', ')}`).toEqual([]);
131
+ });
132
+ });
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getConversationOwner
3
- } from "./chunk-4P2MPERV.js";
3
+ } from "./chunk-X3Y6ENKA.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-4P2MPERV.js";
3
+ } from "./chunk-X3Y6ENKA.js";
4
4
  import {
5
5
  __commonJS,
6
6
  __toESM
@@ -1,21 +1,8 @@
1
1
  // app/lib/neo4j-store.ts
2
2
  import neo4j from "neo4j-driver";
3
3
  import { randomUUID } from "crypto";
4
- import { spawn } from "child_process";
5
4
  import { readFileSync, readdirSync, existsSync, openSync, readSync, closeSync, statSync } from "fs";
6
5
  import { resolve } from "path";
7
-
8
- // ../lib/models/src/index.ts
9
- var OPUS_MODEL = "claude-opus-4-7";
10
- var SONNET_MODEL = "claude-sonnet-4-6";
11
- var HAIKU_MODEL = "claude-haiku-4-5";
12
- var MODEL_CONTEXT_WINDOW = {
13
- [OPUS_MODEL]: 2e5,
14
- [SONNET_MODEL]: 2e5,
15
- [HAIKU_MODEL]: 2e5
16
- };
17
-
18
- // app/lib/neo4j-store.ts
19
6
  var PLATFORM_ROOT = process.env.MAXY_PLATFORM_ROOT ?? resolve(process.cwd(), "..");
20
7
  var driver = null;
21
8
  function readPassword() {
@@ -608,81 +595,6 @@ async function deleteConversation(conversationId) {
608
595
  await session.close();
609
596
  }
610
597
  }
611
- var SESSION_LABEL_MSG_CAP = 500;
612
- var SESSION_LABEL_TIMEOUT_MS = 15e3;
613
- var SESSION_LABEL_MODEL = HAIKU_MODEL;
614
- var SESSION_LABEL_MAX_WORDS = 6;
615
- var SESSION_LABEL_MAX_STDERR = 2048;
616
- var _spawnOverride = null;
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.
618
-
619
- Rules:
620
- - Exactly 3 to 6 words
621
- - Summarize the user's intent, do not copy verbatim
622
- - Capitalize the first word only (sentence case)
623
- - No punctuation, no quotes
624
- - You MUST always produce a label. Vague, terse, or single-word messages still get a best-effort label (e.g. a one-word "hi" or an emoji becomes "Greeting"; an unintelligible fragment becomes "Unstructured note"). Never abstain.`;
625
- async function generateSessionLabel(messages) {
626
- const cappedMessages = messages.map((m) => m.slice(0, SESSION_LABEL_MSG_CAP));
627
- const userContent = cappedMessages.map((m, i) => `Message ${i + 1}: ${m}`).join("\n");
628
- const prompt = `${SESSION_LABEL_SYSTEM}
629
-
630
- ${userContent}`;
631
- const args = [
632
- "--print",
633
- "--model",
634
- SESSION_LABEL_MODEL,
635
- "--max-turns",
636
- "1",
637
- "--permission-mode",
638
- "dontAsk",
639
- prompt
640
- ];
641
- return new Promise((resolve2) => {
642
- let stdout = "";
643
- let stderr = "";
644
- const spawnFn = _spawnOverride ?? spawn;
645
- const proc = spawnFn("claude", args, {
646
- stdio: ["ignore", "pipe", "pipe"]
647
- });
648
- proc.stdout?.on("data", (chunk) => {
649
- stdout += chunk.toString("utf-8");
650
- });
651
- proc.stderr?.on("data", (chunk) => {
652
- if (stderr.length < SESSION_LABEL_MAX_STDERR) {
653
- stderr += chunk.toString("utf-8").slice(0, SESSION_LABEL_MAX_STDERR - stderr.length);
654
- }
655
- });
656
- const timer = setTimeout(() => {
657
- proc.kill("SIGTERM");
658
- console.error("[persist] autoLabel: haiku subprocess timed out");
659
- resolve2(null);
660
- }, SESSION_LABEL_TIMEOUT_MS);
661
- proc.on("error", (err) => {
662
- clearTimeout(timer);
663
- console.error(`[persist] autoLabel: subprocess error \u2014 ${err.message}`);
664
- resolve2(null);
665
- });
666
- proc.on("close", (code) => {
667
- clearTimeout(timer);
668
- if (code !== 0) {
669
- console.error(`[persist] autoLabel: subprocess exited code=${code}${stderr ? ` stderr=${stderr.trim().slice(0, 200)}` : ""}`);
670
- resolve2(null);
671
- return;
672
- }
673
- const text = stdout.trim();
674
- if (!text) {
675
- console.error("[persist] autoLabel: haiku returned empty response");
676
- resolve2(null);
677
- return;
678
- }
679
- const words = text.split(/\s+/).slice(0, SESSION_LABEL_MAX_WORDS);
680
- const label = words.join(" ");
681
- console.error(`[persist] autoLabel: haiku response="${label}"`);
682
- resolve2(label);
683
- });
684
- });
685
- }
686
598
  async function renameConversation(conversationId, label) {
687
599
  let embedding = null;
688
600
  try {
@@ -1336,7 +1248,6 @@ async function deleteAgentProjection(accountId, slug) {
1336
1248
  }
1337
1249
 
1338
1250
  export {
1339
- HAIKU_MODEL,
1340
1251
  getSession,
1341
1252
  runAdminUserSelfHeal,
1342
1253
  embed,
@@ -1351,7 +1262,6 @@ export {
1351
1262
  verifyAndGetConversationUpdatedAt,
1352
1263
  listAdminSessions,
1353
1264
  deleteConversation,
1354
- generateSessionLabel,
1355
1265
  renameConversation,
1356
1266
  getUserTimezone,
1357
1267
  loadAdminUserName,
@@ -7,8 +7,8 @@ import {
7
7
  readTunnelState,
8
8
  recoverRunningCloudflareTasks,
9
9
  resolveUnitGoneVerdict
10
- } from "./chunk-XJVJ2B2Q.js";
11
- import "./chunk-4P2MPERV.js";
10
+ } from "./chunk-NPZKH5EC.js";
11
+ import "./chunk-X3Y6ENKA.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-MEGIQYUD.js";
22
- import "./chunk-4P2MPERV.js";
21
+ } from "./chunk-CWI7NOWK.js";
22
+ import "./chunk-X3Y6ENKA.js";
23
23
  import "./chunk-JSBRDJBE.js";
24
24
 
25
25
  // server/edge.ts