@murphai/murph 0.1.1

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 (301) hide show
  1. package/CHANGELOG.md +2009 -0
  2. package/LICENSE +674 -0
  3. package/README.md +97 -0
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/assistant/automation/run-loop.d.ts +21 -0
  6. package/dist/assistant/automation/run-loop.d.ts.map +1 -0
  7. package/dist/assistant/automation/run-loop.js +31 -0
  8. package/dist/assistant/automation/run-loop.js.map +1 -0
  9. package/dist/assistant/automation.d.ts +10 -0
  10. package/dist/assistant/automation.d.ts.map +1 -0
  11. package/dist/assistant/automation.js +5 -0
  12. package/dist/assistant/automation.js.map +1 -0
  13. package/dist/assistant/cron.d.ts +19 -0
  14. package/dist/assistant/cron.d.ts.map +1 -0
  15. package/dist/assistant/cron.js +59 -0
  16. package/dist/assistant/cron.js.map +1 -0
  17. package/dist/assistant/doctor-security.d.ts +15 -0
  18. package/dist/assistant/doctor-security.d.ts.map +1 -0
  19. package/dist/assistant/doctor-security.js +172 -0
  20. package/dist/assistant/doctor-security.js.map +1 -0
  21. package/dist/assistant/doctor.d.ts +5 -0
  22. package/dist/assistant/doctor.d.ts.map +1 -0
  23. package/dist/assistant/doctor.js +527 -0
  24. package/dist/assistant/doctor.js.map +1 -0
  25. package/dist/assistant/outbox.d.ts +19 -0
  26. package/dist/assistant/outbox.d.ts.map +1 -0
  27. package/dist/assistant/outbox.js +28 -0
  28. package/dist/assistant/outbox.js.map +1 -0
  29. package/dist/assistant/provider-catalog.d.ts +61 -0
  30. package/dist/assistant/provider-catalog.d.ts.map +1 -0
  31. package/dist/assistant/provider-catalog.js +205 -0
  32. package/dist/assistant/provider-catalog.js.map +1 -0
  33. package/dist/assistant/service.d.ts +85 -0
  34. package/dist/assistant/service.d.ts.map +1 -0
  35. package/dist/assistant/service.js +26 -0
  36. package/dist/assistant/service.js.map +1 -0
  37. package/dist/assistant/status.d.ts +9 -0
  38. package/dist/assistant/status.d.ts.map +1 -0
  39. package/dist/assistant/status.js +16 -0
  40. package/dist/assistant/status.js.map +1 -0
  41. package/dist/assistant/stop.d.ts +20 -0
  42. package/dist/assistant/stop.d.ts.map +1 -0
  43. package/dist/assistant/stop.js +142 -0
  44. package/dist/assistant/stop.js.map +1 -0
  45. package/dist/assistant/store.d.ts +6 -0
  46. package/dist/assistant/store.d.ts.map +1 -0
  47. package/dist/assistant/store.js +21 -0
  48. package/dist/assistant/store.js.map +1 -0
  49. package/dist/assistant/ui/ink.d.ts +247 -0
  50. package/dist/assistant/ui/ink.d.ts.map +1 -0
  51. package/dist/assistant/ui/ink.js +2417 -0
  52. package/dist/assistant/ui/ink.js.map +1 -0
  53. package/dist/assistant/ui/theme.d.ts +64 -0
  54. package/dist/assistant/ui/theme.d.ts.map +1 -0
  55. package/dist/assistant/ui/theme.js +180 -0
  56. package/dist/assistant/ui/theme.js.map +1 -0
  57. package/dist/assistant/ui/view-model.d.ts +89 -0
  58. package/dist/assistant/ui/view-model.d.ts.map +1 -0
  59. package/dist/assistant/ui/view-model.js +298 -0
  60. package/dist/assistant/ui/view-model.js.map +1 -0
  61. package/dist/assistant-chat-ink.d.ts +2 -0
  62. package/dist/assistant-chat-ink.d.ts.map +1 -0
  63. package/dist/assistant-chat-ink.js +2 -0
  64. package/dist/assistant-chat-ink.js.map +1 -0
  65. package/dist/assistant-daemon-client.d.ts +81 -0
  66. package/dist/assistant-daemon-client.d.ts.map +1 -0
  67. package/dist/assistant-daemon-client.js +473 -0
  68. package/dist/assistant-daemon-client.js.map +1 -0
  69. package/dist/assistant-runtime.d.ts +25 -0
  70. package/dist/assistant-runtime.d.ts.map +1 -0
  71. package/dist/assistant-runtime.js +17 -0
  72. package/dist/assistant-runtime.js.map +1 -0
  73. package/dist/bin.d.ts +3 -0
  74. package/dist/bin.d.ts.map +1 -0
  75. package/dist/bin.js +7 -0
  76. package/dist/bin.js.map +1 -0
  77. package/dist/cli-entry.d.ts +10 -0
  78. package/dist/cli-entry.d.ts.map +1 -0
  79. package/dist/cli-entry.js +127 -0
  80. package/dist/cli-entry.js.map +1 -0
  81. package/dist/commands/assistant.d.ts +5 -0
  82. package/dist/commands/assistant.d.ts.map +1 -0
  83. package/dist/commands/assistant.js +1663 -0
  84. package/dist/commands/assistant.js.map +1 -0
  85. package/dist/commands/audit-command-helpers.d.ts +15 -0
  86. package/dist/commands/audit-command-helpers.d.ts.map +1 -0
  87. package/dist/commands/audit-command-helpers.js +24 -0
  88. package/dist/commands/audit-command-helpers.js.map +1 -0
  89. package/dist/commands/audit.d.ts +4 -0
  90. package/dist/commands/audit.d.ts.map +1 -0
  91. package/dist/commands/audit.js +107 -0
  92. package/dist/commands/audit.js.map +1 -0
  93. package/dist/commands/device.d.ts +4 -0
  94. package/dist/commands/device.d.ts.map +1 -0
  95. package/dist/commands/device.js +177 -0
  96. package/dist/commands/device.js.map +1 -0
  97. package/dist/commands/document.d.ts +4 -0
  98. package/dist/commands/document.d.ts.map +1 -0
  99. package/dist/commands/document.js +117 -0
  100. package/dist/commands/document.js.map +1 -0
  101. package/dist/commands/event.d.ts +4 -0
  102. package/dist/commands/event.d.ts.map +1 -0
  103. package/dist/commands/event.js +136 -0
  104. package/dist/commands/event.js.map +1 -0
  105. package/dist/commands/experiment.d.ts +4 -0
  106. package/dist/commands/experiment.d.ts.map +1 -0
  107. package/dist/commands/experiment.js +140 -0
  108. package/dist/commands/experiment.js.map +1 -0
  109. package/dist/commands/export-intake-read-helpers.d.ts +150 -0
  110. package/dist/commands/export-intake-read-helpers.d.ts.map +1 -0
  111. package/dist/commands/export-intake-read-helpers.js +328 -0
  112. package/dist/commands/export-intake-read-helpers.js.map +1 -0
  113. package/dist/commands/export.d.ts +4 -0
  114. package/dist/commands/export.d.ts.map +1 -0
  115. package/dist/commands/export.js +179 -0
  116. package/dist/commands/export.js.map +1 -0
  117. package/dist/commands/food.d.ts +4 -0
  118. package/dist/commands/food.d.ts.map +1 -0
  119. package/dist/commands/food.js +190 -0
  120. package/dist/commands/food.js.map +1 -0
  121. package/dist/commands/health-command-factory.d.ts +230 -0
  122. package/dist/commands/health-command-factory.d.ts.map +1 -0
  123. package/dist/commands/health-command-factory.js +551 -0
  124. package/dist/commands/health-command-factory.js.map +1 -0
  125. package/dist/commands/health-entity-command-registry.d.ts +27 -0
  126. package/dist/commands/health-entity-command-registry.d.ts.map +1 -0
  127. package/dist/commands/health-entity-command-registry.js +84 -0
  128. package/dist/commands/health-entity-command-registry.js.map +1 -0
  129. package/dist/commands/inbox.d.ts +5 -0
  130. package/dist/commands/inbox.d.ts.map +1 -0
  131. package/dist/commands/inbox.js +841 -0
  132. package/dist/commands/inbox.js.map +1 -0
  133. package/dist/commands/intake.d.ts +4 -0
  134. package/dist/commands/intake.d.ts.map +1 -0
  135. package/dist/commands/intake.js +175 -0
  136. package/dist/commands/intake.js.map +1 -0
  137. package/dist/commands/intervention.d.ts +4 -0
  138. package/dist/commands/intervention.d.ts.map +1 -0
  139. package/dist/commands/intervention.js +122 -0
  140. package/dist/commands/intervention.js.map +1 -0
  141. package/dist/commands/journal.d.ts +12 -0
  142. package/dist/commands/journal.d.ts.map +1 -0
  143. package/dist/commands/journal.js +186 -0
  144. package/dist/commands/journal.js.map +1 -0
  145. package/dist/commands/meal.d.ts +4 -0
  146. package/dist/commands/meal.d.ts.map +1 -0
  147. package/dist/commands/meal.js +123 -0
  148. package/dist/commands/meal.js.map +1 -0
  149. package/dist/commands/profile.d.ts +4 -0
  150. package/dist/commands/profile.d.ts.map +1 -0
  151. package/dist/commands/profile.js +62 -0
  152. package/dist/commands/profile.js.map +1 -0
  153. package/dist/commands/protocol.d.ts +4 -0
  154. package/dist/commands/protocol.d.ts.map +1 -0
  155. package/dist/commands/protocol.js +79 -0
  156. package/dist/commands/protocol.js.map +1 -0
  157. package/dist/commands/provider.d.ts +4 -0
  158. package/dist/commands/provider.d.ts.map +1 -0
  159. package/dist/commands/provider.js +115 -0
  160. package/dist/commands/provider.js.map +1 -0
  161. package/dist/commands/read.d.ts +4 -0
  162. package/dist/commands/read.d.ts.map +1 -0
  163. package/dist/commands/read.js +55 -0
  164. package/dist/commands/read.js.map +1 -0
  165. package/dist/commands/recipe.d.ts +4 -0
  166. package/dist/commands/recipe.d.ts.map +1 -0
  167. package/dist/commands/recipe.js +116 -0
  168. package/dist/commands/recipe.js.map +1 -0
  169. package/dist/commands/record-mutation-command-helpers.d.ts +196 -0
  170. package/dist/commands/record-mutation-command-helpers.d.ts.map +1 -0
  171. package/dist/commands/record-mutation-command-helpers.js +150 -0
  172. package/dist/commands/record-mutation-command-helpers.js.map +1 -0
  173. package/dist/commands/research.d.ts +3 -0
  174. package/dist/commands/research.d.ts.map +1 -0
  175. package/dist/commands/research.js +104 -0
  176. package/dist/commands/research.js.map +1 -0
  177. package/dist/commands/sample-batch-command-helpers.d.ts +24 -0
  178. package/dist/commands/sample-batch-command-helpers.d.ts.map +1 -0
  179. package/dist/commands/sample-batch-command-helpers.js +99 -0
  180. package/dist/commands/sample-batch-command-helpers.js.map +1 -0
  181. package/dist/commands/sample-import-command-helpers.d.ts +24 -0
  182. package/dist/commands/sample-import-command-helpers.d.ts.map +1 -0
  183. package/dist/commands/sample-import-command-helpers.js +49 -0
  184. package/dist/commands/sample-import-command-helpers.js.map +1 -0
  185. package/dist/commands/sample-query-command-helpers.d.ts +11 -0
  186. package/dist/commands/sample-query-command-helpers.d.ts.map +1 -0
  187. package/dist/commands/sample-query-command-helpers.js +26 -0
  188. package/dist/commands/sample-query-command-helpers.js.map +1 -0
  189. package/dist/commands/samples.d.ts +4 -0
  190. package/dist/commands/samples.d.ts.map +1 -0
  191. package/dist/commands/samples.js +261 -0
  192. package/dist/commands/samples.js.map +1 -0
  193. package/dist/commands/search.d.ts +4 -0
  194. package/dist/commands/search.d.ts.map +1 -0
  195. package/dist/commands/search.js +295 -0
  196. package/dist/commands/search.js.map +1 -0
  197. package/dist/commands/supplement.d.ts +4 -0
  198. package/dist/commands/supplement.d.ts.map +1 -0
  199. package/dist/commands/supplement.js +338 -0
  200. package/dist/commands/supplement.js.map +1 -0
  201. package/dist/commands/vault.d.ts +4 -0
  202. package/dist/commands/vault.d.ts.map +1 -0
  203. package/dist/commands/vault.js +164 -0
  204. package/dist/commands/vault.js.map +1 -0
  205. package/dist/commands/workout.d.ts +4 -0
  206. package/dist/commands/workout.d.ts.map +1 -0
  207. package/dist/commands/workout.js +284 -0
  208. package/dist/commands/workout.js.map +1 -0
  209. package/dist/incur.generated.d.ts +2164 -0
  210. package/dist/incur.generated.d.ts.map +1 -0
  211. package/dist/incur.generated.js +2 -0
  212. package/dist/incur.generated.js.map +1 -0
  213. package/dist/index.d.ts +13 -0
  214. package/dist/index.d.ts.map +1 -0
  215. package/dist/index.js +14 -0
  216. package/dist/index.js.map +1 -0
  217. package/dist/research-cli-contracts.d.ts +22 -0
  218. package/dist/research-cli-contracts.d.ts.map +1 -0
  219. package/dist/research-cli-contracts.js +18 -0
  220. package/dist/research-cli-contracts.js.map +1 -0
  221. package/dist/research-runtime.d.ts +79 -0
  222. package/dist/research-runtime.d.ts.map +1 -0
  223. package/dist/research-runtime.js +351 -0
  224. package/dist/research-runtime.js.map +1 -0
  225. package/dist/run-terminal-logging.d.ts +12 -0
  226. package/dist/run-terminal-logging.d.ts.map +1 -0
  227. package/dist/run-terminal-logging.js +323 -0
  228. package/dist/run-terminal-logging.js.map +1 -0
  229. package/dist/setup-agentmail.d.ts +30 -0
  230. package/dist/setup-agentmail.d.ts.map +1 -0
  231. package/dist/setup-agentmail.js +136 -0
  232. package/dist/setup-agentmail.js.map +1 -0
  233. package/dist/setup-assistant-account.d.ts +29 -0
  234. package/dist/setup-assistant-account.d.ts.map +1 -0
  235. package/dist/setup-assistant-account.js +443 -0
  236. package/dist/setup-assistant-account.js.map +1 -0
  237. package/dist/setup-assistant.d.ts +34 -0
  238. package/dist/setup-assistant.d.ts.map +1 -0
  239. package/dist/setup-assistant.js +355 -0
  240. package/dist/setup-assistant.js.map +1 -0
  241. package/dist/setup-cli.d.ts +72 -0
  242. package/dist/setup-cli.d.ts.map +1 -0
  243. package/dist/setup-cli.js +387 -0
  244. package/dist/setup-cli.js.map +1 -0
  245. package/dist/setup-services/channels.d.ts +19 -0
  246. package/dist/setup-services/channels.d.ts.map +1 -0
  247. package/dist/setup-services/channels.js +721 -0
  248. package/dist/setup-services/channels.js.map +1 -0
  249. package/dist/setup-services/process.d.ts +18 -0
  250. package/dist/setup-services/process.d.ts.map +1 -0
  251. package/dist/setup-services/process.js +98 -0
  252. package/dist/setup-services/process.js.map +1 -0
  253. package/dist/setup-services/scheduled-updates.d.ts +9 -0
  254. package/dist/setup-services/scheduled-updates.d.ts.map +1 -0
  255. package/dist/setup-services/scheduled-updates.js +64 -0
  256. package/dist/setup-services/scheduled-updates.js.map +1 -0
  257. package/dist/setup-services/shell.d.ts +18 -0
  258. package/dist/setup-services/shell.d.ts.map +1 -0
  259. package/dist/setup-services/shell.js +447 -0
  260. package/dist/setup-services/shell.js.map +1 -0
  261. package/dist/setup-services/steps.d.ts +39 -0
  262. package/dist/setup-services/steps.d.ts.map +1 -0
  263. package/dist/setup-services/steps.js +86 -0
  264. package/dist/setup-services/steps.js.map +1 -0
  265. package/dist/setup-services/toolchain.d.ts +46 -0
  266. package/dist/setup-services/toolchain.d.ts.map +1 -0
  267. package/dist/setup-services/toolchain.js +232 -0
  268. package/dist/setup-services/toolchain.js.map +1 -0
  269. package/dist/setup-services.d.ts +44 -0
  270. package/dist/setup-services.d.ts.map +1 -0
  271. package/dist/setup-services.js +739 -0
  272. package/dist/setup-services.js.map +1 -0
  273. package/dist/setup-wizard.d.ts +101 -0
  274. package/dist/setup-wizard.d.ts.map +1 -0
  275. package/dist/setup-wizard.js +1458 -0
  276. package/dist/setup-wizard.js.map +1 -0
  277. package/dist/usecases/intervention.d.ts +63 -0
  278. package/dist/usecases/intervention.d.ts.map +1 -0
  279. package/dist/usecases/intervention.js +205 -0
  280. package/dist/usecases/intervention.js.map +1 -0
  281. package/dist/usecases/text-duration.d.ts +4 -0
  282. package/dist/usecases/text-duration.d.ts.map +1 -0
  283. package/dist/usecases/text-duration.js +63 -0
  284. package/dist/usecases/text-duration.js.map +1 -0
  285. package/dist/usecases/workout-format.d.ts +139 -0
  286. package/dist/usecases/workout-format.d.ts.map +1 -0
  287. package/dist/usecases/workout-format.js +445 -0
  288. package/dist/usecases/workout-format.js.map +1 -0
  289. package/dist/usecases/workout.d.ts +94 -0
  290. package/dist/usecases/workout.d.ts.map +1 -0
  291. package/dist/usecases/workout.js +411 -0
  292. package/dist/usecases/workout.js.map +1 -0
  293. package/dist/vault-cli-command-manifest.d.ts +562 -0
  294. package/dist/vault-cli-command-manifest.d.ts.map +1 -0
  295. package/dist/vault-cli-command-manifest.js +759 -0
  296. package/dist/vault-cli-command-manifest.js.map +1 -0
  297. package/dist/vault-cli.d.ts +6 -0
  298. package/dist/vault-cli.d.ts.map +1 -0
  299. package/dist/vault-cli.js +38 -0
  300. package/dist/vault-cli.js.map +1 -0
  301. package/package.json +85 -0
@@ -0,0 +1,295 @@
1
+ import { Cli, z } from 'incur';
2
+ import { emptyArgsSchema, withBaseOptions } from '@murphai/assistant-core/command-helpers';
3
+ import { ALL_QUERY_ENTITY_FAMILIES, loadQueryRuntime, } from '@murphai/assistant-core/query-runtime';
4
+ import { isoTimestampSchema, localDateSchema, pathSchema, slugSchema, } from '@murphai/assistant-core/vault-cli-contracts';
5
+ import { VaultCliError } from '@murphai/assistant-core/vault-cli-errors';
6
+ import { normalizeRepeatableEnumFlagOption, normalizeRepeatableFlagOption, } from '@murphai/assistant-core/option-utils';
7
+ const recordTypeValues = ALL_QUERY_ENTITY_FAMILIES;
8
+ const timelineEntryTypeValues = [
9
+ 'assessment',
10
+ 'history',
11
+ 'journal',
12
+ 'profile_snapshot',
13
+ 'event',
14
+ 'sample_summary',
15
+ ];
16
+ const searchBackendValues = ['auto', 'scan', 'sqlite'];
17
+ const searchHitSchema = z.object({
18
+ recordId: z.string().min(1),
19
+ aliasIds: z.array(z.string().min(1)),
20
+ recordType: z.enum(recordTypeValues),
21
+ kind: z.string().min(1).nullable(),
22
+ stream: z.string().min(1).nullable(),
23
+ title: z.string().min(1).nullable(),
24
+ occurredAt: z.string().min(1).nullable(),
25
+ date: localDateSchema.nullable(),
26
+ experimentSlug: z.string().min(1).nullable(),
27
+ tags: z.array(z.string().min(1)),
28
+ path: pathSchema,
29
+ snippet: z.string(),
30
+ score: z.number(),
31
+ matchedTerms: z.array(z.string().min(1)),
32
+ citation: z.object({
33
+ path: pathSchema,
34
+ recordId: z.string().min(1),
35
+ aliasIds: z.array(z.string().min(1)),
36
+ }),
37
+ });
38
+ const searchResultSchema = z.object({
39
+ vault: pathSchema,
40
+ query: z.string().min(1),
41
+ filters: z.object({
42
+ text: z.string().min(1),
43
+ backend: z.enum(searchBackendValues),
44
+ recordTypes: z.array(z.enum(recordTypeValues)),
45
+ kinds: z.array(z.string().min(1)),
46
+ streams: z.array(z.string().min(1)),
47
+ experiment: slugSchema.nullable(),
48
+ from: localDateSchema.nullable(),
49
+ to: localDateSchema.nullable(),
50
+ tags: z.array(z.string().min(1)),
51
+ limit: z.number().int().positive().max(200),
52
+ }),
53
+ total: z.number().int().nonnegative(),
54
+ hits: z.array(searchHitSchema),
55
+ });
56
+ const timelineEntrySchema = z.object({
57
+ id: z.string().min(1),
58
+ entryType: z.enum(timelineEntryTypeValues),
59
+ occurredAt: z.string().min(1),
60
+ date: localDateSchema,
61
+ title: z.string().min(1),
62
+ kind: z.string().min(1),
63
+ stream: z.string().min(1).nullable(),
64
+ experimentSlug: z.string().min(1).nullable(),
65
+ path: pathSchema.nullable(),
66
+ relatedIds: z.array(z.string().min(1)),
67
+ tags: z.array(z.string().min(1)),
68
+ data: z.record(z.string(), z.unknown()),
69
+ });
70
+ const timelineResultSchema = z.object({
71
+ vault: pathSchema,
72
+ filters: z.object({
73
+ from: localDateSchema.nullable(),
74
+ to: localDateSchema.nullable(),
75
+ experiment: slugSchema.nullable(),
76
+ kinds: z.array(z.string().min(1)),
77
+ streams: z.array(z.string().min(1)),
78
+ entryTypes: z.array(z.enum(timelineEntryTypeValues)),
79
+ limit: z.number().int().positive().max(500),
80
+ }),
81
+ items: z.array(timelineEntrySchema),
82
+ });
83
+ const searchIndexStatusSchema = z.object({
84
+ vault: pathSchema,
85
+ backend: z.literal('sqlite'),
86
+ dbPath: pathSchema,
87
+ exists: z.boolean(),
88
+ schemaVersion: z.string().min(1).nullable(),
89
+ indexedAt: isoTimestampSchema.nullable(),
90
+ documentCount: z.number().int().nonnegative(),
91
+ });
92
+ const searchIndexRebuildSchema = searchIndexStatusSchema.extend({
93
+ rebuilt: z.literal(true),
94
+ });
95
+ export function registerSearchCommands(cli, _services) {
96
+ const search = Cli.create('search', {
97
+ description: 'Search commands for the local read model and the optional SQLite lexical index.',
98
+ });
99
+ search.command('query', {
100
+ description: 'Search the local read model with lexical scoring and optional SQLite-backed candidate retrieval.',
101
+ args: emptyArgsSchema,
102
+ options: withBaseOptions({
103
+ text: z
104
+ .string()
105
+ .min(1)
106
+ .optional()
107
+ .describe('Search text to run across titles, notes, tags, ids, and record payloads.'),
108
+ backend: z
109
+ .enum(searchBackendValues)
110
+ .optional()
111
+ .describe('Retrieval backend. Defaults to `auto`, which prefers SQLite when an index exists and otherwise falls back to the scan backend.'),
112
+ recordType: z
113
+ .array(z.string().min(1))
114
+ .optional()
115
+ .describe('Optional record families. Repeat --record-type for multiple values: core, experiment, journal, event, sample, audit, assessment, profile_snapshot, current_profile, goal, condition, allergy, protocol, history, family, genetics.'),
116
+ kind: z
117
+ .array(z.string().min(1))
118
+ .optional()
119
+ .describe('Optional record kinds such as meal, note, document, or journal_day. Repeat --kind for multiple values.'),
120
+ stream: z
121
+ .array(z.string().min(1))
122
+ .optional()
123
+ .describe('Optional sample streams; setting this also opts sample rows into search. Repeat --stream for multiple values.'),
124
+ experiment: slugSchema
125
+ .optional()
126
+ .describe('Optional experiment slug filter.'),
127
+ from: localDateSchema
128
+ .optional()
129
+ .describe('Inclusive lower date bound.'),
130
+ to: localDateSchema
131
+ .optional()
132
+ .describe('Inclusive upper date bound.'),
133
+ tag: z
134
+ .array(z.string().min(1))
135
+ .optional()
136
+ .describe('Optional tags that matching records must contain. Repeat --tag for multiple values.'),
137
+ limit: z
138
+ .number()
139
+ .int()
140
+ .positive()
141
+ .max(200)
142
+ .default(20)
143
+ .describe('Maximum number of hits to return.'),
144
+ }),
145
+ output: searchResultSchema,
146
+ async run({ options }) {
147
+ const query = await loadQueryRuntime();
148
+ const text = options.text?.trim();
149
+ if (!text) {
150
+ throw new VaultCliError('invalid_query', 'Search text is required for `search query`.');
151
+ }
152
+ const recordTypes = normalizeRepeatableEnumFlagOption(options.recordType, 'record-type', recordTypeValues) ?? [];
153
+ const kinds = normalizeRepeatableFlagOption(options.kind, 'kind') ?? [];
154
+ const streams = normalizeRepeatableFlagOption(options.stream, 'stream') ?? [];
155
+ const tags = normalizeRepeatableFlagOption(options.tag, 'tag') ?? [];
156
+ const backend = options.backend ?? 'auto';
157
+ const result = await query.searchVaultRuntime(options.vault, text, {
158
+ recordTypes: recordTypes.length > 0 ? recordTypes : undefined,
159
+ kinds: kinds.length > 0 ? kinds : undefined,
160
+ streams: streams.length > 0 ? streams : undefined,
161
+ experimentSlug: options.experiment,
162
+ from: options.from,
163
+ to: options.to,
164
+ tags: tags.length > 0 ? tags : undefined,
165
+ limit: options.limit,
166
+ }, { backend });
167
+ return {
168
+ vault: options.vault,
169
+ query: result.query,
170
+ filters: {
171
+ text,
172
+ backend,
173
+ recordTypes,
174
+ kinds,
175
+ streams,
176
+ experiment: options.experiment ?? null,
177
+ from: options.from ?? null,
178
+ to: options.to ?? null,
179
+ tags,
180
+ limit: options.limit,
181
+ },
182
+ total: result.total,
183
+ hits: result.hits,
184
+ };
185
+ },
186
+ });
187
+ const index = Cli.create('index', {
188
+ description: 'Inspect and rebuild the optional SQLite lexical search index.',
189
+ });
190
+ index.command('status', {
191
+ description: 'Show the current SQLite lexical search index status.',
192
+ args: emptyArgsSchema,
193
+ options: withBaseOptions(),
194
+ output: searchIndexStatusSchema,
195
+ async run({ options }) {
196
+ const query = await loadQueryRuntime();
197
+ const status = query.getSqliteSearchStatus(options.vault);
198
+ return {
199
+ vault: options.vault,
200
+ ...status,
201
+ };
202
+ },
203
+ });
204
+ index.command('rebuild', {
205
+ description: 'Rebuild the SQLite lexical search index from the current read model.',
206
+ args: emptyArgsSchema,
207
+ options: withBaseOptions(),
208
+ output: searchIndexRebuildSchema,
209
+ async run({ options }) {
210
+ const query = await loadQueryRuntime();
211
+ const rebuilt = await query.rebuildSqliteSearchIndex(options.vault);
212
+ return {
213
+ vault: options.vault,
214
+ ...rebuilt,
215
+ };
216
+ },
217
+ });
218
+ search.command(index);
219
+ cli.command(search);
220
+ cli.command('timeline', {
221
+ description: 'Build a descending timeline from journals, events, assessments, health history, profile snapshots, and daily sample summaries.',
222
+ args: emptyArgsSchema,
223
+ options: withBaseOptions({
224
+ from: localDateSchema
225
+ .optional()
226
+ .describe('Inclusive lower date bound.'),
227
+ to: localDateSchema
228
+ .optional()
229
+ .describe('Inclusive upper date bound.'),
230
+ experiment: slugSchema
231
+ .optional()
232
+ .describe('Optional experiment slug filter.'),
233
+ kind: z
234
+ .array(z.string().min(1))
235
+ .optional()
236
+ .describe('Optional entry kinds such as meal, note, journal_day, or sample_summary. Repeat --kind for multiple values.'),
237
+ stream: z
238
+ .array(z.string().min(1))
239
+ .optional()
240
+ .describe('Optional streams; applies to sample summaries and any stream-carrying events. Repeat --stream for multiple values.'),
241
+ entryType: z
242
+ .array(z.string().min(1))
243
+ .optional()
244
+ .describe('Optional entry types: journal, event, assessment, history, profile_snapshot, sample_summary. Repeat --entry-type for multiple values.'),
245
+ limit: z
246
+ .number()
247
+ .int()
248
+ .positive()
249
+ .max(500)
250
+ .default(200)
251
+ .describe('Maximum number of timeline entries to return.'),
252
+ }),
253
+ output: timelineResultSchema,
254
+ async run({ options }) {
255
+ const kinds = normalizeRepeatableFlagOption(options.kind, 'kind') ?? [];
256
+ const streams = normalizeRepeatableFlagOption(options.stream, 'stream') ?? [];
257
+ const entryTypes = normalizeRepeatableEnumFlagOption(options.entryType, 'entry-type', timelineEntryTypeValues) ?? [];
258
+ const entryTypeSet = entryTypes.length > 0 ? new Set(entryTypes) : null;
259
+ const query = await loadQueryRuntime();
260
+ const vault = await query.readVault(options.vault);
261
+ const items = query.buildTimeline(vault, {
262
+ from: options.from,
263
+ to: options.to,
264
+ experimentSlug: options.experiment,
265
+ kinds: kinds.length > 0 ? kinds : undefined,
266
+ streams: streams.length > 0 ? streams : undefined,
267
+ includeJournal: entryTypeSet ? entryTypeSet.has('journal') : true,
268
+ includeEvents: entryTypeSet ? entryTypeSet.has('event') : true,
269
+ includeAssessments: entryTypeSet ? entryTypeSet.has('assessment') : true,
270
+ includeHistory: entryTypeSet ? entryTypeSet.has('history') : true,
271
+ includeProfileSnapshots: entryTypeSet
272
+ ? entryTypeSet.has('profile_snapshot')
273
+ : true,
274
+ includeDailySampleSummaries: entryTypeSet
275
+ ? entryTypeSet.has('sample_summary')
276
+ : true,
277
+ limit: options.limit,
278
+ });
279
+ return {
280
+ vault: options.vault,
281
+ filters: {
282
+ from: options.from ?? null,
283
+ to: options.to ?? null,
284
+ experiment: options.experiment ?? null,
285
+ kinds,
286
+ streams,
287
+ entryTypes,
288
+ limit: options.limit,
289
+ },
290
+ items: items,
291
+ };
292
+ },
293
+ });
294
+ }
295
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Cli } from "incur";
2
+ import type { VaultServices } from "@murphai/assistant-core/vault-services";
3
+ export declare function registerSupplementCommands(cli: Cli.Cli, services: VaultServices): void;
4
+ //# sourceMappingURL=supplement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supplement.d.ts","sourceRoot":"","sources":["../../src/commands/supplement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAK,MAAM,OAAO,CAAA;AAY9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAiF3E,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,GAAG,CAAC,GAAG,EACZ,QAAQ,EAAE,aAAa,QA6QxB"}
@@ -0,0 +1,338 @@
1
+ import { Cli, z } from "incur";
2
+ import { requestIdFromOptions, withBaseOptions } from "@murphai/assistant-core/command-helpers";
3
+ import { createHealthScaffoldResultSchema, healthListResultSchema, healthShowResultSchema, } from "@murphai/assistant-core/health-cli-descriptors";
4
+ import { createRegistryDocEntityGroup, suggestedCommandsCta, } from "./health-command-factory.js";
5
+ import { localDateSchema, pathSchema } from "@murphai/assistant-core/vault-cli-contracts";
6
+ const limitOptionSchema = z.number().int().positive().max(200).default(50);
7
+ const supplementSlugSchema = z
8
+ .string()
9
+ .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/u, 'Expected a lowercase kebab-case slug.');
10
+ const statusOptionSchema = z
11
+ .string()
12
+ .min(1)
13
+ .optional()
14
+ .describe('Optional supplement status to filter by.');
15
+ const compoundStatusOptionSchema = z
16
+ .string()
17
+ .min(1)
18
+ .optional()
19
+ .describe('Optional supplement status to filter by. Defaults to active for compound rollups.');
20
+ const supplementUpsertResultSchema = z.object({
21
+ vault: pathSchema,
22
+ protocolId: z.string().min(1),
23
+ lookupId: z.string().min(1),
24
+ path: pathSchema.optional(),
25
+ created: z.boolean(),
26
+ });
27
+ const stopResultSchema = z.object({
28
+ vault: pathSchema,
29
+ protocolId: z.string().min(1),
30
+ lookupId: z.string().min(1),
31
+ stoppedOn: localDateSchema.nullable(),
32
+ status: z.string().min(1),
33
+ });
34
+ const compoundSourceSchema = z.object({
35
+ supplementId: z.string().min(1),
36
+ supplementSlug: z.string().min(1),
37
+ supplementTitle: z.string().nullable(),
38
+ brand: z.string().nullable(),
39
+ manufacturer: z.string().nullable(),
40
+ status: z.string().nullable(),
41
+ label: z.string().nullable(),
42
+ amount: z.number().nonnegative().nullable(),
43
+ unit: z.string().nullable(),
44
+ note: z.string().nullable(),
45
+ });
46
+ const compoundTotalSchema = z.object({
47
+ unit: z.string().nullable(),
48
+ totalAmount: z.number().nonnegative().nullable(),
49
+ sourceCount: z.number().int().nonnegative(),
50
+ incomplete: z.boolean(),
51
+ });
52
+ const compoundRecordSchema = z.object({
53
+ compound: z.string().min(1),
54
+ lookupId: z.string().min(1),
55
+ totals: z.array(compoundTotalSchema),
56
+ supplementCount: z.number().int().nonnegative(),
57
+ supplementIds: z.array(z.string().min(1)),
58
+ sources: z.array(compoundSourceSchema),
59
+ });
60
+ const compoundFiltersSchema = z.object({
61
+ status: z.string().min(1),
62
+ limit: z.number().int().positive().max(200).optional(),
63
+ });
64
+ const compoundShowResultSchema = z.object({
65
+ vault: pathSchema,
66
+ filters: compoundFiltersSchema,
67
+ compound: compoundRecordSchema,
68
+ });
69
+ const compoundListResultSchema = z.object({
70
+ vault: pathSchema,
71
+ filters: compoundFiltersSchema,
72
+ items: z.array(compoundRecordSchema),
73
+ count: z.number().int().nonnegative(),
74
+ nextCursor: z.string().min(1).nullable(),
75
+ });
76
+ export function registerSupplementCommands(cli, services) {
77
+ const supplement = createRegistryDocEntityGroup({
78
+ commandName: 'supplement',
79
+ description: 'Supplement product commands plus a derived active-compound ledger.',
80
+ scaffold: {
81
+ name: 'scaffold',
82
+ args: z.object({}),
83
+ description: 'Emit a payload template for one supplement product.',
84
+ examples: [
85
+ {
86
+ description: 'Print a template supplement payload.',
87
+ options: {
88
+ vault: './vault',
89
+ },
90
+ },
91
+ ],
92
+ hint: 'The supplement payload supports product metadata plus an ingredients array for compound rollups.',
93
+ output: createHealthScaffoldResultSchema('supplement'),
94
+ async run({ options, requestId }) {
95
+ return services.core.scaffoldSupplement({
96
+ vault: options.vault,
97
+ requestId,
98
+ });
99
+ },
100
+ },
101
+ upsert: {
102
+ description: 'Upsert one supplement from a JSON payload file or stdin.',
103
+ examples: [
104
+ {
105
+ description: 'Upsert one supplement product from a JSON payload file.',
106
+ options: {
107
+ input: '@supplement.json',
108
+ vault: './vault',
109
+ },
110
+ },
111
+ ],
112
+ hint: '--input accepts @file.json or - so the CLI can load a supplement payload with product metadata and ingredients.',
113
+ output: supplementUpsertResultSchema,
114
+ async run(input) {
115
+ return services.core.upsertSupplement(input);
116
+ },
117
+ },
118
+ show: {
119
+ argName: 'id',
120
+ argSchema: z.string().min(1),
121
+ description: 'Show one supplement by canonical id or slug.',
122
+ examples: [
123
+ {
124
+ args: {
125
+ id: '<supplement-id>',
126
+ },
127
+ description: 'Show one saved supplement product.',
128
+ options: {
129
+ vault: './vault',
130
+ },
131
+ },
132
+ ],
133
+ hint: 'Use the canonical supplement id or the supplement slug.',
134
+ output: healthShowResultSchema,
135
+ async run(input) {
136
+ return services.query.showSupplement(input);
137
+ },
138
+ },
139
+ list: {
140
+ description: 'List supplements through the health read model.',
141
+ examples: [
142
+ {
143
+ description: 'List active supplements with a smaller page size.',
144
+ options: {
145
+ limit: 10,
146
+ status: 'active',
147
+ vault: './vault',
148
+ },
149
+ },
150
+ ],
151
+ hint: 'Use --status active to focus on current supplements or --limit to cap results.',
152
+ output: healthListResultSchema,
153
+ statusOption: statusOptionSchema,
154
+ async run(input) {
155
+ return services.query.listSupplements({
156
+ ...input,
157
+ limit: input.limit ?? 50,
158
+ });
159
+ },
160
+ },
161
+ });
162
+ supplement.command('stop', {
163
+ args: z.object({
164
+ protocolId: z.string().min(1),
165
+ }),
166
+ description: 'Stop one supplement while preserving its canonical id.',
167
+ examples: [
168
+ {
169
+ args: {
170
+ protocolId: '<supplement-id>',
171
+ },
172
+ description: 'Stop a supplement today.',
173
+ options: {
174
+ vault: './vault',
175
+ },
176
+ },
177
+ {
178
+ args: {
179
+ protocolId: '<supplement-id>',
180
+ },
181
+ description: 'Stop a supplement on a specific calendar day.',
182
+ options: {
183
+ stoppedOn: '2026-03-12',
184
+ vault: './vault',
185
+ },
186
+ },
187
+ ],
188
+ hint: 'Use the canonical supplement id so the stop event is attached to the existing supplement record.',
189
+ options: withBaseOptions({
190
+ stoppedOn: localDateSchema.optional(),
191
+ }),
192
+ output: stopResultSchema,
193
+ async run(context) {
194
+ const result = await services.core.stopSupplement({
195
+ protocolId: context.args.protocolId,
196
+ stoppedOn: context.options.stoppedOn,
197
+ vault: context.options.vault,
198
+ requestId: requestIdFromOptions(context.options),
199
+ });
200
+ return context.ok(result, {
201
+ cta: suggestedCommandsCta([
202
+ {
203
+ command: 'supplement show',
204
+ args: {
205
+ id: context.args.protocolId,
206
+ },
207
+ description: 'Show the stopped supplement record.',
208
+ options: {
209
+ vault: true,
210
+ },
211
+ },
212
+ {
213
+ command: 'supplement list',
214
+ description: 'List stopped supplements.',
215
+ options: {
216
+ status: 'stopped',
217
+ vault: true,
218
+ },
219
+ },
220
+ ]),
221
+ });
222
+ },
223
+ });
224
+ supplement.command('rename', {
225
+ args: z.object({
226
+ lookup: z.string().min(1).describe('Supplement id or slug to rename.'),
227
+ }),
228
+ description: 'Rename one supplement product while preserving its canonical id.',
229
+ examples: [
230
+ {
231
+ args: {
232
+ lookup: '<supplement-id>',
233
+ },
234
+ description: 'Rename a supplement and let the slug move with the new title.',
235
+ options: {
236
+ title: 'Morning Protein Drink',
237
+ vault: './vault',
238
+ },
239
+ },
240
+ ],
241
+ hint: 'Use the canonical supplement id or current slug; the CLI reuses the existing supplement record instead of creating a new one.',
242
+ options: withBaseOptions({
243
+ title: z.string().min(1).max(160).describe('New supplement title.'),
244
+ slug: supplementSlugSchema
245
+ .optional()
246
+ .describe('Optional stable slug override for the renamed supplement record.'),
247
+ }),
248
+ output: supplementUpsertResultSchema,
249
+ async run(context) {
250
+ return services.core.renameSupplement({
251
+ lookup: context.args.lookup,
252
+ title: context.options.title,
253
+ slug: context.options.slug,
254
+ vault: context.options.vault,
255
+ requestId: requestIdFromOptions(context.options),
256
+ });
257
+ },
258
+ });
259
+ const compound = Cli.create('compound', {
260
+ description: 'Derived canonical ledger of active compounds across supplements.',
261
+ });
262
+ compound.command('list', {
263
+ args: z.object({}),
264
+ description: 'List rolled-up supplement compounds across supplements.',
265
+ examples: [
266
+ {
267
+ description: 'List active compounds from current supplements.',
268
+ options: {
269
+ vault: './vault',
270
+ },
271
+ },
272
+ {
273
+ description: 'List stopped-supplement compounds with a smaller page size.',
274
+ options: {
275
+ limit: 10,
276
+ status: 'stopped',
277
+ vault: './vault',
278
+ },
279
+ },
280
+ ],
281
+ hint: 'The compound ledger defaults to active supplements so overlapping ingredients sum into a single canonical row.',
282
+ options: withBaseOptions({
283
+ limit: limitOptionSchema,
284
+ status: compoundStatusOptionSchema,
285
+ }),
286
+ output: compoundListResultSchema,
287
+ async run(context) {
288
+ return services.query.listSupplementCompounds({
289
+ limit: context.options.limit,
290
+ status: context.options.status,
291
+ vault: context.options.vault,
292
+ requestId: requestIdFromOptions(context.options),
293
+ });
294
+ },
295
+ });
296
+ compound.command('show', {
297
+ args: z.object({
298
+ compound: z.string().min(1),
299
+ }),
300
+ description: 'Show one rolled-up supplement compound by name or lookup id.',
301
+ examples: [
302
+ {
303
+ args: {
304
+ compound: 'vitamin-c',
305
+ },
306
+ description: 'Show one rolled-up compound by lookup id.',
307
+ options: {
308
+ vault: './vault',
309
+ },
310
+ },
311
+ {
312
+ args: {
313
+ compound: 'Magnesium',
314
+ },
315
+ description: 'Show one rolled-up compound by display name.',
316
+ options: {
317
+ vault: './vault',
318
+ },
319
+ },
320
+ ],
321
+ hint: 'Lookup ids are kebab-cased compound names derived from the canonical compound field.',
322
+ options: withBaseOptions({
323
+ status: compoundStatusOptionSchema,
324
+ }),
325
+ output: compoundShowResultSchema,
326
+ async run(context) {
327
+ return services.query.showSupplementCompound({
328
+ compound: context.args.compound,
329
+ status: context.options.status,
330
+ vault: context.options.vault,
331
+ requestId: requestIdFromOptions(context.options),
332
+ });
333
+ },
334
+ });
335
+ supplement.command(compound);
336
+ cli.command(supplement);
337
+ }
338
+ //# sourceMappingURL=supplement.js.map