askvireo 0.0.0-stage → 0.1.2

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 (186) hide show
  1. package/dist/access.js +33 -0
  2. package/dist/access.js.map +1 -0
  3. package/dist/acp.js +257 -0
  4. package/dist/acp.js.map +1 -0
  5. package/dist/actions.js +141 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/address.js +32 -0
  8. package/dist/address.js.map +1 -0
  9. package/dist/aftercare.js +51 -0
  10. package/dist/aftercare.js.map +1 -0
  11. package/dist/agents.js +164 -0
  12. package/dist/agents.js.map +1 -0
  13. package/dist/app.js +67 -0
  14. package/dist/app.js.map +1 -0
  15. package/dist/audit.js +40 -0
  16. package/dist/audit.js.map +1 -0
  17. package/dist/browser.js +559 -0
  18. package/dist/browser.js.map +1 -0
  19. package/dist/bus.js +27 -0
  20. package/dist/bus.js.map +1 -0
  21. package/dist/cards/blocks.js +80 -0
  22. package/dist/cards/blocks.js.map +1 -0
  23. package/dist/cards/diff.js +48 -0
  24. package/dist/cards/diff.js.map +1 -0
  25. package/dist/cards/kinds.js +139 -0
  26. package/dist/cards/kinds.js.map +1 -0
  27. package/dist/cards/store.js +177 -0
  28. package/dist/cards/store.js.map +1 -0
  29. package/dist/cli.js +245 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/config.js +33 -0
  32. package/dist/config.js.map +1 -0
  33. package/dist/connect.js +97 -0
  34. package/dist/connect.js.map +1 -0
  35. package/dist/db.js +288 -0
  36. package/dist/db.js.map +1 -0
  37. package/dist/extract.js +75 -0
  38. package/dist/extract.js.map +1 -0
  39. package/dist/fake-llm-server.js +118 -0
  40. package/dist/fake-llm-server.js.map +1 -0
  41. package/dist/fake-model.js +517 -0
  42. package/dist/fake-model.js.map +1 -0
  43. package/dist/files.js +70 -0
  44. package/dist/files.js.map +1 -0
  45. package/dist/hook.js +146 -0
  46. package/dist/hook.js.map +1 -0
  47. package/dist/http/browser.js +91 -0
  48. package/dist/http/browser.js.map +1 -0
  49. package/dist/http/events.js +54 -0
  50. package/dist/http/events.js.map +1 -0
  51. package/dist/http/index.js +91 -0
  52. package/dist/http/index.js.map +1 -0
  53. package/dist/http/memory.js +40 -0
  54. package/dist/http/memory.js.map +1 -0
  55. package/dist/http/settings.js +69 -0
  56. package/dist/http/settings.js.map +1 -0
  57. package/dist/http/test.js +38 -0
  58. package/dist/http/test.js.map +1 -0
  59. package/dist/http/threads.js +109 -0
  60. package/dist/http/threads.js.map +1 -0
  61. package/dist/http/views.js +43 -0
  62. package/dist/http/views.js.map +1 -0
  63. package/dist/http/work.js +27 -0
  64. package/dist/http/work.js.map +1 -0
  65. package/dist/identity.js +26 -0
  66. package/dist/identity.js.map +1 -0
  67. package/dist/index.js +23 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/integrations/index.js +44 -0
  70. package/dist/integrations/index.js.map +1 -0
  71. package/dist/integrations/local.js +144 -0
  72. package/dist/integrations/local.js.map +1 -0
  73. package/dist/integrations/types.js +2 -0
  74. package/dist/integrations/types.js.map +1 -0
  75. package/dist/lifecycle.js +74 -0
  76. package/dist/lifecycle.js.map +1 -0
  77. package/dist/link.js +33 -0
  78. package/dist/link.js.map +1 -0
  79. package/dist/memory-sync.js +93 -0
  80. package/dist/memory-sync.js.map +1 -0
  81. package/dist/memory-worker.js +146 -0
  82. package/dist/memory-worker.js.map +1 -0
  83. package/dist/memory.js +217 -0
  84. package/dist/memory.js.map +1 -0
  85. package/dist/messages.js +13 -0
  86. package/dist/messages.js.map +1 -0
  87. package/dist/models.js +275 -0
  88. package/dist/models.js.map +1 -0
  89. package/dist/net.js +28 -0
  90. package/dist/net.js.map +1 -0
  91. package/dist/peers.js +82 -0
  92. package/dist/peers.js.map +1 -0
  93. package/dist/plugins/agents/index.js +357 -0
  94. package/dist/plugins/agents/index.js.map +1 -0
  95. package/dist/plugins/chat.js +258 -0
  96. package/dist/plugins/chat.js.map +1 -0
  97. package/dist/plugins/endpoint/index.js +436 -0
  98. package/dist/plugins/endpoint/index.js.map +1 -0
  99. package/dist/plugins/feishu/index.js +256 -0
  100. package/dist/plugins/feishu/index.js.map +1 -0
  101. package/dist/plugins/google/api.js +347 -0
  102. package/dist/plugins/google/api.js.map +1 -0
  103. package/dist/plugins/google/index.js +138 -0
  104. package/dist/plugins/google/index.js.map +1 -0
  105. package/dist/plugins/index.js +518 -0
  106. package/dist/plugins/index.js.map +1 -0
  107. package/dist/plugins/mcp/index.js +218 -0
  108. package/dist/plugins/mcp/index.js.map +1 -0
  109. package/dist/plugins/nodes/index.js +232 -0
  110. package/dist/plugins/nodes/index.js.map +1 -0
  111. package/dist/plugins/search/index.js +122 -0
  112. package/dist/plugins/search/index.js.map +1 -0
  113. package/dist/plugins/tailscale/api.js +52 -0
  114. package/dist/plugins/tailscale/api.js.map +1 -0
  115. package/dist/plugins/tailscale/daemon.js +203 -0
  116. package/dist/plugins/tailscale/daemon.js.map +1 -0
  117. package/dist/plugins/tailscale/index.js +504 -0
  118. package/dist/plugins/tailscale/index.js.map +1 -0
  119. package/dist/plugins/telegram/index.js +174 -0
  120. package/dist/plugins/telegram/index.js.map +1 -0
  121. package/dist/plugins/types.js +2 -0
  122. package/dist/plugins/types.js.map +1 -0
  123. package/dist/pricing.js +113 -0
  124. package/dist/pricing.js.map +1 -0
  125. package/dist/procedures.js +57 -0
  126. package/dist/procedures.js.map +1 -0
  127. package/dist/prompt.js +106 -0
  128. package/dist/prompt.js.map +1 -0
  129. package/dist/push.js +48 -0
  130. package/dist/push.js.map +1 -0
  131. package/dist/relay-client.js +176 -0
  132. package/dist/relay-client.js.map +1 -0
  133. package/dist/reminders.js +40 -0
  134. package/dist/reminders.js.map +1 -0
  135. package/dist/runner.js +350 -0
  136. package/dist/runner.js.map +1 -0
  137. package/dist/scheduler.js +182 -0
  138. package/dist/scheduler.js.map +1 -0
  139. package/dist/server.js +105 -0
  140. package/dist/server.js.map +1 -0
  141. package/dist/service.js +196 -0
  142. package/dist/service.js.map +1 -0
  143. package/dist/settings.js +28 -0
  144. package/dist/settings.js.map +1 -0
  145. package/dist/threads.js +197 -0
  146. package/dist/threads.js.map +1 -0
  147. package/dist/time.js +85 -0
  148. package/dist/time.js.map +1 -0
  149. package/dist/tool-gate.js +70 -0
  150. package/dist/tool-gate.js.map +1 -0
  151. package/dist/tools/approval.js +22 -0
  152. package/dist/tools/approval.js.map +1 -0
  153. package/dist/tools/browser.js +291 -0
  154. package/dist/tools/browser.js.map +1 -0
  155. package/dist/tools/calendar.js +153 -0
  156. package/dist/tools/calendar.js.map +1 -0
  157. package/dist/tools/cards.js +176 -0
  158. package/dist/tools/cards.js.map +1 -0
  159. package/dist/tools/email.js +76 -0
  160. package/dist/tools/email.js.map +1 -0
  161. package/dist/tools/files.js +57 -0
  162. package/dist/tools/files.js.map +1 -0
  163. package/dist/tools/index.js +16 -0
  164. package/dist/tools/index.js.map +1 -0
  165. package/dist/tools/memory.js +90 -0
  166. package/dist/tools/memory.js.map +1 -0
  167. package/dist/tools/research.js +163 -0
  168. package/dist/tools/research.js.map +1 -0
  169. package/dist/tools/setup.js +96 -0
  170. package/dist/tools/setup.js.map +1 -0
  171. package/dist/tools/threads.js +132 -0
  172. package/dist/tools/threads.js.map +1 -0
  173. package/dist/tools/types.js +16 -0
  174. package/dist/tools/types.js.map +1 -0
  175. package/dist/usage.js +75 -0
  176. package/dist/usage.js.map +1 -0
  177. package/dist/util.js +71 -0
  178. package/dist/util.js.map +1 -0
  179. package/dist/vault.js +81 -0
  180. package/dist/vault.js.map +1 -0
  181. package/dist/version.js +4 -0
  182. package/dist/version.js.map +1 -0
  183. package/dist/watch.js +104 -0
  184. package/dist/watch.js.map +1 -0
  185. package/package.json +45 -4
  186. package/README.md +0 -3
@@ -0,0 +1,517 @@
1
+ import { newId, now } from "./util.js";
2
+ function text(m) {
3
+ if (m.role === "user")
4
+ return typeof m.content === "string" ? m.content : m.content.map((c) => (c.type === "text" ? c.text : "")).join("");
5
+ if (m.role === "assistant")
6
+ return m.content.map((c) => (c.type === "text" ? c.text : "")).join("");
7
+ return m.content.map((c) => (c.type === "text" ? c.text : "")).join("");
8
+ }
9
+ function reply(content) {
10
+ const blocks = typeof content === "string" ? [{ type: "text", text: content }] : Array.isArray(content) ? content : [content];
11
+ return { role: "assistant", content: blocks, model: "fake", timestamp: now() };
12
+ }
13
+ function call(name, args) {
14
+ return reply({ type: "toolCall", id: newId("call"), name, arguments: args });
15
+ }
16
+ const isCjk = (s) => /[\u3400-\u9fff]/.test(s);
17
+ /** Everything the scripted model was shown (test mode only), so tests can assert what never reaches a model. */
18
+ export const seenContexts = [];
19
+ export function fakeResponse(context) {
20
+ if (process.env.VIREO_TEST_MODE) {
21
+ seenContexts.push(JSON.stringify({ system: context.systemPrompt, messages: context.messages }));
22
+ if (seenContexts.length > 5000)
23
+ seenContexts.splice(0, 1000);
24
+ }
25
+ const system = context.systemPrompt ?? "";
26
+ const task = system.match(/^Task: (\w+)/)?.[1];
27
+ if (task)
28
+ return reply(routine(task, system, text(context.messages.at(-1))));
29
+ return agentTurn(context);
30
+ }
31
+ // ---------------------------------------------------------------- routine work
32
+ function routine(task, system, prompt) {
33
+ switch (task) {
34
+ case "thread_title": {
35
+ const cleaned = prompt
36
+ .split("\n")[0]
37
+ .replace(/^(please|can you|could you|hey vireo,?|vireo,?|帮我|请)\s*/i, "")
38
+ .replace(/[.?!。?!]+$/, "");
39
+ if (isCjk(cleaned))
40
+ return cleaned.slice(0, 16);
41
+ const words = cleaned.split(/\s+/).slice(0, 7).join(" ");
42
+ return words.charAt(0).toUpperCase() + words.slice(1);
43
+ }
44
+ case "thread_summary": {
45
+ const first = prompt.match(/Owner: (.+)/)?.[1] ?? "the matter";
46
+ return `Handled: ${first.slice(0, 80)}`;
47
+ }
48
+ case "memory_extract":
49
+ return JSON.stringify({ facts: extractFacts(prompt) });
50
+ case "procedure_proposal":
51
+ return JSON.stringify({
52
+ procedure: /Booking confirmed/i.test(prompt)
53
+ ? { name: "Book a restaurant table", description: "When the owner asks to book a table online", steps: "1. Sign in with stored credentials.\n2. Fill name, guests and date.\n3. Ask the owner to confirm before submitting." }
54
+ : null,
55
+ });
56
+ case "email_triage":
57
+ return JSON.stringify({ needs_reply: !/newsletter|unsubscribe|receipt|no-?reply|digest/i.test(prompt), reason: "scripted" });
58
+ default:
59
+ return "OK";
60
+ }
61
+ }
62
+ function extractFacts(prompt) {
63
+ const section = prompt.split("New messages from the owner (extract from these):")[1] ?? prompt.split("Conversation:")[1] ?? "";
64
+ const facts = [];
65
+ const add = (key, statement, entity = "owner", kind = "owner") => facts.push({ entity, entity_kind: kind, key, statement, valid_until: null, procedural: false });
66
+ for (const raw of section.split("\n")) {
67
+ const line = raw.replace(/^Owner:\s*/, "").trim();
68
+ let m;
69
+ if ((m = line.match(/\bI (?:always )?prefer (?:an? |the )?(.+?)(?:\s+(when|on|for)\s+(.+?))?[.!]?$/i))) {
70
+ const what = m[1].trim();
71
+ const topic = /seat/i.test(what) ? "seat" : /airline|air|flight/i.test(`${what} ${m[3] ?? ""}`) ? "airline" : (what.split(/\s+/).pop() ?? "general").toLowerCase();
72
+ add(`preference.${topic}`, `Owner prefers ${what}${m[3] ? ` ${m[2]} ${m[3]}` : ""}`);
73
+ }
74
+ if ((m = line.match(/\bmy (?:home )?address is (.+?)[.!]?$/i)) || (m = line.match(/\bI (?:have )?moved to (.+?)[.!]?$/i))) {
75
+ add("home_address", `Owner's home address is ${m[1].trim()}`);
76
+ }
77
+ if ((m = line.match(/我(?:更|比较)?喜欢(.+?)[。!]?$/)))
78
+ add(`preference.${/座|位/.test(m[1]) ? "seat" : "general"}`, `主人喜欢${m[1]}`);
79
+ if ((m = line.match(/我(?:的)?(?:家)?地址(?:是|改成了|换成了)(.+?)[。!]?$/)) || (m = line.match(/我搬到了(.+?)[。!]?$/))) {
80
+ add("home_address", `主人的住址是${m[1].trim()}`);
81
+ }
82
+ if ((m = line.match(/\b([A-Z][a-z]+) is my (sister|brother|wife|husband|partner|manager|boss|friend|colleague|mother|father)\b/))) {
83
+ add("relationship_to_owner", `${m[1]} is the owner's ${m[2]}`, m[1], "person");
84
+ }
85
+ if ((m = line.match(/\b([A-Z][a-z]+)'s (?:email|e-mail) is (\S+@\S+?)[.!]?$/i))) {
86
+ add("email", `${m[1]}'s email is ${m[2]}`, m[1], "person");
87
+ }
88
+ }
89
+ return facts;
90
+ }
91
+ function buildTurn(context) {
92
+ const msgs = context.messages;
93
+ let idx = -1;
94
+ for (let i = msgs.length - 1; i >= 0; i--) {
95
+ if (msgs[i].role === "user") {
96
+ idx = i;
97
+ break;
98
+ }
99
+ }
100
+ const trail = msgs.slice(idx + 1);
101
+ const calls = new Map();
102
+ for (const m of trail)
103
+ if (m.role === "assistant")
104
+ for (const c of m.content)
105
+ if (c.type === "toolCall")
106
+ calls.set(c.id, c.arguments);
107
+ return {
108
+ system: context.systemPrompt ?? "",
109
+ role: (context.systemPrompt ?? "").match(/## Your role: (\w+)/)?.[1] ?? "Assistant",
110
+ tools: new Set((context.tools ?? []).map((t) => t.name)),
111
+ owner: idx >= 0 ? text(msgs[idx]) : "",
112
+ trail,
113
+ all: msgs,
114
+ results: trail.filter((m) => m.role === "toolResult").map((m) => ({ name: m.toolName, text: text(m), args: calls.get(m.toolCallId) ?? {} })),
115
+ };
116
+ }
117
+ function agentTurn(context) {
118
+ const t = buildTurn(context);
119
+ const last = t.results.at(-1);
120
+ // After a handoff the new specialist starts on the owner's message.
121
+ if (last?.name.startsWith("transfer_to_"))
122
+ t.results = [];
123
+ if (t.owner.startsWith("[Vireo notice]"))
124
+ return noticeTurn(t);
125
+ if (t.role === "Triage")
126
+ return triage(t);
127
+ switch (t.role) {
128
+ case "Research":
129
+ return research(t);
130
+ case "Calendar":
131
+ return calendar(t);
132
+ case "Email":
133
+ return email(t);
134
+ case "Browser":
135
+ return browser(t);
136
+ case "Tailnet":
137
+ return tailnet(t);
138
+ case "MCP":
139
+ return mcp(t);
140
+ default:
141
+ return general(t);
142
+ }
143
+ }
144
+ function noticeTurn(t) {
145
+ const n = t.owner;
146
+ if (/owner (edited and )?confirmed/i.test(n)) {
147
+ const result = n.match(/Result: ([\s\S]*?)\.?\s*Continue the task/)?.[1] ?? "";
148
+ if (/Failed/i.test(result))
149
+ return reply(`That didn't go through: ${result}`);
150
+ if (/Booking confirmed/i.test(result))
151
+ return reply(`Done — ${(result.match(/Booking confirmed for[^\n]*/) ?? result.match(/Booking confirmed[^\n]*/))?.[0] ?? "the booking is confirmed"}.`);
152
+ if (/sent/i.test(result))
153
+ return reply("Sent. ✅");
154
+ if (/Created event/i.test(result))
155
+ return reply("Done — the event is on your calendar and the invitations have gone out.");
156
+ return reply(`Done. ${result.split("\n")[0]}`);
157
+ }
158
+ if (/owner cancelled/i.test(n))
159
+ return reply("Okay, I won't do that.");
160
+ if (/Follow-up due/i.test(n))
161
+ return reply(`Following up: ${n.match(/Follow-up due: (.*?)\. Check/)?.[1] ?? "checking in"}. Nothing new yet — I'll keep an eye on it.`);
162
+ if (/Reminder:/i.test(n))
163
+ return reply(`⏰ ${n.replace("[Vireo notice] ", "")}`);
164
+ return reply("Noted.");
165
+ }
166
+ function triage(t) {
167
+ const m = t.owner.toLowerCase();
168
+ let to = "general";
169
+ if (/https?:\/\/|website|book a table|fill (in|out)|form|log ?in to|网站|表单|订座/.test(m))
170
+ to = "browser";
171
+ else if (/email|e-mail|inbox|mail from|reply to|邮件|回信/.test(m))
172
+ to = "email";
173
+ else if (/schedule|meeting|calendar|free time|free slot|invite|appointment|会议|日程|约/.test(m))
174
+ to = "calendar";
175
+ else if (t.tools.has("transfer_to_mcp") && /\bmcp\b/.test(m))
176
+ to = "mcp";
177
+ else if (t.tools.has("transfer_to_tailnet") && /tailnet|tailscale|my machines|my servers|\bssh\b|\bping\b|服务器|机器/.test(m))
178
+ to = "tailnet";
179
+ else if (/research|search|look up|find out|sources|latest|news|compare|调研|搜索|查一下|研究/.test(m))
180
+ to = "research";
181
+ if (/^(hi|hello|hey|thanks|thank you|你好|谢谢)[.!! ]*$/i.test(t.owner.trim())) {
182
+ return reply(isCjk(t.owner) ? "你好!有什么可以帮你?" : "Hi! What can I do for you?");
183
+ }
184
+ return call(`transfer_to_${to}`, { reason: `Routing to ${to}` });
185
+ }
186
+ function memoryFacts(system) {
187
+ const section = system.split("## What you know about the owner (long-term memory)")[1]?.split("\n## ")[0] ?? "";
188
+ return section
189
+ .split("\n")
190
+ .filter((l) => l.startsWith("- ["))
191
+ .map((l) => l.replace(/^- \[[^\]]+\] \([^)]*\) /, "").replace(/ — since.*$/, ""));
192
+ }
193
+ function general(t) {
194
+ const o = t.owner;
195
+ const lower = o.toLowerCase();
196
+ const facts = memoryFacts(t.system);
197
+ const cjk = isCjk(o);
198
+ // "In my Drive, find …"
199
+ const driveQ = o.match(/(?:in my (?:google )?drive|my drive|drive 里)[,:]?\s*(?:find|look for|找)?\s*(?:the )?(.+?)[??.]?$/i);
200
+ if (driveQ && t.tools.has("drive_search")) {
201
+ const found = t.results.find((r) => r.name === "drive_search");
202
+ if (!found)
203
+ return call("drive_search", { query: driveQ[1].replace(/\b(doc|document|file|plan)s?\b/gi, "").trim() || driveQ[1] });
204
+ const id = found.text.match(/^- (\S+) \|/m)?.[1];
205
+ if (!id)
206
+ return reply("I couldn't find that in your Drive.");
207
+ const read = t.results.find((r) => r.name === "drive_read");
208
+ if (!read)
209
+ return call("drive_read", { file_id: id });
210
+ const body = read.text.split("\n").slice(1, -2).join(" ").trim();
211
+ return reply(`From your Drive: ${body}`);
212
+ }
213
+ // "What do you remember about X?"
214
+ const rememberQ = o.match(/what do you (?:remember|know) about (.+?)[??]?$/i) ?? o.match(/你(?:还)?记得(.+?)(?:吗|的什么)?[??]?$/);
215
+ if (rememberQ) {
216
+ const recall = t.results.find((r) => r.name === "recall_memory");
217
+ if (!recall)
218
+ return call("recall_memory", { query: rememberQ[1].replace(/^(me|my)\s+/i, "") });
219
+ const lines = recall.text.split("\n").filter((l) => l.startsWith("- ["));
220
+ if (lines.length === 0)
221
+ return reply(cjk ? "我还没有关于这个的记忆。" : "I don't have anything remembered about that yet.");
222
+ const items = lines.map((l) => {
223
+ const m = l.match(/^- \[([^\]]+)\] \([^)]*\) (.*?) — since .*?; source: (.*)$/);
224
+ return m ? `- ${m[2]} _(source: ${m[3]})_` : l;
225
+ });
226
+ return reply(`${cjk ? "我记得这些:" : "Here's what I remember:"}\n\n${items.join("\n")}`);
227
+ }
228
+ // Code-word style isolation check: answer only from this thread's own messages.
229
+ if (/code ?word|暗号/.test(lower) && /\?|?|what/.test(lower)) {
230
+ const said = [...t.all].reverse().map(text).join("\n").match(/code ?word is (\w+)/i)?.[1];
231
+ return reply(said ? `Your code word in this thread is ${said}.` : "You haven't told me a code word in this thread.");
232
+ }
233
+ if (/where do i live|my (home )?address\b.*\?|我住(在)?哪|我的地址是什么/.test(lower)) {
234
+ const addr = facts.find((f) => /address is|住址是/.test(f));
235
+ return reply(addr ? (cjk ? `根据我的记忆:${addr}` : `From what I remember: ${addr}.`) : "I don't know your address yet.");
236
+ }
237
+ if (/flight|fly to|机票|航班/.test(lower)) {
238
+ const prefs = facts.filter((f) => /prefer|喜欢/.test(f));
239
+ return reply(`${cjk ? "好的,我来安排航班。" : "On it — I'll look for flights."}${prefs.length ? `\n\n${cjk ? "按照你的偏好:" : "Going by your preferences:"} ${prefs.join("; ")}.` : ""}`);
240
+ }
241
+ const remind = o.match(/remind me (?:in (\d+) minutes? )?to (.+?)(?: in (\d+) minutes?)?[.!]?$/i);
242
+ if (remind && t.tools.has("set_reminder")) {
243
+ const done = t.results.find((r) => r.name === "set_reminder");
244
+ if (done)
245
+ return reply(`Okay — I'll remind you to ${remind[2]}.`);
246
+ const mins = Number(remind[1] ?? remind[3] ?? 60);
247
+ return call("set_reminder", { at: new Date(Date.now() + mins * 60000).toISOString(), text: remind[2], kind: "reminder" });
248
+ }
249
+ // From Overview, multi-step matters get their own thread.
250
+ if (t.tools.has("open_thread") && /\b(plan|organi[sz]e|trip|project)\b|计划|旅行/.test(lower)) {
251
+ const opened = t.results.find((r) => r.name === "open_thread");
252
+ if (opened) {
253
+ const id = opened.text.match(/Opened thread (\S+)/)?.[1];
254
+ const title = String(opened.args.title);
255
+ return reply(`This will take a few steps, so I've opened a thread for it: [${title}](#thread/${id}).`);
256
+ }
257
+ const title = o.replace(/^(please|can you|help me)\s+/i, "").split(/\s+/).slice(0, 6).join(" ");
258
+ return call("open_thread", { title: title.charAt(0).toUpperCase() + title.slice(1), brief: o });
259
+ }
260
+ if (/\bi (prefer|moved|always)\b|my (home )?address is|我(更)?喜欢|我搬到|地址是/.test(lower)) {
261
+ return reply(cjk ? "好的,记住了。" : "Got it — I'll remember that.");
262
+ }
263
+ // An attached document: read it, then answer from it.
264
+ const attached = o.match(/\[Attached file: (.+?) \([^,]+, id (\S+)\) — read it with read_file\]/);
265
+ if (attached && t.tools.has("read_file")) {
266
+ const read = t.results.find((r) => r.name === "read_file");
267
+ if (!read)
268
+ return call("read_file", { file_id: attached[2] });
269
+ const lines = read.text.split("\n").map((l) => l.trim()).filter((l) => l && !l.startsWith("--- Page") && !l.startsWith("<") && !l.startsWith("The content above"));
270
+ return reply(`I read ${attached[1]}. It starts with "${(lines[0] ?? "").slice(0, 80)}" and has ${lines.length} lines in all.`);
271
+ }
272
+ // "Write it up as a file": the answer comes back as an attachment.
273
+ if (t.tools.has("create_file") && /\b(as|into) an? (file|document|page)\b|write (it|this) up|做成(文档|文件)|写成文档/i.test(o)) {
274
+ const made = t.results.find((r) => r.name === "create_file");
275
+ if (made)
276
+ return reply(cjk ? `写好了,附在这里:${String(made.args.name)}。` : `Done — it's attached as ${String(made.args.name)}.`);
277
+ const html = /\b(page|html)\b|网页/i.test(o);
278
+ const subject = o.replace(/\b(please|can you|write (it|this) up|(as|into) an? (file|document|page))\b/gi, "").replace(/[.?!。?!]+$/, "").trim() || "Notes";
279
+ return call("create_file", html
280
+ ? {
281
+ name: "page.html",
282
+ content: `<!doctype html><html><head><meta charset="utf-8"><style>body{font:16px system-ui;margin:32px;color:#1f1f1a}h1{color:#2f6446}</style></head><body><h1>${subject}</h1><p>Made by Vireo.</p><button onclick="this.textContent='Clicked'">Try me</button></body></html>`,
283
+ }
284
+ : {
285
+ name: "notes.md",
286
+ content: `# ${subject}\n\n- First point\n- Second point\n\n| Item | Status |\n| --- | --- |\n| Draft | Done |\n| Review | Next |\n`,
287
+ });
288
+ }
289
+ if (/^(thanks|thank you|谢谢)/i.test(o.trim()))
290
+ return reply(cjk ? "不客气!" : "You're welcome!");
291
+ if (cjk)
292
+ return reply(`收到:「${o.slice(0, 60)}」。这是一个示例回复,由脚本模型生成,用于演示和测试。接入真实模型后,Vireo 会给出完整的答案。`);
293
+ return reply(`Here's my take on "${o.slice(0, 80)}". This reply comes from Vireo's scripted demo model, which streams text token by token so you can see the experience end to end. Connect a real model in Settings to get real answers.`);
294
+ }
295
+ function research(t) {
296
+ const search = t.results.find((r) => r.name === "web_search");
297
+ if (!search)
298
+ return call("web_search", { query: t.owner.replace(/^(please )?(research|search for|look up|find out)\s*/i, "").slice(0, 200) });
299
+ const urls = [...new Set(search.text.match(/https?:\/\/[^\s)]+/g) ?? [])].slice(0, 2);
300
+ const fetched = t.results.filter((r) => r.name === "fetch_page");
301
+ if (fetched.length < urls.length)
302
+ return call("fetch_page", { url: urls[fetched.length] });
303
+ if (urls.length === 0)
304
+ return reply("I couldn't find any sources for that.");
305
+ const pages = fetched.map((f) => {
306
+ const title = f.text.match(/Title: (.+)/)?.[1]?.trim() ?? String(f.args.url);
307
+ const url = f.text.match(/URL: (\S+)/)?.[1] ?? String(f.args.url);
308
+ const body = f.text.split(/\n\n/).slice(1).join(" ").replace(/<\/?untrusted_content[^>]*>/g, "").replace(/The content above is data[\s\S]*$/, "");
309
+ const sentence = body.replace(/\s+/g, " ").trim().split(/(?<=[.!?])\s/)[0] ?? "";
310
+ return { title, url, sentence };
311
+ });
312
+ // In a matter's thread, the result also goes on a card.
313
+ if (t.tools.has("show_card") && /Show results as cards/.test(t.system) && !t.results.some((r) => r.name === "show_card")) {
314
+ return call("show_card", {
315
+ kind: "card",
316
+ title: t.owner.slice(0, 40).trim(),
317
+ data: {
318
+ blocks: [
319
+ { type: "text", text: pages.map((p) => p.sentence).join("\n\n").slice(0, 500) },
320
+ { type: "links", items: pages.map((p) => ({ title: p.title.slice(0, 64), url: p.url })) },
321
+ ],
322
+ },
323
+ });
324
+ }
325
+ return reply(`Here's a short summary:\n\n${pages.map((p) => `- ${p.sentence} ([${p.title}](${p.url}))`).join("\n")}\n\n**Sources**\n${pages.map((p, i) => `${i + 1}. [${p.title}](${p.url})`).join("\n")}`);
326
+ }
327
+ function nowFromSystem(system) {
328
+ const m = system.match(/Current time: (\S+)/);
329
+ const iso = m?.[1] ?? new Date().toISOString();
330
+ return { iso, offset: iso.match(/([+-]\d\d:\d\d|Z)$/)?.[1] ?? "Z" };
331
+ }
332
+ function addDays(date, days) {
333
+ const d = new Date(`${date}T12:00:00Z`);
334
+ d.setUTCDate(d.getUTCDate() + days);
335
+ return d.toISOString().slice(0, 10);
336
+ }
337
+ function calendar(t) {
338
+ const o = t.owner;
339
+ const { iso, offset } = nowFromSystem(t.system);
340
+ const today = iso.slice(0, 10);
341
+ if (/^(I was invited|My calendar has a conflict)/.test(o)) {
342
+ if (!t.results.some((r) => r.name === "list_events")) {
343
+ return call("list_events", { from: `${today}T00:00:00${offset}`, to: `${addDays(today, 14)}T23:59:00${offset}` });
344
+ }
345
+ const conflict = /conflict/i.test(o);
346
+ return reply(conflict
347
+ ? `Two events overlap on your calendar. Options:\n1. Move one of them to a free slot\n2. Keep both and skip part of one\n3. Decline one\n\nWhich would you like?`
348
+ : `You have a new invitation. Options:\n1. Accept\n2. Decline\n3. Propose another time\n\nWhich would you like?`);
349
+ }
350
+ const emails = o.match(/[\w.+-]+@[\w-]+\.[\w.]+/g) ?? [];
351
+ if (/schedule|set up|book|arrange|安排|约/.test(o.toLowerCase())) {
352
+ const day = /day after tomorrow|后天/.test(o) ? addDays(today, 2) : /tomorrow|明天/.test(o) ? addDays(today, 1) : addDays(today, 1);
353
+ const duration = Number(o.match(/(\d+)\s*(?:min|minutes|分钟)/)?.[1] ?? 30);
354
+ const slots = t.results.find((r) => r.name === "find_free_slots");
355
+ if (!slots)
356
+ return call("find_free_slots", { from: `${day}T00:00:00${offset}`, to: `${addDays(day, 3)}T23:59:00${offset}`, duration_minutes: duration });
357
+ const created = t.results.find((r) => r.name === "create_event");
358
+ if (!created) {
359
+ const slot = slots.text.match(/- (\S+) → (\S+)/);
360
+ if (!slot)
361
+ return reply("I couldn't find a free slot in that range. Want me to look further out?");
362
+ const who = emails[0]?.split("@")[0] ?? "";
363
+ const name = who ? who.charAt(0).toUpperCase() + who.slice(1) : "";
364
+ return call("create_event", { title: name ? `Meeting with ${name}` : "Meeting", start: slot[1], end: slot[2], attendees: emails });
365
+ }
366
+ if (/Not executed yet/.test(created.text)) {
367
+ return reply(`I found a free slot (${String(created.args.start).slice(0, 16).replace("T", " ")}) and prepared the invitation${emails.length ? ` for ${emails.join(", ")}` : ""}. Confirm it on the card and I'll send it.`);
368
+ }
369
+ return reply(`Done — "${created.args.title}" is on your calendar at ${String(created.args.start).slice(0, 16).replace("T", " ")}.`);
370
+ }
371
+ const listed = t.results.find((r) => r.name === "list_events");
372
+ if (!listed)
373
+ return call("list_events", { from: `${today}T00:00:00${offset}`, to: `${addDays(today, 7)}T23:59:00${offset}` });
374
+ const events = listed.text.split("\n").filter((l) => l.startsWith("- "));
375
+ return reply(events.length ? `Here's what's coming up:\n${events.map((e) => e.replace(/^- \S+: /, "- ")).join("\n")}` : "Your calendar is clear for the next week.");
376
+ }
377
+ function tailnet(t) {
378
+ const o = t.owner;
379
+ const ssh = o.match(/run [`'"](.+?)[`'"] on ([\w.-]+)/i);
380
+ if (ssh) {
381
+ const r = t.results.find((x) => x.name === "tailnet_ssh");
382
+ if (!r)
383
+ return call("tailnet_ssh", { machine: ssh[2], command: ssh[1] });
384
+ return reply(/awaiting|confirm/i.test(r.text) ? `Confirm on the card and I'll run \`${ssh[1]}\` on ${ssh[2]}.` : `Ran it on ${ssh[2]}:\n\n${r.text}`);
385
+ }
386
+ const http = o.match(/(?:open|call|get) (?:http:\/\/)?([\w-]+):(\d+)(\/\S*)?/i);
387
+ if (http) {
388
+ const r = t.results.find((x) => x.name === "tailnet_http");
389
+ if (!r)
390
+ return call("tailnet_http", { machine: http[1], port: Number(http[2]), path: http[3] ?? "/" });
391
+ return reply(`${http[1]} answered: ${r.text.match(/HTTP \d+[^\n]*/)?.[0] ?? r.text.slice(0, 200)}`);
392
+ }
393
+ const ping = o.match(/ping ([\w.-]+)/i);
394
+ if (ping) {
395
+ const r = t.results.find((x) => x.name === "tailnet_ping");
396
+ if (!r)
397
+ return call("tailnet_ping", { machine: ping[1] });
398
+ return reply(r.text);
399
+ }
400
+ const r = t.results.find((x) => x.name === "tailnet_machines");
401
+ if (!r)
402
+ return call("tailnet_machines", {});
403
+ const lines = r.text.split("\n").filter((l) => l.startsWith("- "));
404
+ const online = lines.filter((l) => /\| online/.test(l)).map((l) => l.slice(2).split(" | ")[0]);
405
+ const offline = lines.filter((l) => /\| offline/.test(l)).map((l) => l.slice(2).split(" | ")[0]);
406
+ return reply(`Your tailnet has ${lines.length} machine(s). Online: ${online.join(", ") || "none"}. Offline: ${offline.join(", ") || "none"}.`);
407
+ }
408
+ /** "Use MCP <tool>: <text>" calls the MCP tool whose name ends in <tool> with { text }. */
409
+ function mcp(t) {
410
+ const m = t.owner.match(/mcp (\w+):?\s*(.*)$/i);
411
+ const name = [...t.tools].find((n) => n.startsWith("mcp_") && m && n.endsWith(`_${m[1]}`)) ?? [...t.tools].find((n) => n.startsWith("mcp_"));
412
+ if (!name)
413
+ return reply("No MCP tools are connected.");
414
+ const r = t.results.find((x) => x.name === name);
415
+ if (!r)
416
+ return call(name, { text: m?.[2] ?? "" });
417
+ if (/awaiting|confirm/i.test(r.text))
418
+ return reply("Confirm on the card and I'll run it.");
419
+ return reply(`MCP said: ${r.text.replace(/<\/?untrusted_content[^>]*>/g, "").split("\n").find((l) => l.trim()) ?? ""}`);
420
+ }
421
+ function email(t) {
422
+ const o = t.owner;
423
+ const emailId = o.match(/email id (\S+?),/)?.[1];
424
+ if (emailId) {
425
+ const read = t.results.find((r) => r.name === "read_email");
426
+ if (!read)
427
+ return call("read_email", { id: emailId });
428
+ const from = read.text.match(/From: (.+)/)?.[1] ?? "";
429
+ const addr = from.match(/[\w.+-]+@[\w-]+\.[\w.]+/)?.[0] ?? from;
430
+ const subject = read.text.match(/Subject: (.+)/)?.[1] ?? "";
431
+ const body = read.text.split(/\n\n/)[1]?.replace(/<\/?untrusted_content[^>]*>/g, "").trim() ?? "";
432
+ const draftText = `Hi ${addr.split("@")[0]},\n\nThanks for your message — that works for me. I'll get back to you with details shortly.\n\nBest`;
433
+ const draft = t.results.find((r) => r.name === "draft_email");
434
+ if (!draft)
435
+ return call("draft_email", { to: addr, subject: `Re: ${subject}`, body: draftText, reply_to_id: emailId });
436
+ return reply(`**Summary:** ${from} wrote about "${subject}": ${body.split(/(?<=[.!?])\s/)[0] ?? ""}\n\n**Draft reply:**\n\n> ${draftText.replace(/\n/g, "\n> ")}\n\nShall I send it?`);
437
+ }
438
+ if (/^(yes|ok|okay|send|send it|go ahead|好|发吧|发送)/i.test(o.trim())) {
439
+ const sent = t.results.find((r) => r.name === "send_email");
440
+ if (sent)
441
+ return reply("It's ready to go — confirm on the card and I'll send it.");
442
+ let draftArgs;
443
+ for (const m of [...t.all].reverse()) {
444
+ if (m.role !== "assistant")
445
+ continue;
446
+ const c = m.content.find((x) => x.type === "toolCall" && (x.name === "draft_email" || x.name === "send_email"));
447
+ if (c && c.type === "toolCall") {
448
+ draftArgs = c.arguments;
449
+ break;
450
+ }
451
+ }
452
+ if (!draftArgs)
453
+ return reply("There's no draft yet. Who should I write to?");
454
+ return call("send_email", draftArgs);
455
+ }
456
+ const searched = t.results.find((r) => r.name === "search_email");
457
+ if (!searched)
458
+ return call("search_email", { query: "is:unread", max_results: 10 });
459
+ const lines = searched.text.split("\n").filter((l) => l.startsWith("- "));
460
+ return reply(lines.length ? `You have ${lines.length} unread email(s):\n${lines.map((l) => `- ${l.split("|").slice(2, 4).join(" —")}`).join("\n")}` : "No unread email.");
461
+ }
462
+ function browser(t) {
463
+ const url = t.owner.match(/https?:\/\/\S+?(?=[\s,.)]*(?:\s|$))/)?.[0];
464
+ const snaps = t.results.filter((r) => r.name.startsWith("browser_"));
465
+ if (snaps.length === 0) {
466
+ if (!url)
467
+ return reply("Which website should I use?");
468
+ return call("browser_open", { url });
469
+ }
470
+ const last = snaps.at(-1);
471
+ if (/Not executed yet/.test(last.text)) {
472
+ return reply("Everything is filled in. Confirm on the card and I'll submit it.");
473
+ }
474
+ const snap = last.text;
475
+ const lines = snap.split("\n").filter((l) => /\[ref=\w+\]/.test(l));
476
+ const el = (pattern) => lines.find((l) => pattern.test(l))?.match(/\[ref=(\w+)\]/)?.[1];
477
+ const typed = (ref) => ref && snaps.some((s) => s.name === "browser_type" && s.args.ref === ref);
478
+ const hasPassword = /textbox "Password"/i.test(snap);
479
+ // "I'll sign in myself": hand the browser over instead of using stored credentials.
480
+ if (hasPassword && /sign in myself|let me sign in|我自己登录/i.test(t.owner) && !snaps.some((s) => s.name === "browser_ask_owner")) {
481
+ return call("browser_ask_owner", { request: "Sign in to Bistro Vireo" });
482
+ }
483
+ if (hasPassword) {
484
+ const user = el(/textbox "(Email|Username|Email or username)"/i);
485
+ const pass = el(/textbox "Password"/i);
486
+ if (user && !typed(user) && !snaps.some((s) => s.name === "browser_type" && s.args.text === "{{username}}"))
487
+ return call("browser_type", { ref: user, text: "{{username}}" });
488
+ if (pass && !snaps.some((s) => s.name === "browser_type" && s.args.text === "{{password}}"))
489
+ return call("browser_type", { ref: pass, text: "{{password}}" });
490
+ const signIn = el(/button "(sign in|log ?in)"/i);
491
+ if (signIn)
492
+ return call("browser_click", { ref: signIn, description: "Sign in" });
493
+ }
494
+ if (/Booking confirmed/i.test(snap))
495
+ return reply(`Done — ${(snap.match(/Booking confirmed for[^\n]*/) ?? snap.match(/Booking confirmed[^\n]*/))?.[0]}.`);
496
+ const name = el(/textbox "Name"/i);
497
+ const guests = el(/(combobox|textbox) "Guests"/i);
498
+ const date = el(/textbox "Date"/i);
499
+ const guestCount = t.owner.match(/(\d+)\s*(?:people|guests|persons|人)/)?.[1] ?? "2";
500
+ const ownerName = t.owner.match(/under (?:the name )?(\w+)/i)?.[1] ?? "Owner";
501
+ // Element refs restart on each page, so only count what was filled since the last navigation.
502
+ const lastNav = snaps.findLastIndex((s) => s.name === "browser_click" || s.name === "browser_open");
503
+ const typedNow = snaps.slice(lastNav + 1).filter((s) => s.name === "browser_type" || s.name === "browser_select").map((s) => s.args.ref);
504
+ if (name && !typedNow.includes(name))
505
+ return call("browser_type", { ref: name, text: ownerName });
506
+ if (guests && !typedNow.includes(guests)) {
507
+ const isSelect = /combobox "Guests"/i.test(snap);
508
+ return call(isSelect ? "browser_select" : "browser_type", { ref: guests, ...(isSelect ? { values: [guestCount] } : { text: guestCount }) });
509
+ }
510
+ if (date && !typedNow.includes(date))
511
+ return call("browser_type", { ref: date, text: "2026-10-15" });
512
+ const submit = el(/button "[^"]*(book|submit|reserve)/i);
513
+ if (submit)
514
+ return call("browser_click", { ref: submit, description: `Submit the booking for ${guestCount} under ${ownerName}` });
515
+ return reply(`I opened ${url ?? "the page"} but couldn't find what to do next.`);
516
+ }
517
+ //# sourceMappingURL=fake-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-model.js","sourceRoot":"","sources":["../src/fake-model.ts"],"names":[],"mappings":"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"}