feed-the-machine 1.6.1 → 1.7.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 (269) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +170 -170
  3. package/bin/brain.py +1340 -0
  4. package/bin/convert_claude_skills_to_codex.py +490 -0
  5. package/bin/generate-manifest.mjs +463 -463
  6. package/bin/harden_codex_skills.py +141 -0
  7. package/bin/install.mjs +491 -491
  8. package/bin/migrate-eng-buddy-data.py +875 -0
  9. package/bin/playbook_engine/__init__.py +1 -0
  10. package/bin/playbook_engine/conftest.py +8 -0
  11. package/bin/playbook_engine/extractor.py +33 -0
  12. package/bin/playbook_engine/manager.py +102 -0
  13. package/bin/playbook_engine/models.py +84 -0
  14. package/bin/playbook_engine/registry.py +35 -0
  15. package/bin/playbook_engine/test_extractor.py +72 -0
  16. package/bin/playbook_engine/test_integration.py +129 -0
  17. package/bin/playbook_engine/test_manager.py +85 -0
  18. package/bin/playbook_engine/test_models.py +166 -0
  19. package/bin/playbook_engine/test_registry.py +67 -0
  20. package/bin/playbook_engine/test_tracer.py +86 -0
  21. package/bin/playbook_engine/tracer.py +93 -0
  22. package/bin/tasks_db.py +456 -0
  23. package/docs/HOOKS.md +243 -243
  24. package/docs/INBOX.md +233 -233
  25. package/ftm/SKILL.md +125 -122
  26. package/ftm-audit/SKILL.md +623 -623
  27. package/ftm-audit/references/protocols/PROJECT-PATTERNS.md +91 -91
  28. package/ftm-audit/references/protocols/RUNTIME-WIRING.md +66 -66
  29. package/ftm-audit/references/protocols/WIRING-CONTRACTS.md +135 -135
  30. package/ftm-audit/references/strategies/AUTO-FIX-STRATEGIES.md +69 -69
  31. package/ftm-audit/references/templates/REPORT-FORMAT.md +96 -96
  32. package/ftm-audit/scripts/run-knip.sh +23 -23
  33. package/ftm-audit.yml +2 -2
  34. package/ftm-brainstorm/SKILL.md +1003 -498
  35. package/ftm-brainstorm/evals/evals.json +180 -100
  36. package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
  37. package/ftm-brainstorm/references/agent-prompts.md +552 -224
  38. package/ftm-brainstorm/references/plan-template.md +209 -121
  39. package/ftm-brainstorm.yml +2 -2
  40. package/ftm-browse/SKILL.md +454 -454
  41. package/ftm-browse/daemon/browser-manager.ts +206 -206
  42. package/ftm-browse/daemon/bun.lock +30 -30
  43. package/ftm-browse/daemon/cli.ts +347 -347
  44. package/ftm-browse/daemon/commands.ts +410 -410
  45. package/ftm-browse/daemon/main.ts +357 -357
  46. package/ftm-browse/daemon/package.json +17 -17
  47. package/ftm-browse/daemon/server.ts +189 -189
  48. package/ftm-browse/daemon/snapshot.ts +519 -519
  49. package/ftm-browse/daemon/tsconfig.json +22 -22
  50. package/ftm-browse.yml +4 -4
  51. package/ftm-capture/SKILL.md +370 -370
  52. package/ftm-capture.yml +4 -4
  53. package/ftm-codex-gate/SKILL.md +361 -361
  54. package/ftm-codex-gate.yml +2 -2
  55. package/ftm-config/SKILL.md +422 -345
  56. package/ftm-config.default.yml +125 -82
  57. package/ftm-config.yml +44 -2
  58. package/ftm-council/SKILL.md +416 -416
  59. package/ftm-council/references/prompts/CLAUDE-INVESTIGATION.md +60 -60
  60. package/ftm-council/references/prompts/CODEX-INVESTIGATION.md +58 -58
  61. package/ftm-council/references/prompts/GEMINI-INVESTIGATION.md +58 -58
  62. package/ftm-council/references/prompts/REBUTTAL-TEMPLATE.md +57 -57
  63. package/ftm-council/references/protocols/PREREQUISITES.md +47 -47
  64. package/ftm-council/references/protocols/STEP-0-FRAMING.md +46 -46
  65. package/ftm-council.yml +2 -2
  66. package/ftm-dashboard/SKILL.md +163 -163
  67. package/ftm-dashboard.yml +4 -4
  68. package/ftm-debug/SKILL.md +1037 -1037
  69. package/ftm-debug/references/phases/PHASE-0-INTAKE.md +58 -58
  70. package/ftm-debug/references/phases/PHASE-1-TRIAGE.md +46 -46
  71. package/ftm-debug/references/phases/PHASE-2-WAR-ROOM-AGENTS.md +279 -279
  72. package/ftm-debug/references/phases/PHASE-3-TO-6-EXECUTION.md +436 -436
  73. package/ftm-debug/references/protocols/BLACKBOARD.md +86 -86
  74. package/ftm-debug/references/protocols/EDGE-CASES.md +103 -103
  75. package/ftm-debug.yml +2 -2
  76. package/ftm-diagram/SKILL.md +277 -277
  77. package/ftm-diagram.yml +2 -2
  78. package/ftm-executor/SKILL.md +777 -777
  79. package/ftm-executor/references/STYLE-TEMPLATE.md +73 -73
  80. package/ftm-executor/references/phases/PHASE-0-VERIFICATION.md +62 -62
  81. package/ftm-executor/references/phases/PHASE-2-AGENT-ASSEMBLY.md +34 -34
  82. package/ftm-executor/references/phases/PHASE-3-WORKTREES.md +38 -38
  83. package/ftm-executor/references/phases/PHASE-4-5-AUDIT.md +72 -72
  84. package/ftm-executor/references/phases/PHASE-4-DISPATCH.md +66 -66
  85. package/ftm-executor/references/phases/PHASE-5-5-CODEX-GATE.md +73 -73
  86. package/ftm-executor/references/protocols/DOCUMENTATION-BOOTSTRAP.md +36 -36
  87. package/ftm-executor/references/protocols/MODEL-PROFILE.md +59 -59
  88. package/ftm-executor/references/protocols/PROGRESS-TRACKING.md +66 -66
  89. package/ftm-executor/runtime/ftm-runtime.mjs +252 -252
  90. package/ftm-executor/runtime/package.json +8 -8
  91. package/ftm-executor.yml +2 -2
  92. package/ftm-git/SKILL.md +441 -441
  93. package/ftm-git/evals/evals.json +26 -26
  94. package/ftm-git/evals/promptfoo.yaml +75 -75
  95. package/ftm-git/hooks/post-commit-experience.sh +92 -92
  96. package/ftm-git/references/patterns/SECRET-PATTERNS.md +104 -104
  97. package/ftm-git/references/protocols/REMEDIATION.md +139 -139
  98. package/ftm-git/scripts/pre-commit-secrets.sh +110 -110
  99. package/ftm-git.yml +2 -2
  100. package/ftm-inbox/backend/__pycache__/main.cpython-314.pyc +0 -0
  101. package/ftm-inbox/backend/adapters/_retry.py +64 -64
  102. package/ftm-inbox/backend/adapters/base.py +230 -230
  103. package/ftm-inbox/backend/adapters/freshservice.py +104 -104
  104. package/ftm-inbox/backend/adapters/gmail.py +125 -125
  105. package/ftm-inbox/backend/adapters/jira.py +136 -136
  106. package/ftm-inbox/backend/adapters/registry.py +192 -192
  107. package/ftm-inbox/backend/adapters/slack.py +110 -110
  108. package/ftm-inbox/backend/db/connection.py +54 -54
  109. package/ftm-inbox/backend/db/schema.py +78 -78
  110. package/ftm-inbox/backend/executor/__init__.py +7 -7
  111. package/ftm-inbox/backend/executor/engine.py +149 -149
  112. package/ftm-inbox/backend/executor/step_runner.py +98 -98
  113. package/ftm-inbox/backend/main.py +103 -103
  114. package/ftm-inbox/backend/models/__init__.py +1 -1
  115. package/ftm-inbox/backend/models/unified_task.py +36 -36
  116. package/ftm-inbox/backend/planner/__init__.py +6 -6
  117. package/ftm-inbox/backend/planner/__pycache__/__init__.cpython-314.pyc +0 -0
  118. package/ftm-inbox/backend/planner/__pycache__/generator.cpython-314.pyc +0 -0
  119. package/ftm-inbox/backend/planner/__pycache__/schema.cpython-314.pyc +0 -0
  120. package/ftm-inbox/backend/planner/generator.py +127 -127
  121. package/ftm-inbox/backend/planner/schema.py +34 -34
  122. package/ftm-inbox/backend/requirements.txt +5 -5
  123. package/ftm-inbox/backend/routes/__pycache__/plan.cpython-314.pyc +0 -0
  124. package/ftm-inbox/backend/routes/execute.py +186 -186
  125. package/ftm-inbox/backend/routes/health.py +52 -52
  126. package/ftm-inbox/backend/routes/inbox.py +68 -68
  127. package/ftm-inbox/backend/routes/plan.py +271 -271
  128. package/ftm-inbox/bin/launchagent.mjs +91 -91
  129. package/ftm-inbox/bin/setup.mjs +188 -188
  130. package/ftm-inbox/bin/start.sh +10 -10
  131. package/ftm-inbox/bin/status.sh +17 -17
  132. package/ftm-inbox/bin/stop.sh +8 -8
  133. package/ftm-inbox/config.example.yml +55 -55
  134. package/ftm-inbox/package-lock.json +2898 -2898
  135. package/ftm-inbox/package.json +26 -26
  136. package/ftm-inbox/postcss.config.js +6 -6
  137. package/ftm-inbox/src/app.css +199 -199
  138. package/ftm-inbox/src/app.html +18 -18
  139. package/ftm-inbox/src/lib/api.ts +166 -166
  140. package/ftm-inbox/src/lib/components/ExecutionLog.svelte +81 -81
  141. package/ftm-inbox/src/lib/components/InboxFeed.svelte +143 -143
  142. package/ftm-inbox/src/lib/components/PlanStep.svelte +271 -271
  143. package/ftm-inbox/src/lib/components/PlanView.svelte +206 -206
  144. package/ftm-inbox/src/lib/components/StreamPanel.svelte +99 -99
  145. package/ftm-inbox/src/lib/components/TaskCard.svelte +190 -190
  146. package/ftm-inbox/src/lib/components/ui/EmptyState.svelte +63 -63
  147. package/ftm-inbox/src/lib/components/ui/KawaiiCard.svelte +86 -86
  148. package/ftm-inbox/src/lib/components/ui/PillButton.svelte +106 -106
  149. package/ftm-inbox/src/lib/components/ui/StatusBadge.svelte +67 -67
  150. package/ftm-inbox/src/lib/components/ui/StreamDrawer.svelte +149 -149
  151. package/ftm-inbox/src/lib/components/ui/ThemeToggle.svelte +80 -80
  152. package/ftm-inbox/src/lib/theme.ts +47 -47
  153. package/ftm-inbox/src/routes/+layout.svelte +76 -76
  154. package/ftm-inbox/src/routes/+page.svelte +401 -401
  155. package/ftm-inbox/svelte.config.js +12 -12
  156. package/ftm-inbox/tailwind.config.ts +63 -63
  157. package/ftm-inbox/tsconfig.json +13 -13
  158. package/ftm-inbox/vite.config.ts +6 -6
  159. package/ftm-intent/SKILL.md +241 -241
  160. package/ftm-intent.yml +2 -2
  161. package/ftm-manifest.json +3794 -3794
  162. package/ftm-map/SKILL.md +291 -291
  163. package/ftm-map/scripts/db.py +712 -712
  164. package/ftm-map/scripts/index.py +415 -415
  165. package/ftm-map/scripts/parser.py +224 -224
  166. package/ftm-map/scripts/queries/go-tags.scm +20 -20
  167. package/ftm-map/scripts/queries/javascript-tags.scm +35 -35
  168. package/ftm-map/scripts/queries/python-tags.scm +31 -31
  169. package/ftm-map/scripts/queries/ruby-tags.scm +19 -19
  170. package/ftm-map/scripts/queries/rust-tags.scm +37 -37
  171. package/ftm-map/scripts/queries/typescript-tags.scm +41 -41
  172. package/ftm-map/scripts/query.py +301 -301
  173. package/ftm-map/scripts/ranker.py +377 -377
  174. package/ftm-map/scripts/requirements.txt +5 -5
  175. package/ftm-map/scripts/setup-hooks.sh +27 -27
  176. package/ftm-map/scripts/setup.sh +56 -56
  177. package/ftm-map/scripts/test_db.py +364 -364
  178. package/ftm-map/scripts/test_parser.py +174 -174
  179. package/ftm-map/scripts/test_query.py +183 -183
  180. package/ftm-map/scripts/test_ranker.py +199 -199
  181. package/ftm-map/scripts/views.py +591 -591
  182. package/ftm-map.yml +2 -2
  183. package/ftm-mind/SKILL.md +201 -1943
  184. package/ftm-mind/evals/promptfoo.yaml +142 -142
  185. package/ftm-mind/references/blackboard-protocol.md +110 -0
  186. package/ftm-mind/references/blackboard-schema.md +328 -328
  187. package/ftm-mind/references/complexity-guide.md +110 -110
  188. package/ftm-mind/references/complexity-sizing.md +138 -0
  189. package/ftm-mind/references/decide-act-protocol.md +172 -0
  190. package/ftm-mind/references/direct-execution.md +51 -0
  191. package/ftm-mind/references/environment-discovery.md +77 -0
  192. package/ftm-mind/references/event-registry.md +319 -319
  193. package/ftm-mind/references/mcp-inventory.md +300 -296
  194. package/ftm-mind/references/ops-routing.md +47 -0
  195. package/ftm-mind/references/orient-protocol.md +234 -0
  196. package/ftm-mind/references/personality.md +40 -0
  197. package/ftm-mind/references/protocols/COMPLEXITY-SIZING.md +72 -72
  198. package/ftm-mind/references/protocols/MCP-HEURISTICS.md +32 -32
  199. package/ftm-mind/references/protocols/PLAN-APPROVAL.md +80 -80
  200. package/ftm-mind/references/reflexion-protocol.md +249 -249
  201. package/ftm-mind/references/routing/SCENARIOS.md +22 -22
  202. package/ftm-mind/references/routing-scenarios.md +35 -35
  203. package/ftm-mind.yml +2 -2
  204. package/ftm-ops.yml +4 -0
  205. package/ftm-pause/SKILL.md +395 -395
  206. package/ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md +186 -186
  207. package/ftm-pause/references/protocols/VALIDATION.md +80 -80
  208. package/ftm-pause.yml +2 -2
  209. package/ftm-researcher/SKILL.md +275 -275
  210. package/ftm-researcher/evals/agent-diversity.yaml +17 -17
  211. package/ftm-researcher/evals/synthesis-quality.yaml +12 -12
  212. package/ftm-researcher/evals/trigger-accuracy.yaml +39 -39
  213. package/ftm-researcher/references/adaptive-search.md +116 -116
  214. package/ftm-researcher/references/agent-prompts.md +193 -193
  215. package/ftm-researcher/references/council-integration.md +193 -193
  216. package/ftm-researcher/references/output-format.md +203 -203
  217. package/ftm-researcher/references/synthesis-pipeline.md +165 -165
  218. package/ftm-researcher/scripts/score_credibility.py +234 -234
  219. package/ftm-researcher/scripts/validate_research.py +92 -92
  220. package/ftm-researcher.yml +2 -2
  221. package/ftm-resume/SKILL.md +518 -518
  222. package/ftm-resume/references/protocols/VALIDATION.md +172 -172
  223. package/ftm-resume.yml +2 -2
  224. package/ftm-retro/SKILL.md +380 -380
  225. package/ftm-retro/references/protocols/SCORING-RUBRICS.md +89 -89
  226. package/ftm-retro/references/templates/REPORT-FORMAT.md +109 -109
  227. package/ftm-retro.yml +2 -2
  228. package/ftm-routine/SKILL.md +170 -170
  229. package/ftm-routine.yml +4 -4
  230. package/ftm-state/blackboard/capabilities.json +5 -5
  231. package/ftm-state/blackboard/capabilities.schema.json +27 -27
  232. package/ftm-state/blackboard/context.json +37 -23
  233. package/ftm-state/blackboard/experiences/doom-statusline-fix.json +26 -0
  234. package/ftm-state/blackboard/experiences/hackathon-pages-site.json +26 -0
  235. package/ftm-state/blackboard/experiences/hindsight-sso-kickoff.json +42 -0
  236. package/ftm-state/blackboard/experiences/index.json +58 -9
  237. package/ftm-state/blackboard/experiences/learning-ragnarok-api-access.json +23 -0
  238. package/ftm-state/blackboard/experiences/nordlayer-members-auto-assign.json +26 -0
  239. package/ftm-state/blackboard/experiences/saml2aws-stale-session-fix.json +41 -0
  240. package/ftm-state/blackboard/patterns.json +6 -6
  241. package/ftm-state/schemas/context.schema.json +130 -130
  242. package/ftm-state/schemas/experience-index.schema.json +77 -77
  243. package/ftm-state/schemas/experience.schema.json +78 -78
  244. package/ftm-state/schemas/patterns.schema.json +44 -44
  245. package/ftm-upgrade/SKILL.md +194 -194
  246. package/ftm-upgrade/scripts/check-version.sh +76 -76
  247. package/ftm-upgrade/scripts/upgrade.sh +143 -143
  248. package/ftm-upgrade.yml +2 -2
  249. package/ftm-verify.yml +2 -2
  250. package/ftm.yml +2 -2
  251. package/hooks/ftm-auto-log.sh +137 -0
  252. package/hooks/ftm-blackboard-enforcer.sh +93 -93
  253. package/hooks/ftm-discovery-reminder.sh +90 -90
  254. package/hooks/ftm-drafts-gate.sh +61 -61
  255. package/hooks/ftm-event-logger.mjs +107 -107
  256. package/hooks/ftm-install-hooks.sh +240 -0
  257. package/hooks/ftm-learning-capture.sh +117 -0
  258. package/hooks/ftm-map-autodetect.sh +79 -79
  259. package/hooks/ftm-pending-sync-check.sh +22 -22
  260. package/hooks/ftm-plan-gate.sh +92 -92
  261. package/hooks/ftm-post-commit-trigger.sh +57 -57
  262. package/hooks/ftm-post-compaction.sh +138 -0
  263. package/hooks/ftm-pre-compaction.sh +147 -0
  264. package/hooks/ftm-session-end.sh +52 -0
  265. package/hooks/ftm-session-snapshot.sh +213 -0
  266. package/hooks/settings-template.json +81 -81
  267. package/install.sh +363 -363
  268. package/package.json +84 -84
  269. package/uninstall.sh +25 -25
@@ -1,106 +1,106 @@
1
- <script lang="ts">
2
- export let variant: 'primary' | 'ghost' | 'danger' = 'primary';
3
- export let size: 'sm' | 'md' | 'lg' = 'md';
4
- export let disabled = false;
5
- export let type: 'button' | 'submit' | 'reset' = 'button';
6
-
7
- const sizeClasses = {
8
- sm: 'btn-sm',
9
- md: 'btn-md',
10
- lg: 'btn-lg'
11
- };
12
- </script>
13
-
14
- <button
15
- {type}
16
- {disabled}
17
- class="pill-btn pill-btn-{variant} {sizeClasses[size]}"
18
- on:click
19
- on:mouseenter
20
- on:mouseleave
21
- >
22
- {#if $$slots.icon}
23
- <span class="btn-icon" aria-hidden="true">
24
- <slot name="icon" />
25
- </span>
26
- {/if}
27
- <slot />
28
- </button>
29
-
30
- <style>
31
- .pill-btn {
32
- display: inline-flex;
33
- align-items: center;
34
- gap: 0.4rem;
35
- border-radius: 9999px;
36
- font-family: 'Nunito', sans-serif;
37
- font-weight: 700;
38
- cursor: pointer;
39
- border: none;
40
- transition:
41
- transform 0.18s cubic-bezier(0.68, -0.55, 0.265, 1.55),
42
- box-shadow 0.18s ease,
43
- background-color 0.18s ease,
44
- color 0.18s ease,
45
- border-color 0.18s ease;
46
- user-select: none;
47
- white-space: nowrap;
48
- line-height: 1;
49
- }
50
-
51
- .pill-btn:disabled {
52
- opacity: 0.45;
53
- cursor: not-allowed;
54
- transform: none !important;
55
- }
56
-
57
- .pill-btn:not(:disabled):hover {
58
- transform: scale(1.06) translateY(-1px);
59
- }
60
-
61
- .pill-btn:not(:disabled):active {
62
- transform: scale(0.96) translateY(0);
63
- }
64
-
65
- /* Sizes */
66
- .btn-sm { padding: 0.35rem 0.9rem; font-size: 0.75rem; }
67
- .btn-md { padding: 0.5rem 1.25rem; font-size: 0.875rem; }
68
- .btn-lg { padding: 0.65rem 1.6rem; font-size: 1rem; }
69
-
70
- /* Variants */
71
- .pill-btn-primary {
72
- background-color: var(--accent-primary);
73
- color: #fff;
74
- box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3);
75
- }
76
- .pill-btn-primary:not(:disabled):hover {
77
- background-color: var(--accent-hover);
78
- box-shadow: 0 4px 16px rgba(76, 175, 80, 0.4);
79
- }
80
-
81
- .pill-btn-ghost {
82
- background-color: transparent;
83
- color: var(--text-secondary);
84
- border: 2px solid var(--border-card);
85
- }
86
- .pill-btn-ghost:not(:disabled):hover {
87
- border-color: var(--accent-primary);
88
- color: var(--accent-primary);
89
- background-color: rgba(76, 175, 80, 0.06);
90
- }
91
-
92
- .pill-btn-danger {
93
- background-color: #ef5350;
94
- color: #fff;
95
- box-shadow: 0 2px 8px rgba(239, 83, 80, 0.25);
96
- }
97
- .pill-btn-danger:not(:disabled):hover {
98
- background-color: #c62828;
99
- box-shadow: 0 4px 16px rgba(239, 83, 80, 0.35);
100
- }
101
-
102
- .btn-icon {
103
- display: flex;
104
- align-items: center;
105
- }
106
- </style>
1
+ <script lang="ts">
2
+ export let variant: 'primary' | 'ghost' | 'danger' = 'primary';
3
+ export let size: 'sm' | 'md' | 'lg' = 'md';
4
+ export let disabled = false;
5
+ export let type: 'button' | 'submit' | 'reset' = 'button';
6
+
7
+ const sizeClasses = {
8
+ sm: 'btn-sm',
9
+ md: 'btn-md',
10
+ lg: 'btn-lg'
11
+ };
12
+ </script>
13
+
14
+ <button
15
+ {type}
16
+ {disabled}
17
+ class="pill-btn pill-btn-{variant} {sizeClasses[size]}"
18
+ on:click
19
+ on:mouseenter
20
+ on:mouseleave
21
+ >
22
+ {#if $$slots.icon}
23
+ <span class="btn-icon" aria-hidden="true">
24
+ <slot name="icon" />
25
+ </span>
26
+ {/if}
27
+ <slot />
28
+ </button>
29
+
30
+ <style>
31
+ .pill-btn {
32
+ display: inline-flex;
33
+ align-items: center;
34
+ gap: 0.4rem;
35
+ border-radius: 9999px;
36
+ font-family: 'Nunito', sans-serif;
37
+ font-weight: 700;
38
+ cursor: pointer;
39
+ border: none;
40
+ transition:
41
+ transform 0.18s cubic-bezier(0.68, -0.55, 0.265, 1.55),
42
+ box-shadow 0.18s ease,
43
+ background-color 0.18s ease,
44
+ color 0.18s ease,
45
+ border-color 0.18s ease;
46
+ user-select: none;
47
+ white-space: nowrap;
48
+ line-height: 1;
49
+ }
50
+
51
+ .pill-btn:disabled {
52
+ opacity: 0.45;
53
+ cursor: not-allowed;
54
+ transform: none !important;
55
+ }
56
+
57
+ .pill-btn:not(:disabled):hover {
58
+ transform: scale(1.06) translateY(-1px);
59
+ }
60
+
61
+ .pill-btn:not(:disabled):active {
62
+ transform: scale(0.96) translateY(0);
63
+ }
64
+
65
+ /* Sizes */
66
+ .btn-sm { padding: 0.35rem 0.9rem; font-size: 0.75rem; }
67
+ .btn-md { padding: 0.5rem 1.25rem; font-size: 0.875rem; }
68
+ .btn-lg { padding: 0.65rem 1.6rem; font-size: 1rem; }
69
+
70
+ /* Variants */
71
+ .pill-btn-primary {
72
+ background-color: var(--accent-primary);
73
+ color: #fff;
74
+ box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3);
75
+ }
76
+ .pill-btn-primary:not(:disabled):hover {
77
+ background-color: var(--accent-hover);
78
+ box-shadow: 0 4px 16px rgba(76, 175, 80, 0.4);
79
+ }
80
+
81
+ .pill-btn-ghost {
82
+ background-color: transparent;
83
+ color: var(--text-secondary);
84
+ border: 2px solid var(--border-card);
85
+ }
86
+ .pill-btn-ghost:not(:disabled):hover {
87
+ border-color: var(--accent-primary);
88
+ color: var(--accent-primary);
89
+ background-color: rgba(76, 175, 80, 0.06);
90
+ }
91
+
92
+ .pill-btn-danger {
93
+ background-color: #ef5350;
94
+ color: #fff;
95
+ box-shadow: 0 2px 8px rgba(239, 83, 80, 0.25);
96
+ }
97
+ .pill-btn-danger:not(:disabled):hover {
98
+ background-color: #c62828;
99
+ box-shadow: 0 4px 16px rgba(239, 83, 80, 0.35);
100
+ }
101
+
102
+ .btn-icon {
103
+ display: flex;
104
+ align-items: center;
105
+ }
106
+ </style>
@@ -1,67 +1,67 @@
1
- <script context="module" lang="ts">
2
- export type Status =
3
- | 'pending'
4
- | 'planning'
5
- | 'approved'
6
- | 'executing'
7
- | 'complete'
8
- | 'failed';
9
- </script>
10
-
11
- <script lang="ts">
12
- export let status: Status = 'pending';
13
- export let label: string | undefined = undefined;
14
-
15
- const labels: Record<Status, string> = {
16
- pending: 'Pending',
17
- planning: 'Planning',
18
- approved: 'Approved',
19
- executing: 'Executing',
20
- complete: 'Complete',
21
- failed: 'Failed'
22
- };
23
-
24
- const dots: Record<Status, string> = {
25
- pending: '○',
26
- planning: '◑',
27
- approved: '●',
28
- executing: '◉',
29
- complete: '✓',
30
- failed: '✕'
31
- };
32
-
33
- $: displayLabel = label ?? labels[status];
34
- </script>
35
-
36
- <span class="badge badge-{status}" role="status">
37
- <span class="dot" aria-hidden="true">{dots[status]}</span>
38
- {displayLabel}
39
- </span>
40
-
41
- <style>
42
- .badge {
43
- display: inline-flex;
44
- align-items: center;
45
- gap: 0.3rem;
46
- padding: 4px 12px;
47
- border-radius: 12px;
48
- font-family: 'Nunito', sans-serif;
49
- font-weight: 700;
50
- font-size: 0.75rem;
51
- letter-spacing: 0.02em;
52
- white-space: nowrap;
53
- user-select: none;
54
- }
55
-
56
- .dot {
57
- font-size: 0.7rem;
58
- line-height: 1;
59
- }
60
-
61
- .badge-pending { background: #fff9c4; color: #5d4037; }
62
- .badge-planning { background: #bbdefb; color: #0d47a1; }
63
- .badge-approved { background: #c8e6c9; color: #1b5e20; }
64
- .badge-executing { background: #ffe0b2; color: #bf360c; }
65
- .badge-complete { background: #b2dfdb; color: #004d40; }
66
- .badge-failed { background: #ffcdd2; color: #b71c1c; }
67
- </style>
1
+ <script context="module" lang="ts">
2
+ export type Status =
3
+ | 'pending'
4
+ | 'planning'
5
+ | 'approved'
6
+ | 'executing'
7
+ | 'complete'
8
+ | 'failed';
9
+ </script>
10
+
11
+ <script lang="ts">
12
+ export let status: Status = 'pending';
13
+ export let label: string | undefined = undefined;
14
+
15
+ const labels: Record<Status, string> = {
16
+ pending: 'Pending',
17
+ planning: 'Planning',
18
+ approved: 'Approved',
19
+ executing: 'Executing',
20
+ complete: 'Complete',
21
+ failed: 'Failed'
22
+ };
23
+
24
+ const dots: Record<Status, string> = {
25
+ pending: '○',
26
+ planning: '◑',
27
+ approved: '●',
28
+ executing: '◉',
29
+ complete: '✓',
30
+ failed: '✕'
31
+ };
32
+
33
+ $: displayLabel = label ?? labels[status];
34
+ </script>
35
+
36
+ <span class="badge badge-{status}" role="status">
37
+ <span class="dot" aria-hidden="true">{dots[status]}</span>
38
+ {displayLabel}
39
+ </span>
40
+
41
+ <style>
42
+ .badge {
43
+ display: inline-flex;
44
+ align-items: center;
45
+ gap: 0.3rem;
46
+ padding: 4px 12px;
47
+ border-radius: 12px;
48
+ font-family: 'Nunito', sans-serif;
49
+ font-weight: 700;
50
+ font-size: 0.75rem;
51
+ letter-spacing: 0.02em;
52
+ white-space: nowrap;
53
+ user-select: none;
54
+ }
55
+
56
+ .dot {
57
+ font-size: 0.7rem;
58
+ line-height: 1;
59
+ }
60
+
61
+ .badge-pending { background: #fff9c4; color: #5d4037; }
62
+ .badge-planning { background: #bbdefb; color: #0d47a1; }
63
+ .badge-approved { background: #c8e6c9; color: #1b5e20; }
64
+ .badge-executing { background: #ffe0b2; color: #bf360c; }
65
+ .badge-complete { background: #b2dfdb; color: #004d40; }
66
+ .badge-failed { background: #ffcdd2; color: #b71c1c; }
67
+ </style>
@@ -1,149 +1,149 @@
1
- <script lang="ts">
2
- export let open = false;
3
- export let height = 200;
4
- export let title = 'Agent Output';
5
-
6
- export let lines: string[] = [];
7
-
8
- function toggle() {
9
- open = !open;
10
- }
11
-
12
- let logEl: HTMLDivElement;
13
-
14
- $: if (logEl && lines) {
15
- // Auto-scroll to bottom when new lines arrive
16
- setTimeout(() => {
17
- if (logEl) logEl.scrollTop = logEl.scrollHeight;
18
- }, 0);
19
- }
20
- </script>
21
-
22
- <div class="stream-drawer" class:open>
23
- <button class="drawer-toggle" on:click={toggle} aria-expanded={open}>
24
- <span class="toggle-icon" aria-hidden="true">{open ? '▼' : '▲'}</span>
25
- <span class="toggle-title">{title}</span>
26
- {#if lines.length > 0}
27
- <span class="line-count">{lines.length} lines</span>
28
- {/if}
29
- </button>
30
-
31
- {#if open}
32
- <div class="drawer-body" style="height: {height}px" bind:this={logEl}>
33
- {#if lines.length === 0}
34
- <p class="drawer-empty">Waiting for agent output...</p>
35
- {:else}
36
- {#each lines as line, i (i)}
37
- <div class="log-line" class:log-error={line.startsWith('ERROR')} class:log-success={line.startsWith('OK') || line.startsWith('✓')}>
38
- <span class="log-index">{String(i + 1).padStart(3, '0')}</span>
39
- <span class="log-text">{line}</span>
40
- </div>
41
- {/each}
42
- {/if}
43
- </div>
44
- {/if}
45
- </div>
46
-
47
- <style>
48
- .stream-drawer {
49
- position: fixed;
50
- bottom: 0;
51
- left: 0;
52
- right: 0;
53
- background: var(--bg-drawer);
54
- border-top: 2px solid var(--border-accent);
55
- z-index: 100;
56
- transition: box-shadow 0.2s ease;
57
- }
58
-
59
- .stream-drawer.open {
60
- box-shadow: 0 -4px 24px rgba(76, 175, 80, 0.15);
61
- }
62
-
63
- .drawer-toggle {
64
- display: flex;
65
- align-items: center;
66
- gap: 0.5rem;
67
- width: 100%;
68
- padding: 0.5rem 1rem;
69
- background: none;
70
- border: none;
71
- cursor: pointer;
72
- font-family: 'Nunito', sans-serif;
73
- font-weight: 700;
74
- font-size: 0.8rem;
75
- color: var(--text-secondary);
76
- transition: color 0.15s ease, background 0.15s ease;
77
- }
78
-
79
- .drawer-toggle:hover {
80
- color: var(--accent-primary);
81
- background: rgba(76, 175, 80, 0.04);
82
- }
83
-
84
- .toggle-icon {
85
- font-size: 0.65rem;
86
- }
87
-
88
- .toggle-title {
89
- flex: 1;
90
- text-align: left;
91
- letter-spacing: 0.05em;
92
- text-transform: uppercase;
93
- font-size: 0.7rem;
94
- }
95
-
96
- .line-count {
97
- font-size: 0.7rem;
98
- color: var(--text-muted);
99
- background: var(--border-card);
100
- padding: 2px 8px;
101
- border-radius: 9999px;
102
- }
103
-
104
- .drawer-body {
105
- overflow-y: auto;
106
- font-family: 'Menlo', 'Monaco', 'Consolas', monospace;
107
- font-size: 0.75rem;
108
- line-height: 1.6;
109
- padding: 0.5rem 0;
110
- scrollbar-width: thin;
111
- }
112
-
113
- .drawer-empty {
114
- padding: 0.75rem 1rem;
115
- color: var(--text-muted);
116
- font-family: 'Nunito', sans-serif;
117
- font-style: italic;
118
- font-size: 0.8rem;
119
- margin: 0;
120
- }
121
-
122
- .log-line {
123
- display: flex;
124
- gap: 0.75rem;
125
- padding: 0.1rem 1rem;
126
- color: var(--text-secondary);
127
- transition: background 0.1s;
128
- }
129
-
130
- .log-line:hover {
131
- background: rgba(76, 175, 80, 0.04);
132
- }
133
-
134
- .log-index {
135
- color: var(--text-muted);
136
- user-select: none;
137
- min-width: 2rem;
138
- text-align: right;
139
- }
140
-
141
- .log-text {
142
- white-space: pre-wrap;
143
- word-break: break-word;
144
- flex: 1;
145
- }
146
-
147
- .log-error .log-text { color: #ef5350; }
148
- .log-success .log-text { color: var(--accent-primary); }
149
- </style>
1
+ <script lang="ts">
2
+ export let open = false;
3
+ export let height = 200;
4
+ export let title = 'Agent Output';
5
+
6
+ export let lines: string[] = [];
7
+
8
+ function toggle() {
9
+ open = !open;
10
+ }
11
+
12
+ let logEl: HTMLDivElement;
13
+
14
+ $: if (logEl && lines) {
15
+ // Auto-scroll to bottom when new lines arrive
16
+ setTimeout(() => {
17
+ if (logEl) logEl.scrollTop = logEl.scrollHeight;
18
+ }, 0);
19
+ }
20
+ </script>
21
+
22
+ <div class="stream-drawer" class:open>
23
+ <button class="drawer-toggle" on:click={toggle} aria-expanded={open}>
24
+ <span class="toggle-icon" aria-hidden="true">{open ? '▼' : '▲'}</span>
25
+ <span class="toggle-title">{title}</span>
26
+ {#if lines.length > 0}
27
+ <span class="line-count">{lines.length} lines</span>
28
+ {/if}
29
+ </button>
30
+
31
+ {#if open}
32
+ <div class="drawer-body" style="height: {height}px" bind:this={logEl}>
33
+ {#if lines.length === 0}
34
+ <p class="drawer-empty">Waiting for agent output...</p>
35
+ {:else}
36
+ {#each lines as line, i (i)}
37
+ <div class="log-line" class:log-error={line.startsWith('ERROR')} class:log-success={line.startsWith('OK') || line.startsWith('✓')}>
38
+ <span class="log-index">{String(i + 1).padStart(3, '0')}</span>
39
+ <span class="log-text">{line}</span>
40
+ </div>
41
+ {/each}
42
+ {/if}
43
+ </div>
44
+ {/if}
45
+ </div>
46
+
47
+ <style>
48
+ .stream-drawer {
49
+ position: fixed;
50
+ bottom: 0;
51
+ left: 0;
52
+ right: 0;
53
+ background: var(--bg-drawer);
54
+ border-top: 2px solid var(--border-accent);
55
+ z-index: 100;
56
+ transition: box-shadow 0.2s ease;
57
+ }
58
+
59
+ .stream-drawer.open {
60
+ box-shadow: 0 -4px 24px rgba(76, 175, 80, 0.15);
61
+ }
62
+
63
+ .drawer-toggle {
64
+ display: flex;
65
+ align-items: center;
66
+ gap: 0.5rem;
67
+ width: 100%;
68
+ padding: 0.5rem 1rem;
69
+ background: none;
70
+ border: none;
71
+ cursor: pointer;
72
+ font-family: 'Nunito', sans-serif;
73
+ font-weight: 700;
74
+ font-size: 0.8rem;
75
+ color: var(--text-secondary);
76
+ transition: color 0.15s ease, background 0.15s ease;
77
+ }
78
+
79
+ .drawer-toggle:hover {
80
+ color: var(--accent-primary);
81
+ background: rgba(76, 175, 80, 0.04);
82
+ }
83
+
84
+ .toggle-icon {
85
+ font-size: 0.65rem;
86
+ }
87
+
88
+ .toggle-title {
89
+ flex: 1;
90
+ text-align: left;
91
+ letter-spacing: 0.05em;
92
+ text-transform: uppercase;
93
+ font-size: 0.7rem;
94
+ }
95
+
96
+ .line-count {
97
+ font-size: 0.7rem;
98
+ color: var(--text-muted);
99
+ background: var(--border-card);
100
+ padding: 2px 8px;
101
+ border-radius: 9999px;
102
+ }
103
+
104
+ .drawer-body {
105
+ overflow-y: auto;
106
+ font-family: 'Menlo', 'Monaco', 'Consolas', monospace;
107
+ font-size: 0.75rem;
108
+ line-height: 1.6;
109
+ padding: 0.5rem 0;
110
+ scrollbar-width: thin;
111
+ }
112
+
113
+ .drawer-empty {
114
+ padding: 0.75rem 1rem;
115
+ color: var(--text-muted);
116
+ font-family: 'Nunito', sans-serif;
117
+ font-style: italic;
118
+ font-size: 0.8rem;
119
+ margin: 0;
120
+ }
121
+
122
+ .log-line {
123
+ display: flex;
124
+ gap: 0.75rem;
125
+ padding: 0.1rem 1rem;
126
+ color: var(--text-secondary);
127
+ transition: background 0.1s;
128
+ }
129
+
130
+ .log-line:hover {
131
+ background: rgba(76, 175, 80, 0.04);
132
+ }
133
+
134
+ .log-index {
135
+ color: var(--text-muted);
136
+ user-select: none;
137
+ min-width: 2rem;
138
+ text-align: right;
139
+ }
140
+
141
+ .log-text {
142
+ white-space: pre-wrap;
143
+ word-break: break-word;
144
+ flex: 1;
145
+ }
146
+
147
+ .log-error .log-text { color: #ef5350; }
148
+ .log-success .log-text { color: var(--accent-primary); }
149
+ </style>