pi-crew 0.1.51 → 0.2.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 (239) hide show
  1. package/CHANGELOG.md +56 -1
  2. package/README.md +176 -781
  3. package/agents/analyst.md +11 -11
  4. package/agents/critic.md +11 -11
  5. package/agents/executor.md +11 -11
  6. package/agents/explorer.md +11 -11
  7. package/agents/planner.md +11 -11
  8. package/agents/reviewer.md +11 -11
  9. package/agents/security-reviewer.md +11 -11
  10. package/agents/test-engineer.md +11 -11
  11. package/agents/verifier.md +70 -11
  12. package/agents/writer.md +11 -11
  13. package/docs/actions-reference.md +595 -0
  14. package/docs/commands-reference.md +347 -0
  15. package/docs/runtime-flow.md +148 -148
  16. package/index.ts +6 -6
  17. package/package.json +99 -99
  18. package/skills/async-worker-recovery/SKILL.md +42 -42
  19. package/skills/context-artifact-hygiene/SKILL.md +52 -52
  20. package/skills/delegation-patterns/SKILL.md +54 -54
  21. package/skills/mailbox-interactive/SKILL.md +40 -40
  22. package/skills/model-routing-context/SKILL.md +39 -39
  23. package/skills/multi-perspective-review/SKILL.md +58 -58
  24. package/skills/observability-reliability/SKILL.md +41 -41
  25. package/skills/orchestration/SKILL.md +157 -157
  26. package/skills/ownership-session-security/SKILL.md +41 -41
  27. package/skills/pi-extension-lifecycle/SKILL.md +39 -39
  28. package/skills/requirements-to-task-packet/SKILL.md +63 -63
  29. package/skills/resource-discovery-config/SKILL.md +41 -41
  30. package/skills/runtime-state-reader/SKILL.md +44 -44
  31. package/skills/secure-agent-orchestration-review/SKILL.md +45 -45
  32. package/skills/state-mutation-locking/SKILL.md +42 -42
  33. package/skills/systematic-debugging/SKILL.md +67 -67
  34. package/skills/ui-render-performance/SKILL.md +39 -39
  35. package/skills/verification-before-done/SKILL.md +57 -57
  36. package/skills/worktree-isolation/SKILL.md +39 -39
  37. package/src/adapters/claude-adapter.ts +25 -0
  38. package/src/adapters/codex-adapter.ts +21 -0
  39. package/src/adapters/cursor-adapter.ts +17 -0
  40. package/src/adapters/export-util.ts +137 -0
  41. package/src/adapters/index.ts +15 -0
  42. package/src/adapters/registry.ts +18 -0
  43. package/src/adapters/types.ts +23 -0
  44. package/src/agents/agent-config.ts +2 -0
  45. package/src/agents/agent-search.ts +98 -98
  46. package/src/agents/discover-agents.ts +2 -1
  47. package/src/config/config.ts +13 -1
  48. package/src/config/drift-detector.ts +211 -0
  49. package/src/config/markers.ts +327 -0
  50. package/src/config/resilient-parser.ts +108 -0
  51. package/src/config/suggestions.ts +74 -0
  52. package/src/extension/cross-extension-rpc.ts +103 -94
  53. package/src/extension/project-init.ts +21 -1
  54. package/src/extension/register.ts +45 -14
  55. package/src/extension/registration/commands.ts +77 -8
  56. package/src/extension/registration/subagent-tools.ts +10 -1
  57. package/src/extension/registration/team-tool.ts +10 -1
  58. package/src/extension/registration/viewers.ts +48 -34
  59. package/src/extension/run-bundle-schema.ts +89 -89
  60. package/src/extension/run-import.ts +25 -1
  61. package/src/extension/run-index.ts +5 -1
  62. package/src/extension/run-maintenance.ts +142 -68
  63. package/src/extension/team-manager-command.ts +10 -1
  64. package/src/extension/team-tool/doctor.ts +28 -3
  65. package/src/extension/team-tool/handle-settings.ts +195 -188
  66. package/src/extension/team-tool/inspect.ts +41 -41
  67. package/src/extension/team-tool/intent-policy.ts +42 -42
  68. package/src/extension/team-tool/lifecycle-actions.ts +27 -8
  69. package/src/extension/team-tool/plan.ts +19 -19
  70. package/src/extension/team-tool/run.ts +12 -1
  71. package/src/extension/team-tool.ts +11 -1
  72. package/src/i18n.ts +184 -184
  73. package/src/observability/exporters/otlp-exporter.ts +92 -77
  74. package/src/prompt/prompt-runtime.ts +72 -72
  75. package/src/runtime/agent-memory.ts +72 -72
  76. package/src/runtime/agent-observability.ts +114 -114
  77. package/src/runtime/async-marker.ts +26 -26
  78. package/src/runtime/attention-events.ts +28 -28
  79. package/src/runtime/auto-resume.ts +100 -0
  80. package/src/runtime/background-runner.ts +11 -1
  81. package/src/runtime/cancellation-token.ts +89 -89
  82. package/src/runtime/cancellation.ts +61 -61
  83. package/src/runtime/capability-inventory.ts +116 -116
  84. package/src/runtime/child-pi.ts +7 -2
  85. package/src/runtime/compaction-summary.ts +271 -0
  86. package/src/runtime/completion-guard.ts +190 -190
  87. package/src/runtime/crash-recovery.ts +33 -0
  88. package/src/runtime/delta-conflict.ts +360 -0
  89. package/src/runtime/direct-run.ts +35 -35
  90. package/src/runtime/foreground-control.ts +82 -82
  91. package/src/runtime/green-contract.ts +46 -46
  92. package/src/runtime/group-join.ts +106 -106
  93. package/src/runtime/heartbeat-gradient.ts +28 -28
  94. package/src/runtime/heartbeat-watcher.ts +124 -124
  95. package/src/runtime/iteration-hooks.ts +262 -0
  96. package/src/runtime/live-agent-control.ts +88 -88
  97. package/src/runtime/live-control-realtime.ts +36 -36
  98. package/src/runtime/live-extension-bridge.ts +150 -150
  99. package/src/runtime/live-irc.ts +92 -92
  100. package/src/runtime/live-session-health.ts +100 -100
  101. package/src/runtime/loop-gates.ts +129 -0
  102. package/src/runtime/metric-parser.ts +40 -0
  103. package/src/runtime/notebook-helpers.ts +90 -90
  104. package/src/runtime/orphan-sentinel.ts +7 -7
  105. package/src/runtime/parallel-research.ts +44 -44
  106. package/src/runtime/phase-progress.ts +217 -0
  107. package/src/runtime/pi-args.ts +38 -11
  108. package/src/runtime/pi-json-output.ts +111 -111
  109. package/src/runtime/pi-spawn.ts +57 -7
  110. package/src/runtime/policy-engine.ts +79 -79
  111. package/src/runtime/post-checks.ts +122 -0
  112. package/src/runtime/progress-event-coalescer.ts +43 -43
  113. package/src/runtime/prose-compressor.ts +164 -164
  114. package/src/runtime/recovery-recipes.ts +74 -74
  115. package/src/runtime/result-extractor.ts +121 -121
  116. package/src/runtime/role-permission.ts +39 -39
  117. package/src/runtime/sensitive-paths.ts +2 -2
  118. package/src/runtime/session-resources.ts +25 -25
  119. package/src/runtime/session-snapshot.ts +59 -59
  120. package/src/runtime/session-usage.ts +79 -79
  121. package/src/runtime/sidechain-output.ts +29 -29
  122. package/src/runtime/stream-preview.ts +177 -177
  123. package/src/runtime/supervisor-contact.ts +59 -59
  124. package/src/runtime/task-display.ts +38 -38
  125. package/src/runtime/task-graph.ts +207 -0
  126. package/src/runtime/task-quality.ts +207 -0
  127. package/src/runtime/task-runner/capabilities.ts +78 -78
  128. package/src/runtime/task-runner/live-executor.ts +7 -1
  129. package/src/runtime/task-runner/progress.ts +119 -119
  130. package/src/runtime/task-runner/prompt-pipeline.ts +64 -64
  131. package/src/runtime/task-runner/result-utils.ts +14 -14
  132. package/src/runtime/task-runner/run-projection.ts +103 -103
  133. package/src/runtime/task-runner/state-helpers.ts +22 -22
  134. package/src/runtime/team-runner.ts +117 -7
  135. package/src/runtime/worker-heartbeat.ts +21 -21
  136. package/src/runtime/worker-startup.ts +57 -57
  137. package/src/runtime/workflow-state.ts +187 -0
  138. package/src/runtime/workspace-tree.ts +298 -298
  139. package/src/schema/config-schema.ts +11 -0
  140. package/src/schema/validation-types.ts +148 -0
  141. package/src/skills/skill-templates.ts +374 -0
  142. package/src/state/active-run-registry.ts +35 -11
  143. package/src/state/atomic-write.ts +33 -26
  144. package/src/state/contracts.ts +1 -0
  145. package/src/state/event-reconstructor.ts +217 -0
  146. package/src/state/locks.ts +2 -13
  147. package/src/state/mailbox.ts +4 -3
  148. package/src/state/state-store.ts +32 -14
  149. package/src/state/task-claims.ts +44 -44
  150. package/src/state/types.ts +9 -0
  151. package/src/state/usage.ts +29 -29
  152. package/src/subagents/async-entry.ts +1 -1
  153. package/src/subagents/index.ts +3 -3
  154. package/src/subagents/live/control.ts +1 -1
  155. package/src/subagents/live/manager.ts +1 -1
  156. package/src/subagents/live/realtime.ts +1 -1
  157. package/src/subagents/live/session-runtime.ts +1 -1
  158. package/src/subagents/manager.ts +1 -1
  159. package/src/subagents/spawn.ts +1 -1
  160. package/src/teams/team-serializer.ts +38 -38
  161. package/src/types/diff.d.ts +18 -18
  162. package/src/ui/crew-footer.ts +101 -101
  163. package/src/ui/crew-select-list.ts +111 -111
  164. package/src/ui/crew-widget.ts +5 -2
  165. package/src/ui/dashboard-panes/cancellation-pane.ts +42 -42
  166. package/src/ui/dashboard-panes/capability-pane.ts +59 -59
  167. package/src/ui/dashboard-panes/mailbox-pane.ts +35 -35
  168. package/src/ui/dashboard-panes/metrics-pane.ts +34 -34
  169. package/src/ui/dashboard-panes/progress-pane.ts +11 -0
  170. package/src/ui/dynamic-border.ts +25 -25
  171. package/src/ui/layout-primitives.ts +106 -106
  172. package/src/ui/loaders.ts +158 -158
  173. package/src/ui/render-coalescer.ts +51 -51
  174. package/src/ui/render-diff.ts +119 -119
  175. package/src/ui/render-scheduler.ts +143 -143
  176. package/src/ui/run-action-dispatcher.ts +10 -1
  177. package/src/ui/spinner.ts +17 -17
  178. package/src/ui/status-colors.ts +58 -58
  179. package/src/ui/syntax-highlight.ts +116 -116
  180. package/src/ui/transcript-entries.ts +258 -258
  181. package/src/utils/completion-dedupe.ts +63 -63
  182. package/src/utils/frontmatter.ts +68 -68
  183. package/src/utils/git.ts +262 -262
  184. package/src/utils/ids.ts +17 -17
  185. package/src/utils/incremental-reader.ts +104 -104
  186. package/src/utils/names.ts +27 -27
  187. package/src/utils/redaction.ts +44 -44
  188. package/src/utils/safe-paths.ts +47 -47
  189. package/src/utils/scan-cache.ts +136 -136
  190. package/src/utils/sleep.ts +40 -26
  191. package/src/utils/task-name-generator.ts +337 -337
  192. package/src/workflows/validate-workflow.ts +40 -40
  193. package/src/worktree/branch-freshness.ts +45 -45
  194. package/teams/default.team.md +12 -12
  195. package/teams/fast-fix.team.md +11 -11
  196. package/teams/implementation.team.md +18 -18
  197. package/teams/parallel-research.team.md +14 -14
  198. package/teams/research.team.md +11 -11
  199. package/teams/review.team.md +12 -12
  200. package/workflows/default.workflow.md +30 -29
  201. package/workflows/fast-fix.workflow.md +23 -22
  202. package/workflows/implementation.workflow.md +43 -43
  203. package/workflows/parallel-research.workflow.md +46 -46
  204. package/workflows/research.workflow.md +22 -22
  205. package/workflows/review.workflow.md +30 -30
  206. package/docs/refactor-tasks-phase3.md +0 -394
  207. package/docs/refactor-tasks-phase4.md +0 -564
  208. package/docs/refactor-tasks-phase5.md +0 -402
  209. package/docs/refactor-tasks-phase6.md +0 -662
  210. package/docs/refactor-tasks.md +0 -1484
  211. package/docs/research/AGENT-EXECUTION-ARCHITECTURE.md +0 -261
  212. package/docs/research/AGENT-LIFECYCLE-COMPARISON.md +0 -111
  213. package/docs/research/AUDIT_OH_MY_PI.md +0 -261
  214. package/docs/research/AUDIT_PI_CREW.md +0 -457
  215. package/docs/research/CAVEMAN-DEEP-RESEARCH.md +0 -281
  216. package/docs/research/COMPARISON_OH_MY_PI_VS_PI_CREW.md +0 -264
  217. package/docs/research/DEEP-RESEARCH-PI-POWERBAR.md +0 -343
  218. package/docs/research/DEEP_RESEARCH_SUBAGENT_ARCHITECTURE.md +0 -480
  219. package/docs/research/GAP_CLOSURE_IMPLEMENTATION_PLAN.md +0 -354
  220. package/docs/research/IMPLEMENTATION_PLAN.md +0 -385
  221. package/docs/research/LIVE-SESSION-PRODUCTION-READY-PLAN.md +0 -502
  222. package/docs/research/OH-MY-PI-DEEP-RESEARCH-v14.7.6.md +0 -266
  223. package/docs/research/REMAINING-GAPS-PLAN.md +0 -363
  224. package/docs/research/SESSION-SUMMARY-2026-05-08.md +0 -146
  225. package/docs/research/UI-RESPONSIVENESS-AUDIT.md +0 -173
  226. package/docs/research-awesome-agent-skills-distillation.md +0 -100
  227. package/docs/research-extension-examples.md +0 -297
  228. package/docs/research-extension-system.md +0 -324
  229. package/docs/research-oh-my-pi-distillation.md +0 -369
  230. package/docs/research-optimization-plan.md +0 -548
  231. package/docs/research-phase10-distillation.md +0 -199
  232. package/docs/research-phase11-distillation.md +0 -201
  233. package/docs/research-phase8-operator-experience-plan.md +0 -819
  234. package/docs/research-phase9-observability-reliability-plan.md +0 -1190
  235. package/docs/research-pi-coding-agent.md +0 -357
  236. package/docs/research-source-pi-crew-reference.md +0 -174
  237. package/docs/research-ui-optimization-plan.md +0 -480
  238. package/docs/source-runtime-refactor-map.md +0 -107
  239. package/src/utils/atomic-write.ts +0 -33
@@ -1,337 +1,337 @@
1
- /**
2
- * Human-readable task name generator.
3
- * Format: AdjectiveNoun (e.g., "SwiftFalcon", "CalmPanda")
4
- *
5
- * Curated lists of ~120 adjectives and ~120 animals/nouns.
6
- * 120 × 120 = 14,400 combinations.
7
- */
8
-
9
- const ADJECTIVES = [
10
- "active",
11
- "agile",
12
- "alert",
13
- "ancient",
14
- "bold",
15
- "brave",
16
- "bright",
17
- "brilliant",
18
- "calm",
19
- "capable",
20
- "careful",
21
- "charming",
22
- "cheerful",
23
- "clever",
24
- "cloudy",
25
- "cold",
26
- "cool",
27
- "curious",
28
- "cute",
29
- "daring",
30
- "dark",
31
- "deep",
32
- "direct",
33
- "eager",
34
- "early",
35
- "electric",
36
- "elegant",
37
- "energetic",
38
- "enormous",
39
- "epic",
40
- "exact",
41
- "exotic",
42
- "fair",
43
- "fancy",
44
- "fast",
45
- "fierce",
46
- "firm",
47
- "flat",
48
- "flexible",
49
- "fresh",
50
- "friendly",
51
- "full",
52
- "fun",
53
- "funny",
54
- "gentle",
55
- "global",
56
- "golden",
57
- "good",
58
- "grand",
59
- "grateful",
60
- "great",
61
- "green",
62
- "happy",
63
- "hard",
64
- "heavy",
65
- "hidden",
66
- "honest",
67
- "hot",
68
- "huge",
69
- "icy",
70
- "ideal",
71
- "keen",
72
- "kind",
73
- "large",
74
- "lazy",
75
- "light",
76
- "lively",
77
- "local",
78
- "loud",
79
- "lucky",
80
- "magic",
81
- "mighty",
82
- "mild",
83
- "modern",
84
- "neat",
85
- "new",
86
- "nice",
87
- "noble",
88
- "odd",
89
- "old",
90
- "open",
91
- "patient",
92
- "perfect",
93
- "plain",
94
- "polite",
95
- "popular",
96
- "powerful",
97
- "precise",
98
- "pretty",
99
- "proud",
100
- "pure",
101
- "quick",
102
- "quiet",
103
- "rapid",
104
- "rare",
105
- "real",
106
- "rich",
107
- "robust",
108
- "round",
109
- "royal",
110
- "safe",
111
- "sharp",
112
- "short",
113
- "shy",
114
- "silent",
115
- "simple",
116
- "slim",
117
- "smart",
118
- "smooth",
119
- "soft",
120
- "solar",
121
- "solid",
122
- "steady",
123
- "strange",
124
- "strong",
125
- "sunny",
126
- "swift",
127
- "tall",
128
- "tame",
129
- "tiny",
130
- "tough",
131
- "true",
132
- "unique",
133
- "vast",
134
- "warm",
135
- "wild",
136
- "wise",
137
- "zany",
138
- "zen",
139
- ] as const;
140
-
141
- const NOUNS = [
142
- "albatross",
143
- "ant",
144
- "antelope",
145
- "ape",
146
- "archer",
147
- "badger",
148
- "bass",
149
- "bat",
150
- "bear",
151
- "beaver",
152
- "bee",
153
- "beetle",
154
- "bird",
155
- "bison",
156
- "boar",
157
- "bobcat",
158
- "bull",
159
- "buzzard",
160
- "camel",
161
- "canary",
162
- "carp",
163
- "cat",
164
- "cedar",
165
- "cheetah",
166
- "chicken",
167
- "cobra",
168
- "cod",
169
- "condor",
170
- "coral",
171
- "cougar",
172
- "crab",
173
- "crane",
174
- "cricket",
175
- "crow",
176
- "deer",
177
- "dolphin",
178
- "dove",
179
- "dragon",
180
- "duck",
181
- "eagle",
182
- "eel",
183
- "elk",
184
- "falcon",
185
- "ferret",
186
- "finch",
187
- "flamingo",
188
- "fox",
189
- "frog",
190
- "gazelle",
191
- "gecko",
192
- "ghost",
193
- "gibbon",
194
- "goat",
195
- "goldfish",
196
- "goose",
197
- "gorilla",
198
- "halibut",
199
- "hamster",
200
- "hare",
201
- "hawk",
202
- "heron",
203
- "horse",
204
- "hummingbird",
205
- "hyena",
206
- "ibis",
207
- "iguana",
208
- "impala",
209
- "jackal",
210
- "jaguar",
211
- "jay",
212
- "jellyfish",
213
- "kangaroo",
214
- "kite",
215
- "kiwi",
216
- "koala",
217
- "krill",
218
- "lark",
219
- "lemur",
220
- "leopard",
221
- "lion",
222
- "lizard",
223
- "llama",
224
- "lobster",
225
- "lynx",
226
- "macaw",
227
- "magnet",
228
- "mammoth",
229
- "marmot",
230
- "mink",
231
- "mole",
232
- "monkey",
233
- "moose",
234
- "moth",
235
- "mouse",
236
- "newt",
237
- "ocelot",
238
- "octopus",
239
- "orca",
240
- "ostrich",
241
- "otter",
242
- "owl",
243
- "ox",
244
- "panda",
245
- "panther",
246
- "parrot",
247
- "peacock",
248
- "pelican",
249
- "penguin",
250
- "pike",
251
- "pony",
252
- "python",
253
- "quail",
254
- "rabbit",
255
- "raccoon",
256
- "ram",
257
- "raven",
258
- "robin",
259
- "rook",
260
- "sable",
261
- "salmon",
262
- "scorpion",
263
- "seal",
264
- "shark",
265
- "sheep",
266
- "snail",
267
- "sparrow",
268
- "spider",
269
- "squid",
270
- "squirrel",
271
- "stork",
272
- "swan",
273
- "tiger",
274
- "toad",
275
- "tortoise",
276
- "toucan",
277
- "trout",
278
- "tuna",
279
- "turkey",
280
- "turtle",
281
- "viper",
282
- "vulture",
283
- "walrus",
284
- "wasp",
285
- "whale",
286
- "wolf",
287
- "wombat",
288
- "woodpecker",
289
- "wren",
290
- "yak",
291
- "zebra",
292
- ] as const;
293
-
294
- function capitalize(s: string): string {
295
- return s.charAt(0).toUpperCase() + s.slice(1);
296
- }
297
-
298
- let usedNames = new Set<string>();
299
-
300
- /**
301
- * Generate a unique two-word identifier (e.g., "SwiftFalcon").
302
- * Resets and starts over if all combinations exhausted.
303
- */
304
- export function generateTaskName(): string {
305
- // Try random combinations first (50 attempts)
306
- for (let attempt = 0; attempt < 50; attempt++) {
307
- const adj = ADJECTIVES[Math.floor(Math.random() * ADJECTIVES.length)]!;
308
- const noun = NOUNS[Math.floor(Math.random() * NOUNS.length)]!;
309
- const name = `${capitalize(adj)}${capitalize(noun)}`;
310
- if (!usedNames.has(name)) {
311
- usedNames.add(name);
312
- return name;
313
- }
314
- }
315
-
316
- // Exhaustive search if random fails
317
- for (const adj of ADJECTIVES) {
318
- for (const noun of NOUNS) {
319
- const name = `${capitalize(adj)}${capitalize(noun)}`;
320
- if (!usedNames.has(name)) {
321
- usedNames.add(name);
322
- return name;
323
- }
324
- }
325
- }
326
-
327
- // All combinations exhausted — reset and start over
328
- usedNames.clear();
329
- return generateTaskName();
330
- }
331
-
332
- /**
333
- * Reset name generator state (for testing).
334
- */
335
- export function resetTaskNames(): void {
336
- usedNames = new Set<string>();
337
- }
1
+ /**
2
+ * Human-readable task name generator.
3
+ * Format: AdjectiveNoun (e.g., "SwiftFalcon", "CalmPanda")
4
+ *
5
+ * Curated lists of ~120 adjectives and ~120 animals/nouns.
6
+ * 120 × 120 = 14,400 combinations.
7
+ */
8
+
9
+ const ADJECTIVES = [
10
+ "active",
11
+ "agile",
12
+ "alert",
13
+ "ancient",
14
+ "bold",
15
+ "brave",
16
+ "bright",
17
+ "brilliant",
18
+ "calm",
19
+ "capable",
20
+ "careful",
21
+ "charming",
22
+ "cheerful",
23
+ "clever",
24
+ "cloudy",
25
+ "cold",
26
+ "cool",
27
+ "curious",
28
+ "cute",
29
+ "daring",
30
+ "dark",
31
+ "deep",
32
+ "direct",
33
+ "eager",
34
+ "early",
35
+ "electric",
36
+ "elegant",
37
+ "energetic",
38
+ "enormous",
39
+ "epic",
40
+ "exact",
41
+ "exotic",
42
+ "fair",
43
+ "fancy",
44
+ "fast",
45
+ "fierce",
46
+ "firm",
47
+ "flat",
48
+ "flexible",
49
+ "fresh",
50
+ "friendly",
51
+ "full",
52
+ "fun",
53
+ "funny",
54
+ "gentle",
55
+ "global",
56
+ "golden",
57
+ "good",
58
+ "grand",
59
+ "grateful",
60
+ "great",
61
+ "green",
62
+ "happy",
63
+ "hard",
64
+ "heavy",
65
+ "hidden",
66
+ "honest",
67
+ "hot",
68
+ "huge",
69
+ "icy",
70
+ "ideal",
71
+ "keen",
72
+ "kind",
73
+ "large",
74
+ "lazy",
75
+ "light",
76
+ "lively",
77
+ "local",
78
+ "loud",
79
+ "lucky",
80
+ "magic",
81
+ "mighty",
82
+ "mild",
83
+ "modern",
84
+ "neat",
85
+ "new",
86
+ "nice",
87
+ "noble",
88
+ "odd",
89
+ "old",
90
+ "open",
91
+ "patient",
92
+ "perfect",
93
+ "plain",
94
+ "polite",
95
+ "popular",
96
+ "powerful",
97
+ "precise",
98
+ "pretty",
99
+ "proud",
100
+ "pure",
101
+ "quick",
102
+ "quiet",
103
+ "rapid",
104
+ "rare",
105
+ "real",
106
+ "rich",
107
+ "robust",
108
+ "round",
109
+ "royal",
110
+ "safe",
111
+ "sharp",
112
+ "short",
113
+ "shy",
114
+ "silent",
115
+ "simple",
116
+ "slim",
117
+ "smart",
118
+ "smooth",
119
+ "soft",
120
+ "solar",
121
+ "solid",
122
+ "steady",
123
+ "strange",
124
+ "strong",
125
+ "sunny",
126
+ "swift",
127
+ "tall",
128
+ "tame",
129
+ "tiny",
130
+ "tough",
131
+ "true",
132
+ "unique",
133
+ "vast",
134
+ "warm",
135
+ "wild",
136
+ "wise",
137
+ "zany",
138
+ "zen",
139
+ ] as const;
140
+
141
+ const NOUNS = [
142
+ "albatross",
143
+ "ant",
144
+ "antelope",
145
+ "ape",
146
+ "archer",
147
+ "badger",
148
+ "bass",
149
+ "bat",
150
+ "bear",
151
+ "beaver",
152
+ "bee",
153
+ "beetle",
154
+ "bird",
155
+ "bison",
156
+ "boar",
157
+ "bobcat",
158
+ "bull",
159
+ "buzzard",
160
+ "camel",
161
+ "canary",
162
+ "carp",
163
+ "cat",
164
+ "cedar",
165
+ "cheetah",
166
+ "chicken",
167
+ "cobra",
168
+ "cod",
169
+ "condor",
170
+ "coral",
171
+ "cougar",
172
+ "crab",
173
+ "crane",
174
+ "cricket",
175
+ "crow",
176
+ "deer",
177
+ "dolphin",
178
+ "dove",
179
+ "dragon",
180
+ "duck",
181
+ "eagle",
182
+ "eel",
183
+ "elk",
184
+ "falcon",
185
+ "ferret",
186
+ "finch",
187
+ "flamingo",
188
+ "fox",
189
+ "frog",
190
+ "gazelle",
191
+ "gecko",
192
+ "ghost",
193
+ "gibbon",
194
+ "goat",
195
+ "goldfish",
196
+ "goose",
197
+ "gorilla",
198
+ "halibut",
199
+ "hamster",
200
+ "hare",
201
+ "hawk",
202
+ "heron",
203
+ "horse",
204
+ "hummingbird",
205
+ "hyena",
206
+ "ibis",
207
+ "iguana",
208
+ "impala",
209
+ "jackal",
210
+ "jaguar",
211
+ "jay",
212
+ "jellyfish",
213
+ "kangaroo",
214
+ "kite",
215
+ "kiwi",
216
+ "koala",
217
+ "krill",
218
+ "lark",
219
+ "lemur",
220
+ "leopard",
221
+ "lion",
222
+ "lizard",
223
+ "llama",
224
+ "lobster",
225
+ "lynx",
226
+ "macaw",
227
+ "magnet",
228
+ "mammoth",
229
+ "marmot",
230
+ "mink",
231
+ "mole",
232
+ "monkey",
233
+ "moose",
234
+ "moth",
235
+ "mouse",
236
+ "newt",
237
+ "ocelot",
238
+ "octopus",
239
+ "orca",
240
+ "ostrich",
241
+ "otter",
242
+ "owl",
243
+ "ox",
244
+ "panda",
245
+ "panther",
246
+ "parrot",
247
+ "peacock",
248
+ "pelican",
249
+ "penguin",
250
+ "pike",
251
+ "pony",
252
+ "python",
253
+ "quail",
254
+ "rabbit",
255
+ "raccoon",
256
+ "ram",
257
+ "raven",
258
+ "robin",
259
+ "rook",
260
+ "sable",
261
+ "salmon",
262
+ "scorpion",
263
+ "seal",
264
+ "shark",
265
+ "sheep",
266
+ "snail",
267
+ "sparrow",
268
+ "spider",
269
+ "squid",
270
+ "squirrel",
271
+ "stork",
272
+ "swan",
273
+ "tiger",
274
+ "toad",
275
+ "tortoise",
276
+ "toucan",
277
+ "trout",
278
+ "tuna",
279
+ "turkey",
280
+ "turtle",
281
+ "viper",
282
+ "vulture",
283
+ "walrus",
284
+ "wasp",
285
+ "whale",
286
+ "wolf",
287
+ "wombat",
288
+ "woodpecker",
289
+ "wren",
290
+ "yak",
291
+ "zebra",
292
+ ] as const;
293
+
294
+ function capitalize(s: string): string {
295
+ return s.charAt(0).toUpperCase() + s.slice(1);
296
+ }
297
+
298
+ let usedNames = new Set<string>();
299
+
300
+ /**
301
+ * Generate a unique two-word identifier (e.g., "SwiftFalcon").
302
+ * Resets and starts over if all combinations exhausted.
303
+ */
304
+ export function generateTaskName(): string {
305
+ // Try random combinations first (50 attempts)
306
+ for (let attempt = 0; attempt < 50; attempt++) {
307
+ const adj = ADJECTIVES[Math.floor(Math.random() * ADJECTIVES.length)]!;
308
+ const noun = NOUNS[Math.floor(Math.random() * NOUNS.length)]!;
309
+ const name = `${capitalize(adj)}${capitalize(noun)}`;
310
+ if (!usedNames.has(name)) {
311
+ usedNames.add(name);
312
+ return name;
313
+ }
314
+ }
315
+
316
+ // Exhaustive search if random fails
317
+ for (const adj of ADJECTIVES) {
318
+ for (const noun of NOUNS) {
319
+ const name = `${capitalize(adj)}${capitalize(noun)}`;
320
+ if (!usedNames.has(name)) {
321
+ usedNames.add(name);
322
+ return name;
323
+ }
324
+ }
325
+ }
326
+
327
+ // All combinations exhausted — reset and start over
328
+ usedNames.clear();
329
+ return generateTaskName();
330
+ }
331
+
332
+ /**
333
+ * Reset name generator state (for testing).
334
+ */
335
+ export function resetTaskNames(): void {
336
+ usedNames = new Set<string>();
337
+ }