@jbarket/loomai 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/CHANGELOG.md +475 -0
  2. package/LICENSE +661 -0
  3. package/README.md +702 -0
  4. package/assets/demo.cast +396 -0
  5. package/assets/skill/SKILL.md +192 -0
  6. package/dist/backends/embedding-runtime.d.ts +39 -0
  7. package/dist/backends/embedding-runtime.js +265 -0
  8. package/dist/backends/episodes.d.ts +36 -0
  9. package/dist/backends/episodes.js +126 -0
  10. package/dist/backends/fastembed.d.ts +18 -0
  11. package/dist/backends/fastembed.js +95 -0
  12. package/dist/backends/glob.d.ts +10 -0
  13. package/dist/backends/glob.js +16 -0
  14. package/dist/backends/index.d.ts +6 -0
  15. package/dist/backends/index.js +78 -0
  16. package/dist/backends/migrations.d.ts +38 -0
  17. package/dist/backends/migrations.js +157 -0
  18. package/dist/backends/mmr.d.ts +45 -0
  19. package/dist/backends/mmr.js +82 -0
  20. package/dist/backends/proposals.d.ts +65 -0
  21. package/dist/backends/proposals.js +182 -0
  22. package/dist/backends/recall-log.d.ts +42 -0
  23. package/dist/backends/recall-log.js +143 -0
  24. package/dist/backends/retry.d.ts +29 -0
  25. package/dist/backends/retry.js +60 -0
  26. package/dist/backends/salience.d.ts +57 -0
  27. package/dist/backends/salience.js +186 -0
  28. package/dist/backends/sqlite-knowledge.d.ts +37 -0
  29. package/dist/backends/sqlite-knowledge.js +788 -0
  30. package/dist/backends/sqlite-vec.d.ts +64 -0
  31. package/dist/backends/sqlite-vec.js +737 -0
  32. package/dist/backends/ttl.d.ts +24 -0
  33. package/dist/backends/ttl.js +50 -0
  34. package/dist/backends/types.d.ts +562 -0
  35. package/dist/backends/types.js +8 -0
  36. package/dist/blocks/harness.d.ts +45 -0
  37. package/dist/blocks/harness.js +142 -0
  38. package/dist/blocks/model.d.ts +4 -0
  39. package/dist/blocks/model.js +56 -0
  40. package/dist/blocks/types.d.ts +40 -0
  41. package/dist/blocks/types.js +34 -0
  42. package/dist/categories.d.ts +16 -0
  43. package/dist/categories.js +29 -0
  44. package/dist/cli/args.d.ts +21 -0
  45. package/dist/cli/args.js +47 -0
  46. package/dist/cli/bootstrap.d.ts +2 -0
  47. package/dist/cli/bootstrap.js +214 -0
  48. package/dist/cli/doctor.d.ts +2 -0
  49. package/dist/cli/doctor.js +206 -0
  50. package/dist/cli/forget.d.ts +2 -0
  51. package/dist/cli/forget.js +97 -0
  52. package/dist/cli/harness.d.ts +2 -0
  53. package/dist/cli/harness.js +91 -0
  54. package/dist/cli/index.d.ts +2 -0
  55. package/dist/cli/index.js +127 -0
  56. package/dist/cli/inject.d.ts +2 -0
  57. package/dist/cli/inject.js +298 -0
  58. package/dist/cli/install.d.ts +2 -0
  59. package/dist/cli/install.js +137 -0
  60. package/dist/cli/io.d.ts +14 -0
  61. package/dist/cli/io.js +63 -0
  62. package/dist/cli/knowledge.d.ts +2 -0
  63. package/dist/cli/knowledge.js +216 -0
  64. package/dist/cli/memory.d.ts +2 -0
  65. package/dist/cli/memory.js +608 -0
  66. package/dist/cli/migrate.d.ts +2 -0
  67. package/dist/cli/migrate.js +116 -0
  68. package/dist/cli/recall.d.ts +2 -0
  69. package/dist/cli/recall.js +91 -0
  70. package/dist/cli/remember.d.ts +2 -0
  71. package/dist/cli/remember.js +111 -0
  72. package/dist/cli/serve.d.ts +2 -0
  73. package/dist/cli/serve.js +71 -0
  74. package/dist/cli/subcommands.d.ts +7 -0
  75. package/dist/cli/subcommands.js +11 -0
  76. package/dist/cli/tui/multi-select.d.ts +53 -0
  77. package/dist/cli/tui/multi-select.js +116 -0
  78. package/dist/cli/update-identity.d.ts +2 -0
  79. package/dist/cli/update-identity.js +90 -0
  80. package/dist/cli/update.d.ts +2 -0
  81. package/dist/cli/update.js +87 -0
  82. package/dist/cli/wake.d.ts +2 -0
  83. package/dist/cli/wake.js +53 -0
  84. package/dist/clients.d.ts +8 -0
  85. package/dist/clients.js +63 -0
  86. package/dist/config.d.ts +59 -0
  87. package/dist/config.js +160 -0
  88. package/dist/index.d.ts +15 -0
  89. package/dist/index.js +75 -0
  90. package/dist/injection/harnesses.d.ts +17 -0
  91. package/dist/injection/harnesses.js +51 -0
  92. package/dist/injection/render.d.ts +17 -0
  93. package/dist/injection/render.js +50 -0
  94. package/dist/injection/writer.d.ts +25 -0
  95. package/dist/injection/writer.js +118 -0
  96. package/dist/install/harnesses.d.ts +26 -0
  97. package/dist/install/harnesses.js +90 -0
  98. package/dist/install/names.d.ts +16 -0
  99. package/dist/install/names.js +36 -0
  100. package/dist/install/render.d.ts +18 -0
  101. package/dist/install/render.js +42 -0
  102. package/dist/install/skill-source.d.ts +1 -0
  103. package/dist/install/skill-source.js +11 -0
  104. package/dist/path-safety.d.ts +19 -0
  105. package/dist/path-safety.js +62 -0
  106. package/dist/server.d.ts +8 -0
  107. package/dist/server.js +571 -0
  108. package/dist/tools/append-maintenance-log.d.ts +52 -0
  109. package/dist/tools/append-maintenance-log.js +103 -0
  110. package/dist/tools/archive.d.ts +2 -0
  111. package/dist/tools/archive.js +21 -0
  112. package/dist/tools/bootstrap.d.ts +11 -0
  113. package/dist/tools/bootstrap.js +161 -0
  114. package/dist/tools/dossier.d.ts +1 -0
  115. package/dist/tools/dossier.js +102 -0
  116. package/dist/tools/eurorack-import.d.ts +47 -0
  117. package/dist/tools/eurorack-import.js +199 -0
  118. package/dist/tools/find-similar.d.ts +3 -0
  119. package/dist/tools/find-similar.js +26 -0
  120. package/dist/tools/forget.d.ts +6 -0
  121. package/dist/tools/forget.js +70 -0
  122. package/dist/tools/harness.d.ts +18 -0
  123. package/dist/tools/harness.js +54 -0
  124. package/dist/tools/identity-scaffold.d.ts +22 -0
  125. package/dist/tools/identity-scaffold.js +142 -0
  126. package/dist/tools/identity.d.ts +4 -0
  127. package/dist/tools/identity.js +226 -0
  128. package/dist/tools/knowledge-archive.d.ts +5 -0
  129. package/dist/tools/knowledge-archive.js +24 -0
  130. package/dist/tools/knowledge-history.d.ts +6 -0
  131. package/dist/tools/knowledge-history.js +55 -0
  132. package/dist/tools/knowledge-maintain.d.ts +9 -0
  133. package/dist/tools/knowledge-maintain.js +113 -0
  134. package/dist/tools/knowledge-merge.d.ts +8 -0
  135. package/dist/tools/knowledge-merge.js +40 -0
  136. package/dist/tools/knowledge-move.d.ts +10 -0
  137. package/dist/tools/knowledge-move.js +48 -0
  138. package/dist/tools/knowledge-purge.d.ts +5 -0
  139. package/dist/tools/knowledge-purge.js +20 -0
  140. package/dist/tools/knowledge-recall.d.ts +20 -0
  141. package/dist/tools/knowledge-recall.js +142 -0
  142. package/dist/tools/knowledge-restore.d.ts +4 -0
  143. package/dist/tools/knowledge-restore.js +24 -0
  144. package/dist/tools/knowledge-supersede.d.ts +6 -0
  145. package/dist/tools/knowledge-supersede.js +36 -0
  146. package/dist/tools/knowledge-verify.d.ts +8 -0
  147. package/dist/tools/knowledge-verify.js +39 -0
  148. package/dist/tools/knowledge-write.d.ts +25 -0
  149. package/dist/tools/knowledge-write.js +87 -0
  150. package/dist/tools/memory-audit.d.ts +3 -0
  151. package/dist/tools/memory-audit.js +47 -0
  152. package/dist/tools/memory-list.d.ts +4 -0
  153. package/dist/tools/memory-list.js +23 -0
  154. package/dist/tools/prune.d.ts +4 -0
  155. package/dist/tools/prune.js +28 -0
  156. package/dist/tools/recall.d.ts +4 -0
  157. package/dist/tools/recall.js +24 -0
  158. package/dist/tools/remember.d.ts +10 -0
  159. package/dist/tools/remember.js +43 -0
  160. package/dist/tools/restore.d.ts +2 -0
  161. package/dist/tools/restore.js +20 -0
  162. package/dist/tools/update-identity.d.ts +34 -0
  163. package/dist/tools/update-identity.js +194 -0
  164. package/dist/tools/update.d.ts +2 -0
  165. package/dist/tools/update.js +16 -0
  166. package/dist/transport/guards.d.ts +35 -0
  167. package/dist/transport/guards.js +107 -0
  168. package/dist/transport/http-server.d.ts +17 -0
  169. package/dist/transport/http-server.js +198 -0
  170. package/dist/transport/mcp-app-hello.d.ts +3 -0
  171. package/dist/transport/mcp-app-hello.js +66 -0
  172. package/dist/widgets/display-modes.html +131 -0
  173. package/dist/widgets/hello.html +138 -0
  174. package/dist/widgets/proposals.html +131 -0
  175. package/dist/widgets/top-of-mind.html +131 -0
  176. package/package.json +73 -0
@@ -0,0 +1,396 @@
1
+ {"version": 2, "width": 100, "height": 28, "timestamp": 1745433600, "title": "loom: install \u2192 wake \u2192 remember \u2192 recall"}
2
+ [0.5, "o", "\u001b[2J\u001b[H"]
3
+ [1.0, "o", "\u001b[2m# loom \u2014 persistent identity + memory for AI agents\u001b[0m"]
4
+ [1.0, "o", "\r\n"]
5
+ [1.08, "o", "\u001b[2m# demo: install \u2192 wake \u2192 remember \u2192 recall\u001b[0m"]
6
+ [1.08, "o", "\r\n"]
7
+ [1.88, "o", "\r\n"]
8
+ [2.48, "o", "\u001b[1;32m~\u001b[0m \u001b[1;34m$\u001b[0m "]
9
+ [2.55, "o", "n"]
10
+ [2.62, "o", "p"]
11
+ [2.69, "o", "x"]
12
+ [2.76, "o", " "]
13
+ [2.88, "o", "l"]
14
+ [2.95, "o", "o"]
15
+ [3.02, "o", "o"]
16
+ [3.09, "o", "m"]
17
+ [3.16, "o", "a"]
18
+ [3.23, "o", "i"]
19
+ [3.3, "o", " "]
20
+ [3.42, "o", "i"]
21
+ [3.49, "o", "n"]
22
+ [3.56, "o", "s"]
23
+ [3.63, "o", "t"]
24
+ [3.7, "o", "a"]
25
+ [3.77, "o", "l"]
26
+ [3.84, "o", "l"]
27
+ [3.91, "o", " "]
28
+ [4.03, "o", "-"]
29
+ [4.1, "o", "-"]
30
+ [4.17, "o", "h"]
31
+ [4.24, "o", "a"]
32
+ [4.31, "o", "r"]
33
+ [4.38, "o", "n"]
34
+ [4.45, "o", "e"]
35
+ [4.52, "o", "s"]
36
+ [4.59, "o", "s"]
37
+ [4.66, "o", " "]
38
+ [4.78, "o", "c"]
39
+ [4.85, "o", "l"]
40
+ [4.92, "o", "a"]
41
+ [4.99, "o", "u"]
42
+ [5.06, "o", "d"]
43
+ [5.13, "o", "e"]
44
+ [5.2, "o", "-"]
45
+ [5.27, "o", "c"]
46
+ [5.34, "o", "o"]
47
+ [5.41, "o", "d"]
48
+ [5.48, "o", "e"]
49
+ [5.88, "o", "\r\n"]
50
+ [6.98, "o", "\u001b[2mNeed to install the following packages:\u001b[0m"]
51
+ [6.98, "o", "\r\n"]
52
+ [7.04, "o", "\u001b[2m loomai@0.4.0-alpha.7\u001b[0m"]
53
+ [7.04, "o", "\r\n"]
54
+ [7.04, "o", "\u001b[2mOk to proceed? (y) \u001b[0m"]
55
+ [7.84, "o", "y"]
56
+ [7.84, "o", "\r\n"]
57
+ [8.34, "o", "\r\n"]
58
+ [8.54, "o", "\u001b[32m\u2714\u001b[0m Wrote \u001b[1;37m~/.claude/skills/loom-setup.md\u001b[0m"]
59
+ [8.54, "o", "\r\n"]
60
+ [8.64, "o", "\r\n"]
61
+ [8.74, "o", "\u001b[1mNext:\u001b[0m open Claude Code. \u001b[36m/loom-setup\u001b[0m."]
62
+ [8.74, "o", "\r\n"]
63
+ [8.82, "o", "\u001b[2mAfter the skill finishes, restart Claude Code (close and reopen).\u001b[0m"]
64
+ [8.82, "o", "\r\n"]
65
+ [8.82, "o", "\r\n"]
66
+ [11.12, "o", "\r\n"]
67
+ [11.12, "o", "\u001b[2m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m"]
68
+ [11.12, "o", "\r\n"]
69
+ [11.17, "o", "\u001b[2m Claude Code \u00b7 \u001b[1m/loom-setup\u001b[0m"]
70
+ [11.17, "o", "\r\n"]
71
+ [11.17, "o", "\u001b[2m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m"]
72
+ [11.17, "o", "\r\n"]
73
+ [11.67, "o", "\r\n"]
74
+ [12.47, "o", "\u001b[2mChecking environment...\u001b[0m"]
75
+ [13.67, "o", " \u001b[33mloom MCP not yet wired up (expected on first run)\u001b[0m"]
76
+ [14.07, "o", "\r\n"]
77
+ [14.37, "o", "\r\n"]
78
+ [14.47, "o", "\u001b[1mLet's set up your agent.\u001b[0m"]
79
+ [14.47, "o", "\r\n"]
80
+ [15.07, "o", "\r\n"]
81
+ [15.27, "o", "\u001b[1;37mAgent name:\u001b[0m "]
82
+ [16.89, "o", "a"]
83
+ [17.01, "o", "l"]
84
+ [17.13, "o", "e"]
85
+ [17.25, "o", "x"]
86
+ [17.25, "o", "\r\n"]
87
+ [17.85, "o", "\u001b[1;37mPurpose (one line):\u001b[0m "]
88
+ [19.72, "o", "P"]
89
+ [19.79, "o", "e"]
90
+ [19.86, "o", "r"]
91
+ [19.93, "o", "s"]
92
+ [20.0, "o", "o"]
93
+ [20.07, "o", "n"]
94
+ [20.14, "o", "a"]
95
+ [20.21, "o", "l"]
96
+ [20.28, "o", " "]
97
+ [20.4, "o", "a"]
98
+ [20.47, "o", "s"]
99
+ [20.54, "o", "s"]
100
+ [20.61, "o", "i"]
101
+ [20.68, "o", "s"]
102
+ [20.75, "o", "t"]
103
+ [20.82, "o", "a"]
104
+ [20.89, "o", "n"]
105
+ [20.96, "o", "t"]
106
+ [21.03, "o", " "]
107
+ [21.15, "o", "a"]
108
+ [21.22, "o", "n"]
109
+ [21.29, "o", "d"]
110
+ [21.36, "o", " "]
111
+ [21.48, "o", "c"]
112
+ [21.55, "o", "o"]
113
+ [21.62, "o", "d"]
114
+ [21.69, "o", "i"]
115
+ [21.76, "o", "n"]
116
+ [21.83, "o", "g"]
117
+ [21.9, "o", " "]
118
+ [22.02, "o", "p"]
119
+ [22.09, "o", "a"]
120
+ [22.16, "o", "r"]
121
+ [22.23, "o", "t"]
122
+ [22.3, "o", "n"]
123
+ [22.37, "o", "e"]
124
+ [22.44, "o", "r"]
125
+ [22.44, "o", "\r\n"]
126
+ [23.04, "o", "\u001b[1;37mVoice:\u001b[0m "]
127
+ [24.53, "o", "D"]
128
+ [24.62, "o", "i"]
129
+ [24.71, "o", "r"]
130
+ [24.8, "o", "e"]
131
+ [24.89, "o", "c"]
132
+ [24.98, "o", "t"]
133
+ [25.07, "o", ","]
134
+ [25.16, "o", " "]
135
+ [25.3, "o", "p"]
136
+ [25.39, "o", "r"]
137
+ [25.48, "o", "e"]
138
+ [25.57, "o", "c"]
139
+ [25.66, "o", "i"]
140
+ [25.75, "o", "s"]
141
+ [25.84, "o", "e"]
142
+ [25.93, "o", ","]
143
+ [26.02, "o", " "]
144
+ [26.16, "o", "a"]
145
+ [26.25, "o", " "]
146
+ [26.39, "o", "b"]
147
+ [26.48, "o", "i"]
148
+ [26.57, "o", "t"]
149
+ [26.66, "o", " "]
150
+ [26.8, "o", "d"]
151
+ [26.89, "o", "r"]
152
+ [26.98, "o", "y"]
153
+ [26.98, "o", "\r\n"]
154
+ [27.58, "o", "\u001b[1;37mClients (e.g. claude-code):\u001b[0m "]
155
+ [28.87, "o", "c"]
156
+ [28.96, "o", "l"]
157
+ [29.05, "o", "a"]
158
+ [29.14, "o", "u"]
159
+ [29.23, "o", "d"]
160
+ [29.32, "o", "e"]
161
+ [29.41, "o", "-"]
162
+ [29.5, "o", "c"]
163
+ [29.59, "o", "o"]
164
+ [29.68, "o", "d"]
165
+ [29.77, "o", "e"]
166
+ [29.77, "o", "\r\n"]
167
+ [30.37, "o", "\r\n"]
168
+ [31.07, "o", "\u001b[32m\u2714\u001b[0m Identity initialized for \u001b[1malex\u001b[0m"]
169
+ [31.07, "o", "\r\n"]
170
+ [31.22, "o", "\u001b[32m\u2714\u001b[0m \u001b[2mIDENTITY.md, preferences.md, self-model.md \u2192 ~/.config/loom/alex/\u001b[0m"]
171
+ [31.22, "o", "\r\n"]
172
+ [31.37, "o", "\u001b[32m\u2714\u001b[0m \u001b[2mMCP config written to ~/.mcp.json\u001b[0m"]
173
+ [31.37, "o", "\r\n"]
174
+ [31.52, "o", "\u001b[32m\u2714\u001b[0m \u001b[2m~/.claude/CLAUDE.md updated with identity pointer\u001b[0m"]
175
+ [31.52, "o", "\r\n"]
176
+ [31.92, "o", "\r\n"]
177
+ [32.02, "o", "\u001b[1;33mRestart Claude Code now to activate loom.\u001b[0m"]
178
+ [32.02, "o", "\r\n"]
179
+ [32.02, "o", "\r\n"]
180
+ [35.82, "o", "\r\n"]
181
+ [35.82, "o", "\u001b[2m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m"]
182
+ [35.82, "o", "\r\n"]
183
+ [35.87, "o", "\u001b[2m Claude Code \u00b7 new session\u001b[0m"]
184
+ [35.87, "o", "\r\n"]
185
+ [35.87, "o", "\u001b[2m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m"]
186
+ [35.87, "o", "\r\n"]
187
+ [36.37, "o", "\r\n"]
188
+ [37.07, "o", "\u001b[2m[mcp__loom__identity \u2192 loading alex's identity]\u001b[0m"]
189
+ [37.07, "o", "\r\n"]
190
+ [37.57, "o", "\r\n"]
191
+ [37.63, "o", "\u001b[1m# Identity\u001b[0m"]
192
+ [37.63, "o", "\r\n"]
193
+ [37.68, "o", ""]
194
+ [37.68, "o", "\r\n"]
195
+ [37.76, "o", "\u001b[1m# alex\u001b[0m"]
196
+ [37.76, "o", "\r\n"]
197
+ [37.84, "o", ""]
198
+ [37.84, "o", "\r\n"]
199
+ [37.92, "o", "Personal assistant and coding partner"]
200
+ [37.92, "o", "\r\n"]
201
+ [38.0, "o", ""]
202
+ [38.0, "o", "\r\n"]
203
+ [38.08, "o", "\u001b[1m## Voice\u001b[0m"]
204
+ [38.08, "o", "\r\n"]
205
+ [38.16, "o", ""]
206
+ [38.16, "o", "\r\n"]
207
+ [38.24, "o", "Direct, precise, a bit dry"]
208
+ [38.24, "o", "\r\n"]
209
+ [38.38, "o", ""]
210
+ [38.38, "o", "\r\n"]
211
+ [38.46, "o", "\u001b[2m---\u001b[0m"]
212
+ [38.46, "o", "\r\n"]
213
+ [38.54, "o", ""]
214
+ [38.54, "o", "\r\n"]
215
+ [38.62, "o", "\u001b[1m# Preferences\u001b[0m"]
216
+ [38.62, "o", "\r\n"]
217
+ [38.7, "o", ""]
218
+ [38.7, "o", "\r\n"]
219
+ [38.78, "o", "\u001b[1m# alex \u2014 Preferences\u001b[0m"]
220
+ [38.78, "o", "\r\n"]
221
+ [38.86, "o", ""]
222
+ [38.86, "o", "\r\n"]
223
+ [38.94, "o", "\u001b[2m*No initial preferences set.*\u001b[0m"]
224
+ [38.94, "o", "\r\n"]
225
+ [39.08, "o", ""]
226
+ [39.08, "o", "\r\n"]
227
+ [39.16, "o", "\u001b[2m---\u001b[0m"]
228
+ [39.16, "o", "\r\n"]
229
+ [39.24, "o", ""]
230
+ [39.24, "o", "\r\n"]
231
+ [39.32, "o", "\u001b[1m# Self-Model\u001b[0m"]
232
+ [39.32, "o", "\r\n"]
233
+ [39.4, "o", ""]
234
+ [39.4, "o", "\r\n"]
235
+ [39.48, "o", "\u001b[1m## Strengths\u001b[0m"]
236
+ [39.48, "o", "\r\n"]
237
+ [39.56, "o", "\u001b[2m*(Add your strengths as you discover them)*\u001b[0m"]
238
+ [39.56, "o", "\r\n"]
239
+ [42.86, "o", "\r\n"]
240
+ [42.86, "o", "\u001b[2m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m"]
241
+ [42.86, "o", "\r\n"]
242
+ [43.16, "o", "\r\n"]
243
+ [43.56, "o", "\u001b[1;32m~\u001b[0m \u001b[1;34m$\u001b[0m "]
244
+ [43.616, "o", "e"]
245
+ [43.672, "o", "c"]
246
+ [43.728, "o", "h"]
247
+ [43.784, "o", "o"]
248
+ [43.84, "o", " "]
249
+ [43.946, "o", "\""]
250
+ [44.002, "o", "P"]
251
+ [44.058, "o", "r"]
252
+ [44.114, "o", "e"]
253
+ [44.17, "o", "f"]
254
+ [44.226, "o", "e"]
255
+ [44.282, "o", "r"]
256
+ [44.338, "o", "s"]
257
+ [44.394, "o", " "]
258
+ [44.5, "o", "a"]
259
+ [44.556, "o", "s"]
260
+ [44.612, "o", "y"]
261
+ [44.668, "o", "n"]
262
+ [44.724, "o", "c"]
263
+ [44.78, "o", " "]
264
+ [44.886, "o", "p"]
265
+ [44.942, "o", "a"]
266
+ [44.998, "o", "i"]
267
+ [45.054, "o", "r"]
268
+ [45.11, "o", " "]
269
+ [45.216, "o", "p"]
270
+ [45.272, "o", "r"]
271
+ [45.328, "o", "o"]
272
+ [45.384, "o", "g"]
273
+ [45.44, "o", "r"]
274
+ [45.496, "o", "a"]
275
+ [45.552, "o", "m"]
276
+ [45.608, "o", "m"]
277
+ [45.664, "o", "i"]
278
+ [45.72, "o", "n"]
279
+ [45.776, "o", "g"]
280
+ [45.832, "o", " "]
281
+ [45.938, "o", "o"]
282
+ [45.994, "o", "n"]
283
+ [46.05, "o", " "]
284
+ [46.156, "o", "w"]
285
+ [46.212, "o", "e"]
286
+ [46.268, "o", "e"]
287
+ [46.324, "o", "k"]
288
+ [46.38, "o", "d"]
289
+ [46.436, "o", "a"]
290
+ [46.492, "o", "y"]
291
+ [46.548, "o", " "]
292
+ [46.654, "o", "e"]
293
+ [46.71, "o", "v"]
294
+ [46.766, "o", "e"]
295
+ [46.822, "o", "n"]
296
+ [46.878, "o", "i"]
297
+ [46.934, "o", "n"]
298
+ [46.99, "o", "g"]
299
+ [47.046, "o", "s"]
300
+ [47.102, "o", "\""]
301
+ [47.158, "o", " "]
302
+ [47.264, "o", "|"]
303
+ [47.32, "o", " "]
304
+ [47.426, "o", "l"]
305
+ [47.482, "o", "o"]
306
+ [47.538, "o", "o"]
307
+ [47.594, "o", "m"]
308
+ [47.65, "o", " "]
309
+ [47.756, "o", "r"]
310
+ [47.812, "o", "e"]
311
+ [47.868, "o", "m"]
312
+ [47.924, "o", "e"]
313
+ [47.98, "o", "m"]
314
+ [48.036, "o", "b"]
315
+ [48.092, "o", "e"]
316
+ [48.148, "o", "r"]
317
+ [48.204, "o", " "]
318
+ [48.31, "o", "\""]
319
+ [48.366, "o", "w"]
320
+ [48.422, "o", "o"]
321
+ [48.478, "o", "r"]
322
+ [48.534, "o", "k"]
323
+ [48.59, "o", "i"]
324
+ [48.646, "o", "n"]
325
+ [48.702, "o", "g"]
326
+ [48.758, "o", " "]
327
+ [48.864, "o", "s"]
328
+ [48.92, "o", "t"]
329
+ [48.976, "o", "y"]
330
+ [49.032, "o", "l"]
331
+ [49.088, "o", "e"]
332
+ [49.144, "o", "\""]
333
+ [49.2, "o", " "]
334
+ [49.306, "o", "-"]
335
+ [49.362, "o", "-"]
336
+ [49.418, "o", "c"]
337
+ [49.474, "o", "a"]
338
+ [49.53, "o", "t"]
339
+ [49.586, "o", "e"]
340
+ [49.642, "o", "g"]
341
+ [49.698, "o", "o"]
342
+ [49.754, "o", "r"]
343
+ [49.81, "o", "y"]
344
+ [49.866, "o", " "]
345
+ [49.972, "o", "u"]
346
+ [50.028, "o", "s"]
347
+ [50.084, "o", "e"]
348
+ [50.14, "o", "r"]
349
+ [50.54, "o", "\r\n"]
350
+ [51.34, "o", "\u001b[32mRemembered:\u001b[0m \u001b[2muser/working-style-a4f2c1\u001b[0m \u2014 \u001b[1mworking style\u001b[0m"]
351
+ [51.34, "o", "\r\n"]
352
+ [51.74, "o", "\r\n"]
353
+ [52.04, "o", "\u001b[1;32m~\u001b[0m \u001b[1;34m$\u001b[0m "]
354
+ [52.11, "o", "l"]
355
+ [52.18, "o", "o"]
356
+ [52.25, "o", "o"]
357
+ [52.32, "o", "m"]
358
+ [52.39, "o", " "]
359
+ [52.51, "o", "r"]
360
+ [52.58, "o", "e"]
361
+ [52.65, "o", "c"]
362
+ [52.72, "o", "a"]
363
+ [52.79, "o", "l"]
364
+ [52.86, "o", "l"]
365
+ [52.93, "o", " "]
366
+ [53.05, "o", "\""]
367
+ [53.12, "o", "p"]
368
+ [53.19, "o", "a"]
369
+ [53.26, "o", "i"]
370
+ [53.33, "o", "r"]
371
+ [53.4, "o", " "]
372
+ [53.52, "o", "p"]
373
+ [53.59, "o", "r"]
374
+ [53.66, "o", "o"]
375
+ [53.73, "o", "g"]
376
+ [53.8, "o", "r"]
377
+ [53.87, "o", "a"]
378
+ [53.94, "o", "m"]
379
+ [54.01, "o", "m"]
380
+ [54.08, "o", "i"]
381
+ [54.15, "o", "n"]
382
+ [54.22, "o", "g"]
383
+ [54.29, "o", "\""]
384
+ [54.69, "o", "\r\n"]
385
+ [55.59, "o", "Found \u001b[1m1\u001b[0m matching memory:"]
386
+ [55.59, "o", "\r\n"]
387
+ [55.89, "o", "\r\n"]
388
+ [55.89, "o", "\u001b[1m## working style\u001b[0m"]
389
+ [55.89, "o", "\r\n"]
390
+ [55.99, "o", "\u001b[2muser \u00b7 2026-04-23\u001b[0m"]
391
+ [55.99, "o", "\r\n"]
392
+ [56.09, "o", "\r\n"]
393
+ [56.19, "o", "Prefers async pair programming on weekday evenings"]
394
+ [56.19, "o", "\r\n"]
395
+ [56.69, "o", "\r\n"]
396
+ [57.09, "o", "\u001b[1;32m~\u001b[0m \u001b[1;34m$\u001b[0m "]
@@ -0,0 +1,192 @@
1
+ ---
2
+ name: loom-setup
3
+ description: Set up loom (persistent identity + memory) for this agent
4
+ ---
5
+
6
+ # loom-setup
7
+
8
+ You are installing and configuring loom — a persistent identity +
9
+ memory layer — for the user in the harness you're running in right
10
+ now. loom is already installed as a CLI (`loom` or `npx loom`). Your
11
+ job is to drive the first-run flow, with the user's consent, without
12
+ clobbering anything that already exists.
13
+
14
+ ## Ground rules
15
+
16
+ - **Existing agent dirs are inviolable.** If `~/.config/loom/<name>/`
17
+ has an `IDENTITY.md`, it belongs to a prior agent. Never overwrite
18
+ it. Never propose `--force`. If the user wants to replace an agent,
19
+ they remove the directory themselves.
20
+ - **Verify, don't assume.** Read harness config files before writing
21
+ to them. Re-read after writing. Finish with `loom wake --json`.
22
+ - **When you can do it, do it.** Don't ask the user to edit JSON by
23
+ hand if you can edit the file yourself. Don't print a config
24
+ snippet as advice when you can write it.
25
+
26
+ ## Step 1 — Probe the environment
27
+
28
+ Run: `loom doctor --json`
29
+
30
+ Parse the output. You'll see:
31
+
32
+ - `stackVersionOk`, `nodeOk`, `contextDirResolved`
33
+ - `existingAgents: [{ name, path, hasIdentity, hasMemoriesDb,
34
+ git: { initialized, hasRemote, dirty, gitignorePresent } }, ...]`
35
+
36
+ If `stackVersionOk` is false or `nodeOk` is false, stop and tell the
37
+ user what's wrong.
38
+
39
+ ## Step 2 — Decide: new agent or use existing
40
+
41
+ If `existingAgents` is non-empty, summarize them to the user:
42
+
43
+ > I see these agents already set up:
44
+ > - `myagent` at `~/.config/loom/myagent/` (has identity)
45
+ >
46
+ > Do you want to (a) use an existing one, (b) create a new one with a
47
+ > different name, or (c) stop?
48
+
49
+ - If they pick (a): set `LOOM_CONTEXT_DIR=<path>` and skip to Step 5
50
+ (you're just wiring this harness to an existing agent).
51
+ - If they pick (b): continue to Step 3 with a new name.
52
+ - If they pick (c): exit.
53
+
54
+ If `existingAgents` is empty, tell the user that and continue to
55
+ Step 3.
56
+
57
+ ## Step 3 — Interview
58
+
59
+ **Four questions. That is the whole interview.** Everything else a first
60
+ identity needs — what a persistent agent *is*, where its continuity lives,
61
+ how memory is tiered, the reflection loop, honesty about what it knows —
62
+ is written by `bootstrap` from a fixed scaffold. Don't ask about any of
63
+ it, and don't invent extra questions.
64
+
65
+ Ask one at a time, and **show the example before the question**. A cold
66
+ "what is this agent for?" gets a blank answer back.
67
+
68
+ **1. The user's name.**
69
+
70
+ > For example: `Jonathan`.
71
+ >
72
+ > What should this agent call you?
73
+
74
+ **2. The agent's name.**
75
+
76
+ > For example: `art`, `visual-mark`, `sage`.
77
+ >
78
+ > What do you want to call it?
79
+
80
+ Must be lowercase alphanumeric + hyphens, 1–64 chars, not a reserved word
81
+ (`current`, `default`, `config`, `backups`, `cache`, `tmp`, `shared`).
82
+ Re-ask on any collision with an existing dir.
83
+
84
+ **3. Purpose — one line.** What it exists to do.
85
+
86
+ > For example: *"Jonathan's primary assistant and the coordinator of all
87
+ > work — holds memory across sessions and runs parallel worker agents."*
88
+ >
89
+ > What is yours for?
90
+
91
+ **4. Voice — one line.** How it talks.
92
+
93
+ > For example: *"Direct. Brief when brief is right, thorough when the task
94
+ > demands it. Has opinions and pushes back — never a yes-machine."*
95
+ >
96
+ > How should it sound?
97
+
98
+ Two rules about the examples:
99
+
100
+ - They are a **shape, not a menu**. If the answer comes back as the example
101
+ with a name swapped in, ask once more for it in their own words. A copied
102
+ purpose line produces a copied agent, and this has actually happened.
103
+ - The answers are **theirs**. Pass them through verbatim. Don't polish them
104
+ into your own prose, and don't expand a one-liner into a paragraph.
105
+
106
+ The context dir will be `~/.config/loom/<name>/` unless the user
107
+ overrides.
108
+
109
+ ## Step 4 — Bootstrap
110
+
111
+ Run:
112
+
113
+ ```
114
+ echo '{"user":"<USER>","name":"<NAME>","purpose":"<PURPOSE>","voice":"<VOICE>"}' \
115
+ | loom bootstrap --context-dir ~/.config/loom/<NAME>
116
+ ```
117
+
118
+ This writes the full IDENTITY.md — the four answers at the top, the
119
+ structural scaffold below them — plus `preferences.md` seeded with the
120
+ user's name and `self-model.md`.
121
+
122
+ Then scaffold the harness manifest for this harness:
123
+
124
+ ```
125
+ loom harness init <HARNESS_KEY> --context-dir ~/.config/loom/<NAME>
126
+ ```
127
+
128
+ Where `<HARNESS_KEY>` is one of `claude-code`, `codex`, `gemini-cli`,
129
+ `opencode`.
130
+
131
+ ## Step 5 — Wire the harness's MCP config
132
+
133
+ This is the part only you can do safely, because the file path and
134
+ schema drift per vendor. Read the relevant config file for this
135
+ harness before writing anything.
136
+
137
+ Targets (Linux/macOS):
138
+
139
+ | harness | config file | env vars to set |
140
+ |-------------|----------------------------------------|----------------------------|
141
+ | claude-code | `~/.claude.json` or `.mcp.json` in cwd | `LOOM_CONTEXT_DIR`, `LOOM_CLIENT=claude-code`, `LOOM_MODEL` |
142
+ | codex | `~/.codex/config.toml` | same + `LOOM_CLIENT=codex` |
143
+ | gemini-cli | `~/.gemini/settings.json` | same + `LOOM_CLIENT=gemini-cli` |
144
+ | opencode | `~/.config/opencode/config.json` | same + `LOOM_CLIENT=opencode` |
145
+
146
+ Procedure:
147
+
148
+ 1. Read the current config file.
149
+ 2. Look for an existing `loom` entry under `mcpServers` (JSON) or
150
+ `[mcp_servers.loom]` (TOML). If one exists and points to the right
151
+ context dir, skip this step.
152
+ 3. If absent, add an entry that runs `loom serve` with the env vars
153
+ above. Use `loom` as the command (or `npx loom` if `loom` isn't on
154
+ PATH).
155
+ 4. Re-read the file to verify your edit took.
156
+
157
+ If the file format confuses you, stop and ask the user rather than
158
+ guess.
159
+
160
+ ## Step 6 — Inject identity pointer into the harness dotfile
161
+
162
+ Run:
163
+
164
+ ```
165
+ loom inject --harness <HARNESS_KEY> --context-dir ~/.config/loom/<NAME>
166
+ ```
167
+
168
+ This writes a marker-bounded block into the harness's CLAUDE.md /
169
+ AGENTS.md / GEMINI.md telling the agent to call the `identity` tool
170
+ on session start.
171
+
172
+ ## Step 7 — Verify
173
+
174
+ Run: `loom wake --json --context-dir ~/.config/loom/<NAME>`
175
+
176
+ - If it returns a payload with the right name: success. Tell the user
177
+ to **restart their harness** (close and reopen, or exit and
178
+ restart) so the new MCP server picks up the config edit. Remind
179
+ them that once they reopen, calling `identity` will wake them as
180
+ `<NAME>`.
181
+ - If it errors: diagnose from the output and loop back to the failing
182
+ step.
183
+
184
+ ## What you are *not* doing
185
+
186
+ - Editing IDENTITY.md or preferences.md content yourself. The
187
+ bootstrap + procedures seeds leave sensible templates; the agent
188
+ edits them after first wake.
189
+ - Writing any file under `~/.config/loom/<name>/` other than what the
190
+ `loom` CLI puts there.
191
+ - Running `bootstrap --force`, ever.
192
+ - Touching another existing agent's dir.
@@ -0,0 +1,39 @@
1
+ /** Dense models this runtime knows how to fetch and run. */
2
+ export declare const EmbeddingModel: {
3
+ readonly AllMiniLML6V2: 'fast-all-MiniLM-L6-v2';
4
+ readonly BGEBaseEN: 'fast-bge-base-en';
5
+ readonly BGEBaseENV15: 'fast-bge-base-en-v1.5';
6
+ readonly BGESmallEN: 'fast-bge-small-en';
7
+ readonly BGESmallENV15: 'fast-bge-small-en-v1.5';
8
+ readonly BGESmallZH: 'fast-bge-small-zh-v1.5';
9
+ readonly MLE5Large: 'fast-multilingual-e5-large';
10
+ };
11
+ export type EmbeddingModelName = (typeof EmbeddingModel)[keyof typeof EmbeddingModel];
12
+ export interface FlagEmbeddingInit {
13
+ model: EmbeddingModelName;
14
+ cacheDir: string;
15
+ /** Token cap per input. Clamped by the model's own tokenizer config. */
16
+ maxLength?: number;
17
+ }
18
+ /**
19
+ * Loaded dense embedder: a tokenizer plus an ONNX inference session.
20
+ *
21
+ * Named for the upstream class so the diff in fastembed.ts stays reviewable.
22
+ */
23
+ export declare class FlagEmbedding {
24
+ private readonly tokenizer;
25
+ private readonly session;
26
+ private readonly model;
27
+ private constructor();
28
+ static init({ model, cacheDir, maxLength, }: FlagEmbeddingInit): Promise<FlagEmbedding>;
29
+ embed(texts: string[], batchSize?: number): AsyncGenerator<Float32Array[]>;
30
+ /**
31
+ * QUIRK PRESERVED: the "query: " prefix is the E5 instruction format. BGE
32
+ * models want "Represent this sentence for searching relevant passages: "
33
+ * instead. Upstream applied E5's prefix to every model and loom's stored
34
+ * vectors were produced under that regime, so it stays until we decide to
35
+ * re-embed. See t-424.
36
+ */
37
+ queryEmbed(query: string): Promise<Float32Array>;
38
+ private runBatch;
39
+ }