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,80 @@
1
+ import { Type } from "typebox";
2
+ const Str = (max, description) => Type.String({ maxLength: max, ...(description ? { description } : {}) });
3
+ const Opt = (t) => Type.Optional(t);
4
+ const List = (t, max, description) => Type.Array(t, { maxItems: max, minItems: 1, ...(description ? { description } : {}) });
5
+ const Url = Type.String({ maxLength: 2000 });
6
+ const Lit = (s) => Type.Literal(s);
7
+ export const MARKS = ["picked", "best", "attention", "done"];
8
+ export const BLOCK_KINDS = [
9
+ {
10
+ type: "facts",
11
+ description: "The few numbers or values that decide, big: prices, totals, counts, a date.",
12
+ schema: Type.Object({
13
+ type: Lit("facts"),
14
+ items: List(Type.Object({
15
+ value: Str(16, "e.g. '¥804', '42', 'Oct 14'"),
16
+ label: Str(24, "What the value is, e.g. 'Archived'"),
17
+ tone: Opt(Type.Union([Lit("good"), Lit("attention")])),
18
+ }), 4),
19
+ }),
20
+ },
21
+ {
22
+ type: "rows",
23
+ description: "A short list of things of one sort: options to choose from, items handled, emails, files, people, places. Mark the one picked or best.",
24
+ schema: Type.Object({
25
+ type: Lit("rows"),
26
+ items: List(Type.Object({
27
+ lead: Opt(Str(8, "A short tag or time before the title, e.g. '09:30', 'New'")),
28
+ title: Str(48, "The thing's name, e.g. 'Park Hyatt Tokyo'"),
29
+ detail: Opt(Str(64, "One or two facts that tell it apart, e.g. 'Shinjuku · 4.6 ★'")),
30
+ value: Opt(Str(16, "The number that decides, e.g. '¥2,400'")),
31
+ mark: Opt(Type.Union(MARKS.map(Lit), { description: "picked (chosen), best (recommended), attention (needs the owner), done" })),
32
+ url: Opt(Url),
33
+ }), 6),
34
+ }),
35
+ },
36
+ {
37
+ type: "text",
38
+ description: "A direct answer or a short passage, when the point is words rather than numbers.",
39
+ schema: Type.Object({
40
+ type: Lit("text"),
41
+ text: Str(500, "Markdown. Lead with the conclusion; one short paragraph after it at most"),
42
+ }),
43
+ },
44
+ {
45
+ type: "steps",
46
+ description: "Stages of something that moves forward: a delivery, an application, a booking.",
47
+ schema: Type.Object({
48
+ type: Lit("steps"),
49
+ items: List(Str(20, "A word or two"), 6),
50
+ current: Type.Number({ description: "Index of the current stage" }),
51
+ }),
52
+ },
53
+ {
54
+ type: "chart",
55
+ description: "How a number moves: a price over days (line), or one value per option or date (bars).",
56
+ schema: Type.Object({
57
+ type: Lit("chart"),
58
+ style: Opt(Type.Union([Lit("line"), Lit("bars")])),
59
+ values: List(Type.Number(), 30, "Oldest or first first"),
60
+ labels: Opt(List(Str(8), 30, "One per value, for bars, e.g. '10/19'")),
61
+ caption: Opt(Str(48, "What the chart shows, e.g. 'Cheapest return per day'")),
62
+ highlight: Opt(Type.Number({ description: "Index of the value to pick out, e.g. the cheapest" })),
63
+ }),
64
+ },
65
+ {
66
+ type: "links",
67
+ description: "Sources or pages worth opening.",
68
+ schema: Type.Object({
69
+ type: Lit("links"),
70
+ items: List(Type.Object({ title: Str(64), url: Url }), 5),
71
+ }),
72
+ },
73
+ ];
74
+ export const BLOCK_TYPES = BLOCK_KINDS.map((b) => b.type);
75
+ export function blockKind(type) {
76
+ return BLOCK_KINDS.find((b) => b.type === type);
77
+ }
78
+ /** Every new card is stored with this kind; older cards keep the kinds they were made with. */
79
+ export const CARD_KIND = "card";
80
+ //# sourceMappingURL=blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/cards/blocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /** Scalar leaves of a card's data, keyed by path, each with the label it is shown under. */
2
+ function leaves(data, path = "", context = "", out = new Map()) {
3
+ if (data === null || data === undefined)
4
+ return out;
5
+ if (Array.isArray(data)) {
6
+ data.forEach((v, i) => leaves(v, `${path}/${i}`, context, out));
7
+ return out;
8
+ }
9
+ if (typeof data === "object") {
10
+ const o = data;
11
+ // An item names itself by its label, title or name ("Return", "Hotel The Celestine").
12
+ const own = [o.label, o.title, o.name].find((v) => typeof v === "string" && v.trim());
13
+ for (const [k, v] of Object.entries(o)) {
14
+ const key = k.replace(/_/g, " ");
15
+ const here = own && !["label", "title", "name"].includes(k) ? own : context ? `${context} ${key}` : key;
16
+ leaves(v, `${path}/${k}`, typeof v === "object" ? (own ?? (context ? `${context} ${key}` : key)) : here, out);
17
+ }
18
+ return out;
19
+ }
20
+ out.set(path, { label: context, value: String(data) });
21
+ return out;
22
+ }
23
+ const QUIET = /(^|\/)(type|url|file_id|checked_at|trend|values|activity|current|tone|mark|primary)(\/|$)/;
24
+ /**
25
+ * What changed between two versions of a card's data, for the line that says
26
+ * so on the card. Only a few facts: when most of the card changed, it is a new
27
+ * stage of the matter rather than an update, and nothing is listed.
28
+ */
29
+ export function diffCard(before, after) {
30
+ const a = leaves(before);
31
+ const b = leaves(after);
32
+ const changes = [];
33
+ for (const [path, now] of b) {
34
+ if (QUIET.test(path))
35
+ continue;
36
+ const was = a.get(path);
37
+ if (!was || was.value === now.value)
38
+ continue;
39
+ if (now.value.length > 40 || was.value.length > 40)
40
+ continue;
41
+ changes.push({ label: capitalize(now.label), from: was.value, to: now.value });
42
+ }
43
+ return changes.length > 3 ? [] : changes;
44
+ }
45
+ function capitalize(s) {
46
+ return s ? s[0].toUpperCase() + s.slice(1) : s;
47
+ }
48
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/cards/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ import { Type } from "typebox";
2
+ /** Text of at most `max` characters. */
3
+ const Str = (max, description) => Type.String({ maxLength: max, ...(description ? { description } : {}) });
4
+ const Opt = (t) => Type.Optional(t);
5
+ const List = (t, max, description) => Type.Array(t, { maxItems: max, ...(description ? { description } : {}) });
6
+ const Url = Type.String({ maxLength: 2000 });
7
+ /** A short number that decides, e.g. a price: "¥804", "320 USD". */
8
+ const Value = (description = "The number that decides, e.g. a price") => Str(16, description);
9
+ const Leg = Type.Object({
10
+ from: Str(4, "Airport code, e.g. PVG"),
11
+ to: Str(4, "Airport code, e.g. NRT"),
12
+ departs: Str(5, "Local time, e.g. 17:35"),
13
+ arrives: Str(12, "Local time, e.g. 21:35 or 00:50 +1"),
14
+ date: Str(10, "e.g. 2026-10-10"),
15
+ airline: Opt(Str(24)),
16
+ flight: Opt(Str(12, "e.g. IJ 004")),
17
+ price: Opt(Value()),
18
+ });
19
+ export const CARD_KINDS = [
20
+ {
21
+ name: "card",
22
+ description: "The general card, for anything without a kind of its own: an answer, options to compare, a batch handled, a person, a file, a page. Compose it from blocks (listed below), the most important first.",
23
+ data: Type.Object({
24
+ subtitle: Opt(Str(60, "One line under the title, e.g. the criteria or the source")),
25
+ blocks: Type.Array(Type.Unknown(), { minItems: 1, maxItems: 4, description: "1 to 4 blocks" }),
26
+ }),
27
+ },
28
+ {
29
+ name: "watch",
30
+ description: "Something Vireo keeps an eye on that changes over time: a price, a delivery, a page, a queue.",
31
+ data: Type.Object({
32
+ value: Str(20, "The current value, e.g. '320 USD' or 'Out for delivery'"),
33
+ detail: Opt(Str(80)),
34
+ trend: Opt(List(Type.Number(), 30, "Recent values, oldest first, for a small chart")),
35
+ steps: Opt(List(Str(20), 5, "Stages in order, a word or two each, e.g. Shipped, Sorted, Out for delivery, Delivered")),
36
+ current: Opt(Type.Number({ description: "Index into steps of the current stage" })),
37
+ checked_at: Opt(Str(40, "When you last checked, e.g. 2026-10-09T19:40+08:00")),
38
+ }),
39
+ times: ["checked_at"],
40
+ },
41
+ {
42
+ name: "document",
43
+ description: "Something Vireo wrote or assembled for the owner to keep: an itinerary, a plan, notes, a draft.",
44
+ data: Type.Object({
45
+ text: Str(8000, "Markdown"),
46
+ file_id: Opt(Str(60, "A file created with create_file")),
47
+ }),
48
+ },
49
+ {
50
+ name: "flight",
51
+ description: "One flight, either the best option found or a booked ticket. For a round trip use trip.",
52
+ data: Type.Object({
53
+ from: Str(4, "Airport code, e.g. PVG"),
54
+ to: Str(4, "Airport code, e.g. HND"),
55
+ departs: Str(5, "Local time, e.g. 08:10"),
56
+ arrives: Str(12, "Local time, e.g. 12:05"),
57
+ date: Str(10, "e.g. 2026-11-14"),
58
+ airline: Opt(Str(24)),
59
+ flight: Opt(Str(12, "e.g. NH 920")),
60
+ duration: Opt(Str(12)),
61
+ details: Opt(List(Str(20), 3, "e.g. Aisle seat, 1 checked bag")),
62
+ price: Opt(Value()),
63
+ trend: Opt(List(Type.Number(), 30)),
64
+ booked: Opt(Type.Object({ seat: Opt(Str(6)), ref: Opt(Str(12)) })),
65
+ }),
66
+ },
67
+ {
68
+ name: "trip",
69
+ description: "Flights there and back, on one ticket or two one-ways: the outbound flight (picked or best found), the return once picked, and while it isn't, the cheapest return per date to choose from. Use it for any two-leg trip, from searching to booked.",
70
+ data: Type.Object({
71
+ outbound: Leg,
72
+ return: Opt(Leg),
73
+ total: Opt(Value("Both legs together, e.g. ¥3,006")),
74
+ return_options: Opt(List(Type.Object({
75
+ date: Str(10, "e.g. 2026-10-19"),
76
+ price: Value("Cheapest return that day"),
77
+ flight: Opt(Str(40, "That flight in brief, e.g. 'NRT 22:25 → PVG 00:50 +1'")),
78
+ }), 10, "In date order")),
79
+ note: Opt(Str(100, "One caveat, e.g. 'Fares exclude checked bags'")),
80
+ }),
81
+ },
82
+ {
83
+ name: "event",
84
+ description: "A calendar event that is already on the owner's calendar or worth showing (not a pending invite: those confirm themselves).",
85
+ data: Type.Object({
86
+ start: Str(40, "Date and time, e.g. 2026-10-14T15:30+08:00"),
87
+ end: Opt(Str(40, "Date and time, e.g. 2026-10-14T16:15+08:00")),
88
+ location: Opt(Str(60)),
89
+ attendees: Opt(List(Str(80), 20)),
90
+ note: Opt(Str(120)),
91
+ }),
92
+ times: ["start", "end"],
93
+ },
94
+ {
95
+ name: "email",
96
+ description: "One email worth the owner's attention, with Vireo's draft reply if there is one.",
97
+ data: Type.Object({
98
+ from: Str(60),
99
+ address: Opt(Str(120)),
100
+ subject: Str(100),
101
+ received: Opt(Str(40, "e.g. 2026-10-09T09:12+08:00")),
102
+ body: Str(600, "The relevant part of the message"),
103
+ draft: Opt(Str(1200, "Vireo's suggested reply")),
104
+ }),
105
+ times: ["received"],
106
+ },
107
+ {
108
+ name: "github_pr",
109
+ description: "A GitHub pull request: its checks, review state and size.",
110
+ data: Type.Object({
111
+ repo: Str(100, "owner/name"),
112
+ number: Type.Number(),
113
+ url: Opt(Url),
114
+ state: Opt(Type.Union([Type.Literal("open"), Type.Literal("draft"), Type.Literal("merged"), Type.Literal("closed")])),
115
+ additions: Opt(Type.Number()),
116
+ deletions: Opt(Type.Number()),
117
+ files: Opt(Type.Number()),
118
+ checks: Opt(Type.Object({ passed: Type.Number(), total: Type.Number() })),
119
+ review: Opt(Str(60, "e.g. 'Approved by 1 reviewer'")),
120
+ }),
121
+ },
122
+ {
123
+ name: "place",
124
+ description: "A place: a restaurant, shop, venue or address, possibly with a time.",
125
+ data: Type.Object({
126
+ name: Str(40),
127
+ address: Opt(Str(80)),
128
+ distance: Opt(Str(12)),
129
+ when: Opt(Str(40)),
130
+ note: Opt(Str(100)),
131
+ url: Opt(Url),
132
+ }),
133
+ },
134
+ ];
135
+ export const CARD_KIND_NAMES = CARD_KINDS.map((k) => k.name);
136
+ export function cardKind(name) {
137
+ return CARD_KINDS.find((k) => k.name === name);
138
+ }
139
+ //# sourceMappingURL=kinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinds.js","sourceRoot":"","sources":["../../src/cards/kinds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import { messageText, OVERVIEW_ID } from "../threads.js";
2
+ import { newId, now, safeJson, truncate } from "../util.js";
3
+ import { diffCard } from "./diff.js";
4
+ const ORDER = { needs_you: 0, working: 1, watching: 2, ready: 3, done: 4 };
5
+ const DONE_WINDOW = 3 * 864e5;
6
+ export class Cards {
7
+ app;
8
+ constructor(app) {
9
+ this.app = app;
10
+ }
11
+ toCard(r, thread) {
12
+ const done = thread?.state === "done";
13
+ return {
14
+ id: r.id,
15
+ threadId: r.thread_id,
16
+ threadTitle: thread?.title ?? "",
17
+ kind: r.kind,
18
+ title: r.title,
19
+ status: done ? "done" : r.status,
20
+ data: safeJson(r.data, {}),
21
+ buttons: safeJson(r.buttons, []),
22
+ running: Boolean(thread?.running),
23
+ statusLine: thread?.running ? thread.statusLine : undefined,
24
+ changes: safeJson(r.changes, []),
25
+ createdAt: r.created_at,
26
+ updatedAt: r.updated_at,
27
+ };
28
+ }
29
+ get(id) {
30
+ const r = this.app.db.get("SELECT * FROM cards WHERE id = ?", id);
31
+ return r ? this.toCard(r, this.app.threads.get(r.thread_id)) : undefined;
32
+ }
33
+ forThread(threadId) {
34
+ const thread = this.app.threads.get(threadId);
35
+ return this.app.db
36
+ .all("SELECT * FROM cards WHERE thread_id = ? AND archived = 0 ORDER BY created_at", threadId)
37
+ .map((r) => this.toCard(r, thread));
38
+ }
39
+ /** Creates a card, or replaces an existing one of this thread when id is given. */
40
+ save(threadId, input) {
41
+ const t = now();
42
+ // Models sometimes make up a card_id ("tokyo-trip") instead of reusing the
43
+ // one they were given. An id this thread doesn't have means the thread's
44
+ // latest card, or a new card when there is none; never another thread's.
45
+ const existing = input.id
46
+ ? (this.app.db.get("SELECT * FROM cards WHERE id = ? AND thread_id = ?", input.id, threadId) ??
47
+ this.app.db.get("SELECT * FROM cards WHERE thread_id = ? AND archived = 0 ORDER BY updated_at DESC LIMIT 1", threadId))
48
+ : undefined;
49
+ const id = existing?.id ?? newId("card");
50
+ if (existing) {
51
+ // A card that changed kind is a new stage of the matter, not an update.
52
+ const changes = existing.kind === input.kind ? diffCard(safeJson(existing.data, {}), input.data) : [];
53
+ this.app.db.run("UPDATE cards SET kind = ?, title = ?, status = ?, data = ?, buttons = ?, changes = ?, archived = 0, updated_at = ? WHERE id = ?", input.kind, input.title, input.status, JSON.stringify(input.data), JSON.stringify(input.buttons), JSON.stringify(changes), t, id);
54
+ }
55
+ else {
56
+ this.app.db.run("INSERT INTO cards (id, thread_id, kind, title, status, data, buttons, archived, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, 0, ?, ?)", id, threadId, input.kind, input.title, input.status, JSON.stringify(input.data), JSON.stringify(input.buttons), t, t);
57
+ }
58
+ this.changed(threadId, id);
59
+ return this.get(id);
60
+ }
61
+ archive(id) {
62
+ const r = this.app.db.get("SELECT * FROM cards WHERE id = ?", id);
63
+ if (!r)
64
+ return false;
65
+ this.app.db.run("UPDATE cards SET archived = 1, updated_at = ? WHERE id = ?", now(), id);
66
+ this.changed(r.thread_id, id);
67
+ return true;
68
+ }
69
+ changed(threadId, cardId) {
70
+ this.app.bus.publish({ type: "card.updated", threadId, cardId });
71
+ }
72
+ /** Everything the home page shows, most urgent first. */
73
+ feed() {
74
+ const threads = new Map(this.app.threads.list().map((t) => [t.id, t]));
75
+ const out = [];
76
+ const withCards = new Set();
77
+ for (const r of this.app.db.all("SELECT * FROM cards WHERE archived = 0 ORDER BY updated_at DESC")) {
78
+ const thread = threads.get(r.thread_id);
79
+ if (!thread || thread.temporary)
80
+ continue;
81
+ withCards.add(thread.id);
82
+ out.push(this.toCard(r, thread));
83
+ }
84
+ for (const a of this.app.actions.pending()) {
85
+ const thread = threads.get(a.threadId);
86
+ out.push({
87
+ id: `action:${a.id}`,
88
+ threadId: a.threadId,
89
+ threadTitle: thread?.title ?? "",
90
+ kind: "proposal",
91
+ title: a.summary,
92
+ status: "needs_you",
93
+ data: { actionId: a.id, tool: a.tool, args: a.args },
94
+ buttons: [],
95
+ running: false,
96
+ changes: [],
97
+ createdAt: a.createdAt,
98
+ updatedAt: a.createdAt,
99
+ });
100
+ withCards.add(a.threadId);
101
+ }
102
+ // Vireo waiting for the owner to do something in its browser (sign in, a captcha).
103
+ for (const r of this.app.browser.requests()) {
104
+ const thread = threads.get(r.threadId);
105
+ if (!thread)
106
+ continue;
107
+ out.push({
108
+ id: `browser:${r.threadId}`,
109
+ threadId: r.threadId,
110
+ threadTitle: thread.title,
111
+ kind: "browser_request",
112
+ title: r.request,
113
+ status: "needs_you",
114
+ data: { request: r.request, since: r.since },
115
+ buttons: [],
116
+ running: false,
117
+ changes: [],
118
+ createdAt: r.since,
119
+ updatedAt: r.since,
120
+ });
121
+ withCards.add(r.threadId);
122
+ }
123
+ for (const thread of threads.values()) {
124
+ if (thread.id === OVERVIEW_ID || thread.temporary || withCards.has(thread.id))
125
+ continue;
126
+ out.push(this.threadCard(thread));
127
+ }
128
+ for (const r of this.app.reminders.scheduled({ kind: "reminder", limit: 20 })) {
129
+ out.push({
130
+ id: `reminder:${r.id}`,
131
+ threadId: r.threadId ?? OVERVIEW_ID,
132
+ threadTitle: threads.get(r.threadId ?? OVERVIEW_ID)?.title ?? "",
133
+ kind: "reminder",
134
+ title: r.text,
135
+ status: "watching",
136
+ data: { reminderId: r.id, due: r.dueAt },
137
+ buttons: [],
138
+ running: false,
139
+ changes: [],
140
+ createdAt: r.createdAt,
141
+ updatedAt: r.createdAt,
142
+ });
143
+ }
144
+ const cutoff = now() - DONE_WINDOW;
145
+ return out
146
+ .filter((c) => c.status !== "done" || c.updatedAt > cutoff || (threads.get(c.threadId)?.doneAt ?? 0) > cutoff)
147
+ .sort((a, b) => {
148
+ const sa = a.running && a.status !== "needs_you" ? ORDER.working : ORDER[a.status];
149
+ const sb = b.running && b.status !== "needs_you" ? ORDER.working : ORDER[b.status];
150
+ return sa - sb || b.updatedAt - a.updatedAt;
151
+ });
152
+ }
153
+ /** A thread that has not shown a card yet appears as its latest answer. */
154
+ threadCard(thread) {
155
+ const last = this.app.threads
156
+ .messages(thread.id, { limit: 8 })
157
+ .reverse()
158
+ .find((m) => m.role === "assistant" && messageText(m.body));
159
+ const status = thread.state === "done" ? "done" : thread.needsYou ? "needs_you" : thread.running ? "working" : "ready";
160
+ return {
161
+ id: `thread:${thread.id}`,
162
+ threadId: thread.id,
163
+ threadTitle: thread.title,
164
+ kind: "thread",
165
+ title: thread.title,
166
+ status,
167
+ data: { text: last ? truncate(messageText(last.body), 600) : "", statusLine: thread.statusLine, browsing: thread.running && this.app.browser.hasPage(thread.id) },
168
+ buttons: [],
169
+ running: thread.running,
170
+ statusLine: thread.running ? thread.statusLine : undefined,
171
+ changes: [],
172
+ createdAt: thread.createdAt,
173
+ updatedAt: thread.updatedAt,
174
+ };
175
+ }
176
+ }
177
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cards/store.ts"],"names":[],"mappings":"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"}