thursday-agent 0.6.0 → 0.7.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 (193) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/app/_global-error.html +1 -1
  5. package/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  9. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  10. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_not-found.html +1 -1
  12. package/.next/server/app/_not-found.rsc +2 -2
  13. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  14. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  15. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  16. package/.next/server/app/api/artifact/route.js +3 -3
  17. package/.next/server/app/api/artifact/route.js.nft.json +1 -1
  18. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
  19. package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
  20. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  21. package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -1
  22. package/.next/server/app/api/bot/thread/route.js.nft.json +1 -1
  23. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  24. package/.next/server/app/api/memory/edit/route.js +1 -1
  25. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
  26. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  27. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  28. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  29. package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
  30. package/.next/server/app/api/thursday/tool-call/route.js +1 -1
  31. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  32. package/.next/server/app/api/workspace/missing/route.js +2 -2
  33. package/.next/server/app/api/workspace/missing/route.js.nft.json +1 -1
  34. package/.next/server/app/api/workspace/route.js.nft.json +1 -1
  35. package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
  36. package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
  37. package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/page/server-reference-manifest.json +42 -42
  39. package/.next/server/app/page.js +5 -4
  40. package/.next/server/app/page.js.nft.json +1 -1
  41. package/.next/server/app/page_client-reference-manifest.js +1 -1
  42. package/.next/server/chunks/[root-of-the-server]__0-06t3f._.js +8 -0
  43. package/.next/server/chunks/{[root-of-the-server]__049f521._.js → [root-of-the-server]__06l05n_._.js} +1 -1
  44. package/.next/server/chunks/[root-of-the-server]__0_ue8oe._.js +1 -1
  45. package/.next/server/chunks/{[root-of-the-server]__0ye3da2._.js → [root-of-the-server]__0btqrct._.js} +1 -1
  46. package/.next/server/chunks/[root-of-the-server]__0c9fgca._.js +1 -1
  47. package/.next/server/chunks/[root-of-the-server]__0zp35ul._.js +1 -1
  48. package/.next/server/chunks/[root-of-the-server]__1kv8p3e._.js +1 -1
  49. package/.next/server/chunks/_02szwk8._.js +1 -1
  50. package/.next/server/chunks/_06c9kie._.js +24 -24
  51. package/.next/server/chunks/_0i55en5._.js +6 -6
  52. package/.next/server/chunks/_0p56fn0._.js +1 -1
  53. package/.next/server/chunks/_11ujpya._.js +1 -1
  54. package/.next/server/chunks/_1dbixxz._.js +1 -1
  55. package/.next/server/chunks/_1dc_d1q._.js +16 -16
  56. package/.next/server/chunks/_1gnjfli._.js +3 -0
  57. package/.next/server/chunks/_1klbcft._.js +1 -1
  58. package/.next/server/chunks/features_0-cnt0l._.js +1 -1
  59. package/.next/server/chunks/features_0hdaci0._.js +1 -1
  60. package/.next/server/chunks/ssr/[root-of-the-server]__0-e011f._.js +3 -0
  61. package/.next/server/chunks/ssr/[root-of-the-server]__0pd8yr7._.js +3 -0
  62. package/.next/server/chunks/ssr/[root-of-the-server]__1nygfik._.js +1 -1
  63. package/.next/server/chunks/ssr/[root-of-the-server]__1sdphb0._.js +1 -1
  64. package/.next/server/chunks/ssr/{[root-of-the-server]__1fll8dc._.js → [root-of-the-server]__1vdmfbe._.js} +2 -2
  65. package/.next/server/chunks/ssr/[root-of-the-server]__1waa3rc._.js +34 -49
  66. package/.next/server/chunks/ssr/{_1anqots._.js → _0-2qsxo._.js} +2 -2
  67. package/.next/server/chunks/ssr/_02oc_h5._.js +9 -9
  68. package/.next/server/chunks/ssr/_05yghx6._.js +1 -1
  69. package/.next/server/chunks/ssr/_07nbwap._.js +3 -0
  70. package/.next/server/chunks/ssr/_08c4z-9._.js +1 -1
  71. package/.next/server/chunks/ssr/_0_qfdlw._.js +1 -1
  72. package/.next/server/chunks/ssr/_0b6_jv-._.js +3 -0
  73. package/.next/server/chunks/ssr/_0hxt2ul._.js +1 -1
  74. package/.next/server/chunks/ssr/_0i_6q1w._.js +1 -1
  75. package/.next/server/chunks/ssr/{_18xqmny._.js → _0no7i1o._.js} +2 -2
  76. package/.next/server/chunks/ssr/_0tzg--b._.js +3 -0
  77. package/.next/server/chunks/ssr/{_1ztk7p6._.js → _114ylv7._.js} +3 -3
  78. package/.next/server/chunks/ssr/{_1k0spz7._.js → _12c-iwh._.js} +2 -2
  79. package/.next/server/chunks/ssr/_12w42gi._.js +1 -1
  80. package/.next/server/chunks/ssr/{_0eaog6_._.js → _167hchk._.js} +2 -2
  81. package/.next/server/chunks/ssr/{_1x9pskj._.js → _1_x5spz._.js} +3 -3
  82. package/.next/server/chunks/ssr/{_0dr-ddg._.js → _1a61fc9._.js} +2 -2
  83. package/.next/server/chunks/ssr/_1jmz33w._.js +1 -1
  84. package/.next/server/chunks/ssr/{_1y6b5mr._.js → _1w_t7h7._.js} +2 -2
  85. package/.next/server/chunks/ssr/{_0dh2e1j._.js → _1wyfaq_._.js} +7 -7
  86. package/.next/server/chunks/ssr/{[root-of-the-server]__0bxsfyn._.js → _200gt-m._.js} +4 -3
  87. package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
  88. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  89. package/.next/server/chunks/ssr/{_0c9e5w6._.js → features_workspace_00jz2hu._.js} +3 -4
  90. package/.next/server/chunks/ssr/{node_modules_0746rzi._.js → node_modules_02ai7br._.js} +1 -1
  91. package/.next/server/chunks/ssr/{node_modules_0vsxbzp._.js → node_modules_02deexj._.js} +1 -1
  92. package/.next/server/chunks/ssr/{node_modules_1g1eihe._.js → node_modules_07za262._.js} +1 -1
  93. package/.next/server/chunks/ssr/{node_modules_0332gw4._.js → node_modules_0_s9get._.js} +1 -1
  94. package/.next/server/chunks/ssr/{node_modules_1gpednh._.js → node_modules_0n3c7h0._.js} +1 -1
  95. package/.next/server/chunks/ssr/{node_modules_0t-9nup._.js → node_modules_0od6jwr._.js} +1 -1
  96. package/.next/server/chunks/ssr/{node_modules_0mxvg8h._.js → node_modules_0rdt7pk._.js} +1 -1
  97. package/.next/server/chunks/ssr/{node_modules_0vv0-fg._.js → node_modules_0w1z7kz._.js} +1 -1
  98. package/.next/server/chunks/ssr/{node_modules_1d53yiq._.js → node_modules_0wdupfz._.js} +1 -1
  99. package/.next/server/chunks/ssr/{node_modules_1u6w1pb._.js → node_modules_1720w0a._.js} +1 -1
  100. package/.next/server/chunks/ssr/{node_modules_1gu1pph._.js → node_modules_18lsg7d._.js} +1 -1
  101. package/.next/server/chunks/ssr/{node_modules_1he1w8_._.js → node_modules_1b94fxf._.js} +1 -1
  102. package/.next/server/chunks/ssr/{node_modules_0qbfyjh._.js → node_modules_1ecdo1s._.js} +1 -1
  103. package/.next/server/chunks/ssr/{node_modules_0qapgjr._.js → node_modules_1fa9ag7._.js} +1 -1
  104. package/.next/server/chunks/ssr/{node_modules_0d5uzof._.js → node_modules_1fv-_si._.js} +1 -1
  105. package/.next/server/chunks/ssr/{node_modules_1lnjapm._.js → node_modules_1hf461g._.js} +1 -1
  106. package/.next/server/chunks/ssr/{node_modules_1-urho9._.js → node_modules_1m71ta-._.js} +1 -1
  107. package/.next/server/chunks/ssr/{node_modules_1lynj9m._.js → node_modules_1n93n-g._.js} +1 -1
  108. package/.next/server/chunks/ssr/{node_modules_0fr-ml8._.js → node_modules_1n9lqu9._.js} +1 -1
  109. package/.next/server/chunks/ssr/{node_modules_04vxchl._.js → node_modules_1npnsvd._.js} +1 -1
  110. package/.next/server/chunks/ssr/{node_modules_0exkwcm._.js → node_modules_1rn2r0n._.js} +1 -1
  111. package/.next/server/chunks/ssr/{node_modules_022sipm._.js → node_modules_1vq-mfk._.js} +1 -1
  112. package/.next/server/chunks/ssr/{node_modules_00_51_v._.js → node_modules_1vzyw1t._.js} +1 -1
  113. package/.next/server/chunks/ssr/{node_modules_0wsvp00._.js → node_modules_1w359w4._.js} +1 -1
  114. package/.next/server/chunks/ssr/{node_modules_1xn6saw._.js → node_modules_1yajbl6._.js} +1 -1
  115. package/.next/server/chunks/ssr/{node_modules_16pi_dd._.js → node_modules_20eqhy8._.js} +1 -1
  116. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_067_exa._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_019sbis._.js} +1 -1
  117. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0nrrdaq._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0s6piq3._.js} +1 -1
  118. package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_21a5haa._.js → node_modules_@vercel_oidc_dist_05itbb1._.js} +1 -1
  119. package/.next/server/middleware-build-manifest.js +3 -3
  120. package/.next/server/pages/404.html +1 -1
  121. package/.next/server/pages/500.html +1 -1
  122. package/.next/server/server-reference-manifest.js +1 -1
  123. package/.next/server/server-reference-manifest.json +43 -43
  124. package/.next/static/chunks/{0dr16v67vj4n7.js → 07vqbk_9t4em4.js} +2 -2
  125. package/.next/static/chunks/{2nvepds1fu2ux.js → 08krja1zx7nqg.js} +1 -1
  126. package/.next/static/chunks/{42wcg3wfg_m_p.js → 0qcuwdk132jjt.js} +1 -1
  127. package/.next/static/chunks/{2_pnccjp6j1ca.js → 0z69gvysmave7.js} +1 -1
  128. package/.next/static/chunks/12fvz1w5ows75.js +1 -0
  129. package/.next/static/chunks/14t03ned286iu.js +1 -0
  130. package/.next/static/chunks/{2jlz8zp4jax_m.js → 156xxbkrz5lzu.js} +1 -1
  131. package/.next/static/chunks/1fz14reod4lft.js +1 -0
  132. package/.next/static/chunks/{0joan-69kbspd.js → 1g23dbabl-vkr.js} +1 -1
  133. package/.next/static/chunks/{18mkhstgiqcbt.js → 1qy_rc3oxfxok.js} +1 -1
  134. package/.next/static/chunks/1zea7qdl-7365.js +1 -0
  135. package/.next/static/chunks/1zvqumkg7kmo0.css +1 -0
  136. package/.next/static/chunks/26hpqt3y6bogl.js +12 -0
  137. package/.next/static/chunks/{3zk6q3-3f9swq.js → 2_j5mqm6d-z18.js} +1 -1
  138. package/.next/static/chunks/{1vj_5bnbxx84e.js → 2dt6tu7a22svs.js} +1 -1
  139. package/.next/static/chunks/2h5ls3d86kya6.js +1 -0
  140. package/.next/static/chunks/2wc6y1ht6dfuy.js +1 -0
  141. package/.next/static/chunks/{1i-u2wzub_to1.js → 2xr0zpll7thyi.js} +6 -6
  142. package/.next/static/chunks/{26ql4y-43xwhp.js → 31jztc-yq30m7.js} +1 -1
  143. package/.next/static/chunks/391af0i8eljzk.js +1 -0
  144. package/.next/static/chunks/{1kp5nfp06nj9h.js → 3p2s2cjokx1aa.js} +2 -2
  145. package/.next/static/chunks/{1wlo979mx-y3w.js → 41s3fml5oivsa.js} +1 -1
  146. package/README.md +60 -19
  147. package/docs/how-it-works.md +2 -0
  148. package/docs/live-calls.md +38 -33
  149. package/features/ai/load-tools.ts +4 -2
  150. package/features/ai/prompts/bot.prompt.ts +5 -5
  151. package/features/ai/prompts/live.prompt.ts +36 -132
  152. package/features/ai/prompts/prompt-helper.ts +5 -4
  153. package/features/ai/prompts/thursday.prompt.ts +75 -54
  154. package/features/ai/tools/call.tool.ts +32 -4
  155. package/features/ai/tools/tool-name.ts +1 -0
  156. package/features/bot/bot.runner.ts +5 -5
  157. package/features/thursday/ascii.const.ts +74 -0
  158. package/features/thursday/components/ascii-orb.tsx +173 -30
  159. package/features/thursday/components/face.tsx +6 -1
  160. package/features/thursday/components/side-captions.tsx +273 -0
  161. package/features/thursday/components/tab-state.tsx +11 -3
  162. package/features/thursday/components/thursday-setting.tsx +6 -5
  163. package/features/thursday/components/thursday.tsx +227 -251
  164. package/features/thursday/face.store.ts +5 -0
  165. package/features/thursday/thursday.action.ts +4 -6
  166. package/features/thursday/thursday.schema.ts +10 -5
  167. package/features/thursday/thursday.store.ts +3 -0
  168. package/features/thursday/use-thursday.ts +461 -392
  169. package/features/workspace/file-kind.ts +9 -0
  170. package/hooks/use-hotkey.ts +3 -2
  171. package/lib/live/live.schema.ts +0 -21
  172. package/lib/live/live.server.ts +1 -3
  173. package/package.json +1 -1
  174. package/scripts/artifact-paths.test.mts +13 -0
  175. package/scripts/live-session.test.mts +56 -66
  176. package/.next/server/chunks/[root-of-the-server]__0g-ueei._.js +0 -8
  177. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1kipdeo._.js +0 -3
  178. package/.next/server/chunks/ssr/[root-of-the-server]__172cq4x._.js +0 -3
  179. package/.next/server/chunks/ssr/_03_928f._.js +0 -3
  180. package/.next/server/chunks/ssr/_0g_rlog._.js +0 -3
  181. package/.next/server/chunks/ssr/_123ttsf._.js +0 -3
  182. package/.next/static/chunks/10k2xvap03z20.css +0 -1
  183. package/.next/static/chunks/1t9qms5pwwa3n.js +0 -1
  184. package/.next/static/chunks/2a51-ywz9b2a3.js +0 -1
  185. package/.next/static/chunks/2fvdgxih7x7hr.js +0 -1
  186. package/.next/static/chunks/3addj3i4-izma.js +0 -1
  187. package/.next/static/chunks/3gfh7nxwusbt0.js +0 -1
  188. package/.next/static/chunks/3gwa44cvz4qoi.js +0 -1
  189. package/.next/static/chunks/3zkg5iup3v4a2.js +0 -12
  190. package/.next/static/chunks/405m0bqtoihev.js +0 -1
  191. /package/.next/static/{0qzGoKn2wTERVZtblX1tp → yyRVBc0xxYQsh3GpbQX9b}/_buildManifest.js +0 -0
  192. /package/.next/static/{0qzGoKn2wTERVZtblX1tp → yyRVBc0xxYQsh3GpbQX9b}/_clientMiddlewareManifest.js +0 -0
  193. /package/.next/static/{0qzGoKn2wTERVZtblX1tp → yyRVBc0xxYQsh3GpbQX9b}/_ssgManifest.js +0 -0
@@ -116,3 +116,12 @@ export function pathsIn(text: string): string[] {
116
116
  }
117
117
  return [...seen].slice(0, 6);
118
118
  }
119
+
120
+ /**
121
+ * What a finished job puts on the user's screen by itself: a page to read among their finished
122
+ * work. Anything else a report names — a data file, a bot's own memory, a sign-in state — opens
123
+ * only from its chip.
124
+ */
125
+ export const opensOnFinish = (path: string): boolean =>
126
+ path.startsWith(`${PATHS.artifacts}/`) &&
127
+ ["md", "markdown", "html", "htm"].includes(extensionOf(path));
@@ -10,7 +10,8 @@ const EDITABLE = /^(input|textarea|select)$/i;
10
10
 
11
11
  export const HOTKEY_CAPTURE = { "data-hotkey-capture": "" } as const;
12
12
 
13
- const busy = (target: EventTarget | null) => {
13
+ /** A key pressed here is being typed or recorded, not meant for a shortcut. */
14
+ export const capturesKeys = (target: EventTarget | null) => {
14
15
  const node = target as HTMLElement | null;
15
16
  if (!node) return false;
16
17
  return Boolean(
@@ -92,7 +93,7 @@ export function useHotkey({
92
93
  if (!enabled || !combo) return;
93
94
 
94
95
  const onKeyDown = (event: KeyboardEvent) => {
95
- if (event.repeat || busy(event.target)) return;
96
+ if (event.repeat || capturesKeys(event.target)) return;
96
97
  if (comboOf(event) !== combo) return;
97
98
 
98
99
  event.preventDefault();
@@ -3,9 +3,6 @@ import { z } from "zod";
3
3
  export const LIVE_MODEL = "gpt-live-1";
4
4
  export const LIVE_BACKEND_MODEL = "gpt-5.6-luna";
5
5
 
6
- /** Provider maxima for the startup `input`: how many messages, and their combined tokens. */
7
- export const LIVE_INPUT = { messages: 128, tokens: 8_192 };
8
-
9
6
  /** Flat function declaration accepted by Responses delegation. */
10
7
  export type ToolManifest = {
11
8
  name: string;
@@ -21,24 +18,6 @@ export const LiveFragmentSchema = z.object({
21
18
  });
22
19
  export type LiveFragment = z.infer<typeof LiveFragmentSchema>;
23
20
 
24
- /** Earlier conversation seeded at startup. Live has no system role here; a trusted note is a developer message. */
25
- export type LiveInput =
26
- | {
27
- type: "message";
28
- role: "developer";
29
- content: [{ type: "input_text"; text: string }];
30
- }
31
- | {
32
- type: "message";
33
- role: "user";
34
- content: [{ type: "input_text"; text: string }];
35
- }
36
- | {
37
- type: "message";
38
- role: "assistant";
39
- content: [{ type: "output_text"; text: string }];
40
- };
41
-
42
21
  /** What `session.closed` confirmed: the provider's reason and the active seconds billed. */
43
22
  export const LiveCloseSchema = z.object({
44
23
  reason: z.string().max(128),
@@ -2,7 +2,7 @@ import { z } from "zod";
2
2
  import { LIVE_CALL } from "@/config";
3
3
  import { logger } from "@/lib/logger";
4
4
  import { publicError } from "@/lib/public-error";
5
- import { LIVE_MODEL, type LiveInput, type ToolManifest } from "./live.schema";
5
+ import { LIVE_MODEL, type ToolManifest } from "./live.schema";
6
6
 
7
7
  const LiveConnectionSchema = z.object({
8
8
  session: z.object({ id: z.string().min(1) }),
@@ -79,7 +79,6 @@ export async function createLiveCall(options: {
79
79
  sdp: string;
80
80
  voice: string;
81
81
  instructions: string;
82
- input: LiveInput[];
83
82
  backend: {
84
83
  model: string;
85
84
  instructions: string;
@@ -100,7 +99,6 @@ export async function createLiveCall(options: {
100
99
  session: {
101
100
  model: LIVE_MODEL,
102
101
  instructions: options.instructions,
103
- input: options.input,
104
102
  audio: { output: { voice: options.voice } },
105
103
  store: false,
106
104
  delegation: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thursday-agent",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "A voice agent that runs on your own machine — talk to her, she hands the slow work to bots with a shell, a browser and skills.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -1,6 +1,19 @@
1
1
  import assert from "node:assert/strict";
2
2
  import { test } from "node:test";
3
3
  import { decodePagePath, decodePath, queryKey } from "../app/api/query-key.ts";
4
+ import { opensOnFinish, pathsIn } from "../features/workspace/file-kind.ts";
5
+
6
+ test("a finished job opens only a page among the finished work, never a data file or a bot's own", () => {
7
+ const report =
8
+ "Signed in and saved to bots/Mail/.auth/gmail.json. Notes in bots/Mail/memory/inbox.md, raw rows in artifacts/Mail/rows.json, slides in artifacts/Insta/slide_1.png, and the summary is artifacts/Mail/summary.md.";
9
+ assert.equal(
10
+ pathsIn(report).find(opensOnFinish),
11
+ "artifacts/Mail/summary.md",
12
+ );
13
+ assert.equal(opensOnFinish("artifacts/Analyst/report.html"), true);
14
+ assert.equal(opensOnFinish("artifacts/Analyst/data.csv"), false);
15
+ assert.equal(opensOnFinish("scratch/job/draft.md"), false);
16
+ });
4
17
 
5
18
  test("viewer URLs round-trip Unicode, spaces and reserved filename characters", () => {
6
19
  const paths = [
@@ -547,29 +547,20 @@ function captureFetch() {
547
547
  return requests;
548
548
  }
549
549
 
550
- test("startup sends voice and backend apart, seeds history, and keeps the key on the server", async () => {
550
+ test("startup sends voice and backend apart, seeds no history, and keeps the key on the server", async () => {
551
551
  const requests = captureFetch();
552
- const input = [
553
- {
554
- type: "message" as const,
555
- role: "user" as const,
556
- content: [{ type: "input_text" as const, text: "Book the dentist." }] as [
557
- { type: "input_text"; text: string },
558
- ],
559
- },
560
- ];
561
552
  const connection = await createLiveCall({
562
553
  apiKey: "test-key",
563
554
  sdp: "offer",
564
555
  voice: "marin",
565
556
  instructions: "Conversation only",
566
- input,
567
557
  backend: backend(),
568
558
  });
569
559
  const [request] = requests;
570
560
  assert.equal(request.session.model, "gpt-live-1");
571
561
  assert.equal(request.session.instructions, "Conversation only");
572
- assert.deepEqual(request.session.input, input);
562
+ // Earlier calls are the backend's to read; the voice opens on nothing but its instructions
563
+ assert.equal("input" in request.session, false);
573
564
  assert.equal(request.session.audio.output.voice, "marin");
574
565
  assert.equal(request.session.store, false);
575
566
  assert.equal(request.session.delegation.type, "responses");
@@ -595,7 +586,6 @@ test("reasoning and web search are sent only when given", async () => {
595
586
  sdp: "offer",
596
587
  voice: "cedar",
597
588
  instructions: "Talk",
598
- input: [],
599
589
  backend: backend({
600
590
  model: "gpt-4.1",
601
591
  reasoning: { effort: "low", summary: "auto" },
@@ -621,7 +611,6 @@ test("a provider refusal reaches the caller unchanged", async () => {
621
611
  sdp: "offer",
622
612
  voice: "marin",
623
613
  instructions: "Talk",
624
- input: [],
625
614
  backend: backend(),
626
615
  }),
627
616
  /This project cannot access gpt-live-1/,
@@ -748,13 +737,15 @@ test("stored settings keep OpenAI choices and the shared instruction, drop a Gro
748
737
  assert.deepEqual(migrateLiveSettings(null), LIVE_DEFAULTS);
749
738
  });
750
739
 
751
- test("both call prompts open as one Thursday: the voice gets the delegation policy and memory, earlier calls behind a developer note ending on her words, and an opening on every call", async () => {
740
+ test("both call prompts open as one Thursday: the voice gets a two-line delegation policy and memory and no earlier calls, the backend asks before handing work over, and every call has an opening", async () => {
752
741
  let profileFacts = 200;
742
+ let samFacts = 2;
753
743
  const botMock = mock.module("../features/bot/bot.query.ts", {
754
744
  namedExports: {
755
745
  listJobBots: async () => [
756
746
  { name: "Scout", description: "Finds things out on the web" },
757
747
  ],
748
+ readBotMemoryOn: async () => true,
758
749
  },
759
750
  });
760
751
  const skillsMock = mock.module("../features/skills/skills.discover.ts", {
@@ -796,7 +787,7 @@ test("both call prompts open as one Thursday: the voice gets the delegation poli
796
787
  path: "people/sam",
797
788
  description: "Their brother",
798
789
  aliases: ["Sam"],
799
- factCount: 2,
790
+ factCount: samFacts,
800
791
  lastSeenAt: new Date(),
801
792
  },
802
793
  ],
@@ -812,9 +803,6 @@ test("both call prompts open as one Thursday: the voice gets the delegation poli
812
803
  { role: "user", tool: null, text: "Book the dentist.", seq: 1 },
813
804
  { role: "tool", tool: "delegate", text: '{"bot":"Scout"}', seq: 2 },
814
805
  { role: "assistant", tool: null, text: "Scout has it.", seq: 3 },
815
- // The call ended on the user's words: they must not reach the next call as a waiting turn
816
- { role: "user", tool: null, text: "Hang up.", seq: 4 },
817
- { role: "tool", tool: "end_call", text: "{}", seq: 5 },
818
806
  ],
819
807
  },
820
808
  ],
@@ -833,60 +821,67 @@ test("both call prompts open as one Thursday: the voice gets the delegation poli
833
821
  );
834
822
  const on = await loadLivePrompt({
835
823
  voicePrompt: "Use a calm voice.",
836
- webSearch: false,
837
824
  locale: "ko-KR",
838
825
  });
839
826
  assert.match(on.text, /modeled on Friday, the AI in \*Iron Man\*/);
840
827
  assert.match(on.text, /Prefer brief replies/);
841
828
  assert.match(
842
829
  on.text,
843
- /\n\nBackchannel policy: Use moderate backchannels\. .*\n\nInterruption policy: Stop speaking when the user interrupts\. Listen to what they say\.\n\nDelegation policy:\nBackend tools:\n- Memory:/,
830
+ /\n\n## Always\n\nIMPORTANT — always follow this: [^\n]+\n\nBackchannel policy: Use moderate backchannels\. .*\n\nInterruption policy: Stop speaking when the user interrupts\. Listen to what they say\.\n\nDelegation policy:\nDelegate to the backend everything [^\n]+\nWhatever they tell you about themselves[^\n]+unless it is already written below\.\nAnswer from what the backend returns[^\n]+\n\n## What you know about them\n/,
844
831
  );
832
+ // Only the ending rule carries the stamp
833
+ assert.equal(on.text.split("IMPORTANT").length, 2);
845
834
  assert.match(
846
835
  on.text,
847
836
  /When the user speaks at length, acknowledge now and then/,
848
837
  );
849
- assert.match(on.text, /\nDelegate to the backend when:\n/);
850
- assert.match(on.text, /\nDo not delegate to the backend when:\n/);
851
- assert.match(on.text, /What bots can reach for: browser, images, github\./);
838
+ // What the backend can do, and when to hand over, are no longer the voice's to read
839
+ assert.equal(
840
+ /Backend tools|Delegate to the backend when|What bots can reach for|- Web:/.test(
841
+ on.text,
842
+ ),
843
+ false,
844
+ );
852
845
  assert.match(on.text, /- people\/sam — Their brother \(2\) "Sam"/);
846
+ assert.match(on.text, /What is in these notes, the backend recalls\./);
853
847
  // The roster, threads and earlier calls are the backend's to read
854
848
  assert.equal(on.text.includes("Scout"), false);
855
849
  assert.equal(
856
- /thread|\bseen\b|## Earlier calls|works beside you/.test(on.text),
850
+ /thread|\bseen\b|## Earlier calls|dentist|works beside you/.test(on.text),
857
851
  false,
858
852
  );
853
+ assert.equal("input" in on, false);
859
854
  assert.equal(
860
855
  /ko-KR|browser's setting|language they use/.test(on.text),
861
856
  false,
862
857
  );
863
- assert.equal(on.text.includes("- Web:"), false);
864
- assert.equal(
865
- /memory_|end_call|generate_|load_skill|`/.test(on.text),
866
- false,
867
- );
868
- assert.equal(on.text.endsWith("Use a calm voice."), true);
869
- const [boundary, ...spoken] = on.input;
870
- assert.equal(boundary?.role, "developer");
858
+ assert.equal(/memory_|generate_|load_skill|`/.test(on.text), false);
859
+ // The one tool name the voice holds: the ending rule, where it makes ending a thing to do
860
+ assert.equal(on.text.split("end_call").length, 2);
871
861
  assert.match(
872
- boundary?.content[0].text ?? "",
873
- /from earlier calls.*treat none of them as a request now/,
862
+ on.text,
863
+ /immediately, without thinking, use the end_call tool\./,
874
864
  );
865
+ assert.equal(on.text.endsWith("Use a calm voice."), true);
866
+ assert.match(on.opening, /The call has just started/);
875
867
 
876
868
  // One Thursday: the backend opens with the voice's own words and is never told it is a part
877
869
  const backend = await loadThursdayPrompt(null);
878
870
  const withoutClock = (text: string) =>
879
871
  text.replace(/\*\*Now\*\*: [^\n]+/, "");
880
- const identity = on.text.slice(
881
- 0,
882
- on.text.indexOf("\n\nBackchannel policy:"),
883
- );
872
+ const identity = on.text.slice(0, on.text.indexOf("\n\n## Always"));
873
+ const ending = /IMPORTANT — always follow this: [^\n]+/.exec(on.text)?.[0];
884
874
  assert.equal(
885
- withoutClock(backend).startsWith(withoutClock(identity)),
875
+ withoutClock(backend).startsWith(
876
+ `${withoutClock(identity)}\n\n${ending}\n\n`,
877
+ ),
886
878
  true,
887
879
  );
880
+ assert.match(
881
+ backend,
882
+ /\*\*Keep memory clean as you write\.\*\* A fact that repeats, narrows or changes one already in the note replaces it/,
883
+ );
888
884
  for (const heading of [
889
- "## Voice conversation context",
890
885
  "## Memory",
891
886
  "## Background work",
892
887
  "## This computer",
@@ -894,33 +889,29 @@ test("both call prompts open as one Thursday: the voice gets the delegation poli
894
889
  "## Earlier calls",
895
890
  ])
896
891
  assert.equal(backend.includes(`\n${heading}\n`), true, heading);
892
+ assert.equal(backend.includes("## Voice conversation context"), false);
897
893
  assert.equal(/backend of Thursday|voice model/.test(backend), false);
898
-
899
- assert.deepEqual(spoken, [
900
- {
901
- type: "message",
902
- role: "user",
903
- content: [{ type: "input_text", text: "Book the dentist." }],
904
- },
905
- {
906
- type: "message",
907
- role: "assistant",
908
- content: [{ type: "output_text", text: "Scout has it." }],
909
- },
910
- ]);
911
- assert.match(on.opening, /The call has just started/);
912
-
913
- const searching = await loadLivePrompt({
914
- voicePrompt: "",
915
- webSearch: true,
916
- locale: null,
917
- });
918
- assert.equal(searching.input.length, 3);
919
- assert.match(searching.text, /- Web: look things up\./);
920
- assert.match(searching.opening, /The call has just started/);
894
+ // The end_call name sits in the ending rule only
895
+ assert.equal(backend.split("end_call").length, 2);
896
+ assert.match(backend, /\*\*Ask once before handing work over\.\*\*/);
897
+ assert.match(backend, /Each bot keeps its own memory from job to job/);
898
+ assert.match(backend, /they come from bots, not the user/);
899
+ assert.match(backend, /Book the dentist\./);
900
+ assert.equal(backend.includes("grown past what it holds well"), false);
901
+
902
+ // Tidying memory is the backend's: the voice neither reads it nor opens with it
903
+ samFacts = 60;
904
+ const heavy = await loadLivePrompt({ locale: null });
905
+ assert.equal(/tidying|grown past/.test(heavy.text), false);
906
+ assert.match(heavy.opening, /The call has just started/);
907
+ assert.match(
908
+ await loadThursdayPrompt(null),
909
+ /grown past what it holds well \(people\/sam\): say so once in what you return/,
910
+ );
911
+ samFacts = 2;
921
912
 
922
913
  profileFacts = 0;
923
- const first = await loadLivePrompt({ webSearch: false, locale: "ko-KR" });
914
+ const first = await loadLivePrompt({ locale: "ko-KR" });
924
915
  assert.match(first.text, /## First call/);
925
916
  // The one call that opens with nothing: she says who she is, then learns who they are
926
917
  assert.match(first.opening ?? "", /say who you are/);
@@ -930,7 +921,6 @@ test("both call prompts open as one Thursday: the voice gets the delegation poli
930
921
 
931
922
  // A call the page placed says so, ahead of even the first-call opening
932
923
  const rung = await loadLivePrompt({
933
- webSearch: false,
934
924
  locale: "ko-KR",
935
925
  calledBack: true,
936
926
  });
@@ -1,8 +0,0 @@
1
- module.exports=[874533,(e,t,i)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},666680,(e,t,i)=>{t.exports=e.x("node:crypto",()=>require("node:crypto"))},912714,(e,t,i)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},265143,e=>e.a(async(t,i)=>{try{var a=e.i(875225),o=e.i(518899),n=e.i(528790),r=e.i(613240),l=e.i(340698);e.i(786025);var s=e.i(944971),c=t([n,l]);[n,l]=c.then?(await c)():c;let T=e=>({name:e.name,description:e.description,systemPrompt:e.systemPrompt,icon:e.icon,provider:e.provider,model:e.model,disabled:e.disabled,compactAt:e.compactAt});async function m(){let e=await n.database.select().from(r.botTable).orderBy(r.botTable.createdAt);return e.length?e.filter(e=>!e.disabled).map(T):[s.DEFAULT_BOT]}async function d(e){let t=await f(e);if(t)return T(t);let i=e.trim().toLowerCase(),[l]=await n.database.select().from(r.botTable).where((0,a.eq)(o.sql`lower(${r.botTable.name})`,i));return l?T(l):s.DEFAULT_BOT.name.toLowerCase()===i?s.DEFAULT_BOT:null}async function u(){let[e,t,i]=await Promise.all([n.database.select().from(r.botTable).orderBy(r.botTable.createdAt),n.database.select({botName:r.botMcpToolTable.botName,id:r.mcpToolTable.id,name:r.mcpToolTable.name,serverName:r.mcpToolTable.serverName}).from(r.botMcpToolTable).innerJoin(r.mcpToolTable,(0,a.eq)(r.botMcpToolTable.toolId,r.mcpToolTable.id)),n.database.select({bot:r.threadTable.bot,input:o.sql`coalesce(sum(${r.threadTable.inputTokens}), 0)`,output:o.sql`coalesce(sum(${r.threadTable.outputTokens}), 0)`,lastJobAt:o.sql`max(${r.threadTable.updatedAt})`}).from(r.threadTable).groupBy(r.threadTable.bot)]),l=new Map;for(let{botName:e,...i}of t){let t=l.get(e)??[];t.push(i),l.set(e,t)}let s=new Map(i.map(e=>[e.bot,{input:Number(e.input),output:Number(e.output)}])),c=new Map(i.flatMap(e=>null==e.lastJobAt?[]:[[e.bot,new Date(1e3*Number(e.lastJobAt))]]));return e.map(e=>({...e,tools:l.get(e.name)??[],tokens:s.get(e.name)??{input:0,output:0},lastJobAt:c.get(e.name)??null}))}async function p(){return(0,s.isBotMemoryOn)(await (0,l.readConfig)(s.BOT_MEMORY_KEY))}async function f(e){let[t]=await n.database.select().from(r.botTable).where((0,a.eq)(r.botTable.name,e));return t??null}async function w(){let e=await n.database.select({name:r.botTable.name}).from(r.botTable);return[...new Set([...e.map(e=>e.name),s.DEFAULT_BOT.name])]}e.s(["findAllBots",0,u,"findJobBot",0,d,"listBotNames",0,w,"listJobBots",0,m,"readBotMemoryOn",0,p]),i()}catch(e){i(e)}},!1),629668,e=>{"use strict";var t=e.i(687388);let i=e=>`text/${e}; charset=utf-8`,a={md:{kind:"markdown",mime:i("markdown")},markdown:{kind:"markdown",mime:i("markdown")},csv:{kind:"csv",mime:i("csv")},json:{kind:"json",mime:"application/json; charset=utf-8"},txt:{kind:"text",mime:i("plain")},log:{kind:"text",mime:i("plain")},html:{kind:"frame",mime:i("html")},htm:{kind:"frame",mime:i("html")},pdf:{kind:"frame",mime:"application/pdf"},png:{kind:"image",mime:"image/png"},jpg:{kind:"image",mime:"image/jpeg"},jpeg:{kind:"image",mime:"image/jpeg"},gif:{kind:"image",mime:"image/gif"},webp:{kind:"image",mime:"image/webp"},svg:{kind:"image",mime:"image/svg+xml"},mp3:{kind:"audio",mime:"audio/mpeg"},wav:{kind:"audio",mime:"audio/wav"},mp4:{kind:"video",mime:"video/mp4"},webm:{kind:"video",mime:"video/webm"},css:{kind:"none",mime:i("css")},js:{kind:"none",mime:i("javascript")},woff2:{kind:"none",mime:"font/woff2"}},o=e=>e.split(".").pop()?.toLowerCase()??"",n=new Set(["node_modules","__pycache__"]),r=Object.entries(a).filter(([,e])=>"none"!==e.kind).map(([e])=>e),l=RegExp(String.raw`(?<![\p{L}\p{N}_/:@%-])(?:[\p{L}\p{N}_.@%-]+/)*[\p{L}\p{N}_@%-]+(?:\.[\p{L}\p{N}_-]+)*\.(?:${r.join("|")})\b`,"giu"),s=`${t.PATHS.workspace}/`;e.s(["isListedFolder",0,e=>!e.startsWith(".")&&!n.has(e),"mimeOf",0,e=>a[o(e)]?.mime??"application/octet-stream","pathsIn",0,function(e){let t=e.replace(/\b[a-z][\w+.-]*:\/\/\S+/gi," "),i=new Set;for(let e of t.match(l)??[]){let t=function(e){let t,i,a=(i=(t=e.trim()).indexOf(s))>=0?t.slice(i+s.length)||null:t.startsWith("/")||/^[A-Za-z]:/.test(t)||t.split("/").includes("..")?null:t||null;if(!a)return null;let[o,...n]=a.split("/");return n.length&&o.includes(".")?null:a}(e);t&&i.add(t)}return[...i].slice(0,6)},"viewKindOf",0,e=>a[o(e)]?.kind??"none"])},786025,e=>{"use strict";var t=e.i(666680),i=e.i(902157),a=e.i(912714),o=e.i(750227),n=e.i(687388);e.i(640911);var r=e.i(874533),l=n;let s=new Set(["node_modules",".git",".next","dist","build",".venv","__pycache__",".turbo","coverage"]);async function*c(e){let t;try{t=await (0,a.readdir)(e,{withFileTypes:!0})}catch{return}for(let i of t){if(s.has(i.name)||i.name.startsWith("."))continue;let t=(0,o.join)(e,i.name);i.isDirectory()?yield*c(t):i.isFile()&&(yield t)}}async function m(e,t,i,n){if(e.length<=n.max)return e;let r=(0,o.join)(i,n.dir),l=(0,o.join)(r,`${new Date().toISOString().replace(/[:.]/g,"-")}-${t.replace(/[^a-zA-Z0-9_-]+/g,"_")}.txt`),s=l;try{await (0,a.mkdir)(r,{recursive:!0}),await (0,a.writeFile)(l,e),s=(0,o.relative)(i,l)||l}catch{s="(could not be written to a file)"}let c=(e.match(/\n/g)?.length??0)+1;return`${e.slice(0,n.head).trimEnd()}
2
-
3
- [${t} cut at ${n.max.toLocaleString("en")} chars — the whole thing (${c} lines) is at ${s}. Read the part you need with \`sed -n\`.]
4
-
5
- ${e.slice(-n.tail).trimStart()}`}let d=n.APP_DIR,u=(0,o.join)(n.DATA_DIR,n.PATHS.workspace),p=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,o.join)(d,"node_modules",".bin")]).filter(Boolean),f=(0,o.join)(u,n.PATHS.artifacts),w=[n.PATHS.artifacts,n.PATHS.projects,n.PATHS.scratch,n.PATHS.bots],T=new Set([...w,".agents"]),b=(e,t)=>t===e||t.startsWith(e+o.sep),h=e=>(0,a.realpath)(e).catch(()=>null);async function g(e){let t=await h(u)??u,i=(0,o.resolve)(u,e);if(!b(u,i))return null;let a=i,n=await h(a);for(;null===n&&(0,o.dirname)(a)!==a;)a=(0,o.dirname)(a),n=await h(a);if(null===n)return null;let r=(0,o.relative)(a,i),l=r?(0,o.join)(n,r):n;return b(t,l)?l:null}let S=e=>e.replace(/[^\p{L}\p{N}_-]+/gu,"-"),A=e=>`${n.PATHS.bots}/${S(e)}`,y=e=>`${n.PATHS.artifacts}/${S(e)}`;async function k(e){let t=A(e),i=y(e);return await Promise.all([t,i].map(e=>(0,a.mkdir)((0,o.join)(u,e),{recursive:!0}))),{own:t,artifacts:i}}async function v(e,t){let i,r=(i=t.trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40)||"job",`${n.PATHS.scratch}/${i}-${e.slice(0,6)}`);return await (0,a.mkdir)((0,o.join)(u,r),{recursive:!0}),r}let _=e=>e?{PLAYWRIGHT_CLI_SESSION:`thread-${e}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:n.BROWSER_VIEWPORT}:{},$={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function P(e){let t=Object.values($).flat(),{stdout:i}=await e.exec(t.map(e=>`command -v ${e} >/dev/null 2>&1 && printf '%s ' ${e}`).join("; "),{timeoutMs:1e4}),a=new Set(i.trim().split(/\s+/).filter(Boolean)),o=e=>({found:e.filter(e=>a.has(e)),missing:e.filter(e=>!a.has(e))});return{runtimes:o($.runtimes),managers:o($.managers),browser:null}}async function E(){await x(),await O()}async function j(e){await L(e,!0)}async function L(e,t){let i=await H(),a=_(e),o=await i.exec("playwright-cli list --json",{env:a,timeoutMs:15e3}).catch(()=>null),n=[];try{let{browsers:e}=JSON.parse(o?.stdout??"");n=e?.filter(e=>e.name===a.PLAYWRIGHT_CLI_SESSION||e.name.startsWith(`${a.PLAYWRIGHT_CLI_SESSION}-`))??[]}catch{}for(let e of n)!e.attached&&(t||!1===e.headed)&&await i.exec("playwright-cli close",{env:{...a,PLAYWRIGHT_CLI_SESSION:e.name},timeoutMs:15e3}).catch(()=>{});await E()}let O=()=>I(n.PATHS.output),x=()=>I(".playwright-cli");async function I(e){let t=(0,o.join)(u,e),i=await (0,a.readdir)(t,{withFileTypes:!0}).catch(()=>[]),r=Date.now()-n.WORKSPACE_KEEP.forMs;for(let e of i){if(!e.isFile())continue;let i=(0,o.join)(t,e.name),n=await (0,a.stat)(i).catch(()=>null);n&&n.mtimeMs<r&&await (0,a.unlink)(i).catch(()=>{})}}let R={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function H(){for(let e of w)await (0,a.mkdir)((0,o.join)(u,e),{recursive:!0});for(let[e,t]of Object.entries(R))await (0,a.writeFile)((0,o.join)(u,e),t,{flag:"wx"}).catch(()=>{});return(({workingDirectory:e,spill:t,toolPath:i})=>{let n=(0,o.resolve)(e),s=(i??[]).filter(Boolean).join(":"),d=e=>e.startsWith("/")||/^[A-Za-z]:/.test(e)?e:(0,o.resolve)(n,e);return{cwd:n,resolve:d,readFile:(e,t)=>(0,a.readFile)(d(e),t),async writeFile(e,t){let i=d(e);await (0,a.mkdir)((0,o.join)(i,".."),{recursive:!0}),await (0,a.writeFile)(i,t)},readdir:(e,t)=>(0,a.readdir)(d(e),t),fold:(e,i="output")=>m(e,i,n,t),async glob(e,{path:t=".",limit:i=200}={}){let a=d(t),n=RegExp("^"+e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*\//g,"(?:.*/)?").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")+"$"),r=[];for await(let e of c(a)){let t=(0,o.relative)(a,e).split(o.sep).join("/");if((n.test(t)||n.test(e))&&r.push(e),r.length>=i)break}return r},exec:(e,{cwd:i,timeoutMs:a=l.EXEC_TIMEOUT_MS,signal:o,env:c}={})=>new Promise(u=>{let p,f,w=function(){let e={...process.env};for(let t of Object.keys(e))/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|_AUTH/i.test(t)&&delete e[t];return e.TERM="dumb",e.PAGER="cat",e.GIT_PAGER="cat",e}();s&&(w.PATH=`${w.PATH??""}:${s}`);let T=(0,r.spawn)(e,{shell:!0,cwd:i?d(i):n,env:{...w,...c},detached:!0}),b="",h="";T.stdout?.on("data",e=>b+=e),T.stderr?.on("data",e=>h+=e);let g=e=>{try{T.pid&&process.kill(-T.pid,e)}catch{T.kill(e)}},S=!1,A=async e=>{S||(S=!0,clearTimeout(k),clearTimeout(p),clearTimeout(f),o?.removeEventListener("abort",v),u({...e,stdout:await m(e.stdout,"stdout",n,t),stderr:await m(e.stderr,"stderr",n,t)}))},y=e=>{p||S||(h+=`
6
- [${e}]`,g("SIGTERM"),p=setTimeout(()=>{h+="\n[Killed: it did not exit on SIGTERM]",g("SIGKILL"),f=setTimeout(()=>{T.stdout?.destroy(),T.stderr?.destroy(),A({stdout:b,stderr:h,exitCode:-1})},1e3)},l.EXEC_KILL_GRACE_MS))},k=setTimeout(()=>y(`Timed out after ${a}ms`),a),v=()=>y("Aborted");o?.aborted?v():o?.addEventListener("abort",v,{once:!0}),T.on("close",e=>A({stdout:b,stderr:h,exitCode:e??-1})),T.on("error",e=>A({stdout:b,stderr:h+String(e),exitCode:-1}))})}})({workingDirectory:u,spill:{dir:n.PATHS.output,...n.TOOL_OUTPUT},toolPath:p})}async function M(e,t){let i=e.map(e=>(0,o.resolve)(u,e));if(t){let e=0;for await(let a of c((0,o.join)(u,t)))if(i.push(a),(e+=1)>=500)break}let n=new Map;for(let e of i){let t=await (0,a.stat)(e).catch(()=>null);if(!t?.isFile())continue;let i=(0,o.relative)(u,e);n.set(i&&!i.startsWith("..")?i:e,t.mtimeMs)}return[...n].sort((e,t)=>e[1]-t[1]).map(([e])=>e)}e.s(["ARTIFACTS",0,f,"WORKSPACE",0,u,"botArtifacts",0,y,"botBrowserSession",0,(e,i)=>`${e}-bot-${(0,t.createHash)("sha256").update(i.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,A,"botFolderName",0,S,"botShellEnv",0,e=>({THURSDAY_ARTIFACTS:y(e)}),"closeJobShell",0,j,"filesOnDisk",0,M,"insideWorkspace",0,g,"jobShellEnv",0,_,"openBotFolders",0,k,"openJobScratch",0,v,"openWorkspace",0,H,"readMachineTools",0,P,"writeRefusal",0,function(e,t){if(b(u,e)){let a=(0,o.relative)(u,e),[r,l]=a.split(o.sep);return r&&T.has(r)?t&&r===n.PATHS.artifacts&&l&&l.toLowerCase()!==S(t).toLowerCase()&&!(0,i.existsSync)((0,o.join)(f,l))?`Not written: ${a} would sit loose at the top of ${n.PATHS.artifacts}/. Your finished work goes in ${y(t)}/.`:null:`Not written: ${a||"the workspace root"} is outside the workspace's folders. Finished work goes under ${t?y(t):n.PATHS.artifacts}/, code under ${n.PATHS.projects}/, your own kit under ${n.PATHS.bots}/, and this job's working material under ${n.PATHS.scratch}/.`}return b(d,e)?`Not written: ${e} is inside the app that is running you, not the user's files. Work in ${u}; outside it, write only where the user pointed you.`:null}],786025)}];
7
-
8
- //# sourceMappingURL=%5Broot-of-the-server%5D__0g-ueei._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[329280,e=>{e.v(s=>Promise.all(["server/chunks/[externals]_node_readline_1u65a-m._.js","server/chunks/node_modules_consola_dist_chunks_prompt_mjs_02axwqv._.js"].map(s=>e.l(s))).then(()=>s(781937)))}];
2
-
3
- //# sourceMappingURL=node_modules_consola_dist_chunks_prompt_mjs_1kipdeo._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[750227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},59639,(a,b,c)=>{b.exports=a.x("node:process",()=>require("node:process"))},287702,a=>{"use strict";process.env.THURSDAY_APP_DIR?.trim()||process.cwd(),process.env.THURSDAY_HOME?.trim()||process.cwd(),process.env.THURSDAY_URL?.trim()||process.env.PORT?.trim();let b=".ai-workspace",c={workspace:b,artifacts:"artifacts",projects:"projects",scratch:"scratch",bots:"bots",output:".output",skills:{default:"skills",custom:`${b}/.agents/skills`}};a.s(["APP_NAME",0,"Thursday","ARTIFACT_VIEW",0,{rows:200,setFiles:120},"ASCII_FACE",0,{charset:"emojiOnly",fontSize:{default:8,min:4,max:16},density:{default:1.4,min:.6,max:2}},"BOT_RUN",0,{steps:100,compactAt:5e5,compactHeadroom:.8,summaryWords:{min:600,max:3e3,perTokens:200},participants:12,concurrent:4,turns:120,queuedMessages:200,silenceMs:3e5,overflowShrink:.6,retryMs:1e4,compactFiles:40},"BROWSER_SKILL",0,"browser","CALL_END",0,{quietMs:600,unsaidMs:2e3,maxMs:8e3},"CALL_HISTORY_PAGE",0,10,"CALL_IDLE",0,{hangUpMs:3e4,graceMs:15e3,warnMs:1e4,agentSilentMs:3e4},"CALL_RELAY",0,{quietMs:7e3,perTurn:3,readMs:15e3},"IS_DEV",0,!1,"LIVE_CALL",0,{startupMs:3e4,closeMs:15e3,transcriptGapMs:1500,transcriptSaveMs:500,appendMs:15e3,backendOutputTokens:4096,reasoningCheckMs:5e3},"PAGE_SIZE",0,50,"PATHS",0,c,"PROMPT_CROWDED",0,{bots:10,skills:20},"ROOM_KEEP_READ_MS",0,6e5,"STUDIO_SERVER",0,"studio","WORKSPACE_VIEW",0,{rows:200,textMax:524288,elementMax:0x3200000}])},992025,a=>{a.v(a=>Promise.resolve().then(()=>a(948986)))},929490,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_0exkwcm._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-SVP7TREG_mjs_03r5m21._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_0lct0v1._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js"].map(b=>a.l(b))).then(()=>b(161868)))},969267,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_1g1eihe._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_1feyqvf._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js","server/chunks/ssr/node_modules_cytoscape_dist_cytoscape_esm_mjs_0arohj6._.js","server/chunks/ssr/node_modules_11trqmi._.js"].map(b=>a.l(b))).then(()=>b(626047)))},784520,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_0qwth-_._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_blockDiagram-I7D4REHJ_mjs_0qg1lr5._.js"].map(b=>a.l(b))).then(()=>b(155638)))},613707,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-F27PBJKO_mjs_0ms0zmb._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_c4Diagram-7LVT6UL2_mjs_06bhe3-._.js"].map(b=>a.l(b))).then(()=>b(557384)))},53467,a=>{"use strict";var b=a.i(261234),c=a.i(539110);a.i(975930);var d=a.i(671731),e=(0,c.__name)(a=>{let{securityLevel:c}=(0,b.getConfig2)(),e=(0,d.select)("body");if("sandbox"===c){let b=(0,d.select)(`#i${a}`),c=b.node()?.contentDocument??document;e=(0,d.select)(c.body)}return e.select(`#${a}`)},"selectSvgElement");a.s(["selectSvgElement",0,e])},882458,a=>{"use strict";var b=a.i(416635),c=a.i(43429),d=a.i(428212),e=a.i(916573),f=a.i(887370),g=a.i(261234),h=a.i(875117),i=a.i(539110),j={common:g.common_default,getConfig:g.getConfig,insertCluster:b.insertCluster,insertEdge:c.insertEdge,insertEdgeLabel:c.insertEdgeLabel,insertMarkers:c.markers_default,insertNode:d.insertNode,interpolateToCurve:f.interpolateToCurve,labelHelper:e.labelHelper,log:h.log,positionEdgeLabel:c.positionEdgeLabel},k={},l=(0,i.__name)(a=>{for(let b of a)k[b.name]=b},"registerLayoutLoaders");(0,i.__name)(()=>{l([{name:"dagre",loader:(0,i.__name)(async()=>await a.A(390118),"loader")},{name:"swimlane",loader:(0,i.__name)(async()=>await a.A(860094),"loader")},{name:"cose-bilkent",loader:(0,i.__name)(async()=>await a.A(989520),"loader")}])},"registerDefaultLayoutLoaders")();var m=(0,i.__name)(async(a,b)=>{if(!(a.layoutAlgorithm in k))throw Error(`Unknown layout algorithm: ${a.layoutAlgorithm}`);if(a.diagramId)for(let b of a.nodes){let c=b.domId||b.id;b.domId=`${a.diagramId}-${c}`}let c=k[a.layoutAlgorithm],d=await c.loader(),{theme:e,themeVariables:f}=a.config,{useGradient:g,gradientStart:h,gradientStop:i}=f,l=b.attr("id");if(b.append("defs").append("filter").attr("id",`${l}-drop-shadow`).attr("height","130%").attr("width","130%").append("feDropShadow").attr("dx","4").attr("dy","4").attr("stdDeviation",0).attr("flood-opacity","0.06").attr("flood-color",`${e?.includes("dark")?"#FFFFFF":"#000000"}`),b.append("defs").append("filter").attr("id",`${l}-drop-shadow-small`).attr("height","150%").attr("width","150%").append("feDropShadow").attr("dx","2").attr("dy","2").attr("stdDeviation",0).attr("flood-opacity","0.06").attr("flood-color",`${e?.includes("dark")?"#FFFFFF":"#000000"}`),g){let a=b.append("linearGradient").attr("id",b.attr("id")+"-gradient").attr("gradientUnits","objectBoundingBox").attr("x1","0%").attr("y1","0%").attr("x2","100%").attr("y2","0%");a.append("svg:stop").attr("offset","0%").attr("stop-color",h).attr("stop-opacity",1),a.append("svg:stop").attr("offset","100%").attr("stop-color",i).attr("stop-opacity",1)}return d.render(a,b,j,{algorithm:c.algorithm})},"render"),n=(0,i.__name)((a="",{fallback:b="dagre"}={})=>{if(a in k)return a;if(b in k)return h.log.warn(`Layout algorithm ${a} is not registered. Using ${b} as fallback.`),b;throw Error(`Both layout algorithms ${a} and ${b} are not registered.`)},"getRegisteredLayoutAlgorithm");a.s(["getRegisteredLayoutAlgorithm",0,n,"registerLayoutLoaders",0,l,"render",0,m])},854712,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_1v463pe._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-TICWLB2K_mjs_1t97mh7._.js"].map(b=>a.l(b))).then(()=>b(336243)))},892569,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_0thh8pk._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-TICWLB2K_mjs_1t97mh7._.js"].map(b=>a.l(b))).then(()=>b(538994)))},989520,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_1nl12mt._.js","server/chunks/ssr/node_modules_cytoscape_dist_cytoscape_esm_mjs_0arohj6._.js"].map(b=>a.l(b))).then(()=>b(127273)))},388833,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_0qbfyjh._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_18pinup._.js"].map(b=>a.l(b))).then(()=>b(517237)))},390118,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_dagre-GXQ25YYZ_mjs_0k_lz8d._.js","server/chunks/ssr/node_modules_dagre-d3-es_src_dagre_index_0g66msq.js"].map(b=>a.l(b))).then(()=>b(920028)))},831868,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_1gu1pph._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_0eji647._.js"].map(b=>a.l(b))).then(()=>b(767190)))},840309,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_04vxchl._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_18pinup._.js"].map(b=>a.l(b))).then(()=>b(464445)))},835410,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_0746rzi._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_18pinup._.js"].map(b=>a.l(b))).then(()=>b(617803)))},728413,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_1gpednh._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_diagram-VX7I27RA_mjs_0dl8gzm._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_13hksv_._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js"].map(b=>a.l(b))).then(()=>b(217755)))},992149,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_1d53yiq._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_18pinup._.js"].map(b=>a.l(b))).then(()=>b(752425)))},70220,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_1xn6saw._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-SVP7TREG_mjs_03r5m21._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_0lct0v1._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js"].map(b=>a.l(b))).then(()=>b(137554)))},595386,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_0il0v7d._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_erDiagram-RLTQ6QDP_mjs_18g60i7._.js"].map(b=>a.l(b))).then(()=>b(239909)))},707604,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_0ql0igl._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-SHT3W25Y_mjs_00p5j42._.js"].map(b=>a.l(b))).then(()=>b(1258)))},598518,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_1831lye._.js","server/chunks/ssr/node_modules_1_d0q_7._.js"].map(b=>a.l(b))).then(()=>b(722966)))},126571,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_0vv0-fg._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_0dlpxwr._.js","server/chunks/ssr/1q96_modules_mermaid_dist_chunks_mermaid_core_gitGraphDiagram-WWUBYQGX_mjs_0g15hiw._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js"].map(b=>a.l(b))).then(()=>b(349834)))},814636,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_00_51_v._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_1ok0411._.js"].map(b=>a.l(b))).then(()=>b(525902)))},147136,a=>{a.v(b=>Promise.all(["server/chunks/ssr/1q96_modules_mermaid_dist_chunks_mermaid_core_ishikawaDiagram-5VMMS53U_mjs_05o2e4d._.js"].map(b=>a.l(b))).then(()=>b(206340)))},719552,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_201yvda._.js","server/chunks/ssr/1q96_modules_mermaid_dist_chunks_mermaid_core_journeyDiagram-3NMN7TZE_mjs_16ehrbl._.js"].map(b=>a.l(b))).then(()=>b(450754)))},653408,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-5VM5RSS4_mjs_0tg6kya._.js","server/chunks/ssr/1q96_modules_mermaid_dist_chunks_mermaid_core_kanban-definition-UXKFOSKX_mjs_1uiqd5g._.js"].map(b=>a.l(b))).then(()=>b(301315)))},165250,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_1turj0n._.js","server/chunks/ssr/1daa_mermaid_dist_chunks_mermaid_core_mindmap-definition-YA3MSWOX_mjs_19k8byt._.js"].map(b=>a.l(b))).then(()=>b(790158)))},325455,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_0qapgjr._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-SVP7TREG_mjs_03r5m21._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_0lct0v1._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js"].map(b=>a.l(b))).then(()=>b(595628)))},934650,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0nrrdaq._.js","server/chunks/ssr/node_modules_1rg7lj4._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_1sgfrma._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js"].map(b=>a.l(b))).then(()=>b(748116)))},389088,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_111pp7w._.js","server/chunks/ssr/1q96_modules_mermaid_dist_chunks_mermaid_core_quadrantDiagram-AXDQQJYC_mjs_0h4a9wq._.js"].map(b=>a.l(b))).then(()=>b(888630)))},523431,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_0fr-ml8._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-SVP7TREG_mjs_03r5m21._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_0lct0v1._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js"].map(b=>a.l(b))).then(()=>b(846881)))},458290,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_1turj0n._.js","server/chunks/ssr/1daa_mermaid_dist_chunks_mermaid_core_requirementDiagram-BXWQKSXE_mjs_0kwiv6n._.js"].map(b=>a.l(b))).then(()=>b(443250)))},215730,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_d3-scale_src_1tr1qwb._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_sankeyDiagram-P5KCCOFB_mjs_187yyta._.js"].map(b=>a.l(b))).then(()=>b(656950)))},295724,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_1o1kg4c._.js","server/chunks/ssr/1q96_modules_mermaid_dist_chunks_mermaid_core_sequenceDiagram-WJ2MYXX4_mjs_1n01m3a._.js"].map(b=>a.l(b))).then(()=>b(571979)))},482052,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_sizeCapture-INFHLROL_mjs_179zv_p._.js"].map(b=>a.l(b))).then(()=>b(865684)))},438231,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_1rxlz7e._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_stateDiagram-D77RDMKH_mjs_1mer5fv._.js","server/chunks/ssr/node_modules_dagre-d3-es_src_dagre_index_0g66msq.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-IMKFNOWR_mjs_0vdq1-l._.js"].map(b=>a.l(b))).then(()=>b(168538)))},991687,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_0jkhu0x._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-IMKFNOWR_mjs_0vdq1-l._.js"].map(b=>a.l(b))).then(()=>b(472309)))},860094,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_swimlanes-42K2YHIH_mjs_0scuk32._.js"].map(b=>a.l(b))).then(()=>b(827033)))},819980,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_04f6p6a._.js","server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-SHT3W25Y_mjs_00p5j42._.js"].map(b=>a.l(b))).then(()=>b(1471)))},623969,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_d3-shape_src_arc_1-w13bo.js","server/chunks/ssr/1daa_mermaid_dist_chunks_mermaid_core_timeline-definition-24CTP7MA_mjs_10dmaxt._.js"].map(b=>a.l(b))).then(()=>b(301394)))},788557,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_vennDiagram-4TSXK5OY_mjs_0anqu7y._.js"].map(b=>a.l(b))).then(()=>b(509170)))},925161,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_1g1eihe._.js","server/chunks/ssr/1q96_modules_mermaid_dist_chunks_mermaid_core_wardleyDiagram-VM6X3IG4_mjs_0kh3fjb._.js","server/chunks/ssr/node_modules_@mermaid-js_parser_dist_17wxxyr._.js","server/chunks/ssr/1daa_@mermaid-js_parser_dist_chunks_mermaid-parser_core_chunk-FOHPRMQF_mjs_0ybwfeq._.js"].map(b=>a.l(b))).then(()=>b(914844)))},506751,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_0xht9wg._.js","server/chunks/ssr/1q96_modules_mermaid_dist_chunks_mermaid_core_xychartDiagram-S5SC5T6Z_mjs_08t5e44._.js"].map(b=>a.l(b))).then(()=>b(176947)))},236914,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_streamdown_dist_highlighted-body-KPVGNVTW_1fnf894.js"].map(b=>a.l(b))).then(()=>b(391282)))},172487,a=>{a.v(b=>Promise.all(["server/chunks/ssr/node_modules_streamdown_dist_mermaid-HWGCJPDP_093xi20.js"].map(b=>a.l(b))).then(()=>b(853409)))}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__172cq4x._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[897020,a=>{"use strict";var b=a.i(187924);a.s([],804434),a.i(804434);var c=a.i(572131),d=a.i(801811),e=a.i(357738),f=a.i(462824),g=a.i(524715),h=a.i(394552),i=a.i(307436),j=a.i(407393),k=a.i(827576);let l={checked:a=>a?{"data-checked":""}:{"data-unchecked":""},...j.transitionStatusMapping,...k.fieldValidityMapping};var m=a.i(85933),n=a.i(300557),o=a.i(926184),p=a.i(221436),q=a.i(579587),r=a.i(796511),s=a.i(1230),t=a.i(832362),u=a.i(77260),v=a.i(346919),w=a.i(769476);let x=c.createContext(void 0);var y=a.i(376224),z=a.i(854662);let A=c.createContext(void 0),B=c.forwardRef(function(a,j){let{render:k,className:z,disabled:B=!1,readOnly:C=!1,required:D=!1,"aria-labelledby":E,value:F,inputRef:G,nativeButton:H=!1,id:I,style:J,...K}=a,L=c.useContext(x),{disabled:M,readOnly:N,required:O,form:P,checkedValue:Q,touched:R=!1,validation:S,name:T,setCheckedValue:U=g.NOOP,setTouched:V=g.NOOP,registerInputRef:W=g.NOOP}=L??{},{setTouched:X,setFilled:Y,state:Z,disabled:$}=(0,s.useFieldRootContext)(),_=(0,t.useFieldItemContext)(),{labelId:aa,getDescriptionProps:ab}=(0,u.useLabelableContext)(),ac=$||_.disabled||M||B,ad=N||C,ae=O||D,af=L?Q===F:""===F,ag=c.useRef(null),ah=c.useRef(null),ai=S?.registerInput,aj=c.useCallback(a=>ai?.(a,{controlRef:ag,value:void 0}),[ai]),ak=(0,d.useMergedRefs)(G,ah,W,aj);(0,e.useIsoLayoutEffect)(()=>{ah.current?.checked&&Y(!0)},[Y]),(0,e.useIsoLayoutEffect)(()=>{if(ah.current){if(ac&&af)return void W(null);W(ah.current)}},[af,ac,W]);let al=(0,n.useBaseUiId)(),am=(0,w.useLabelableId)({id:I}),an=H?void 0:am,ao={role:"radio","aria-checked":af,"aria-labelledby":(0,v.useAriaLabelledBy)(E,aa,ah,!H,an),[q.ACTIVE_COMPOSITE_ITEM]:af?"":void 0,id:H?am:al,onKeyDown(a){"Enter"===a.key&&a.preventDefault()},onClick(a){if(a.defaultPrevented||ac||ad)return;a.preventDefault();let b=ah.current;b&&(0,m.dispatchClickWithModifiers)(b,a)},onFocus(a){a.defaultPrevented||ac||ad||!R||(ah.current?.click(),V(!1))}},{getButtonProps:ap,buttonRef:aq}=(0,p.useButton)({disabled:ac,native:H,composite:!1}),ar={type:"radio",ref:ak,form:P,id:an,name:T,tabIndex:-1,style:T?f.visuallyHiddenInput:f.visuallyHidden,"aria-hidden":!0,...void 0!==F?{value:(0,y.serializeValue)(F)}:g.EMPTY_OBJECT,disabled:ac,checked:af,required:ae,readOnly:ad,onChange(a){if(a.nativeEvent.defaultPrevented||ac||ad||void 0===F)return;let b=(0,h.createChangeEventDetails)(i.REASONS.none,a.nativeEvent);U(F,b),b.isCanceled||X(!0)},onClick(a){a.stopPropagation()},onFocus(){ag.current?.focus()}},as=c.useMemo(()=>({...Z,required:ae,disabled:ac,readOnly:ad,checked:af}),[Z,ac,ad,af,ae]),at=void 0!==L,au=[j,ag,aq],av=[ao,K,ap,ab,S?a=>S.getValidationProps(ac,a):g.EMPTY_OBJECT],aw=(0,o.useRenderElement)("span",a,{enabled:!at,state:as,ref:au,props:av,stateAttributesMapping:l});return(0,b.jsxs)(A.Provider,{value:as,children:[at?(0,b.jsx)(r.CompositeItem,{tag:"span",render:k,className:z,style:J,state:as,refs:au,props:av,stateAttributesMapping:l}):aw,(0,b.jsx)("input",{...ar,suppressHydrationWarning:!0})]})});var C=a.i(305687),D=a.i(348250);let E=c.forwardRef(function(a,b){let{render:d,className:e,style:f,keepMounted:g=!1,...h}=a,i=function(){let a=c.useContext(A);if(void 0===a)throw Error((0,z.default)(52));return a}(),j=i.checked,{mounted:k,transitionStatus:m,setMounted:n}=(0,D.useTransitionStatus)(j),p={...i,transitionStatus:m},q=c.useRef(null),r=(0,o.useRenderElement)("span",a,{ref:[b,q],state:p,props:h,stateAttributesMapping:l});return((0,C.useOpenChangeComplete)({batch:!0,enabled:!j,open:j,ref:q,onComplete(){j||n(!1)}}),g||k)?r:null});a.s(["Indicator",0,E,"Root",0,B],642851);var F=a.i(642851),F=F,G=a.i(950381),H=a.i(854401),I=a.i(30116),J=a.i(669649),K=a.i(801548),L=a.i(958589),M=a.i(717326),N=a.i(971154),O=a.i(541302),P=a.i(964072);let Q=[J.SHIFT],R=c.forwardRef(function(a,d){let{render:e,className:f,disabled:g,readOnly:h,required:i,onValueChange:j,value:l,defaultValue:m,form:o,name:p,inputRef:q,id:r,style:t,...v}=a,{setTouched:w,setFocused:y,validationMode:z,name:A,disabled:B,state:C,validation:D,setDirty:E,setFilled:F,validityData:J}=(0,s.useFieldRootContext)(),{labelId:R}=(0,u.useLabelableContext)(),{clearErrors:S,elementRef:T}=(0,O.useFormContext)(),U=(0,N.useFieldsetRootContext)(!0),V=B||g,W=A??p,X=(0,n.useBaseUiId)(r),[Y,Z]=(0,G.useControlled)({controlled:l,default:m,name:"RadioGroup",state:"value"}),[$,_]=c.useState(!1),aa=(0,H.useStableCallback)((a,b)=>{j?.(a,b),b.isCanceled||Z(a)}),ab=D.getInputControl,ac=c.useMemo(()=>({get current(){return ab()}}),[ab]),ad=c.useRef(null),ae=c.useRef(null);function af(a){let b;return q&&("function"==typeof q?b=q(a):q.current=a),ad.current=a,b}let ag=(0,H.useStableCallback)(a=>{if(!a||a.disabled)return;ae.current||(ae.current=a);let b=ad.current,c=a.checked||null==b||b.disabled?af(a):void 0;return()=>{ae.current===a&&(ae.current=null),ad.current===a?c?(c(),ad.current=null):af(null):c?.()}}),ah=(0,H.useStableCallback)(()=>{let a=T.current;if(!a)return Y??null;for(let b of D.registeredInputs.keys())if(b.checked&&(0,M.isEligibleInput)(b,a))return Y??null;return null});(0,L.useRegisterFieldControl)(ac,X,Y??null,ah,!V,p),(0,P.useValueChanged)(Y,()=>{S(W),E(Y!==J.initialValue),F(null!=Y),D.change(Y);let a=ae.current;null==Y&&a&&!a.disabled&&af(a)});let ai=R??U?.legendId,aj={...C,disabled:V??!1,required:i??!1,readOnly:h??!1},ak=c.useMemo(()=>({checkedValue:Y,disabled:V,form:o,validation:D,name:W,readOnly:h,registerInputRef:ag,required:i,setCheckedValue:aa,setTouched:_,touched:$}),[Y,V,o,D,W,h,ag,i,aa,_,$]);return(0,b.jsx)(x.Provider,{value:ak,children:(0,b.jsx)(K.CompositeRoot,{render:e,className:f,style:t,state:aj,props:[{id:r,role:"radiogroup","aria-required":i||void 0,"aria-disabled":V||void 0,"aria-readonly":h||void 0,"aria-labelledby":ai,onFocus(){y(!0)},onBlur(a){(0,I.contains)(a.currentTarget,a.relatedTarget)||(w(!0),y(!1),"onBlur"===z&&D.commit(Y))},onKeyDownCapture(a){a.key.startsWith("Arrow")&&(_(!0),y(!0))}},v,a=>D.getValidationProps(V??!1,a)],refs:[d],stateAttributesMapping:k.fieldValidityMapping,enableHomeAndEndKeys:!1,modifierKeys:Q})})});var S=a.i(497895);a.s(["RadioGroup",0,function({className:a,...c}){return(0,b.jsx)(R,{"data-slot":"radio-group",className:(0,S.cn)("grid w-full gap-2",a),...c})},"RadioGroupItem",0,function({className:a,...c}){return(0,b.jsx)(F.Root,{"data-slot":"radio-group-item",className:(0,S.cn)("group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none group-has-[:focus-visible]/field-label:ring-0 group-has-[:focus-visible]/field-label:not-data-checked:border-input after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground group-has-[:focus-visible]/field-label:data-checked:border-primary dark:data-checked:bg-primary",a),...c,children:(0,b.jsx)(F.Indicator,{"data-slot":"radio-group-indicator",className:"flex size-4 items-center justify-center",children:(0,b.jsx)("span",{className:"absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground"})})})}],897020)},102306,a=>a.a(async(b,c)=>{try{var d=a.i(187924),e=a.i(141146),f=a.i(866491),g=a.i(951675),h=a.i(572131),i=a.i(767561),j=a.i(340695),k=a.i(446181),l=a.i(545097),m=a.i(950463),n=a.i(287702),o=a.i(8468),p=a.i(619477),q=a.i(199169),r=a.i(313237),s=a.i(862966),t=a.i(497895),u=a.i(351287),v=a.i(103837),w=a.i(27418),x=a.i(346075),y=b([o]);[o]=y.then?(await y)():y;let F={running:"working",waiting:"waiting on you",done:"done",cancelled:"stopped"},G={running:"text-muted-foreground",waiting:t.WAITING_INK,done:"text-muted-foreground",cancelled:"text-muted-foreground"},H="h-[min(34rem,58vh)] min-h-64 px-1";function z(){let{items:a,isLoading:b,isLoadingMore:c,error:e,hasMore:f,sentinelRef:l,refresh:m}=(0,s.useServerPages)({key:(a,b)=>{if(0===a)return i.queryKey.callHistory(null);let c=b?.at(-1);return c?i.queryKey.callHistory((0,q.toDate)(c.startedAt).toISOString()):null},size:n.CALL_HISTORY_PAGE,swr:{revalidateOnFocus:!1}}),o=(0,h.useMemo)(()=>[...a].reverse(),[a]),[u,w]=(0,r.useServerAction)(v.deleteEndedCallsAction,{okMessage:a=>1===a?"1 call deleted":`${a} calls deleted`,onOk:m}),x=async()=>{await k.notify.confirm({title:"Delete every call?",description:"Every turn of every call goes — and she stops reading any of it back into the next call. A call still on the line stays.",okText:"Delete all",destructive:!0})&&u()},y=(0,h.useRef)(null),z=(0,h.useRef)(!1),C=(0,h.useRef)(0);return((0,h.useLayoutEffect)(()=>{let a=y.current;a&&0!==o.length&&(z.current?a.scrollTop=a.scrollHeight-C.current:(z.current=!0,a.scrollTop=a.scrollHeight),C.current=a.scrollHeight-a.scrollTop)},[o]),b)?(0,d.jsx)("div",{className:(0,t.cn)(H,"overflow-hidden"),children:(0,d.jsx)(A,{})}):e?(0,d.jsx)(p.SettingError,{message:e.message}):(0,d.jsx)(d.Fragment,{children:0===o.length?(0,d.jsx)("p",{className:"px-1 text-sm leading-relaxed text-muted-foreground",children:"No calls yet. Everything said on the line is kept here — hers and yours, in the order it was said."}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{ref:y,onScroll:a=>{let b=a.currentTarget;C.current=b.scrollHeight-b.scrollTop},className:(0,t.cn)(H,"overflow-y-auto overscroll-contain pb-6"),children:[(0,d.jsx)(p.SettingMore,{hasMore:f,loading:c,sentinelRef:l,count:1,ghost:(0,d.jsx)(A,{})}),o.map((a,b)=>(0,d.jsx)(B,{call:a,first:0===b,onDropped:m},a.id))]}),(0,d.jsx)("div",{className:"flex justify-end",children:(0,d.jsxs)(j.Button,{variant:"ghost",loading:w,onClick:x,className:"text-muted-foreground hover:text-destructive",children:[(0,d.jsx)(g.Trash2,{}),"Delete all"]})})]})})}function A(){return(0,d.jsxs)("div",{className:"pb-3",children:[(0,d.jsxs)("div",{className:"flex h-7 items-center gap-2.5",children:[(0,d.jsx)(m.Skeleton,{className:"h-3 w-24"}),(0,d.jsx)(m.Skeleton,{className:"h-3 w-10"})]}),(0,d.jsx)("div",{className:"mt-2 mb-[18px] h-px bg-border/60"}),(0,d.jsx)("div",{className:"flex justify-end",children:(0,d.jsx)(m.Skeleton,{className:"h-9 w-3/5 rounded-2xl rounded-br-sm"})}),(0,d.jsxs)("div",{className:"mt-3 flex items-start gap-2",children:[(0,d.jsx)(m.Skeleton,{className:"mt-0.5 size-[18px] shrink-0 rounded-full"}),(0,d.jsx)(m.Skeleton,{className:"mt-1 h-3.5 w-2/3"})]})]})}let I=a=>"user"===a.role?"user":"her";function B({call:a,first:b,onDropped:c}){let[e,f]=(0,r.useServerAction)(u.deleteCallAction,{okMessage:"Call deleted",onOk:c}),h=(0,q.toDate)(a.startedAt),i=a.turns.at(-1),l=a.endedAt&&i?function(a,b){let c=Math.max(0,Math.round((b.getTime()-a.getTime())/1e3));if(c<60)return`${c}s`;let d=Math.floor(c/60);return d<60?`${d}m ${String(c%60).padStart(2,"0")}s`:`${Math.floor(d/60)}h ${String(d%60).padStart(2,"0")}m`}(h,(0,q.toDate)(i.at)):"on the line",m=async()=>{await k.notify.confirm({title:`Delete the call from ${(0,q.whenOf)(h)}?`,description:"Every turn of it goes — and she stops reading it back into the next call.",okText:"Delete",destructive:!0})&&e(a.id)};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:(0,t.cn)("group flex items-center gap-2.5",b?"mt-1":"mt-11"),children:[(0,d.jsx)("span",{title:[a.provider,a.model,a.backendModel,null===a.seconds?null:`${a.seconds}s active`,a.endedReason].filter(Boolean).join(" · "),className:"font-mono text-[10px] tracking-[0.14em] uppercase",children:(0,q.whenOf)(h)}),(0,d.jsx)("span",{className:"font-mono text-[10px] text-muted-foreground",children:l}),(0,d.jsx)("span",{className:"ml-auto flex size-7 shrink-0 items-center justify-center",children:a.endedAt&&(0,d.jsx)(j.Button,{size:"icon-sm",variant:"ghost",loading:f,"aria-label":"Delete this call",onClick:m,className:"text-muted-foreground/60 opacity-0 transition-opacity group-hover:opacity-100 hover:text-destructive focus-visible:opacity-100",children:(0,d.jsx)(g.Trash2,{})})})]}),(0,d.jsx)("div",{className:"mt-2 mb-[18px] h-px bg-border/60"}),(function(a){let b=[];for(let c of a){let a=b.at(-1);if(a&&"tool"===c.role&&"tool"===a.turn.role&&a.turn.tool===c.tool&&a.turn.text===c.text){a.repeats+=1;continue}b.push({turn:c,repeats:1})}return b})(a.turns).map(({turn:b,repeats:c},e,f)=>{var g,h;let i,j=f[e-1]?.turn,k=f[e+1]?.turn;return(0,d.jsx)(C,{turn:b,job:(g=a,h=b,(i=(0,w.delegatedLabel)(h.tool,h.text))?g.jobs.find(a=>a.label===i):void 0),repeats:c,opensRun:!j||I(j)!==I(b),closesRun:!k||I(k)!==I(b)},b.id)})]})}function C({turn:a,job:b,opensRun:c,closesRun:e,repeats:f=1}){return"tool"===a.role?(0,d.jsx)(E,{turn:a,job:b,repeats:f,opensRun:c}):"user"===a.role?(0,d.jsx)("div",{className:(0,t.cn)("flex justify-end",c?"mt-3":"mt-1"),children:(0,d.jsx)("p",{className:(0,t.cn)("max-w-[min(34rem,78%)] rounded-2xl bg-muted px-3.5 py-2 text-[13.5px] leading-relaxed break-keep whitespace-pre-wrap",e&&"rounded-br-sm"),children:a.text})}):(0,d.jsxs)("div",{className:(0,t.cn)("flex items-start gap-2",c?"mt-3":"mt-1"),children:[(0,d.jsx)(D,{face:c,className:"mt-0.5"}),(0,d.jsx)("p",{className:"max-w-[min(34rem,78%)] text-[13.5px] leading-relaxed break-keep whitespace-pre-wrap",children:a.text})]})}function D({face:a,className:b}){return(0,d.jsx)("span",{className:(0,t.cn)("grid size-[18px] shrink-0 place-items-center",b),children:a&&(0,d.jsx)(x.ThursdayMark,{size:18})})}function E({turn:a,job:b,repeats:c,opensRun:e}){let f=a.tool??"",g=(0,o.toolIcon)(f),h=(0,w.toolLine)(f,a.text);return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:(0,t.cn)("flex items-center gap-2",e?"mt-3":"mt-1.5"),children:[(0,d.jsx)(D,{face:e}),(0,d.jsxs)("span",{className:"flex min-w-0 items-center gap-1.5 text-muted-foreground",children:[(0,d.jsx)(g,{className:"size-3 shrink-0"}),h&&(0,d.jsx)("span",{className:"truncate text-[11px] break-keep",children:h}),(0,d.jsx)("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/60",children:f}),c>1&&(0,d.jsxs)("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:["×",c]})]})]}),b&&(0,d.jsxs)("p",{className:"mt-0.5 ml-[26px] flex min-w-0 items-baseline gap-1.5 text-[11px]",children:["running"===b.status?(0,d.jsx)(l.ShinyText,{text:F.running,className:"shrink-0 font-mono text-[10px]"}):(0,d.jsx)("span",{className:(0,t.cn)("shrink-0 font-mono text-[10px]",G[b.status]),children:F[b.status]}),b.outcome&&"running"!==b.status&&(0,d.jsx)("span",{className:"truncate text-muted-foreground",children:(0,t.plainText)(b.outcome)})]})]})}a.s(["CallHistoryRow",0,function(){return(0,d.jsxs)("button",{type:"button",onClick:()=>k.notify.component({className:"sm:max-w-3xl",renderer:()=>(0,d.jsx)(p.SettingDialogContent,{title:"Call history",description:"Everything said on the line, oldest at the top. Scroll up for older calls.",children:(0,d.jsx)(z,{})})}),className:"flex w-full min-w-0 items-center gap-3 p-4 text-left outline-none transition-colors hover:bg-muted/50 focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-inset",children:[(0,d.jsx)("span",{className:"grid size-10 shrink-0 place-items-center rounded-lg bg-muted text-muted-foreground",children:(0,d.jsx)(f.Phone,{className:"size-4"})}),(0,d.jsxs)("span",{className:"min-w-0 flex-1 space-y-0.5",children:[(0,d.jsx)("span",{className:"block text-sm font-medium",children:"Call history"}),(0,d.jsx)("span",{className:"block text-xs text-muted-foreground",children:"Every call, word for word — hers and yours"})]}),(0,d.jsx)(e.ChevronRight,{className:"size-4 shrink-0 text-muted-foreground"})]})}]),c()}catch(a){c(a)}},!1),922056,a=>a.a(async(b,c)=>{try{var d=a.i(187924),e=a.i(752562),f=a.i(26268),g=a.i(572131),h=a.i(767561),i=a.i(340695),j=a.i(825715),k=a.i(205522),l=a.i(446181),m=a.i(897020),n=a.i(777794),o=a.i(280281),p=a.i(546893),q=a.i(287702),r=a.i(96340),s=a.i(626280),t=a.i(324835),u=a.i(249049),v=a.i(760374),w=a.i(619477),x=a.i(102306),y=a.i(445432),z=a.i(346075),A=a.i(203282),B=a.i(334392),C=a.i(759399),D=a.i(969730),E=a.i(486832),F=a.i(461512),G=a.i(359006),H=a.i(888396),I=a.i(332033),J=a.i(616682),K=a.i(249890),L=a.i(313237),M=a.i(759497),N=a.i(497895),O=b([x]);function P({columns:a,children:b}){return(0,d.jsx)("div",{className:"@container",children:(0,d.jsx)("div",{className:(0,N.cn)("grid divide-y divide-border/60 overflow-hidden rounded-xl border border-border/60",3===a?"@3xl:grid-cols-3 @3xl:divide-x @3xl:divide-y-0":"@xl:grid-cols-2 @xl:divide-x @xl:divide-y-0"),children:b})})}function Q({label:a,children:b}){return(0,d.jsxs)("div",{className:"flex min-h-5 items-center gap-3",children:[(0,d.jsx)("span",{className:"min-w-0 flex-1 truncate text-sm font-medium",children:a}),b]})}function R({value:a,face:b,hasKey:c,onChange:e}){return(0,d.jsx)(w.SettingGroup,{label:"Models",note:"Both run on your OpenAI key. Instructions are saved when you leave the field.",children:(0,d.jsxs)("div",{className:"@container divide-y divide-border/60 rounded-xl border border-border/60",children:[!c&&(0,d.jsx)(U,{}),(0,d.jsxs)(S,{name:"Voice",fact:"billed by the minute",children:[(0,d.jsx)("div",{className:"grid gap-4 @xl:grid-cols-2",children:(0,d.jsx)(T,{label:"model",children:(0,d.jsx)(j.Combobox,{value:K.LIVE_MODEL,onChange:()=>void 0,options:[{value:K.LIVE_MODEL,label:"GPT-Live 1"}],"aria-label":"Voice model",disabled:!0})})}),(0,d.jsx)(T,{label:"voice",children:(0,d.jsx)(A.VoicePicker,{voice:a.voice,face:b,onChange:a=>e({voice:a.trim()||r.LIVE_DEFAULTS.voice})})}),(0,d.jsx)(T,{label:"instructions",children:(0,d.jsx)(Z,{value:a.voicePrompt,onCommit:a=>e({voicePrompt:a}),placeholder:"How to address you, how much to say, what to skip.","aria-label":"Voice instructions"})})]}),(0,d.jsxs)(S,{name:"Backend",fact:"billed per token",children:[(0,d.jsx)(T,{label:"model",children:(0,d.jsx)(V,{value:a.backendModel,onChange:a=>e({backendModel:a})})}),(0,d.jsx)(T,{label:"reasoning",children:(0,d.jsx)(n.Segmented,{"aria-label":"Reasoning effort",className:"w-full flex-wrap *:flex-1",options:ah,value:a.reasoningEffort??"auto",onChange:a=>e({reasoningEffort:"auto"===a?null:a})})}),(0,d.jsx)(T,{label:"tools",children:(0,d.jsx)(W,{webSearch:a.webSearch,onWebSearch:a=>e({webSearch:a})})}),(0,d.jsx)(T,{label:"instructions",children:(0,d.jsx)(Z,{value:a.backendPrompt,onCommit:a=>e({backendPrompt:a}),placeholder:"How work should be handed over, what to check first.","aria-label":"Backend instructions"})})]})]})})}function S({name:a,fact:b,children:c}){return(0,d.jsxs)("div",{className:"grid gap-4 p-5 @2xl:grid-cols-[8.5rem_minmax(0,1fr)] @2xl:gap-6",children:[(0,d.jsxs)("span",{className:"space-y-0.5",children:[(0,d.jsx)("span",{className:"block text-sm font-medium",children:a}),(0,d.jsx)("span",{className:"block font-mono text-[11px] text-muted-foreground",children:b})]}),(0,d.jsx)("div",{className:"min-w-0 space-y-4",children:c})]})}function T({label:a,children:b}){return(0,d.jsxs)("div",{className:"min-w-0 space-y-2",children:[(0,d.jsx)("span",{className:"block font-mono text-[11px] text-muted-foreground",children:a}),b]})}function U(){let[a,b]=(0,g.useState)(""),[c,e]=(0,L.useServerAction)(v.setConfigAction,{onOk:()=>{(0,M.revalidate)(h.queryKey.llmModel),(0,M.revalidate)(h.queryKey.config),b("")}}),f=a.trim().length>=u.KEY_MIN;return(0,d.jsxs)("div",{className:"space-y-3 p-5",children:[(0,d.jsxs)("span",{className:"block space-y-0.5",children:[(0,d.jsx)("span",{className:(0,N.cn)("block text-sm font-medium",N.WAITING_INK),children:"No OpenAI key"}),(0,d.jsx)("span",{className:"block text-xs text-muted-foreground",children:"Her voice and the backend both run on it"})]}),(0,d.jsx)(u.KeyInput,{dense:!0,provider:r.LIVE_PROVIDER,saved:!1,value:a,ready:f,saving:e,onValue:b,onSubmit:()=>f&&c(r.LIVE_PROVIDER.apiKeyName,a)})]})}function V({value:a,onChange:b}){let c=r.LIVE_BACKEND_MODELS.some(b=>b.id===a),f=(0,H.useDraft)(c?"":a,a=>b(a||r.LIVE_DEFAULTS.backendModel),{min:0});return(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)("div",{role:"radiogroup","aria-label":"Backend model",className:"grid grid-cols-2 gap-2 @3xl:grid-cols-4",children:r.LIVE_BACKEND_MODELS.map(c=>{let f=c.id===a;return(0,d.jsxs)("button",{type:"button",role:"radio","aria-checked":f,onClick:()=>b(c.id),className:(0,N.cn)("min-w-0 space-y-0.5 rounded-lg border px-3 py-2.5 text-left outline-none transition-colors focus-visible:ring-3 focus-visible:ring-ring/50",f?"border-foreground bg-muted/40":"border-border/60 hover:bg-muted/50"),children:[(0,d.jsxs)("span",{className:"flex items-center gap-2",children:[(0,d.jsx)("span",{className:"min-w-0 flex-1 truncate text-sm font-medium",children:c.label}),f&&(0,d.jsx)(e.Check,{className:"size-3.5 shrink-0"})]}),(0,d.jsxs)("span",{className:"block truncate font-mono text-[11px] text-muted-foreground",children:[c.id," · ",c.tier]})]},c.id)})}),(0,d.jsx)(k.Input,{value:f.value,onChange:a=>f.set(a.target.value),onBlur:f.commit,onKeyDown:f.onKeyDown,placeholder:"Other model id","aria-label":"Other backend model id",spellCheck:!1,className:"font-mono text-sm"})]})}[x]=O.then?(await O)():O;let ah=[{value:"auto",label:"auto",title:"The model's own default"},...r.LIVE_REASONING.map(a=>({value:a,label:a,title:`Reasoning effort ${a}`}))];function W({webSearch:a,onWebSearch:b}){let{data:c}=(0,M.useServerRoute)(h.queryKey.callSkills),[e]=(0,L.useServerAction)(E.setCallSkillsAction,{onOk:()=>(0,M.revalidate)(h.queryKey.callSkills)});return(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsxs)("div",{className:"flex flex-wrap gap-x-7 gap-y-3",children:[(0,d.jsx)(X,{label:"Search the web",checked:a,onChange:b}),(0,d.jsx)(X,{label:"Read skills herself",checked:c??!1,disabled:void 0===c,onChange:a=>e(a)})]}),a&&(0,d.jsx)(w.SettingNote,{children:"Each search adds to the backend's OpenAI usage."}),c&&(0,d.jsx)(Y,{})]})}function X({label:a,checked:b,disabled:c,onChange:e}){return(0,d.jsxs)("label",{className:"flex items-center gap-2.5 text-sm",children:[(0,d.jsx)(o.Switch,{checked:b,disabled:c,onCheckedChange:e}),a]})}function Y(){let{data:a}=(0,M.useServerRoute)(h.queryKey.skills);return a?(0,d.jsx)(w.SettingNote,{className:(0,N.cn)(!a.length&&N.WAITING_INK),children:a.length?`The same ${a.length} a bot reads. Each one she opens spends a page of the call on it.`:"Nothing installed yet — there is nothing for her to read."}):null}function Z({value:a,onCommit:b,placeholder:c,"aria-label":e}){let f=(0,H.useDraft)(a,b,{min:0});return(0,d.jsx)(p.Textarea,{value:f.value,maxLength:J.COMMON_VALIDATE.prompt.max,onChange:a=>f.set(a.target.value),onBlur:f.commit,placeholder:c,"aria-label":e})}function $(){let[a,b]=(0,L.useServerAction)(D.resetHistoryAction,{okMessage:({calls:a,threads:b,notes:c})=>`Wiped ${a} calls, ${b} jobs, ${c} notes`,onOk:()=>{(0,M.revalidate)(h.queryKey.memory),(0,M.revalidate)(h.queryKey.threads),(0,M.revalidate)(h.queryKey.callHistory(null))}}),c=async()=>{await l.notify.confirm({title:"Reset history?",description:"Every call, every job and everything she remembers is deleted for good. Keys, bots and connectors stay.",okText:"Reset",destructive:!0})&&a()};return(0,d.jsxs)("div",{className:"flex min-w-0 items-center gap-3 p-4",children:[(0,d.jsx)("span",{className:"grid size-10 shrink-0 place-items-center rounded-lg bg-muted text-muted-foreground",children:(0,d.jsx)(f.TriangleAlert,{className:"size-4"})}),(0,d.jsxs)("span",{className:"min-w-0 flex-1 space-y-0.5",children:[(0,d.jsx)("span",{className:"block truncate text-sm font-medium",children:"Reset history"}),(0,d.jsx)("span",{className:"block truncate text-xs text-muted-foreground",children:"Calls, jobs and memory. Keys and bots stay."})]}),(0,d.jsx)(i.Button,{variant:"outline",size:"sm",loading:b,onClick:c,className:"shrink-0 text-destructive hover:text-destructive",children:"Reset"})]})}function _({value:a,onChange:b}){let c=c=>b({...a,...c});return(0,d.jsx)(w.SettingGroup,{label:"Face",children:(0,d.jsxs)("div",{className:"space-y-5 py-2",children:[(0,d.jsxs)("div",{className:"flex flex-col items-center gap-4 pt-2",children:[(0,d.jsx)(y.Face,{look:a,size:176,className:"w-44"}),(0,d.jsx)(n.Segmented,{"aria-label":"Face",options:B.FACE_KINDS.map(a=>({value:a,label:y.FACES[a].label})),value:a.kind,onChange:a=>c({kind:a})}),(0,d.jsx)("p",{className:"max-w-sm text-center text-xs text-muted-foreground",children:y.FACES[a.kind].hint})]}),"mark"===a.kind&&(0,d.jsx)(s.MarkPalette,{color:a.paint?void 0:a.color,themePicked:!a.paint&&!a.color,onTheme:()=>c({color:void 0,paint:void 0}),onPick:a=>c({color:a,paint:void 0}),paint:a.paint,onPaint:b=>c({paint:a.paint===b?void 0:b})}),"mark"===a.kind&&(0,d.jsx)(aa,{label:"Shape",children:(0,d.jsx)(n.Segmented,{"aria-label":"Shape",options:t.MARK_SHAPES.map(a=>({value:a,label:(0,d.jsx)("span",{className:"capitalize",children:a})})),value:a.shape??"blob",onChange:a=>c({shape:a})})}),"mark"===a.kind&&(0,d.jsx)(aa,{label:"Style",children:(0,d.jsx)(n.Segmented,{"aria-label":"Style",options:[{value:"solid",label:"Solid"},{value:"outline",label:"Outline"}],value:a.outline?"outline":"solid",onChange:a=>c({outline:"outline"===a||void 0})})}),"ascii"===a.kind&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(aa,{label:"Glyphs",children:(0,d.jsx)(n.Segmented,{"aria-label":"Glyphs",options:B.ASCII_CHARSETS.map(a=>({value:a,label:ai[a]})),value:a.charset,onChange:a=>c({charset:a})})}),(0,d.jsx)(aa,{label:"Size",children:(0,d.jsx)(ab,{min:q.ASCII_FACE.fontSize.min,max:q.ASCII_FACE.fontSize.max,step:1,value:a.fontSize,format:a=>`${a}px`,onChange:a=>c({fontSize:a})})}),(0,d.jsx)(aa,{label:"Density",children:(0,d.jsx)(ab,{min:q.ASCII_FACE.density.min,max:q.ASCII_FACE.density.max,step:.1,value:a.density,format:a=>`${a.toFixed(1)}x`,onChange:a=>c({density:a})})})]})]})})}let ai={ascii:"Characters",emoji:"Sprinkled",emojiOnly:"All emoji"};function aa({label:a,children:b}){return(0,d.jsxs)("div",{className:"flex items-center gap-3",children:[(0,d.jsx)("span",{className:"w-16 shrink-0 font-mono text-[11px] text-muted-foreground",children:a}),b]})}function ab({value:a,onChange:b,format:c,...e}){return(0,d.jsxs)("span",{className:"flex min-w-0 flex-1 items-center gap-3",children:[(0,d.jsx)("input",{type:"range",...e,value:a,onChange:a=>b(Number(a.target.value)),className:"min-w-0 flex-1 accent-foreground"}),(0,d.jsx)("span",{className:"w-10 shrink-0 text-right font-mono text-[11px] text-muted-foreground tabular-nums",children:c(a)})]})}let aj={center:{label:"Her last line",hint:"One caption under the mark — only what she said."},sides:{label:"Last three turns",hint:"Hers on the left, yours on the right, beside the mark."}};function ac({value:a,onChange:b}){return(0,d.jsx)(w.SettingGroup,{label:"Captions",children:(0,d.jsx)("div",{className:"@container",children:(0,d.jsx)("div",{role:"radiogroup","aria-label":"Captions",className:"grid gap-3 @xl:grid-cols-2",children:F.CAPTION_VIEWS.map(c=>{let f=c===a;return(0,d.jsxs)("button",{type:"button",role:"radio","aria-checked":f,onClick:()=>b(c),className:(0,N.cn)("min-w-0 space-y-3 rounded-xl border p-3 text-left outline-none transition-colors focus-visible:ring-3 focus-visible:ring-ring/50",f?"border-foreground":"border-border/60 hover:bg-muted/50"),children:[(0,d.jsx)(ad,{view:c}),(0,d.jsxs)("span",{className:"flex items-center gap-3 px-1 pb-0.5",children:[(0,d.jsxs)("span",{className:"min-w-0 flex-1 space-y-0.5",children:[(0,d.jsx)("span",{className:"block truncate text-sm font-medium",children:aj[c].label}),(0,d.jsx)("span",{className:"block truncate text-xs text-muted-foreground",children:aj[c].hint})]}),f&&(0,d.jsx)(e.Check,{className:"size-4 shrink-0"})]})]},c)})})})})}function ad({view:a}){let b="block h-1 max-w-full rounded-full bg-foreground/20";return(0,d.jsx)("span",{className:"flex h-24 items-center justify-center rounded-lg bg-muted",children:"center"===a?(0,d.jsxs)("span",{className:"flex flex-col items-center gap-2.5",children:[(0,d.jsx)(z.ThursdayMark,{size:32}),(0,d.jsx)("span",{className:(0,N.cn)(b,"w-28")})]}):(0,d.jsxs)("span",{className:"grid w-full grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center gap-4 px-6",children:[(0,d.jsxs)("span",{className:"space-y-1.5",children:[(0,d.jsx)("span",{className:(0,N.cn)(b,"w-24")}),(0,d.jsx)("span",{className:(0,N.cn)(b,"w-16")})]}),(0,d.jsx)(z.ThursdayMark,{size:32}),(0,d.jsx)("span",{children:(0,d.jsx)("span",{className:(0,N.cn)(b,"ml-auto w-20")})})]})})}function ae({value:a,onChange:b}){return(0,d.jsxs)("div",{className:"min-w-0 space-y-3 p-4",children:[(0,d.jsx)(Q,{label:"She calls you"}),(0,d.jsx)(m.RadioGroup,{"aria-label":"She calls you",value:a,onValueChange:a=>b(F.CallBackSchema.parse(a)),className:"gap-2.5",children:F.CALL_BACK_MODES.map(a=>(0,d.jsxs)("label",{className:"flex min-w-0 items-center gap-2.5 text-sm",children:[(0,d.jsx)(m.RadioGroupItem,{value:a}),(0,d.jsx)("span",{className:"truncate",children:F.CALL_BACK_LABEL[a]})]},a))}),(0,d.jsx)(w.SettingNote,{children:ak[a]}),"off"!==a&&(0,d.jsx)(w.SettingNote,{children:"Needs this tab open. A tab that has been silent since it loaded may not be allowed to make a sound — the desktop notification covers that."})]})}let ak={off:"Nothing opens a call but you.",waiting:"A job that stopped to ask gets her to ring you.",any:"Anything a bot finishes, she opens a line to tell you."};function af({value:a,onChange:b}){let c=(0,H.useDraft)(a.phrase,c=>b({...a,phrase:c}),{min:F.WAKE_PHRASE.min}),e=c.value.trim().split(/\s+/).length<2;return(0,d.jsxs)("div",{className:"min-w-0 space-y-3 p-4",children:[(0,d.jsx)(Q,{label:"Wake phrase",children:(0,d.jsx)(o.Switch,{"aria-label":"Answer to her name",checked:a.enabled,onCheckedChange:c=>b({...a,enabled:c})})}),(0,d.jsx)(k.Input,{value:c.value,maxLength:F.WAKE_PHRASE.max,spellCheck:!1,disabled:!a.enabled,onChange:a=>c.set(a.target.value),onBlur:c.commit,onKeyDown:c.onKeyDown,"aria-label":"Wake phrase",className:"font-mono text-sm"}),(0,d.jsx)(w.SettingNote,{children:a.enabled?e?"One word will wake her by accident — say hello first.":"Heard loosely, in English. Near misses count.":"Between calls, the browser listens for it and picks up."})]})}function ag({value:a,onChange:b}){let[c,e]=(0,g.useState)(!1),[f,h]=(0,g.useState)(!1),i=(0,I.useHotkeyLabel)((0,I.isCombo)(a.combo)?a.combo:null);return(0,d.jsxs)("div",{className:"min-w-0 space-y-3 p-4",children:[(0,d.jsx)(Q,{label:"Shortcut",children:(0,d.jsx)(o.Switch,{"aria-label":"Answer to a key",checked:a.enabled,onCheckedChange:c=>b({...a,enabled:c})})}),(0,d.jsx)("button",{type:"button",...I.HOTKEY_CAPTURE,disabled:!a.enabled,onClick:()=>{h(!1),e(!0)},onBlur:()=>e(!1),onKeyDown:c?c=>{if("Tab"===c.key)return;if(c.preventDefault(),c.stopPropagation(),"Escape"===c.key)return e(!1);let d=(0,I.comboOf)(c.nativeEvent);if(!d)return h(!0);h(!1),e(!1),b({...a,combo:d})}:void 0,className:(0,N.cn)("flex h-8 w-full items-center justify-center rounded-lg border px-3 font-mono text-sm outline-none transition-colors focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50",c?"border-foreground/40 text-muted-foreground":"border-border/60 hover:bg-muted/50"),children:c?"Press the keys…":i??"Set a shortcut"}),(0,d.jsx)(w.SettingNote,{children:f?"Hold Ctrl, Alt or Cmd — a plain key is typing.":c?"Esc to keep the one you have.":a.enabled?"Only while this tab has focus. Not while you are typing.":"Starts a call, and ends the one that is running."})]})}a.s(["ThursdaySetting",0,function(){let a=(0,G.useThursdayStore)(),b=(0,G.useThursdayStore)(a=>a.patch),{data:c=[],isLoading:e,error:f}=(0,M.useServerRoute)(h.queryKey.llmModel),g=(0,C.useThursdayFace)();if(e)return(0,d.jsx)(w.SettingSkeleton,{rows:4});if(f)return(0,d.jsx)(w.SettingError,{message:f.message});let i=c.some(a=>a.apiKeyName===r.LIVE_PROVIDER.apiKeyName&&a.hasKey);return(0,d.jsxs)(w.SettingScreen,{footer:(0,d.jsx)(w.SettingRailNote,{children:"Both of her prompts are assembled fresh on every call — memory, the roster and your skills go in. Changes here apply from the next call."}),children:[(0,d.jsx)(_,{value:g,onChange:C.setThursdayFace}),(0,d.jsx)(ac,{value:a.captionView,onChange:a=>b({captionView:a})}),(0,d.jsx)(R,{value:a,face:g,hasKey:i,onChange:b}),(0,d.jsx)(w.SettingGroup,{label:"Starting a call",children:(0,d.jsxs)(P,{columns:3,children:[(0,d.jsx)(af,{value:a.wake,onChange:a=>b({wake:a})}),(0,d.jsx)(ag,{value:a.hotkey,onChange:a=>b({hotkey:a})}),(0,d.jsx)(ae,{value:a.callBack,onChange:a=>b({callBack:a})})]})}),(0,d.jsx)(w.SettingGroup,{label:"History",children:(0,d.jsxs)(P,{columns:2,children:[(0,d.jsx)(x.CallHistoryRow,{}),(0,d.jsx)($,{})]})})]})}]),c()}catch(a){c(a)}},!1),203282,a=>{"use strict";var b=a.i(187924),c=a.i(752562),d=a.i(589027),e=a.i(474215),f=a.i(572131),g=a.i(340695),h=a.i(205522),i=a.i(545097),j=a.i(864037),k=a.i(96340),l=a.i(445432),m=a.i(483253),n=a.i(497895);let o=Array(m.SPECTRUM_BANDS).fill(0);a.s(["VoicePicker",0,function({voice:a,face:p,onChange:q}){let[r,s]=(0,f.useState)(!1),[t,u]=(0,f.useState)(a),[v,w]=(0,f.useState)(!1),[x,y]=(0,f.useState)(""),z=(0,f.useRef)(null),A=(0,f.useRef)(null),B=(0,f.useRef)(0),C=(0,f.useRef)(!1),D=(0,f.useCallback)(()=>A.current&&C.current?A.current.clip.read():o,[]),E=a=>{C.current=a,w(a)};(0,f.useEffect)(()=>{if(r)return()=>{let a=A.current;A.current=null,a&&(a.element.pause(),a.clip.close())}},[r]);let F=(a,b)=>{a===B.current&&(B.current++,E(!1),j.toast.add({type:"error",title:"Voice sample did not play",description:(0,n.errorToString)(b)}))},G=()=>{B.current++;let a=z.current;a&&(a.pause(),a.currentTime=0),E(!1)};return r?(0,b.jsxs)("div",{className:"@container space-y-2",children:[(0,b.jsx)("audio",{ref:z,onEnded:()=>E(!1),onError:a=>{C.current&&F(B.current,a.currentTarget.error?.message||"The clip could not be read.")},children:(0,b.jsx)("track",{kind:"captions"})}),(0,b.jsxs)("div",{className:"rounded-xl border border-border/60 p-3",children:[(0,b.jsxs)("div",{className:"mb-2 flex items-center gap-2",children:[(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted-foreground",children:"click a name to hear it"}),(0,b.jsx)(g.Button,{variant:"ghost",size:"icon-xs",className:"ml-auto","aria-label":"Close",onClick:()=>{G(),s(!1),y(""),u(a)},children:(0,b.jsx)(e.X,{})})]}),(0,b.jsxs)("div",{className:"grid gap-4 @md:grid-cols-[11rem_minmax(0,1fr)]",children:[(0,b.jsxs)("div",{className:"flex flex-col items-center gap-2",children:[(0,b.jsx)(l.Face,{look:p,status:v?"speaking":"idle",getSpectrum:D,size:176,className:"w-44"}),(0,b.jsx)("span",{className:"text-sm font-medium",children:v?(0,b.jsx)(i.ShinyText,{text:t}):t}),(0,b.jsx)("span",{className:"h-4 font-mono text-[11px] text-muted-foreground",children:k.LIVE_VOICE_NOTE[t]})]}),(0,b.jsx)("div",{className:"max-h-56 min-w-0 overflow-y-auto",children:k.LIVE_VOICES.map(d=>(0,b.jsxs)("button",{type:"button",onClick:()=>(a=>{let b=z.current;if(!b)return;if(v&&a===t)return void G();u(a),y(""),A.current?.element!==b&&(A.current?.clip.close(),A.current={element:b,clip:(0,m.createClipTap)(b)}),A.current.clip.resume();let c=++B.current;b.src=(0,k.voiceSamplePath)(a),E(!0),b.play().catch(a=>{a instanceof DOMException&&"AbortError"===a.name||F(c,a)})})(d),className:(0,n.cn)("flex w-full items-center gap-2 rounded-md px-1.5 py-1.5 text-sm outline-none hover:bg-accent focus-visible:bg-accent",d===t&&"bg-accent text-accent-foreground"),children:[(0,b.jsx)("span",{className:"flex-1 text-left",children:v&&d===t?(0,b.jsx)(i.ShinyText,{text:d}):d}),(0,b.jsx)("span",{className:"shrink truncate font-mono text-[11px] text-muted-foreground",children:k.LIVE_VOICE_NOTE[d]}),(0,b.jsx)(c.Check,{className:(0,n.cn)("size-3.5 shrink-0",d===a?"opacity-100":"opacity-0")})]},d))})]})]}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)(h.Input,{value:x,onChange:a=>y(a.target.value),placeholder:"another voice id","aria-label":"Another voice id",spellCheck:!1,className:"font-mono text-sm"}),(0,b.jsx)(g.Button,{className:"shrink-0",onClick:()=>{let b=x.trim()||t;G(),s(!1),y(""),u(b),b!==a&&q(b)},children:"Save"})]})]}):(0,b.jsxs)("button",{type:"button",onClick:()=>s(!0),"aria-label":"Voice",className:(0,n.cn)(h.inputClassName,"flex items-center gap-2 text-left font-mono text-sm hover:border-ring"),children:[(0,b.jsx)("span",{className:"shrink-0",children:a}),(0,b.jsx)("span",{className:"min-w-0 truncate text-[11px] text-muted-foreground",children:k.LIVE_VOICE_NOTE[a]}),(0,b.jsx)(d.ChevronDown,{className:"ml-auto size-3.5 shrink-0 text-muted-foreground"})]})}])},969730,a=>{"use strict";var b=a.i(405050);let c=(0,b.createServerReference)("7f1531e9bfa2fb6a3893c63ba15bfa30d5265bac61",b.callServer,void 0,b.findSourceMapURL,"resetHistoryAction");a.s(["resetHistoryAction",0,c])},486832,a=>{"use strict";var b=a.i(405050);let c=(0,b.createServerReference)("7f2235ee325843a055425949538d38ef0c6b44c62c",b.callServer,void 0,b.findSourceMapURL,"setCallSkillsAction");a.s(["setCallSkillsAction",0,c])},351287,a=>{"use strict";var b=a.i(405050);let c=(0,b.createServerReference)("7f16c32567d23cea9e7ab3cdd3b239ca935ab9596d",b.callServer,void 0,b.findSourceMapURL,"deleteCallAction");a.s(["deleteCallAction",0,c])},103837,a=>{"use strict";var b=a.i(405050);let c=(0,b.createServerReference)("7f7a8dec2724ded35f3720cca3da5ae468b639a9f6",b.callServer,void 0,b.findSourceMapURL,"deleteEndedCallsAction");a.s(["deleteEndedCallsAction",0,c])},866491,a=>{"use strict";var b=a.i(164831);let c={name:"phone",size:24,node:[["path",{d:"M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384",key:"9njp5v"}]]};c.node;let d=(0,b.default)(c);a.s(["Phone",0,d],866491)}];
2
-
3
- //# sourceMappingURL=_03_928f._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[703228,a=>a.a(async(b,c)=>{try{var d=a.i(187924),e=a.i(263359),f=a.i(689594),g=a.i(707963),h=a.i(141146),i=a.i(998697),j=a.i(483138),k=a.i(69095),l=a.i(696732),m=a.i(567826),n=a.i(403512),o=a.i(233540),p=a.i(917256),q=a.i(951675),r=a.i(201661),s=a.i(572131),t=a.i(767561),u=a.i(340695),v=a.i(316474),w=a.i(205522),x=a.i(846991),y=a.i(446181),z=a.i(950463),A=a.i(280281),B=a.i(621958),C=a.i(546893),D=a.i(287702),E=a.i(619477),F=a.i(968990),G=a.i(897112),H=a.i(62995),I=a.i(752728),J=a.i(313237),K=a.i(759497),L=a.i(497895),M=b([x]);[x]=M.then?(await M)():M;let W={browser:l.Globe,computer:e.AppWindow,"find-skills":o.Search,"interactive-page":m.MousePointer2,"skill-creator":p.SquarePen};function N({skill:a}){let[b,c]=(0,J.useServerAction)(G.deleteSkillAction,{onOk:()=>(0,K.revalidate)(t.queryKey.skills)}),[e]=(0,J.useServerAction)(H.setSkillDisabledAction,{onOk:()=>(0,K.revalidate)(t.queryKey.skills)}),g=async()=>{await y.notify.confirm({title:`Delete ${a.name}?`,description:"Every file in this skill is deleted for good.",okText:"Delete",destructive:!0})&&b(a.dir)},i="default"===a.source&&W[a.dir]||f.BookMarked;return(0,d.jsxs)("div",{className:"group flex items-center transition-colors hover:bg-muted/50",children:[(0,d.jsxs)("button",{type:"button",onClick:()=>{var b;return b=a,y.notify.component({className:"sm:max-w-4xl",renderer:()=>(0,d.jsx)(O,{skill:b})})},className:"flex min-w-0 flex-1 items-center gap-3 py-4 pl-4 text-left outline-none focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-inset",children:[(0,d.jsx)("span",{className:(0,L.cn)("grid size-10 shrink-0 place-items-center rounded-lg bg-muted text-muted-foreground",a.disabled&&"opacity-45"),children:(0,d.jsx)(i,{className:"size-4"})}),(0,d.jsxs)("span",{className:(0,L.cn)("min-w-0 flex-1 space-y-0.5",a.disabled&&"opacity-45"),children:[(0,d.jsx)("span",{className:"block truncate text-sm font-medium",children:a.name}),(0,d.jsx)("span",{className:"line-clamp-2 text-xs leading-relaxed text-muted-foreground",children:a.description})]}),(0,d.jsx)(h.ChevronRight,{className:"size-4 shrink-0 text-muted-foreground/60 group-hover:text-foreground"})]}),(0,d.jsxs)("div",{className:"mr-4 ml-5 flex w-18 shrink-0 items-center justify-end gap-3",children:[(0,d.jsx)(A.Switch,{checked:!a.disabled,onCheckedChange:b=>e(a.source,a.dir,!b),"aria-label":`${a.name} on or off`,className:"shrink-0"}),"custom"===a.source?(0,d.jsx)(u.Button,{size:"icon-sm",variant:"ghost",loading:c,onClick:g,className:"shrink-0 text-muted-foreground",children:(0,d.jsx)(q.Trash2,{})}):(0,d.jsx)("span",{className:"size-7 shrink-0"})]})]})}function O({skill:a}){let[b,c]=(0,s.useState)(""),[e,f]=(0,s.useState)("SKILL.md");return(0,d.jsx)(E.SettingDialogContent,{title:a.name,description:(0,d.jsx)(P,{skill:a,path:e??b}),children:(0,d.jsxs)("div",{className:"flex h-[36rem] divide-x divide-border/60 overflow-hidden rounded-xl border border-border/60 bg-background",children:[(0,d.jsxs)("div",{className:"flex w-44 shrink-0 flex-col overflow-y-auto bg-muted/20 py-1",children:[b&&(0,d.jsxs)("button",{type:"button",onClick:()=>c(b.split("/").slice(0,-1).join("/")),className:"mx-1 mb-1 flex items-center gap-1 rounded-md px-2 py-1 text-left font-mono text-[11px] text-muted-foreground outline-none hover:bg-muted/50 hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-inset",children:[(0,d.jsx)(g.ChevronLeft,{className:"size-3 shrink-0"}),(0,d.jsx)("span",{className:"truncate",children:b.split("/").pop()})]}),(0,d.jsx)(R,{source:a.source,dir:a.dir,path:b,current:e,onPick:a=>{let d=b?`${b}/${a.name}`:a.name;"dir"===a.kind?c(d):f(d)}})]}),(0,d.jsx)("div",{className:"min-w-0 flex-1 overflow-y-auto",children:e?(0,d.jsx)(T,{source:a.source,dir:a.dir,path:e}):(0,d.jsx)("p",{className:"p-6 text-sm text-muted-foreground/60",children:"Pick a file"})})]})})}function P({skill:a,path:b}){if(!a)return(0,d.jsx)("span",{className:"truncate font-mono text-[11px] text-muted-foreground/60",children:"Pick a skill"});let c=[a.name,...b.split("/").filter(Boolean)];return(0,d.jsx)("span",{className:"flex min-w-0 items-center gap-1 font-mono text-[11px] text-muted-foreground",children:c.map((a,b)=>(0,d.jsxs)("span",{className:"flex min-w-0 items-center gap-1",children:[b>0&&(0,d.jsx)(h.ChevronRight,{className:"size-3 shrink-0 opacity-50"}),(0,d.jsx)("span",{className:(0,L.cn)("truncate",b===c.length-1&&"text-foreground"),children:a})]},`${b}-${a}`))})}function Q({icon:a,label:b,active:c,hasChildren:e,onClick:f}){return(0,d.jsxs)("button",{type:"button",onClick:f,className:(0,L.cn)("mx-1 flex items-center gap-1.5 rounded-md px-2 py-1 text-left text-xs outline-none focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-inset",c?"bg-secondary text-foreground":"text-muted-foreground hover:bg-muted/50 hover:text-foreground"),children:[(0,d.jsx)("span",{className:"shrink-0 text-muted-foreground/70 [&>svg]:size-3",children:a}),(0,d.jsx)("span",{className:"min-w-0 flex-1 truncate",children:b}),e&&(0,d.jsx)(h.ChevronRight,{className:"size-3 shrink-0 text-muted-foreground/50"})]})}function R({source:a,dir:b,path:c,current:e,onPick:f}){let{data:g,isLoading:h,error:l}=(0,K.useServerRoute)(t.queryKey.skillNode(a,b,c));return l?(0,d.jsx)("p",{className:"p-3 font-mono text-xs text-destructive",children:l.message}):h||!g?(0,d.jsxs)("div",{className:"space-y-2 p-2",children:[(0,d.jsx)(z.Skeleton,{className:"h-5 w-full"}),(0,d.jsx)(z.Skeleton,{className:"h-5 w-4/5"})]}):"dir"!==g.kind?null:(0,d.jsxs)(d.Fragment,{children:[g.entries.map(a=>(0,d.jsx)(Q,{icon:"dir"===a.kind?(0,d.jsx)(k.Folder,{}):a.name.endsWith(".md")?(0,d.jsx)(j.FileText,{}):(0,d.jsx)(i.File,{}),label:a.name,hasChildren:"dir"===a.kind,active:(c?`${c}/${a.name}`:a.name)===e,onClick:()=>f(a)},a.name)),0===g.entries.length&&(0,d.jsx)("p",{className:"p-3 text-xs text-muted-foreground/60",children:"Empty folder"})]})}function S({content:a}){let b=/^---\r?\n([\s\S]*?)\r?\n---[ \t]*\r?\n?/.exec(a),c=b?.[1].trim(),e=b?a.slice(b[0].length):a;return(0,d.jsxs)("div",{className:"min-w-0",children:[c&&(0,d.jsx)("pre",{className:"border-b border-border/60 bg-muted/20 px-5 py-3 font-mono text-[11px] leading-relaxed whitespace-pre-wrap text-muted-foreground",children:c}),(0,d.jsx)("div",{className:"px-5 py-4 text-sm leading-relaxed",children:(0,d.jsx)(x.Markdown,{children:e})})]})}function T({source:a,dir:b,path:c}){let{data:e,isLoading:f,error:g}=(0,K.useServerRoute)(t.queryKey.skillNode(a,b,c));if(g)return(0,d.jsx)("p",{className:"p-4 font-mono text-xs text-destructive",children:g.message});if(f||!e)return(0,d.jsxs)("div",{className:"space-y-3 p-5",children:[(0,d.jsx)(z.Skeleton,{className:"h-5 w-2/3"}),(0,d.jsx)(z.Skeleton,{className:"h-4 w-full"}),(0,d.jsx)(z.Skeleton,{className:"h-4 w-5/6"})]});if("file"!==e.kind)return null;let h=c.split("/").pop()??"";return(0,d.jsxs)("div",{children:[(0,d.jsxs)("div",{className:"sticky top-0 z-20 flex items-center justify-between gap-2 border-b border-border/60 bg-background/90 px-5 py-2 font-mono text-[11px] text-muted-foreground backdrop-blur",children:[(0,d.jsx)("span",{className:"truncate",children:h}),(0,d.jsx)("span",{className:"shrink-0",children:(0,L.formatBytes)(e.size)})]}),null===e.content?(0,d.jsx)("p",{className:"px-5 py-4 text-sm text-muted-foreground/60",children:"Not a text file — the agent can still read it from disk."}):h.toLowerCase().endsWith(".md")?(0,d.jsx)(S,{content:e.content}):(0,d.jsx)("pre",{className:"overflow-x-auto px-5 py-4 font-mono text-[13px] leading-relaxed whitespace-pre text-foreground/90",children:e.content})]})}function U(){return y.notify.component({className:"sm:max-w-lg",renderer:({close:a})=>(0,d.jsx)(V,{onDone:a})})}function V({onDone:a}){let[b,c]=(0,s.useState)("write"),[e,f]=(0,s.useState)(""),[g,h]=(0,s.useState)(""),[i,j]=(0,s.useState)(""),[k,l]=(0,s.useState)(null),[m,o]=(0,s.useState)(!1),p=(0,s.useRef)(null),q={errorMessage:!1,onOk:()=>{(0,K.revalidate)(t.queryKey.skills),a()}},[x,y,,z]=(0,J.useServerAction)(F.createSkillAction,q),[A,G,,H]=(0,J.useServerAction)(I.uploadSkillAction,q),M=y||G,N="write"===b?z:H,O=!M&&("write"===b?e.trim()&&g.trim()&&i.trim():null!==k),P=async()=>{var a;!O||("write"===b?x({name:e.trim(),description:g.trim(),content:i}):k&&A({fileName:k.name,base64:await (a=k,new Promise((b,c)=>{let d=new FileReader;d.onload=()=>{let a=d.result;b(a.slice(a.indexOf(",")+1))},d.onerror=()=>c(d.error),d.readAsDataURL(a)}))}))},Q=a=>{let b=a?.[0]??null;b&&l(b)};return(0,d.jsxs)(E.SettingDialogContent,{title:"New skill",description:"Instructions the agent loads by name when a task calls for them.",footer:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(u.Button,{variant:"ghost",onClick:a,children:"Cancel"}),(0,d.jsxs)(u.Button,{disabled:!O,loading:M,onClick:P,children:[!M&&("write"===b?(0,d.jsx)(n.Plus,{}):(0,d.jsx)(r.Upload,{})),"write"===b?"Create":"Upload"]})]}),children:[(0,d.jsxs)(B.Tabs,{value:b,onValueChange:a=>c(a),children:[(0,d.jsxs)(B.TabsList,{className:"w-full",children:[(0,d.jsx)(B.TabsTrigger,{value:"write",children:"Write"}),(0,d.jsx)(B.TabsTrigger,{value:"upload",children:"Upload"})]}),(0,d.jsxs)(B.TabsContent,{value:"write",className:"space-y-5 pt-4",children:[(0,d.jsxs)(v.Field,{children:[(0,d.jsx)(v.FieldLabel,{htmlFor:"skill-name",children:"Name"}),(0,d.jsxs)(v.FieldContent,{children:[(0,d.jsx)(w.Input,{id:"skill-name",value:e,onChange:a=>f(a.target.value),placeholder:"deploy-checklist",spellCheck:!1,autoFocus:!0}),(0,d.jsxs)("p",{className:"font-mono text-[11px] text-muted-foreground",children:[D.PATHS.skills.custom,"/",e.trim()||"…","/SKILL.md"]})]})]}),(0,d.jsxs)(v.Field,{children:[(0,d.jsx)(v.FieldLabel,{htmlFor:"skill-description",children:"Description"}),(0,d.jsx)(v.FieldContent,{children:(0,d.jsx)(w.Input,{id:"skill-description",value:g,onChange:a=>h(a.target.value),placeholder:"When to use it — this is how the agent decides to load it"})})]}),(0,d.jsxs)(v.Field,{children:[(0,d.jsx)(v.FieldLabel,{htmlFor:"skill-content",children:"Content"}),(0,d.jsx)(C.Textarea,{id:"skill-content",value:i,onChange:a=>j(a.target.value),placeholder:"Markdown. The steps, the rules, the examples.",className:"min-h-40 resize-none font-mono text-xs"})]})]}),(0,d.jsxs)(B.TabsContent,{value:"upload",className:"space-y-4 pt-4",children:[(0,d.jsxs)("button",{type:"button",onClick:()=>p.current?.click(),onDragOver:a=>{a.preventDefault(),o(!0)},onDragLeave:()=>o(!1),onDrop:a=>{a.preventDefault(),o(!1),Q(a.dataTransfer.files)},className:(0,L.cn)("flex w-full flex-col items-center gap-2 rounded-xl border border-dashed px-6 py-10 text-center outline-none transition-colors focus-visible:ring-3 focus-visible:ring-ring/50",m?"border-foreground/60 bg-muted/60":"border-border hover:bg-muted/40"),children:[(0,d.jsx)(r.Upload,{className:"size-5 text-muted-foreground"}),k?(0,d.jsxs)("span",{className:"text-sm",children:[k.name,(0,d.jsx)("span",{className:"ml-2 font-mono text-[11px] text-muted-foreground",children:(0,L.formatBytes)(k.size)})]}):(0,d.jsx)("span",{className:"text-sm text-muted-foreground",children:"Drop a file here, or click to choose"})]}),(0,d.jsx)("input",{ref:p,type:"file",accept:".md,.zip,.skill",className:"hidden",onChange:a=>Q(a.target.files)}),(0,d.jsxs)("div",{className:"space-y-1 text-xs text-muted-foreground",children:[(0,d.jsx)("p",{className:"font-medium text-foreground/80",children:"File requirements"}),(0,d.jsxs)("p",{children:["A ",(0,d.jsx)("span",{className:"font-mono",children:".md"})," file needs a YAML block with the skill's name and description."]}),(0,d.jsxs)("p",{children:["A ",(0,d.jsx)("span",{className:"font-mono",children:".zip"})," or"," ",(0,d.jsx)("span",{className:"font-mono",children:".skill"})," archive needs a SKILL.md inside — the rest of its folder comes along."]})]})]})]}),N&&(0,d.jsx)("p",{className:"font-mono text-xs text-destructive",children:N})]})}a.s(["SkillsSetting",0,function(){let[a,b]=(0,s.useState)(""),{data:c,isLoading:e,error:f}=(0,K.useServerRoute)(t.queryKey.skills),g=c??[];if(e)return(0,d.jsx)(E.SettingSkeleton,{rows:4});if(f)return(0,d.jsx)(E.SettingError,{message:f.message});let h=a.trim().toLowerCase(),i=g.filter(a=>!h||`${a.name} ${a.description}`.toLowerCase().includes(h)),j=g.filter(a=>!a.disabled).length;return(0,d.jsxs)(E.SettingScreen,{footer:(0,d.jsxs)(E.SettingRailNote,{children:[g.filter(a=>"default"===a.source).length," shipped · ",g.filter(a=>"custom"===a.source).length," ","installed"]}),children:[(0,d.jsx)(E.SettingToolbar,{count:`${j} on \xb7 ${g.length-j} off`,children:(0,d.jsx)(E.SettingFilter,{value:a,onChange:b,placeholder:"Filter skills"})}),(0,d.jsx)(E.SettingGroup,{label:"Custom",hint:"yours — added here · wins a name clash",children:(0,d.jsx)(E.SettingItems,{addRow:{label:"Add skill",onClick:U},children:i.filter(a=>"custom"===a.source).map(a=>(0,d.jsx)(N,{skill:a},`custom/${a.dir}`))})}),(0,d.jsx)(E.SettingGroup,{label:"Default",hint:"ships with the app · switch off, can't edit or delete",children:(0,d.jsx)(E.SettingItems,{children:i.filter(a=>"default"===a.source).map(a=>(0,d.jsx)(N,{skill:a},`default/${a.dir}`))})}),j>D.PROMPT_CROWDED.skills&&(0,d.jsxs)(E.SettingNote,{children:[j," skills are on. Each is a line in every prompt a bot reads, and one more to look past when it picks."]})]})},"openSkillCreate",0,U]),c()}catch(a){c(a)}},!1),968990,a=>{"use strict";var b=a.i(405050);let c=(0,b.createServerReference)("7f98b9d85dd58ad1d3e9b53a3a1799b27bffc75e94",b.callServer,void 0,b.findSourceMapURL,"createSkillAction");a.s(["createSkillAction",0,c])},897112,a=>{"use strict";var b=a.i(405050);let c=(0,b.createServerReference)("7ffe58353e8a289deea66dd070a79a480a2ef64a81",b.callServer,void 0,b.findSourceMapURL,"deleteSkillAction");a.s(["deleteSkillAction",0,c])},62995,a=>{"use strict";var b=a.i(405050);let c=(0,b.createServerReference)("7f52bfec15b438c9480ce2a68692632c2afb3f006a",b.callServer,void 0,b.findSourceMapURL,"setSkillDisabledAction");a.s(["setSkillDisabledAction",0,c])},752728,a=>{"use strict";var b=a.i(405050);let c=(0,b.createServerReference)("7fd39b524aaead025e24a9b83ba354398abecf491b",b.callServer,void 0,b.findSourceMapURL,"uploadSkillAction");a.s(["uploadSkillAction",0,c])},263359,a=>{"use strict";var b=a.i(164831);let c={name:"app-window",size:24,node:[["rect",{x:"2",y:"4",width:"20",height:"16",rx:"2",key:"izxlao"}],["path",{d:"M10 4v4",key:"pp8u80"}],["path",{d:"M2 8h20",key:"d11cs7"}],["path",{d:"M6 4v4",key:"1svtjw"}]]};c.node;let d=(0,b.default)(c);a.s(["AppWindow",0,d],263359)},696732,a=>{"use strict";var b=a.i(164831);let c={name:"globe",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]};c.node;let d=(0,b.default)(c);a.s(["Globe",0,d],696732)},567826,a=>{"use strict";var b=a.i(164831);let c={name:"mouse-pointer-2",size:24,node:[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]]};c.node;let d=(0,b.default)(c);a.s(["MousePointer2",0,d],567826)},917256,a=>{"use strict";var b=a.i(164831);let c={name:"square-pen",size:24,node:[["path",{d:"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1m0v6g"}],["path",{d:"M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z",key:"ohrbg2"}]],aliases:["pen-box","edit","pen-square"]};c.node;let d=(0,b.default)(c);a.s(["SquarePen",0,d],917256)},201661,a=>{"use strict";var b=a.i(164831);let c={name:"upload",size:24,node:[["path",{d:"M12 3v12",key:"1x0j5s"}],["path",{d:"m17 8-5-5-5 5",key:"7q97r8"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}]]};c.node;let d=(0,b.default)(c);a.s(["Upload",0,d],201661)}];
2
-
3
- //# sourceMappingURL=_0g_rlog._.js.map