@truefoundry/trueforge 0.1.4 → 0.2.0-rc.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.
Files changed (169) hide show
  1. package/README.md +1 -1
  2. package/dist/_frontend/assets/{ConnectorSettings-ODC3LVHN-CAU9MgGN.js → ConnectorSettings-FXQ5B7TN-CqkaJ6bk.js} +1 -1
  3. package/dist/_frontend/assets/ConnectorSettings-FXQ5B7TN-CqkaJ6bk.js.br +0 -0
  4. package/dist/_frontend/assets/ConnectorSettings-FXQ5B7TN-CqkaJ6bk.js.gz +0 -0
  5. package/dist/_frontend/assets/{DockLayout-2RWDSUKE-eKoTN8R3.js → DockLayout-LBNQJZNF-DGHpS9Gm.js} +1 -1
  6. package/dist/_frontend/assets/DrawerLayout-Q6UK4VMI-weFd3sRX.js +2 -0
  7. package/dist/_frontend/assets/DrawerLayout-Q6UK4VMI-weFd3sRX.js.br +0 -0
  8. package/dist/_frontend/assets/DrawerLayout-Q6UK4VMI-weFd3sRX.js.gz +0 -0
  9. package/dist/_frontend/assets/{ModelSettings-CKQ5CVAC-UBz_ch6T.js → ModelSettings-4L4LOQJA-C_5SjCkP.js} +1 -1
  10. package/dist/_frontend/assets/ModelSettings-4L4LOQJA-C_5SjCkP.js.br +0 -0
  11. package/dist/_frontend/assets/ModelSettings-4L4LOQJA-C_5SjCkP.js.gz +0 -0
  12. package/dist/_frontend/assets/{SandboxSettings-HSCPYUOC-Csl-nC9h.js → SandboxSettings-Z4ZG6ZX4-D6AjXcBe.js} +1 -1
  13. package/dist/_frontend/assets/SandboxSettings-Z4ZG6ZX4-D6AjXcBe.js.br +0 -0
  14. package/dist/_frontend/assets/SandboxSettings-Z4ZG6ZX4-D6AjXcBe.js.gz +0 -0
  15. package/dist/_frontend/assets/SettingsBuilder-WF7ZWKQW-BKzXsxdK.js +2 -0
  16. package/dist/_frontend/assets/SettingsBuilder-WF7ZWKQW-BKzXsxdK.js.br +0 -0
  17. package/dist/_frontend/assets/SettingsBuilder-WF7ZWKQW-BKzXsxdK.js.gz +0 -0
  18. package/dist/_frontend/assets/ShellRouteSync-T4WLY57Q-DQu3omM6.js +1 -0
  19. package/dist/_frontend/assets/ShellRouteSync-T4WLY57Q-DQu3omM6.js.br +0 -0
  20. package/dist/_frontend/assets/ShellRouteSync-T4WLY57Q-DQu3omM6.js.gz +0 -0
  21. package/dist/_frontend/assets/SidebarLayout-3WZ3CVON-DCnEzJW3.js +2 -0
  22. package/dist/_frontend/assets/SidebarLayout-3WZ3CVON-DCnEzJW3.js.br +0 -0
  23. package/dist/_frontend/assets/SidebarLayout-3WZ3CVON-DCnEzJW3.js.gz +0 -0
  24. package/dist/_frontend/assets/{SkillSettings-ECH6SHZ7-CKWEzdO_.js → SkillSettings-3EPPC3IT-Cp2dAkSv.js} +1 -1
  25. package/dist/_frontend/assets/SkillSettings-3EPPC3IT-Cp2dAkSv.js.br +0 -0
  26. package/dist/_frontend/assets/SkillSettings-3EPPC3IT-Cp2dAkSv.js.gz +0 -0
  27. package/dist/_frontend/assets/{TrueForgeUIWithRouter-RKZ2E7PV-CoVbEgto.js → TrueForgeUIWithRouter-NZ4FGPE4-DKspF7Vq.js} +1 -1
  28. package/dist/_frontend/assets/{WidgetLayout-NWWB2SXI-cUmY1p2v.js → WidgetLayout-3QZ357FL-hQNmmaQ9.js} +1 -1
  29. package/dist/_frontend/assets/WidgetLayout-3QZ357FL-hQNmmaQ9.js.br +0 -0
  30. package/dist/_frontend/assets/WidgetLayout-3QZ357FL-hQNmmaQ9.js.gz +0 -0
  31. package/dist/_frontend/assets/{chunk-62JRHF6Z-BftTGWZl.js → chunk-62JRHF6Z-DktHCg-F.js} +1 -1
  32. package/dist/_frontend/assets/chunk-62JRHF6Z-DktHCg-F.js.br +0 -0
  33. package/dist/_frontend/assets/chunk-62JRHF6Z-DktHCg-F.js.gz +0 -0
  34. package/dist/_frontend/assets/chunk-7L63OK3O-ut7ifKZZ.js +2 -0
  35. package/dist/_frontend/assets/chunk-7L63OK3O-ut7ifKZZ.js.br +0 -0
  36. package/dist/_frontend/assets/chunk-7L63OK3O-ut7ifKZZ.js.gz +0 -0
  37. package/dist/_frontend/assets/chunk-ZXOADNF3-CYtk3iXk.js +4 -0
  38. package/dist/_frontend/assets/chunk-ZXOADNF3-CYtk3iXk.js.br +0 -0
  39. package/dist/_frontend/assets/chunk-ZXOADNF3-CYtk3iXk.js.gz +0 -0
  40. package/dist/_frontend/assets/{cssMode-CvKwYh_L.js → cssMode-CVoX59tx.js} +1 -1
  41. package/dist/_frontend/assets/cssMode-CVoX59tx.js.br +0 -0
  42. package/dist/_frontend/assets/cssMode-CVoX59tx.js.gz +0 -0
  43. package/dist/_frontend/assets/{freemarker2-Bb2yOpT3.js → freemarker2-CCQkuwQA.js} +1 -1
  44. package/dist/_frontend/assets/freemarker2-CCQkuwQA.js.br +0 -0
  45. package/dist/_frontend/assets/freemarker2-CCQkuwQA.js.gz +0 -0
  46. package/dist/_frontend/assets/{handlebars-FL3wsxe0.js → handlebars-Cbz9hMh4.js} +1 -1
  47. package/dist/_frontend/assets/handlebars-Cbz9hMh4.js.br +0 -0
  48. package/dist/_frontend/assets/handlebars-Cbz9hMh4.js.gz +0 -0
  49. package/dist/_frontend/assets/{html-Cb3v_ZRD.js → html-BahIpdyT.js} +1 -1
  50. package/dist/_frontend/assets/html-BahIpdyT.js.br +0 -0
  51. package/dist/_frontend/assets/html-BahIpdyT.js.gz +0 -0
  52. package/dist/_frontend/assets/{htmlMode-JQDvK0Qf.js → htmlMode-D8Lhuwsc.js} +1 -1
  53. package/dist/_frontend/assets/htmlMode-D8Lhuwsc.js.br +0 -0
  54. package/dist/_frontend/assets/htmlMode-D8Lhuwsc.js.gz +0 -0
  55. package/dist/_frontend/assets/{index-DJ1uWGdt.js → index-2V4Ldq3d.js} +236 -238
  56. package/dist/_frontend/assets/index-2V4Ldq3d.js.br +0 -0
  57. package/dist/_frontend/assets/index-2V4Ldq3d.js.gz +0 -0
  58. package/dist/_frontend/assets/{index-DRjgykCE.js → index-BijvMc2J.js} +3 -3
  59. package/dist/_frontend/assets/index-BijvMc2J.js.br +0 -0
  60. package/dist/_frontend/assets/index-BijvMc2J.js.gz +0 -0
  61. package/dist/_frontend/assets/{javascript-2WsgEpYV.js → javascript-DX64NjaV.js} +1 -1
  62. package/dist/_frontend/assets/{jsonMode-DnbseMlM.js → jsonMode-Cmj-z8lq.js} +1 -1
  63. package/dist/_frontend/assets/jsonMode-Cmj-z8lq.js.br +0 -0
  64. package/dist/_frontend/assets/jsonMode-Cmj-z8lq.js.gz +0 -0
  65. package/dist/_frontend/assets/{liquid-DeE37I1e.js → liquid-D9aEkxQ3.js} +1 -1
  66. package/dist/_frontend/assets/liquid-D9aEkxQ3.js.br +0 -0
  67. package/dist/_frontend/assets/liquid-D9aEkxQ3.js.gz +0 -0
  68. package/dist/_frontend/assets/{lspLanguageFeatures-Bty8j9di.js → lspLanguageFeatures-B9OVB8fw.js} +1 -1
  69. package/dist/_frontend/assets/lspLanguageFeatures-B9OVB8fw.js.br +0 -0
  70. package/dist/_frontend/assets/{lspLanguageFeatures-Bty8j9di.js.gz → lspLanguageFeatures-B9OVB8fw.js.gz} +0 -0
  71. package/dist/_frontend/assets/{mdx-DfKPZX1Z.js → mdx-BS6lx6sy.js} +1 -1
  72. package/dist/_frontend/assets/mdx-BS6lx6sy.js.br +0 -0
  73. package/dist/_frontend/assets/mdx-BS6lx6sy.js.gz +0 -0
  74. package/dist/_frontend/assets/{python-2i3Kiv75.js → python-CsklLa1s.js} +1 -1
  75. package/dist/_frontend/assets/python-CsklLa1s.js.br +0 -0
  76. package/dist/_frontend/assets/python-CsklLa1s.js.gz +0 -0
  77. package/dist/_frontend/assets/{razor-B0N4vZnc.js → razor-AHbg0zLw.js} +1 -1
  78. package/dist/_frontend/assets/razor-AHbg0zLw.js.br +0 -0
  79. package/dist/_frontend/assets/razor-AHbg0zLw.js.gz +0 -0
  80. package/dist/_frontend/assets/{tsMode-D1Y8xh-o.js → tsMode-a0R0JxtL.js} +1 -1
  81. package/dist/_frontend/assets/tsMode-a0R0JxtL.js.br +0 -0
  82. package/dist/_frontend/assets/tsMode-a0R0JxtL.js.gz +0 -0
  83. package/dist/_frontend/assets/{typescript-2nhip0PT.js → typescript-0a1AGk9v.js} +1 -1
  84. package/dist/_frontend/assets/typescript-0a1AGk9v.js.br +0 -0
  85. package/dist/_frontend/assets/typescript-0a1AGk9v.js.gz +0 -0
  86. package/dist/_frontend/assets/{workers-DSmTvA39.js → workers-B52dGfKp.js} +1 -1
  87. package/dist/_frontend/assets/workers-B52dGfKp.js.br +0 -0
  88. package/dist/_frontend/assets/workers-B52dGfKp.js.gz +0 -0
  89. package/dist/_frontend/assets/{xml-CA4M6Pks.js → xml-DLl5XSKM.js} +1 -1
  90. package/dist/_frontend/assets/xml-DLl5XSKM.js.br +0 -0
  91. package/dist/_frontend/assets/xml-DLl5XSKM.js.gz +0 -0
  92. package/dist/_frontend/assets/{yaml-D5KNk7Ji.js → yaml-DJwDc3Fv.js} +1 -1
  93. package/dist/_frontend/assets/yaml-DJwDc3Fv.js.br +0 -0
  94. package/dist/_frontend/assets/yaml-DJwDc3Fv.js.gz +0 -0
  95. package/dist/_frontend/index.html +1 -30
  96. package/dist/main.js +35 -21
  97. package/dist/main.js.map +1 -1
  98. package/dist/postgres/migrations/20260821_000001_agent_compaction.js +63 -0
  99. package/dist/postgres/migrations/20260821_000001_agent_compaction.js.map +1 -0
  100. package/dist/sqlite/migrations/20260821_000001_agent_compaction.js +69 -0
  101. package/dist/sqlite/migrations/20260821_000001_agent_compaction.js.map +1 -0
  102. package/package.json +21 -22
  103. package/dist/_frontend/assets/ConnectorSettings-ODC3LVHN-CAU9MgGN.js.br +0 -0
  104. package/dist/_frontend/assets/ConnectorSettings-ODC3LVHN-CAU9MgGN.js.gz +0 -0
  105. package/dist/_frontend/assets/DrawerLayout-CZLJYMIN-DWPAdLZz.js +0 -2
  106. package/dist/_frontend/assets/DrawerLayout-CZLJYMIN-DWPAdLZz.js.br +0 -0
  107. package/dist/_frontend/assets/DrawerLayout-CZLJYMIN-DWPAdLZz.js.gz +0 -0
  108. package/dist/_frontend/assets/ModelSettings-CKQ5CVAC-UBz_ch6T.js.br +0 -0
  109. package/dist/_frontend/assets/ModelSettings-CKQ5CVAC-UBz_ch6T.js.gz +0 -0
  110. package/dist/_frontend/assets/SandboxSettings-HSCPYUOC-Csl-nC9h.js.br +0 -0
  111. package/dist/_frontend/assets/SandboxSettings-HSCPYUOC-Csl-nC9h.js.gz +0 -0
  112. package/dist/_frontend/assets/SettingsBuilder-MYWRFXRI-Ce3OWfa1.js +0 -2
  113. package/dist/_frontend/assets/SettingsBuilder-MYWRFXRI-Ce3OWfa1.js.br +0 -0
  114. package/dist/_frontend/assets/SettingsBuilder-MYWRFXRI-Ce3OWfa1.js.gz +0 -0
  115. package/dist/_frontend/assets/ShellRouteSync-T4WLY57Q-B5lyCu4o.js +0 -1
  116. package/dist/_frontend/assets/ShellRouteSync-T4WLY57Q-B5lyCu4o.js.br +0 -0
  117. package/dist/_frontend/assets/ShellRouteSync-T4WLY57Q-B5lyCu4o.js.gz +0 -0
  118. package/dist/_frontend/assets/SidebarLayout-WVY54TGZ-CIx5jQIC.js +0 -2
  119. package/dist/_frontend/assets/SidebarLayout-WVY54TGZ-CIx5jQIC.js.br +0 -0
  120. package/dist/_frontend/assets/SidebarLayout-WVY54TGZ-CIx5jQIC.js.gz +0 -0
  121. package/dist/_frontend/assets/SkillSettings-ECH6SHZ7-CKWEzdO_.js.br +0 -0
  122. package/dist/_frontend/assets/SkillSettings-ECH6SHZ7-CKWEzdO_.js.gz +0 -0
  123. package/dist/_frontend/assets/WidgetLayout-NWWB2SXI-cUmY1p2v.js.br +0 -0
  124. package/dist/_frontend/assets/WidgetLayout-NWWB2SXI-cUmY1p2v.js.gz +0 -0
  125. package/dist/_frontend/assets/chunk-62JRHF6Z-BftTGWZl.js.br +0 -0
  126. package/dist/_frontend/assets/chunk-62JRHF6Z-BftTGWZl.js.gz +0 -0
  127. package/dist/_frontend/assets/chunk-OZTNBS6V-CLmmFX7d.js +0 -4
  128. package/dist/_frontend/assets/chunk-OZTNBS6V-CLmmFX7d.js.br +0 -0
  129. package/dist/_frontend/assets/chunk-OZTNBS6V-CLmmFX7d.js.gz +0 -0
  130. package/dist/_frontend/assets/chunk-TCAVLWYL-DVhtkE3q.js +0 -2
  131. package/dist/_frontend/assets/chunk-TCAVLWYL-DVhtkE3q.js.br +0 -0
  132. package/dist/_frontend/assets/chunk-TCAVLWYL-DVhtkE3q.js.gz +0 -0
  133. package/dist/_frontend/assets/cssMode-CvKwYh_L.js.br +0 -0
  134. package/dist/_frontend/assets/cssMode-CvKwYh_L.js.gz +0 -0
  135. package/dist/_frontend/assets/freemarker2-Bb2yOpT3.js.br +0 -0
  136. package/dist/_frontend/assets/freemarker2-Bb2yOpT3.js.gz +0 -0
  137. package/dist/_frontend/assets/handlebars-FL3wsxe0.js.br +0 -0
  138. package/dist/_frontend/assets/handlebars-FL3wsxe0.js.gz +0 -0
  139. package/dist/_frontend/assets/html-Cb3v_ZRD.js.br +0 -0
  140. package/dist/_frontend/assets/html-Cb3v_ZRD.js.gz +0 -0
  141. package/dist/_frontend/assets/htmlMode-JQDvK0Qf.js.br +0 -0
  142. package/dist/_frontend/assets/htmlMode-JQDvK0Qf.js.gz +0 -0
  143. package/dist/_frontend/assets/index-DJ1uWGdt.js.br +0 -0
  144. package/dist/_frontend/assets/index-DJ1uWGdt.js.gz +0 -0
  145. package/dist/_frontend/assets/index-DRjgykCE.js.br +0 -0
  146. package/dist/_frontend/assets/index-DRjgykCE.js.gz +0 -0
  147. package/dist/_frontend/assets/jsonMode-DnbseMlM.js.br +0 -0
  148. package/dist/_frontend/assets/jsonMode-DnbseMlM.js.gz +0 -0
  149. package/dist/_frontend/assets/liquid-DeE37I1e.js.br +0 -0
  150. package/dist/_frontend/assets/liquid-DeE37I1e.js.gz +0 -0
  151. package/dist/_frontend/assets/lspLanguageFeatures-Bty8j9di.js.br +0 -0
  152. package/dist/_frontend/assets/mdx-DfKPZX1Z.js.br +0 -0
  153. package/dist/_frontend/assets/mdx-DfKPZX1Z.js.gz +0 -0
  154. package/dist/_frontend/assets/python-2i3Kiv75.js.br +0 -0
  155. package/dist/_frontend/assets/python-2i3Kiv75.js.gz +0 -0
  156. package/dist/_frontend/assets/razor-B0N4vZnc.js.br +0 -0
  157. package/dist/_frontend/assets/razor-B0N4vZnc.js.gz +0 -0
  158. package/dist/_frontend/assets/tsMode-D1Y8xh-o.js.br +0 -0
  159. package/dist/_frontend/assets/tsMode-D1Y8xh-o.js.gz +0 -0
  160. package/dist/_frontend/assets/typescript-2nhip0PT.js.br +0 -0
  161. package/dist/_frontend/assets/typescript-2nhip0PT.js.gz +0 -0
  162. package/dist/_frontend/assets/workers-DSmTvA39.js.br +0 -0
  163. package/dist/_frontend/assets/workers-DSmTvA39.js.gz +0 -0
  164. package/dist/_frontend/assets/xml-CA4M6Pks.js.br +0 -0
  165. package/dist/_frontend/assets/xml-CA4M6Pks.js.gz +0 -0
  166. package/dist/_frontend/assets/yaml-D5KNk7Ji.js.br +0 -0
  167. package/dist/_frontend/assets/yaml-D5KNk7Ji.js.gz +0 -0
  168. package/dist/_frontend/index.html.br +0 -0
  169. package/dist/_frontend/index.html.gz +0 -0
@@ -0,0 +1,63 @@
1
+ // src/db/postgres/migrations/20260821_000001_agent_compaction.ts
2
+ import { sql } from "kysely";
3
+ async function up(db) {
4
+ await sql`SET LOCAL lock_timeout = '5s'`.execute(db);
5
+ await sql`
6
+ UPDATE agent
7
+ SET manifest = jsonb_set(
8
+ manifest #- '{config,context_management,compaction,compaction_threshold_tokens}',
9
+ '{config,context_management,compaction,trigger}',
10
+ coalesce(
11
+ manifest #> '{config,context_management,compaction,trigger}',
12
+ jsonb_build_object(
13
+ 'type', 'input_tokens',
14
+ 'value', (manifest #>> '{config,context_management,compaction,compaction_threshold_tokens}')::numeric
15
+ )
16
+ )
17
+ )
18
+ WHERE manifest #>> '{config,context_management,compaction,compaction_threshold_tokens}' IS NOT NULL
19
+ `.execute(db);
20
+ await sql`
21
+ UPDATE session
22
+ SET agent_spec = jsonb_set(
23
+ agent_spec #- '{config,context_management,compaction,compaction_threshold_tokens}',
24
+ '{config,context_management,compaction,trigger}',
25
+ coalesce(
26
+ agent_spec #> '{config,context_management,compaction,trigger}',
27
+ jsonb_build_object(
28
+ 'type', 'input_tokens',
29
+ 'value', (agent_spec #>> '{config,context_management,compaction,compaction_threshold_tokens}')::numeric
30
+ )
31
+ )
32
+ )
33
+ WHERE agent_spec #>> '{config,context_management,compaction,compaction_threshold_tokens}' IS NOT NULL
34
+ `.execute(db);
35
+ }
36
+ async function down(db) {
37
+ await sql`SET LOCAL lock_timeout = '5s'`.execute(db);
38
+ await sql`
39
+ UPDATE agent
40
+ SET manifest = jsonb_set(
41
+ manifest #- '{config,context_management,compaction,trigger}',
42
+ '{config,context_management,compaction,compaction_threshold_tokens}',
43
+ to_jsonb((manifest #>> '{config,context_management,compaction,trigger,value}')::numeric)
44
+ )
45
+ WHERE manifest #>> '{config,context_management,compaction,trigger,type}' = 'input_tokens'
46
+ AND manifest #>> '{config,context_management,compaction,trigger,value}' IS NOT NULL
47
+ `.execute(db);
48
+ await sql`
49
+ UPDATE session
50
+ SET agent_spec = jsonb_set(
51
+ agent_spec #- '{config,context_management,compaction,trigger}',
52
+ '{config,context_management,compaction,compaction_threshold_tokens}',
53
+ to_jsonb((agent_spec #>> '{config,context_management,compaction,trigger,value}')::numeric)
54
+ )
55
+ WHERE agent_spec #>> '{config,context_management,compaction,trigger,type}' = 'input_tokens'
56
+ AND agent_spec #>> '{config,context_management,compaction,trigger,value}' IS NOT NULL
57
+ `.execute(db);
58
+ }
59
+ export {
60
+ down,
61
+ up
62
+ };
63
+ //# sourceMappingURL=20260821_000001_agent_compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/db/postgres/migrations/20260821_000001_agent_compaction.ts"],"sourcesContent":["import { sql, type Kysely } from 'kysely';\n\n/** Replace the legacy compaction token threshold with an input-token trigger. */\nexport async function up<TDatabase>(db: Kysely<TDatabase>): Promise<void> {\n await sql`SET LOCAL lock_timeout = '5s'`.execute(db);\n await sql`\n UPDATE agent\n SET manifest = jsonb_set(\n manifest #- '{config,context_management,compaction,compaction_threshold_tokens}',\n '{config,context_management,compaction,trigger}',\n coalesce(\n manifest #> '{config,context_management,compaction,trigger}',\n jsonb_build_object(\n 'type', 'input_tokens',\n 'value', (manifest #>> '{config,context_management,compaction,compaction_threshold_tokens}')::numeric\n )\n )\n )\n WHERE manifest #>> '{config,context_management,compaction,compaction_threshold_tokens}' IS NOT NULL\n `.execute(db);\n await sql`\n UPDATE session\n SET agent_spec = jsonb_set(\n agent_spec #- '{config,context_management,compaction,compaction_threshold_tokens}',\n '{config,context_management,compaction,trigger}',\n coalesce(\n agent_spec #> '{config,context_management,compaction,trigger}',\n jsonb_build_object(\n 'type', 'input_tokens',\n 'value', (agent_spec #>> '{config,context_management,compaction,compaction_threshold_tokens}')::numeric\n )\n )\n )\n WHERE agent_spec #>> '{config,context_management,compaction,compaction_threshold_tokens}' IS NOT NULL\n `.execute(db);\n}\n\n/** Restore the legacy token threshold for rollback compatibility. */\nexport async function down<TDatabase>(db: Kysely<TDatabase>): Promise<void> {\n await sql`SET LOCAL lock_timeout = '5s'`.execute(db);\n await sql`\n UPDATE agent\n SET manifest = jsonb_set(\n manifest #- '{config,context_management,compaction,trigger}',\n '{config,context_management,compaction,compaction_threshold_tokens}',\n to_jsonb((manifest #>> '{config,context_management,compaction,trigger,value}')::numeric)\n )\n WHERE manifest #>> '{config,context_management,compaction,trigger,type}' = 'input_tokens'\n AND manifest #>> '{config,context_management,compaction,trigger,value}' IS NOT NULL\n `.execute(db);\n await sql`\n UPDATE session\n SET agent_spec = jsonb_set(\n agent_spec #- '{config,context_management,compaction,trigger}',\n '{config,context_management,compaction,compaction_threshold_tokens}',\n to_jsonb((agent_spec #>> '{config,context_management,compaction,trigger,value}')::numeric)\n )\n WHERE agent_spec #>> '{config,context_management,compaction,trigger,type}' = 'input_tokens'\n AND agent_spec #>> '{config,context_management,compaction,trigger,value}' IS NOT NULL\n `.execute(db);\n}\n"],"mappings":";AAAA,SAAS,WAAwB;AAGjC,eAAsB,GAAc,IAAsC;AACxE,QAAM,mCAAmC,QAAQ,EAAE;AACnD,QAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAcJ,QAAQ,EAAE;AACZ,QAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAcJ,QAAQ,EAAE;AACd;AAGA,eAAsB,KAAgB,IAAsC;AAC1E,QAAM,mCAAmC,QAAQ,EAAE;AACnD,QAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASJ,QAAQ,EAAE;AACZ,QAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASJ,QAAQ,EAAE;AACd;","names":[]}
@@ -0,0 +1,69 @@
1
+ // src/db/sqlite/migrations/20260821_000001_agent_compaction.ts
2
+ import { sql } from "kysely";
3
+ async function up(db) {
4
+ await db.transaction().execute(async (transaction) => {
5
+ await sql`
6
+ UPDATE agent
7
+ SET manifest = jsonb_set(
8
+ jsonb_remove(manifest, '$.config.context_management.compaction.compaction_threshold_tokens'),
9
+ '$.config.context_management.compaction.trigger',
10
+ coalesce(
11
+ jsonb_extract(manifest, '$.config.context_management.compaction.trigger'),
12
+ jsonb(json_object(
13
+ 'type', 'input_tokens',
14
+ 'value', cast(
15
+ json_extract(manifest, '$.config.context_management.compaction.compaction_threshold_tokens') AS INTEGER
16
+ )
17
+ ))
18
+ )
19
+ )
20
+ WHERE json_extract(manifest, '$.config.context_management.compaction.compaction_threshold_tokens') IS NOT NULL
21
+ `.execute(transaction);
22
+ await sql`
23
+ UPDATE session
24
+ SET agent_spec = jsonb_set(
25
+ jsonb_remove(agent_spec, '$.config.context_management.compaction.compaction_threshold_tokens'),
26
+ '$.config.context_management.compaction.trigger',
27
+ coalesce(
28
+ jsonb_extract(agent_spec, '$.config.context_management.compaction.trigger'),
29
+ jsonb(json_object(
30
+ 'type', 'input_tokens',
31
+ 'value', cast(
32
+ json_extract(agent_spec, '$.config.context_management.compaction.compaction_threshold_tokens') AS INTEGER
33
+ )
34
+ ))
35
+ )
36
+ )
37
+ WHERE json_extract(agent_spec, '$.config.context_management.compaction.compaction_threshold_tokens') IS NOT NULL
38
+ `.execute(transaction);
39
+ });
40
+ }
41
+ async function down(db) {
42
+ await db.transaction().execute(async (transaction) => {
43
+ await sql`
44
+ UPDATE agent
45
+ SET manifest = jsonb_set(
46
+ jsonb_remove(manifest, '$.config.context_management.compaction.trigger'),
47
+ '$.config.context_management.compaction.compaction_threshold_tokens',
48
+ cast(json_extract(manifest, '$.config.context_management.compaction.trigger.value') AS INTEGER)
49
+ )
50
+ WHERE json_extract(manifest, '$.config.context_management.compaction.trigger.type') = 'input_tokens'
51
+ AND json_extract(manifest, '$.config.context_management.compaction.trigger.value') IS NOT NULL
52
+ `.execute(transaction);
53
+ await sql`
54
+ UPDATE session
55
+ SET agent_spec = jsonb_set(
56
+ jsonb_remove(agent_spec, '$.config.context_management.compaction.trigger'),
57
+ '$.config.context_management.compaction.compaction_threshold_tokens',
58
+ cast(json_extract(agent_spec, '$.config.context_management.compaction.trigger.value') AS INTEGER)
59
+ )
60
+ WHERE json_extract(agent_spec, '$.config.context_management.compaction.trigger.type') = 'input_tokens'
61
+ AND json_extract(agent_spec, '$.config.context_management.compaction.trigger.value') IS NOT NULL
62
+ `.execute(transaction);
63
+ });
64
+ }
65
+ export {
66
+ down,
67
+ up
68
+ };
69
+ //# sourceMappingURL=20260821_000001_agent_compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/db/sqlite/migrations/20260821_000001_agent_compaction.ts"],"sourcesContent":["import { type Kysely, sql } from 'kysely';\n\n/**\n * Replace the legacy compaction token threshold with an input-token trigger.\n * Mirrors db/postgres/migrations/20260821_000001_agent_compaction.ts.\n */\nexport async function up<TDatabase>(db: Kysely<TDatabase>): Promise<void> {\n await db.transaction().execute(async transaction => {\n await sql`\n UPDATE agent\n SET manifest = jsonb_set(\n jsonb_remove(manifest, '$.config.context_management.compaction.compaction_threshold_tokens'),\n '$.config.context_management.compaction.trigger',\n coalesce(\n jsonb_extract(manifest, '$.config.context_management.compaction.trigger'),\n jsonb(json_object(\n 'type', 'input_tokens',\n 'value', cast(\n json_extract(manifest, '$.config.context_management.compaction.compaction_threshold_tokens') AS INTEGER\n )\n ))\n )\n )\n WHERE json_extract(manifest, '$.config.context_management.compaction.compaction_threshold_tokens') IS NOT NULL\n `.execute(transaction);\n await sql`\n UPDATE session\n SET agent_spec = jsonb_set(\n jsonb_remove(agent_spec, '$.config.context_management.compaction.compaction_threshold_tokens'),\n '$.config.context_management.compaction.trigger',\n coalesce(\n jsonb_extract(agent_spec, '$.config.context_management.compaction.trigger'),\n jsonb(json_object(\n 'type', 'input_tokens',\n 'value', cast(\n json_extract(agent_spec, '$.config.context_management.compaction.compaction_threshold_tokens') AS INTEGER\n )\n ))\n )\n )\n WHERE json_extract(agent_spec, '$.config.context_management.compaction.compaction_threshold_tokens') IS NOT NULL\n `.execute(transaction);\n });\n}\n\n/** Restore the legacy token threshold for rollback compatibility. */\nexport async function down<TDatabase>(db: Kysely<TDatabase>): Promise<void> {\n await db.transaction().execute(async transaction => {\n await sql`\n UPDATE agent\n SET manifest = jsonb_set(\n jsonb_remove(manifest, '$.config.context_management.compaction.trigger'),\n '$.config.context_management.compaction.compaction_threshold_tokens',\n cast(json_extract(manifest, '$.config.context_management.compaction.trigger.value') AS INTEGER)\n )\n WHERE json_extract(manifest, '$.config.context_management.compaction.trigger.type') = 'input_tokens'\n AND json_extract(manifest, '$.config.context_management.compaction.trigger.value') IS NOT NULL\n `.execute(transaction);\n await sql`\n UPDATE session\n SET agent_spec = jsonb_set(\n jsonb_remove(agent_spec, '$.config.context_management.compaction.trigger'),\n '$.config.context_management.compaction.compaction_threshold_tokens',\n cast(json_extract(agent_spec, '$.config.context_management.compaction.trigger.value') AS INTEGER)\n )\n WHERE json_extract(agent_spec, '$.config.context_management.compaction.trigger.type') = 'input_tokens'\n AND json_extract(agent_spec, '$.config.context_management.compaction.trigger.value') IS NOT NULL\n `.execute(transaction);\n });\n}\n"],"mappings":";AAAA,SAAsB,WAAW;AAMjC,eAAsB,GAAc,IAAsC;AACxE,QAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,gBAAe;AAClD,UAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBN,QAAQ,WAAW;AACnB,UAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBN,QAAQ,WAAW;AAAA,EACrB,CAAC;AACH;AAGA,eAAsB,KAAgB,IAAsC;AAC1E,QAAM,GAAG,YAAY,EAAE,QAAQ,OAAM,gBAAe;AAClD,UAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASN,QAAQ,WAAW;AACnB,UAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASN,QAAQ,WAAW;AAAA,EACrB,CAAC;AACH;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@truefoundry/trueforge",
3
- "version": "0.1.4",
3
+ "version": "0.2.0-rc.0",
4
4
  "description": "TrueForge Agent Harness: server, HTTP API, and chat UI (npx @truefoundry/trueforge)",
5
5
  "author": "TrueFoundry",
6
6
  "license": "MIT",
@@ -24,39 +24,39 @@
24
24
  "README.md"
25
25
  ],
26
26
  "engines": {
27
- "node": ">=22"
27
+ "node": ">=22.14.0"
28
28
  },
29
29
  "dependencies": {
30
30
  "@anthropic-ai/sandbox-runtime": "0.0.71",
31
31
  "@daytona/sdk": "^0.204.1",
32
- "@hono/node-server": "^2.0.11",
33
- "@hono/swagger-ui": "^0.2.1",
34
- "@hono/zod-openapi": "^1.5.1",
35
- "@modelcontextprotocol/sdk": "^1.29.0",
36
- "better-sqlite3": "^13.0.2",
32
+ "@hono/node-server": "^2.1.1",
33
+ "@hono/swagger-ui": "^0.2.2",
34
+ "@hono/zod-openapi": "^1.6.1",
35
+ "@modelcontextprotocol/sdk": "^1.30.0",
36
+ "better-sqlite3": "^13.0.3",
37
37
  "env-paths": "^4.0.0",
38
- "hono": "^4.12.34",
39
- "jose": "^6.2.8",
40
- "kysely": "^0.29.4",
41
- "openid-client": "^6.8.4",
42
- "pg": "^8.22.0",
43
- "redis": "^5.10.0",
38
+ "hono": "^4.13.5",
39
+ "jose": "^6.2.10",
40
+ "kysely": "^0.29.5",
41
+ "openid-client": "^6.8.7",
42
+ "pg": "^8.23.0",
43
+ "redis": "^5.12.1",
44
44
  "ulid": "^3.0.2",
45
- "winston": "^3.13.0",
45
+ "winston": "^3.19.0",
46
46
  "yaml": "^2.9.0",
47
47
  "zod": "^4.4.3",
48
- "@truefoundry/trueforge-core": "0.1.4"
48
+ "@truefoundry/trueforge-core": "0.2.0-rc.0"
49
49
  },
50
50
  "devDependencies": {
51
- "@swc/core": "^1.11.0",
52
- "@swc/jest": "^0.2.37",
51
+ "@swc/core": "^1.16.1",
52
+ "@swc/jest": "^0.2.39",
53
53
  "@types/better-sqlite3": "^7.6.13",
54
54
  "@types/jest": "^29.5.14",
55
- "@types/node": "^24.12.0",
56
- "@types/pg": "^8.20.0",
55
+ "@types/node": "^24.13.3",
56
+ "@types/pg": "^8.23.1",
57
57
  "jest": "^29.7.0",
58
- "tsup": "^8.5.0",
59
- "tsx": "^4.16.2",
58
+ "tsup": "^8.5.1",
59
+ "tsx": "^4.23.12",
60
60
  "typescript": "^7.0.2"
61
61
  },
62
62
  "scripts": {
@@ -74,7 +74,6 @@
74
74
  "migrate": "NODE_OPTIONS='--conditions=trueforge-dev' STANDALONE=false tsx --env-file=.env src/db/postgres/migrate-cli.ts",
75
75
  "openapi:write": "pnpm run build:gen && NODE_OPTIONS='--conditions=trueforge-dev' tsx --env-file=.env.test scripts/write-openapi.ts",
76
76
  "pack:dry": "pnpm pack --dry-run",
77
- "migrate:legacy-sqlite-path": "node scripts/migrate-legacy-sqlite-path.mjs",
78
77
  "predev:no-watch": "pnpm --filter @truefoundry/trueforge-core build:gen && pnpm run build:gen",
79
78
  "predev": "pnpm --filter @truefoundry/trueforge-core build:gen && pnpm run build:gen",
80
79
  "test:eventsub": "jest --config jest.eventsub.config.cjs",
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SettingsBuilder-MYWRFXRI-Ce3OWfa1.js","assets/index-DJ1uWGdt.js","assets/index-DEKCw40W.css"])))=>i.map(i=>d[i]);
2
- import{u as N,a as v,c,r as a,j as e,I as m,f as S,S as C,e as E,_ as k}from"./index-DJ1uWGdt.js";import{N as O,S as R,a as T,T as A}from"./chunk-OZTNBS6V-CLmmFX7d.js";var _=a.lazy(()=>k(()=>import("./SettingsBuilder-MYWRFXRI-Ce3OWfa1.js"),__vite__mapDeps([0,1,2])));function z({className:p}){const b=N(),s=v(),h=c("ClearChatButton"),j=c("SaveAgentButton"),g=c("SelectAgentEmptyState"),[n,r]=a.useState(!1),u=a.useRef(null),d=a.useRef(null),f=a.useRef(null),l=a.useRef(!1),y=(s==null?void 0:s.mode.status)==="idle",o=(s==null?void 0:s.settingsOpen)===!0;a.useEffect(()=>{if(!n)return;const t=i=>{i.key==="Escape"&&r(!1)};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[n]),a.useEffect(()=>{var i,x;const t=f.current;if(n){l.current=!0,t&&(t.inert=!0),(i=d.current)==null||i.focus();return}l.current&&(t&&(t.inert=!1),(x=u.current)==null||x.focus(),l.current=!1)},[n]);const w=()=>{s!=null&&s.isComposerEnabled?s.openDraft():(s==null||s.setSettingsOpen(!1),b.threads().switchToNewThread()),r(!1)};return e.jsxs("div",{className:E("relative flex h-full min-h-0 w-full flex-col bg-primary-bg",p),children:[e.jsxs("header",{className:"flex shrink-0 items-center gap-1 border-b border-border bg-topbar-bg px-2 py-1.5",children:[o?e.jsx("span",{className:"min-w-0 flex-1"}):e.jsxs(e.Fragment,{children:[e.jsx(O,{}),e.jsx("span",{className:"min-w-0 flex-1"}),e.jsx(h,{}),e.jsx(j,{})]}),e.jsx(R,{},"shell-actions"),o?null:e.jsxs(e.Fragment,{children:[(s==null?void 0:s.isNewChatEnabled)!==!1?e.jsx("button",{type:"button","aria-label":"New chat",title:"New chat",className:S({variant:"ghost",size:"icon"}),onClick:w,children:e.jsx(m,{name:"plus"})}):null,e.jsx("button",{ref:u,type:"button","aria-label":"Sessions","aria-expanded":n,className:"text-text-secondary hover:text-text-primary inline-flex size-8 cursor-pointer items-center justify-center rounded-md",onClick:()=>r(t=>!t),children:e.jsx(m,{name:"clock-rotate-left"})})]})]}),e.jsx("div",{ref:f,className:"min-h-0 min-w-0 flex-1",children:o?e.jsx(a.Suspense,{fallback:e.jsxs("div",{className:"flex h-full items-center justify-center",role:"status","aria-live":"polite","aria-busy":"true",children:[e.jsx(C,{size:28,className:"text-text-primary"}),e.jsx("span",{className:"sr-only",children:"Loading"})]}),children:e.jsx(_,{})}):y?e.jsx(g,{}):e.jsx(T,{})}),n?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button","aria-label":"Close sessions",className:"absolute inset-0 z-[9] cursor-pointer bg-[var(--overlay)]",onClick:()=>r(!1)}),e.jsx("div",{ref:d,className:"absolute inset-y-0 right-0 z-10 flex w-full max-w-80 flex-col border-l border-border bg-sidebar-bg shadow-lg outline-none",role:"dialog","aria-label":"Sessions",tabIndex:-1,children:e.jsx(A,{onThreadOpen:()=>r(!1)})})]}):null]})}export{z as DrawerLayout};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ModelSettings-CKQ5CVAC-UBz_ch6T.js","assets/index-DJ1uWGdt.js","assets/index-DEKCw40W.css","assets/ConnectorSettings-ODC3LVHN-CAU9MgGN.js","assets/SkillSettings-ECH6SHZ7-CKWEzdO_.js","assets/SandboxSettings-HSCPYUOC-Csl-nC9h.js"])))=>i.map(i=>d[i]);
2
- import{g,i as v,k as y,l as j,m as S,r as t,j as e,I as p,f as _,e as f,_ as u,S as k}from"./index-DJ1uWGdt.js";var w=t.lazy(()=>u(()=>import("./ModelSettings-CKQ5CVAC-UBz_ch6T.js"),__vite__mapDeps([0,1,2]))),E=t.lazy(()=>u(()=>import("./ConnectorSettings-ODC3LVHN-CAU9MgGN.js"),__vite__mapDeps([3,1,2]))),N=t.lazy(()=>u(()=>import("./SkillSettings-ECH6SHZ7-CKWEzdO_.js"),__vite__mapDeps([4,1,2]))),C=t.lazy(()=>u(()=>import("./SandboxSettings-HSCPYUOC-Csl-nC9h.js"),__vite__mapDeps([5,1,2])));function L(){return e.jsxs("div",{className:"flex flex-1 items-center justify-center py-8",role:"status","aria-live":"polite","aria-busy":"true",children:[e.jsx(k,{size:20,className:"text-text-secondary"}),e.jsx("span",{className:"sr-only",children:"Loading"})]})}var O=()=>{const{settingsOpen:n,settingsSection:l,setSettingsOpen:a}=g(),r=v(),d=y(),{refresh:m}=j(),i=S(),o=(r==null?void 0:r.skillCatalog)!=null,c=(r==null?void 0:r.sandboxCatalog)!=null,x=t.useCallback(()=>{a(!1)},[a]);t.useEffect(()=>{if(n)return()=>{m(),d==null||d()}},[n,m,d]),t.useEffect(()=>{!o&&l==="skills"&&a(n,"models"),!c&&l==="sandbox"&&a(n,"models")},[o,c,l,n,a]),t.useEffect(()=>{if(!n)return;const s=b=>{b.key==="Escape"&&(b.stopImmediatePropagation(),x())};return window.addEventListener("keydown",s,!0),()=>window.removeEventListener("keydown",s,!0)},[x,n]);const h=t.useMemo(()=>{const s=[{id:"models",label:"Models",icon:"cpu"},{id:"connectors",label:"Connectors",icon:"plug"}];return o&&s.push({id:"skills",label:"Skills",icon:"lightbulb"}),c&&s.push({id:"sandbox",label:"Sandbox providers",icon:"cube"}),s},[o,c]);return!n||!r?null:e.jsxs("div",{className:"flex h-full min-h-0 w-full flex-col bg-primary-bg",children:[e.jsxs("header",{className:"flex shrink-0 items-center gap-2 border-b border-border px-2 py-1.5",children:[e.jsx("button",{type:"button","aria-label":"Back",title:"Back",className:_({variant:"ghost",size:"icon"}),onClick:x,children:e.jsx(p,{name:"arrow-left"})}),e.jsx("h1",{className:"text-lg font-semibold tracking-tight text-text-primary",children:"Settings"})]}),e.jsxs("div",{className:f("flex min-h-0 flex-1 flex-col",!i&&"md:flex-row"),children:[e.jsx("nav",{"aria-label":"Settings sections",className:f("flex w-full gap-1 border-b border-border bg-secondary-bg/40 p-2",i?"min-w-0":"justify-center md:w-48 md:flex-col md:justify-start md:border-b-0 md:border-r"),children:h.map(s=>e.jsxs("button",{type:"button","aria-current":l===s.id?"page":void 0,...i?{title:s.label}:{},className:f("flex min-h-9 items-center gap-2 rounded-md px-3 text-sm font-medium transition-colors","focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring",i?"min-w-0 flex-1 justify-center gap-1.5 px-1.5":"shrink-0",l===s.id?"bg-primary-button-bg text-primary-button-text":"text-text-secondary hover:bg-ghost-button-hover/60 hover:text-text-primary"),onClick:()=>{a(!0,s.id)},children:[e.jsx(p,{name:s.icon,className:"h-4 w-4 shrink-0"}),i?e.jsx("span",{className:"truncate",children:s.label}):s.label]},s.id))}),e.jsx("section",{className:"flex flex-col h-full flex-1 overflow-y-hidden px-6 py-4",children:e.jsx("div",{className:"w-full max-w-210 h-full min-h-0 flex flex-col mx-auto",children:e.jsxs(t.Suspense,{fallback:e.jsx(L,{}),children:[l==="models"?e.jsx(w,{}):null,l==="connectors"?e.jsx(E,{}):null,l==="skills"&&o?e.jsx(N,{}):null,l==="sandbox"&&c?e.jsx(C,{}):null]})})})]})]})},I=O;export{I as default};
@@ -1 +0,0 @@
1
- import{u as A,a as E,m as O,p as L,b as v}from"./chunk-62JRHF6Z-BftTGWZl.js";import{g as H,h as I,r as a}from"./index-DJ1uWGdt.js";function C(n){const u=n.activeRemoteId??n.pendingSessionId;if(u!=null)return{type:"session",sessionId:u};const{mode:c,agentConfigMode:t}=n;if(c.status==="active"&&!c.isMutable&&t!=="SingleAgent"){const o=c.agentName??c.agentId;if(o!=null)return{type:"agent",agentName:o}}return{type:"root"}}function k(n){return n.settingsOpen?{type:"settings"}:C(n)}function x({routes:n,activeRemoteId:u,initialSettingsOpen:c}){const t=H(),o=I(),h=A(),s=E(),S={settingsOpen:t.settingsOpen,pendingSessionId:t.pendingSessionId,activeRemoteId:u,mode:t.mode,agentConfigMode:t.agentConfigMode},l=k(S),N=JSON.stringify(l),i=a.useRef(null),d=a.useRef(null),f=a.useRef(!1),m=a.useRef(null),b=a.useRef(!1),P=a.useRef(!1),R=a.useCallback(e=>{if(m.current=e,o==null){t.openHistorySession({sessionId:e});return}o.getSession({sessionId:e}).then(r=>{m.current===e&&t.openHistorySession({sessionId:e,isMutable:r.isMutable,...r.agentName!=null?{agentName:r.agentName}:{}})}).catch(()=>{m.current===e&&t.openHistorySession({sessionId:e})})},[o,t]),y=a.useCallback(e=>{switch(e.type){case"settings":t.setSettingsOpen(!0);return;case"session":if(t.pendingSessionId===e.sessionId||u===e.sessionId)return;R(e.sessionId);return;case"agent":t.selectLibraryAgent({isMutable:!1,agentName:e.agentName});return;case"root":switch(t.setSettingsOpen(!1),t.agentConfigMode){case"AgentLibrary":t.openLibraryHome();return;case"AgentComposer":case"AgentLibraryWithComposer":t.openDraft();return;case"SingleAgent":t.clearChat();return}}},[t,u,R]);return a.useEffect(()=>{if(f.current)return;f.current=!0;const e=O(s.pathname,n)??{type:"root"},r=c||e.type==="settings";if(e.type==="settings")t.setSettingsOpen(!0);else{const M=C(S);L(M,e)||y(e),c&&t.setSettingsOpen(!0)}const p=r?{type:"settings"}:e,g=v(p,n);d.current=p,g!=null&&g!==s.pathname&&(i.current=g,h({pathname:g,search:s.search,hash:s.hash},{replace:!0}))},[]),a.useEffect(()=>{if(!f.current)return;if(!b.current){b.current=!0;return}const e=v(l,n);if(e==null)return;const r=d.current;if(d.current=l,e===s.pathname)return;const p=l.type==="session"&&t.pendingSessionId==null&&r!=null&&r.type!=="session";i.current=e,h({pathname:e,search:s.search,hash:s.hash},{replace:p})},[N]),a.useEffect(()=>{if(!f.current)return;if(!P.current){P.current=!0;return}if(i.current===s.pathname){i.current=null;return}const e=O(s.pathname,n);if(e==null){const r=n.root;i.current=r,h({pathname:r,search:s.search,hash:s.hash},{replace:!0}),y({type:"root"});return}e.type!=="settings"&&t.settingsOpen&&t.setSettingsOpen(!1),y(e)},[s.pathname]),null}export{x as ShellRouteSync};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SettingsBuilder-MYWRFXRI-Ce3OWfa1.js","assets/index-DJ1uWGdt.js","assets/index-DEKCw40W.css"])))=>i.map(i=>d[i]);
2
- import{u as T,a as _,b as I,c,r as n,d as D,j as e,e as r,I as u,f,S as H,_ as P}from"./index-DJ1uWGdt.js";import{T as v,S as y,N as F,a as M}from"./chunk-OZTNBS6V-CLmmFX7d.js";var V=n.lazy(()=>P(()=>import("./SettingsBuilder-MYWRFXRI-Ce3OWfa1.js"),__vite__mapDeps([0,1,2]))),w=!1;function G({className:C}){const S=T(),s=_(),p=I(),b=c("BrandLogo"),k=c("AgentsLibraryButton"),E=c("ClearChatButton"),B=c("SaveAgentButton"),L=c("SelectAgentEmptyState"),[a,A]=n.useState(w),z=t=>{A(l=>{const o=typeof t=="function"?t(l):t;return w=o,o})},[i,d]=n.useState(!1),h=n.useRef(null),j=n.useRef(null),g=n.useRef(null),x=n.useRef(!1),N=(s==null?void 0:s.mode.status)==="idle",m=(s==null?void 0:s.settingsOpen)===!0,O=D();n.useEffect(()=>{if(!i)return;const t=l=>{l.key==="Escape"&&d(!1)};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[i]),n.useEffect(()=>{var l,o;const t=g.current;if(i){x.current=!0,t&&(t.inert=!0),(l=j.current)==null||l.focus();return}x.current&&(t&&(t.inert=!1),(o=h.current)==null||o.focus(),x.current=!1)},[i]);const R=()=>{if(s!=null&&s.isComposerEnabled){s.openDraft();return}s==null||s.setSettingsOpen(!1),Promise.resolve(S.threads().switchToNewThread()).catch(()=>{})};return e.jsxs("div",{className:r("relative flex h-full min-h-0 w-full min-w-0",C),children:[e.jsxs("aside",{className:r("hidden min-h-0 shrink-0 flex-col border-r border-border bg-sidebar-bg transition-[width] duration-300 ease-in-out md:flex",a?"w-16":"w-64"),children:[e.jsxs("div",{className:r("flex shrink-0 items-center px-3 py-3",a?"flex-col gap-3":"justify-between gap-2"),children:[e.jsxs("div",{className:r("flex min-w-0 items-center text-text-primary",a?"justify-center":"gap-2"),children:[e.jsx(b,{className:"size-5 shrink-0 object-contain"}),a?null:e.jsx("span",{className:"truncate text-lg font-semibold tracking-tight",children:p})]}),e.jsx("button",{type:"button","aria-label":a?"Expand sidebar":"Collapse sidebar",title:a?"Expand sidebar":"Collapse sidebar","aria-expanded":!a,className:f({variant:"ghost",size:"icon"}),onClick:()=>z(t=>!t),children:e.jsx(u,{name:a?"panel-left-open":"panel-left-close"})})]}),e.jsxs("nav",{className:"flex min-h-0 flex-1 flex-col items-center gap-2 px-3",hidden:!a,"aria-label":"Sidebar",children:[(s==null?void 0:s.isNewChatEnabled)!==!1?e.jsx("button",{type:"button","aria-label":"Start new chat",title:"New chat",className:f({variant:"ghost",size:"icon"}),onClick:R,children:e.jsx(u,{name:"square-pen"})}):null,e.jsx(k,{compact:!0})]}),e.jsx("div",{className:"flex min-h-0 flex-1 flex-col overflow-hidden",hidden:a,children:e.jsx(v,{})}),e.jsx("footer",{className:r("flex shrink-0 border-t border-border px-3 py-2",a?"flex-col items-center gap-2":"items-center gap-1"),children:e.jsx(y,{className:a?"flex-col":void 0})})]}),e.jsxs("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col bg-primary-bg",children:[e.jsxs("header",{className:r("flex shrink-0 items-center gap-1 border-b border-border bg-topbar-bg px-2 py-1.5",(m||N||!O)&&"md:hidden"),children:[m?e.jsx("span",{className:"min-w-0 flex-1"}):e.jsxs(e.Fragment,{children:[e.jsx("button",{ref:h,type:"button","aria-label":"Sessions","aria-expanded":i,className:r(f({variant:"ghost",size:"icon"}),"md:hidden"),onClick:()=>d(!0),children:e.jsx(u,{name:"bars"})}),e.jsx(F,{}),e.jsx("span",{className:"min-w-0 flex-1"}),e.jsx(E,{}),e.jsx(B,{})]}),e.jsx("div",{className:"md:hidden",children:e.jsx(y,{})},"mobile-shell-actions")]}),e.jsx("div",{ref:g,className:"min-h-0 min-w-0 flex-1",children:m?e.jsx(n.Suspense,{fallback:e.jsxs("div",{className:"flex h-full items-center justify-center",role:"status","aria-live":"polite","aria-busy":"true",children:[e.jsx(H,{size:28,className:"text-text-primary"}),e.jsx("span",{className:"sr-only",children:"Loading"})]}),children:e.jsx(V,{})}):N?e.jsx(L,{}):e.jsx(M,{})})]}),i?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button","aria-label":"Close sessions",className:"absolute inset-0 z-[9] cursor-pointer bg-[var(--overlay)] md:hidden",onClick:()=>d(!1)}),e.jsxs("div",{ref:j,className:"absolute inset-y-0 left-0 z-10 flex w-full max-w-80 flex-col border-r border-border bg-sidebar-bg shadow-lg outline-none md:hidden",role:"dialog","aria-label":"Sessions",tabIndex:-1,children:[e.jsxs("div",{className:"flex shrink-0 items-center gap-2 border-b border-border px-3 py-3 text-text-primary",children:[e.jsx(b,{className:"size-5 shrink-0 object-contain"}),e.jsx("span",{className:"truncate text-lg font-semibold tracking-tight",children:p})]}),e.jsx(v,{onThreadOpen:()=>d(!1)})]})]}):null]})}export{G as SidebarLayout};