fraim 2.0.202 → 2.0.204

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 (79) hide show
  1. package/README.md +3 -3
  2. package/bin/fraim.js +8 -18
  3. package/dist/src/cli/commands/first-run.js +2 -37
  4. package/dist/src/cli/doctor/checks/mcp-connectivity-checks.js +1 -1
  5. package/dist/src/cli/fraim.js +0 -2
  6. package/dist/src/cli/setup/ide-invocation-surfaces.js +6 -6
  7. package/dist/src/cli/utils/managed-agent-paths.js +76 -6
  8. package/dist/src/cli/utils/version-utils.js +2 -2
  9. package/dist/src/config/persona-capability-bundles.js +3 -3
  10. package/dist/src/core/job-phases.js +168 -0
  11. package/dist/src/core/utils/ports.js +32 -0
  12. package/dist/src/core/utils/stub-generator.js +24 -2
  13. package/dist/src/first-run/session-service.js +106 -24
  14. package/dist/src/local-mcp-server/learning-context-builder.js +1 -1
  15. package/dist/src/local-mcp-server/stdio-server.js +41 -9
  16. package/dist/src/routes/analytics.js +2 -2
  17. package/dist/src/services/registry-service.js +2 -2
  18. package/index.js +1 -1
  19. package/package.json +61 -181
  20. package/dist/src/ai-hub/catalog.js +0 -406
  21. package/dist/src/ai-hub/cert-store.js +0 -70
  22. package/dist/src/ai-hub/conversation-store.js +0 -359
  23. package/dist/src/ai-hub/desktop-main.js +0 -449
  24. package/dist/src/ai-hub/hosts.js +0 -1664
  25. package/dist/src/ai-hub/hub-latest-version.js +0 -52
  26. package/dist/src/ai-hub/hub-launch-decision.js +0 -57
  27. package/dist/src/ai-hub/hub-runtime-file.js +0 -43
  28. package/dist/src/ai-hub/managed-browser.js +0 -269
  29. package/dist/src/ai-hub/manager-turns.js +0 -64
  30. package/dist/src/ai-hub/office-sideload.js +0 -156
  31. package/dist/src/ai-hub/openclaw-bridge.js +0 -250
  32. package/dist/src/ai-hub/preferences.js +0 -201
  33. package/dist/src/ai-hub/remote-hub-gateway.js +0 -88
  34. package/dist/src/ai-hub/server.js +0 -3827
  35. package/dist/src/ai-hub/types.js +0 -2
  36. package/dist/src/ai-hub/word-sideload.js +0 -95
  37. package/dist/src/cli/commands/hub.js +0 -238
  38. package/dist/src/cli/commands/test-mcp.js +0 -171
  39. package/dist/src/cli/setup/first-run.js +0 -242
  40. package/dist/src/core/config-writer.js +0 -75
  41. package/dist/src/core/utils/job-aliases.js +0 -47
  42. package/dist/src/core/utils/workflow-parser.js +0 -174
  43. package/dist/src/services/email-service-clean.js +0 -782
  44. package/extensions/office-word/favicon.ico +0 -0
  45. package/extensions/office-word/icon-64.png +0 -0
  46. package/extensions/office-word/manifest.xml +0 -33
  47. package/extensions/office-word/taskpane.html +0 -242
  48. package/public/ai-hub/index.html +0 -894
  49. package/public/ai-hub/powerpoint-taskpane/icon-64.png +0 -0
  50. package/public/ai-hub/powerpoint-taskpane/index.html +0 -236
  51. package/public/ai-hub/powerpoint-taskpane/manifest.xml +0 -30
  52. package/public/ai-hub/review.css +0 -381
  53. package/public/ai-hub/script.js +0 -11024
  54. package/public/ai-hub/styles.css +0 -4873
  55. package/public/portfolio/ashley.html +0 -523
  56. package/public/portfolio/auditya.html +0 -83
  57. package/public/portfolio/banke.html +0 -83
  58. package/public/portfolio/beza.html +0 -659
  59. package/public/portfolio/careena.html +0 -632
  60. package/public/portfolio/casey.html +0 -568
  61. package/public/portfolio/celia.html +0 -490
  62. package/public/portfolio/deidre.html +0 -642
  63. package/public/portfolio/gautam.html +0 -597
  64. package/public/portfolio/hari.html +0 -469
  65. package/public/portfolio/huxley.html +0 -1354
  66. package/public/portfolio/index.html +0 -741
  67. package/public/portfolio/maestro.html +0 -518
  68. package/public/portfolio/mandy.html +0 -590
  69. package/public/portfolio/mona.html +0 -597
  70. package/public/portfolio/pam.html +0 -887
  71. package/public/portfolio/procella.html +0 -107
  72. package/public/portfolio/qasm.html +0 -569
  73. package/public/portfolio/ricardo.html +0 -489
  74. package/public/portfolio/sade.html +0 -560
  75. package/public/portfolio/sam.html +0 -654
  76. package/public/portfolio/sechar.html +0 -580
  77. package/public/portfolio/sreya.html +0 -599
  78. package/public/portfolio/swen.html +0 -601
  79. /package/dist/src/{ai-hub → core}/brand-store.js +0 -0
@@ -1,894 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta name="color-scheme" content="light dark">
7
- <title>FRAIM AI Hub</title>
8
- <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Crect width='48' height='48' rx='10' fill='%233d8a6e'/%3E%3Ctext x='24' y='32' text-anchor='middle' font-family='Helvetica,Arial,sans-serif' font-size='22' font-weight='700' fill='white'%3EH%3C/text%3E%3C/svg%3E">
9
- <!-- Detect Electron + host platform before CSS paints so html.electron / html.mac /
10
- html.win / html.linux rules apply on first render (no flash, correct native chrome). -->
11
- <script>(function(){var h=document.documentElement,ua=navigator.userAgent;if(/Electron/.test(ua))h.classList.add('electron');var p=(navigator.userAgentData&&navigator.userAgentData.platform)||navigator.platform||'';if(/mac/i.test(p)||/Mac|iPhone|iPad|iPod/.test(ua))h.classList.add('mac');else if(/win/i.test(p)||/Windows/.test(ua))h.classList.add('win');else if(/linux/i.test(p)||/Linux|X11/.test(ua))h.classList.add('linux');
12
- // #700: set the theme pre-paint (no flash). Explicit choice in
13
- // localStorage wins; otherwise follow the OS preference.
14
- try{var t=localStorage.getItem('fraim-theme');if(t!=='light'&&t!=='dark'){t=(window.matchMedia&&window.matchMedia('(prefers-color-scheme: dark)').matches)?'dark':'light';}h.setAttribute('data-theme',t);}catch(e){h.setAttribute('data-theme','light');}
15
- // #744: apply the cached org brand pre-paint (no flash of FRAIM identity
16
- // before company branding). script.js refines the per-theme accent on load.
17
- try{var b=JSON.parse(localStorage.getItem('fraim-org-brand')||'null');if(b){if(typeof b.color==='string'&&/^#[0-9a-f]{6}$/i.test(b.color)){h.style.setProperty('--accent',b.color);h.style.setProperty('--accent-strong',b.color);}if(typeof b.name==='string'&&b.name){document.title=b.name+' Hub';}}}catch(e){}
18
- })();</script>
19
- <link rel="stylesheet" href="./styles.css?v=conv-panels-20260611b">
20
- <link rel="stylesheet" href="./review.css">
21
- </head>
22
- <body>
23
-
24
- <!-- Issue #512: three-area top nav + account menu (surface=hub only). -->
25
- <nav class="hub-tabs" id="hub-tabs" hidden>
26
- <!-- #744: company brand lockup (logo + name), populated from bootstrap.orgBrand. -->
27
- <span class="hub-brand" id="hub-brand" hidden></span>
28
- <span class="hub-brand-divider" id="hub-brand-divider" hidden></span>
29
- <button class="hub-tab" type="button" data-area="company">Company</button>
30
- <button class="hub-tab" type="button" data-area="manager">Manager</button>
31
- <button class="hub-tab on" type="button" data-area="projects">Projects</button>
32
- <div class="nav-right">
33
- <!-- #744: FRAIM co-mark (co-branding, not white-label) shown when a brand is set. -->
34
- <span class="hub-cobrand" id="hub-cobrand" hidden></span>
35
- <button class="avatar-btn" id="avatar-btn" type="button" title="Account &amp; settings">SM</button>
36
- <div id="account-menu" class="account-menu">
37
- <div class="am-header">
38
- <div class="am-av" id="am-av">SM</div>
39
- <div>
40
- <div class="am-name" id="am-name">You</div>
41
- <div class="am-email" id="am-email"></div>
42
- </div>
43
- </div>
44
- <button class="am-item" id="am-account" type="button">
45
- <span class="am-ico">👤</span>
46
- <div><div class="am-label">Account</div><div class="am-sub">API key, sessions, billing</div></div>
47
- </button>
48
- <button class="am-item" id="am-brain" type="button">
49
- <span class="am-ico">🧠</span>
50
- <div><div class="am-label">Brain</div><div class="am-sub">Everything your team knows</div></div>
51
- </button>
52
- <button class="am-item" id="am-analytics" type="button">
53
- <span class="am-ico">📊</span>
54
- <div><div class="am-label">Analytics</div><div class="am-sub">Usage, cost, and ROI</div></div>
55
- </button>
56
- <button class="am-item am-theme" id="am-theme-toggle" type="button" role="switch" aria-checked="false">
57
- <span class="am-ico" id="am-theme-ico">🌙</span>
58
- <div><div class="am-label">Dark mode</div><div class="am-sub" id="am-theme-sub">Off</div></div>
59
- <span class="am-switch" aria-hidden="true"><span class="am-switch-knob"></span></span>
60
- </button>
61
- <div class="am-div"></div>
62
- <div class="am-update" id="am-update" hidden>
63
- <span class="am-ico">⬆️</span>
64
- <div><div class="am-label">Update available</div><div class="am-sub" id="am-update-sub"></div></div>
65
- </div>
66
- <button class="am-foot" id="am-signout" type="button"><span class="am-ico">⏻</span><span>Sign out</span></button>
67
- <div class="am-version" id="am-version" title="Running FRAIM Hub build"></div>
68
- </div>
69
- </div>
70
- </nav>
71
-
72
- <!-- Issue #512 / #521 R6: Company area — same shell as Projects (jobs rail + collapsible context/learnings) -->
73
- <section class="hub-area" id="area-company" hidden>
74
- <div class="area-shell">
75
- <nav class="area-rail" id="company-rail"></nav>
76
- <div class="area-main">
77
- <!-- Info view: context/learnings accordions shown when no conv is active -->
78
- <div class="area-info-view" id="company-info-view">
79
- <div class="hub-area-page">
80
- <div class="eyebrow">FRAIM Hub</div>
81
- <div class="area-h1">Company</div>
82
- <p class="area-lede">Your organization's identity — what you do, how you operate, and the guardrails every employee follows on every job.</p>
83
- <div id="company-push-banner"></div>
84
- <!-- #744: Brand editor — company identity across the Hub. -->
85
- <details class="ctx-acc" id="company-brand-acc">
86
- <summary><span class="ca-chev">▸</span> <span>🎨 Brand</span>
87
- <span class="ca-note">— your company's identity across the Hub, applied for every teammate</span></summary>
88
- <div class="ctx-acc-body"><div class="card area-profile" id="company-brand-editor"></div></div>
89
- </details>
90
- <details class="ctx-acc" id="company-ctx-acc">
91
- <summary><span class="ca-chev">▸</span> <span>🏢 Context &amp; rules</span></summary>
92
- <div class="ctx-acc-body"><div class="card area-profile" id="company-profile"></div></div>
93
- </details>
94
- <details class="ctx-acc" id="company-learn-acc">
95
- <summary><span class="ca-chev">▸</span> <span>🧠 Company learnings</span>
96
- <span class="ca-note">— org-wide, applied on every project</span></summary>
97
- <div class="ctx-acc-body"><div id="company-learnings"></div></div>
98
- </details>
99
- <!-- Issue #540 R1-R3: AI employee persona grid (collapsed by default) -->
100
- <details class="ctx-acc" id="company-emp-acc">
101
- <summary><span class="ca-chev">▸</span> <span>Your AI employees</span></summary>
102
- <div class="ctx-acc-body"><div id="persona-grid" class="persona-grid"></div></div>
103
- </details>
104
- </div>
105
- </div>
106
- <!-- Conversation host: the shared .page conversation panel is moved here when a company job is active -->
107
- <div class="area-conv-host workspace-conv" id="company-conv-host" hidden></div>
108
- </div>
109
- </div>
110
- </section>
111
-
112
- <!-- Issue #512 / #521 R6: Manager area — same shell as Projects -->
113
- <section class="hub-area" id="area-manager" hidden>
114
- <div class="area-shell">
115
- <nav class="area-rail" id="manager-rail"></nav>
116
- <div class="area-main">
117
- <!-- Info view: context/learnings accordions shown when no conv is active -->
118
- <div class="area-info-view" id="manager-info-view">
119
- <div class="hub-area-page">
120
- <div class="eyebrow">FRAIM Hub</div>
121
- <div class="area-h1">Manager</div>
122
- <p class="area-lede">How you manage — your working style, preferences, and the standing rules your team follows when working with you.</p>
123
- <details class="ctx-acc" id="manager-ctx-acc">
124
- <summary><span class="ca-chev">▸</span> <span>🤝 Context &amp; rules</span></summary>
125
- <div class="ctx-acc-body"><div class="card area-profile" id="manager-profile"></div></div>
126
- </details>
127
- <details class="ctx-acc" id="manager-learn-acc">
128
- <summary><span class="ca-chev">▸</span> <span>🧠 Manager learnings</span>
129
- <span class="ca-note">— how your team adapts to you</span></summary>
130
- <div class="ctx-acc-body"><div id="manager-learnings"></div></div>
131
- </details>
132
- <details class="ctx-acc" id="manager-reverse-acc">
133
- <summary><span class="ca-chev">▸</span> <span>🪞 Reverse mentoring</span>
134
- <span class="ca-note">— what you can improve on as a manager</span></summary>
135
- <div class="ctx-acc-body"><div id="reverse-mentoring"></div></div>
136
- </details>
137
- <!-- Issue #540 R4-R7: Your team pool (collapsed by default) -->
138
- <details class="ctx-acc" id="manager-team-acc">
139
- <summary><span class="ca-chev">▸</span> <span>Your team</span></summary>
140
- <div class="ctx-acc-body"><div id="manager-team-pool" class="manager-team-pool"></div></div>
141
- </details>
142
- </div>
143
- </div>
144
- <!-- Conversation host: the shared .page conversation panel is moved here when a manager job is active -->
145
- <div class="area-conv-host workspace-conv" id="manager-conv-host" hidden></div>
146
- </div>
147
- </div>
148
- </section>
149
-
150
- <!-- Issue #512: Brain area (reached from the account menu) -->
151
- <section class="hub-area" id="area-brain" hidden>
152
- <div class="hub-area-page">
153
- <div class="eyebrow">FRAIM · Brain</div>
154
- <div class="area-h1">Brain</div>
155
- <p class="area-lede">The full picture of what your team knows — every preserved learning across scopes, plus the skills and rules they draw on.</p>
156
- <div class="sec-label" style="margin-top:22px;">Preserved learnings</div>
157
- <div class="stat-grid" id="brain-learnings"></div>
158
- <div class="sec-label" style="margin-top:22px;">What your team draws on</div>
159
- <div class="stat-grid" id="brain-catalog"></div>
160
- </div>
161
- </section>
162
-
163
- <section class="hub-area" id="area-connected" hidden>
164
- <div class="connected-shell">
165
- <div class="connected-toolbar">
166
- <div class="connected-title-block">
167
- <div class="connected-kicker" id="connected-kicker">Connected FRAIM</div>
168
- <div class="connected-title" id="connected-title">Account</div>
169
- </div>
170
- <div class="connected-origin" id="connected-origin"></div>
171
- <button class="connected-close" id="connected-close" type="button">Back</button>
172
- </div>
173
- <iframe id="connected-frame" class="connected-frame" title="FRAIM connected surface" allow="clipboard-read; clipboard-write"></iframe>
174
- </div>
175
- </section>
176
-
177
- <!-- Issue #512: Projects area wraps the existing single-surface Hub. -->
178
- <section class="hub-area on" id="area-projects">
179
- <div class="proj-tabs" id="proj-tabs">
180
- <button class="ptab on" id="ptab-overview" type="button" data-view="overview">Overview</button>
181
- <span id="proj-tab-list"></span>
182
- <button class="ptab ptab-add" id="ptab-add" type="button">+ Project</button>
183
- </div>
184
-
185
- <!-- Overview sub-view: dashboard project cards -->
186
- <div id="proj-overview">
187
- <div class="hub-area-page">
188
- <!-- Issue #671: Cards / Kanban view toggle -->
189
- <div class="kb-view-toggle" id="kb-view-toggle">
190
- <button class="kb-vtab on" data-view="cards" type="button">Cards</button>
191
- <button class="kb-vtab" data-view="kanban" type="button">Kanban</button>
192
- </div>
193
- <div id="proj-cards-view">
194
- <div class="sec-label" id="proj-cards-label">All projects</div>
195
- <div class="proj-grid" id="proj-grid"></div>
196
- <div id="kb-runs-grid" hidden></div>
197
- </div>
198
- </div>
199
- <!-- Issue #671: Kanban board — rendered by tfRenderKanban() -->
200
- <div id="proj-kanban" hidden>
201
- <div id="kb-stats" class="kb-stats"></div>
202
- </div>
203
- </div>
204
-
205
- <!-- Project workspace: employee tree + the existing conversation surface. -->
206
- <div id="proj-workspace" hidden>
207
- <nav class="tree-sidebar" id="tree-sidebar"></nav>
208
- <button class="tree-collapse-btn" id="tree-collapse-btn" type="button" aria-label="Collapse project navigation" title="Collapse project navigation"></button>
209
- <div class="tree-resizer" id="tree-resizer" role="separator" aria-orientation="vertical" aria-label="Resize project navigation"></div>
210
- <div class="workspace-conv">
211
-
212
- <!-- #521 R5/R6.4: project brief & learnings as collapsible top sections
213
- (consistent with Company/Manager), replacing the over-conversation
214
- panels. Each sub-area is its own <details> so the manager controls
215
- how much text is shown. The editable brief rows (#proj-brief-profile)
216
- and the learnings list (#project-learnings) are unchanged. -->
217
- <div id="proj-context-top" class="proj-context-top">
218
- <!-- Onboarding state banner lives ABOVE the accordions so it shows even
219
- when the Brief is collapsed (so the conversation keeps its height). -->
220
- <div id="proj-onboarding-banner"></div>
221
- <div id="hub-agent-setup-panel" class="hub-agent-setup-panel" data-testid="hub-cli-setup-panel" hidden></div>
222
- <details class="ctx-acc" id="proj-brief-acc">
223
- <summary><span class="ca-chev">▸</span> <span>📋 Brief</span>
224
- <span class="ca-note">— this project's context and rules, captured by Project Onboarding</span></summary>
225
- <div class="ctx-acc-body"><div class="card area-profile" id="proj-brief-profile"></div></div>
226
- </details>
227
- <details class="ctx-acc" id="proj-learnings-acc">
228
- <summary><span class="ca-chev">▸</span> <span>🧠 Learnings</span>
229
- <span class="ca-note">— from <strong>sleep-on-learnings</strong> · promote to a scope</span></summary>
230
- <div class="ctx-acc-body"><div id="project-learnings"></div></div>
231
- </details>
232
- <!-- Issue #578: Scheduled + Reactive Employees — deployment roster -->
233
- <details class="ctx-acc" id="proj-deployments-acc">
234
- <summary><span class="ca-chev">▸</span> <span>📋 Assignments</span>
235
- <span class="ca-note">— scheduled and triggered assignments for this project</span></summary>
236
- <div class="ctx-acc-body">
237
- <div id="proj-deployments-list"></div>
238
- <div class="dep-actions">
239
- <button class="dep-add-btn" id="dep-add-btn" type="button">+ New Assignment</button>
240
- </div>
241
- </div>
242
- </details>
243
- </div>
244
-
245
-
246
- <div class="page" id="hub-conv-page">
247
-
248
- <header class="header" style="-webkit-app-region: drag;">
249
- <h1 class="header-title">Manage your FRAIM Employees</h1>
250
- <section class="welcome">
251
- Hi <strong class="you">there</strong>, remember, you are the
252
- <span class="concept">AI Manager<button class="info" data-concept="manager" aria-label="What is AI Manager?">i</button>
253
- <span class="popover" id="pop-manager">
254
- <span class="pop-title">AI Manager</span>
255
- That's you. You decide what outcome matters, pick the right job, and hold the bar on quality. You're not writing the work - you're directing it.
256
- <a class="pop-link" href="#" data-target="jobs-manager">See manager jobs</a>
257
- <span class="pop-jobs" id="jobs-manager"></span>
258
- </span></span>.
259
- Delegate jobs to your
260
- <span class="concept">AI Employees<button class="info" data-concept="employee" aria-label="What is AI Employee?">i</button>
261
- <span class="popover" id="pop-employee">
262
- <span class="pop-title">AI Employee</span>
263
- The coding agent - Codex, Claude, or another - that actually does the work you assign. AI Hub is where you direct them; the agent itself is the employee.
264
- <a class="pop-link" href="#" data-target="jobs-employee">See employee jobs</a>
265
- <span class="pop-jobs" id="jobs-employee"></span>
266
- </span></span>,
267
- <span class="concept">Coach<button class="info" data-concept="coach" aria-label="What is Coach?">i</button>
268
- <span class="popover" id="pop-coach">
269
- <span class="pop-title">Coach</span>
270
- Add context, raise the bar, or correct course mid-flight without abandoning the conversation. Same job, sharper guidance.
271
- <a class="pop-link" href="#" data-target="jobs-coach">See coaching jobs</a>
272
- <span class="pop-jobs" id="jobs-coach"></span>
273
- </span></span>
274
- them,
275
- <span class="concept">Verify<button class="info" data-concept="verify" aria-label="What is Verify?">i</button>
276
- <span class="popover" id="pop-verify">
277
- <span class="pop-title">Verify</span>
278
- Check that the artifact actually solved the problem before you trust completion. Read the result, not just the logs.
279
- <a class="pop-link" href="#" data-target="jobs-verify">See verification jobs</a>
280
- <span class="pop-jobs" id="jobs-verify"></span>
281
- </span></span>
282
- their work, and expect them to
283
- <span class="concept">Learn<button class="info" data-concept="learn" aria-label="What is Learn?">i</button>
284
- <span class="popover" id="pop-learn">
285
- <span class="pop-title">Learn</span>
286
- Each run should make the next one better. Your coaching becomes their lasting habit.
287
- <a class="pop-link" href="#" data-target="jobs-learn">See learning jobs</a>
288
- <span class="pop-jobs" id="jobs-learn"></span>
289
- </span></span>
290
- and get better. Let your employees make you shine.
291
- </section>
292
- <button class="project-button" type="button" id="project-button">
293
- <span class="folder">Project</span>
294
- <strong id="project-name">Choose a folder</strong>
295
- </button>
296
- </header>
297
-
298
- <div class="layout">
299
- <aside class="rail">
300
- <span id="tp-project-label" class="tp-project-label"></span>
301
- <button class="new-conv" type="button" id="new-conv-btn">+ New job</button>
302
- <div class="rail-note">Alpha: browser shell for directing employees across your project.</div>
303
- <section class="rail-section rail-section--employees">
304
- <div class="rail-section-label">Hired employees</div>
305
- <div class="team-roster" id="team-roster" hidden></div>
306
- </section>
307
-
308
- <section class="rail-section rail-section--runs">
309
- <div class="rail-section-label">Employees</div>
310
- <div class="conv-list" id="conv-list"></div>
311
- </section>
312
- </aside>
313
-
314
- <div id="word-context-bar" class="word-context-bar" hidden>
315
- <span class="word-ctx-icon">📄</span>
316
- <span class="word-ctx-text" id="word-ctx-text"></span>
317
- <button class="word-ctx-refresh" type="button" id="word-ctx-refresh" title="Refresh document context">↻</button>
318
- </div>
319
-
320
- <main class="conversation" id="conversation">
321
- <div class="empty-state" id="empty">
322
- <h3>No job selected</h3>
323
- <p>Pick an existing job from the left, or click <strong>+ New job</strong> to give your employee something to work on.</p>
324
- </div>
325
-
326
- <!-- Issue #540 R10-R14: Non-blocking hire strip. Lives outside #active-conv so it
327
- is visible even when no conversation is active. -->
328
- <div id="hire-strip" class="hire-strip" hidden>
329
- <div class="hs-avatar" id="hs-avatar"></div>
330
- <div class="hs-body">
331
- <p class="hs-title" id="hs-title">Unlock this employee</p>
332
- <p class="hs-sub" id="hs-sub">Add them to your team to run this job with full context and memory.</p>
333
- </div>
334
- <div class="hs-actions">
335
- <button class="hs-btn hs-btn--primary" type="button" id="hs-add-btn">Add to my team</button>
336
- <button class="hs-btn hs-btn--primary" type="button" id="hs-get-btn" hidden>Get for your company</button>
337
- <button class="hs-btn hs-btn--ghost" type="button" id="hs-skip-btn">Skip — use generic agent</button>
338
- </div>
339
- </div>
340
-
341
- <div id="active-conv" hidden>
342
- <div class="conv-topline">
343
- <div class="employee-identity" id="active-identity"></div>
344
- <span id="active-title" class="conv-job-title"></span>
345
- <button class="run-stop-btn" id="run-stop-btn" type="button" hidden title="Ask the employee to stop and wait for you">⏹ Stop</button>
346
- <div class="run-state-pill" id="run-state-pill"></div>
347
- </div>
348
-
349
- <div class="conversation-status">
350
- <div class="tracker tracker-inline" id="tracker" aria-label="Job progress" hidden>
351
- <div class="tracker-rows" id="tracker-rows"></div>
352
- <div class="tracker-note" id="tracker-note" hidden></div>
353
- <div class="totals" id="totals" aria-label="Run totals" hidden></div>
354
- </div>
355
- </div>
356
-
357
- <details class="panel-details panel-details--thread" id="thread-panel" open>
358
- <summary>
359
- <span class="panel-summary-copy">
360
- <span class="panel-kicker">Manager and employee thread</span>
361
- </span>
362
- </summary>
363
- <!-- Issue #512 R7: completion card + format-derived artifact strip
364
- render INSIDE #messages (as the employee's review turn) so the
365
- thread panel keeps its existing flex/scroll geometry. -->
366
- <div class="messages" id="messages"></div>
367
- </details>
368
-
369
- <div class="support-stack">
370
- <details class="panel-details panel-details--coach" id="coach-panel" open>
371
- <summary>
372
- <span class="panel-summary-copy">
373
- <span class="panel-kicker">Coach the employee</span>
374
- <span class="panel-summary-text" id="coach-summary">Open when you want to steer the next step</span>
375
- </span>
376
- <span class="active-employee-row" onclick="event.stopPropagation()">
377
- <span class="active-employee-label">Maestro</span>
378
- <select id="active-employee-select" class="employee-select inline" aria-label="Agent Tool"></select>
379
- </span>
380
- </summary>
381
- <div class="panel-body">
382
- <div class="coach">
383
- <!-- Issue #512 R7.7: review actions live in the SAME bar as the
384
- coaching chips. Hidden until a deliverable is awaiting review;
385
- the coaching chips below never disappear. -->
386
- <div class="review-actions" id="review-actions" hidden>
387
- <button class="rb-approve" type="button" id="review-approve">✓ Approve</button>
388
- <button class="rb-secondary" type="button" id="review-request-changes">↩ Request changes</button>
389
- <span class="rb-handoff" id="review-handoff">Comment on the doc to leave inline notes, or type below to coach.</span>
390
- </div>
391
- <div class="quick-coach-row" id="quick-coach-btns" hidden>
392
- <button class="ghost quick-coach-btn mark-complete-btn" type="button" id="mark-complete-btn">✓ Mark complete</button>
393
- <button class="ghost quick-coach-btn" type="button" data-job="recognize-good-work" data-prompt="Good job. What went well, and how can we repeat it?">👍 Good job</button>
394
- <button class="ghost quick-coach-btn" type="button" data-job="analyze-why-you-messed-up" data-prompt="Why did you mess up? Explain the root cause, what you should have done differently, and what you will change next time.">🔍 Why did you mess up?</button>
395
- <button class="ghost quick-coach-btn" type="button" data-job="follow-your-mentor" data-prompt="Follow the process. Re-check the workflow instructions and continue from the correct next step.">📋 Follow the process</button>
396
- <button class="ghost quick-coach-btn" type="button" id="other-manager-jobs-btn">Other manager jobs ▾</button>
397
- </div>
398
- <div class="coach-input">
399
- <textarea id="coach-text" placeholder="Tell the employee what to do next..."></textarea>
400
- <button class="send-button" type="button" id="send" disabled>↑</button>
401
- </div>
402
- <div class="template-popover" id="template-popover" role="menu" hidden></div>
403
- <div class="coach-note" id="coach-note"></div>
404
- </div>
405
- </div>
406
- </details>
407
-
408
- <details class="micro panel-details" id="micro-manage">
409
- <summary>
410
- <span class="panel-summary-copy">
411
- <span class="panel-kicker">Micro-manage</span>
412
- <span class="panel-summary-text">Raw host events and tool calls</span>
413
- </span>
414
- </summary>
415
- <pre class="micro-log" id="micro-log"></pre>
416
- </details>
417
- </div>
418
- </div>
419
-
420
- <!-- Issue #442: Direct (B) panel — shown only in A/B mode, mirrors FRAIM panel layout -->
421
- <div id="ab-direct-panel" hidden>
422
- <div class="conv-topline">
423
- <div class="ab-direct-identity">
424
- <span class="ab-direct-label">Direct (No FRAIM)</span>
425
- </div>
426
- <span class="conv-job-title"></span>
427
- <div class="run-state-pill" id="ab-direct-pill"></div>
428
- </div>
429
-
430
- <div class="conversation-status">
431
- <div class="tracker tracker-inline" id="ab-direct-tracker" aria-label="Direct run progress">
432
- <div class="ab-direct-progress" id="ab-direct-progress"></div>
433
- <div class="totals" id="ab-direct-totals" aria-label="Direct run totals" hidden></div>
434
- </div>
435
- </div>
436
-
437
- <details class="panel-details panel-details--thread" id="ab-direct-thread-panel" open>
438
- <summary>
439
- <span class="panel-summary-copy">
440
- <span class="panel-kicker">Direct output (raw)</span>
441
- </span>
442
- </summary>
443
- <pre class="ab-direct-log" id="ab-direct-log"></pre>
444
- </details>
445
-
446
- <div class="support-stack">
447
- <details class="panel-details panel-details--coach" id="ab-direct-reply-panel" open>
448
- <summary>
449
- <span class="panel-summary-copy">
450
- <span class="panel-kicker">Reply to Direct agent</span>
451
- <span class="panel-summary-text" id="ab-direct-reply-summary">Open to send a follow-up</span>
452
- </span>
453
- </summary>
454
- <div class="panel-body">
455
- <div class="coach">
456
- <div class="coach-input">
457
- <textarea id="ab-direct-input" placeholder="Reply to the agent..."></textarea>
458
- <button class="send-button" type="button" id="ab-direct-send" aria-label="Send reply to Direct agent" disabled>↑</button>
459
- </div>
460
- </div>
461
- </div>
462
- </details>
463
- </div>
464
- </div>
465
- </main>
466
- </div>
467
-
468
- <p class="status-line" id="status-line" role="status" aria-live="polite"></p>
469
- </div>
470
-
471
- </div><!-- /.workspace-conv -->
472
- <div class="proj-switch-mask" id="proj-switch-mask" role="status" aria-live="polite" aria-hidden="true">
473
- <div class="proj-switch-panel">
474
- <span class="proj-switch-spinner" aria-hidden="true"></span>
475
- <span id="proj-switch-label">Loading project...</span>
476
- </div>
477
- </div>
478
- </div><!-- /#proj-workspace -->
479
- </section><!-- /#area-projects -->
480
-
481
- <div class="modal-backdrop" id="modal" role="dialog" aria-modal="true" hidden>
482
- <div class="modal">
483
-
484
- <div id="step1">
485
- <div class="modal-header">
486
- <h2>What should the employee work on?</h2>
487
- <p>Pick one job. You can always start a new job for different work.</p>
488
- </div>
489
- <div class="modal-body">
490
- <input class="search" type="text" placeholder="Describe the work, or search jobs… (↵ starts an ad-hoc job)" id="job-search">
491
- <div id="job-persona-filter" hidden></div>
492
- <div id="job-catalog"></div>
493
- </div>
494
- <div id="hire-notice" hidden>
495
- <p id="hire-notice-text"></p>
496
- <div class="hire-notice-actions">
497
- <a id="hire-notice-link" href="#" target="_blank" rel="noopener" class="send-button">Go to Pricing</a>
498
- <button id="hire-notice-back" type="button" class="ghost">Back to all jobs</button>
499
- </div>
500
- </div>
501
- <div class="modal-footer">
502
- <span class="left" id="job-pick-status">Choose a job to continue</span>
503
- <div class="right">
504
- <button class="ghost" type="button" id="cancel1">Cancel</button>
505
- <button class="send-button" type="button" id="next1" disabled>Next</button>
506
- </div>
507
- </div>
508
- </div>
509
-
510
- <div id="step2" class="step2" hidden>
511
- <div class="modal-header">
512
- <h2>Tell the employee what you need</h2>
513
- <p>A few sentences is enough. The employee will ask if anything is unclear.</p>
514
- </div>
515
- <div class="modal-body">
516
- <div class="assigned-job">
517
- <div class="label">Assigned job</div>
518
- <div class="name" id="picked-name"></div>
519
- <div class="desc" id="picked-desc"></div>
520
- </div>
521
- <textarea id="instructions" placeholder="What outcome do you want? Any context the employee should know?"></textarea>
522
- <div id="word-context-card" class="word-context-card" hidden>
523
- <div class="word-ctx-card-header">
524
- <span class="word-ctx-card-icon">📄</span>
525
- <span class="word-ctx-card-label" id="word-ctx-card-label">Document context</span>
526
- <button type="button" class="word-ctx-card-toggle" id="word-ctx-card-toggle" aria-label="Expand document context">▸</button>
527
- </div>
528
- <div class="word-ctx-card-body" id="word-ctx-card-body" hidden></div>
529
- </div>
530
- <div class="employee-line">
531
- <span class="employee-label">Agent Tool:</span>
532
- <select id="employee-select" class="employee-select" aria-label="Agent Tool"></select>
533
- </div>
534
- <div id="agent-install-panel"></div>
535
- <div id="ab-toggle-wrap" hidden>
536
- <label class="ab-toggle-label">
537
- <input type="checkbox" id="ab-toggle">
538
- Compare with Direct mode (no FRAIM)
539
- </label>
540
- <p id="ab-toggle-explanation" hidden>FRAIM runs the job on the left. A direct session with no FRAIM framework runs on the right. Compare results side by side.</p>
541
- </div>
542
- </div>
543
- <div class="modal-footer">
544
- <span class="left">You can coach the employee with more detail after they start.</span>
545
- <div class="right">
546
- <button class="ghost" type="button" id="back2">Back</button>
547
- <button class="send-button" type="button" id="start" disabled>Start</button>
548
- </div>
549
- </div>
550
- </div>
551
-
552
- </div>
553
- </div>
554
-
555
- <!-- Issue #512: New-project flow (4-step modal) -->
556
- <div id="np-modal" class="np-overlay" hidden>
557
- <button class="np-close" id="np-close" type="button">×</button>
558
- <div class="np-wrap">
559
- <div class="np-step-dots" id="np-dots">
560
- <div class="np-dot on"></div><div class="np-dot"></div><div class="np-dot"></div><div class="np-dot"></div>
561
- </div>
562
-
563
- <div class="np-step on" id="np1">
564
- <div class="np-card">
565
- <div class="np-hdr">
566
- <div class="step-label">Step 1 of 4</div>
567
- <h2>Choose a project folder</h2>
568
- <p>Pick the folder where your team will work. They'll read context from it, write artifacts to it, and build up learnings there.</p>
569
- </div>
570
- <div class="np-body">
571
- <div class="np-field">
572
- <label>Project folder</label>
573
- <div class="np-folder-row">
574
- <input type="text" id="np-folder" placeholder="Choose a folder…" readonly>
575
- <button type="button" class="np-browse-btn" id="np-browse">Browse…</button>
576
- </div>
577
- <div class="np-field-hint">Must be an existing folder on your machine.</div>
578
- </div>
579
- <div class="np-field">
580
- <label>What are you trying to accomplish? <span class="np-optional">(optional — your team will ask if unclear)</span></label>
581
- <textarea id="np-intent" rows="3" placeholder="e.g. Build a compliance-ready hiring module for mid-market SaaS teams."></textarea>
582
- </div>
583
- </div>
584
- <div class="np-footer"><span></span><button class="np-next" type="button" data-np="2" id="np1-next" disabled>Next →</button></div>
585
- </div>
586
- </div>
587
-
588
- <div class="np-step" id="np2">
589
- <div class="np-card">
590
- <div class="np-hdr"><div class="step-label">Step 2 of 4</div><h2>What does success look like?</h2><p>Your employees will use this to know when they're done and what constraints to work within.</p></div>
591
- <div class="np-body">
592
- <div class="np-field"><label>Outcome — how will you know this project succeeded?</label><textarea id="np-outcome" rows="3" placeholder="The end state that means done."></textarea></div>
593
- <div class="np-field"><label>Rules &amp; guardrails for this project <span class="np-optional">(optional)</span></label><textarea id="np-rules" rows="4" placeholder="Anything the team must always do, or never do?"></textarea></div>
594
- <div class="np-source"><span>📎</span><input type="text" id="np-source" placeholder="Or point me to a project doc, ticket, or spec to pull context from…"><button type="button" class="np-source-btn">Add source</button></div>
595
- <div class="np-note">Project rules stack on top of your org guardrails — they apply only here.</div>
596
- </div>
597
- <div class="np-footer"><button class="np-back" type="button" data-np="1">← Back</button><button class="np-next" type="button" data-np="3">Next →</button></div>
598
- </div>
599
- </div>
600
-
601
- <div class="np-step" id="np3">
602
- <div class="np-card">
603
- <div class="np-hdr"><div class="step-label">Step 3 of 4</div><h2>Who's working on this?</h2><p>Select from your hired employees. Each one will be briefed on the project before starting work.</p></div>
604
- <div class="np-body">
605
- <div class="emp-grid" id="np-emp-grid"></div>
606
- <div class="np-note">Greyed-out employees aren't hired yet. <a href="/pricing" class="np-link">Go to pricing →</a></div>
607
- </div>
608
- <div class="np-footer"><button class="np-back" type="button" data-np="2">← Back</button><button class="np-next" type="button" data-np="4">Review →</button></div>
609
- </div>
610
- </div>
611
-
612
- <div class="np-step" id="np4">
613
- <div class="np-card">
614
- <div class="np-hdr"><div class="step-label">Step 4 of 4</div><h2>Ready to brief the team</h2><p>FRAIM will share this context with each employee before they start any job on this project.</p></div>
615
- <div class="np-body" id="np-summary"></div>
616
- <div class="np-footer"><button class="np-back" type="button" data-np="3">← Back</button><button class="np-next" type="button" id="np-create-btn">Create project and brief the team →</button></div>
617
- </div>
618
- </div>
619
- </div>
620
- </div>
621
-
622
- <!-- #594: Area onboarding pre-flight context modal (org onboarding, learning synthesis, manager agreements) -->
623
- <div id="area-onboard-modal" class="modal-overlay" hidden>
624
- <div class="modal-card">
625
- <div class="modal-hdr">
626
- <div>
627
- <h2 id="aom-title">Run onboarding</h2>
628
- <p id="aom-desc">Add any specific focus areas or context before starting.</p>
629
- </div>
630
- <button class="modal-close" id="aom-close" type="button">×</button>
631
- </div>
632
- <div class="modal-body">
633
- <div class="np-field">
634
- <label for="aom-context">Any specific direction for this run? <span class="np-optional">(optional — leave blank to start with defaults)</span></label>
635
- <textarea id="aom-context" rows="4" placeholder="e.g. Focus on our new remote-work policy and async-first communication norms."></textarea>
636
- </div>
637
- </div>
638
- <div class="modal-footer">
639
- <button type="button" class="aom-cancel-btn" id="aom-cancel">Cancel</button>
640
- <button type="button" class="modal-next" id="aom-start">Start →</button>
641
- </div>
642
- </div>
643
- </div>
644
-
645
- <!-- Issue #512: Assign-job modal (job-first, with locks + per-employee filter) -->
646
- <div id="assign-job-modal" class="modal-overlay" hidden>
647
- <div class="modal-card">
648
- <div class="modal-hdr">
649
- <div><h2 id="aj-title">Assign a job</h2><p>Pick the work — we'll route it to the right specialist. Locked jobs need a teammate you haven't hired yet.</p></div>
650
- <button class="modal-close" id="aj-close" type="button">×</button>
651
- </div>
652
- <div class="modal-body" id="aj-body"></div>
653
- </div>
654
- </div>
655
-
656
- <!-- Issue #512: Add-employee modal (preselect-aware) -->
657
- <div id="add-emp-modal" class="modal-overlay" hidden>
658
- <div class="modal-card">
659
- <div class="modal-hdr">
660
- <div><h2>Add an employee to this project</h2><p id="ae-sub">Add someone from your team, or hire a new specialist. New hires are onboarded with your company context automatically.</p></div>
661
- <button class="modal-close" id="ae-close" type="button">×</button>
662
- </div>
663
- <div class="modal-body" id="ae-body"></div>
664
- </div>
665
- </div>
666
-
667
- <!-- Issue #512: Pricing modal -->
668
- <div id="pricing-modal" class="modal-overlay pricing-overlay" hidden>
669
- <div class="modal-card pricing-card">
670
- <div class="modal-hdr" style="border:none;justify-content:flex-end;padding-bottom:0;">
671
- <button class="modal-close" id="pr-close" type="button">×</button>
672
- </div>
673
- <div class="pricing-body">
674
- <div id="pr-av" class="pr-av">CE</div>
675
- <h2>Hire <span id="pr-persona">this specialist</span></h2>
676
- <p>Onboarded with your company context the moment you hire — and dropped straight onto this project, ready to take the job you picked.</p>
677
- <div class="pr-price" id="pr-price">$299<span>/mo</span></div>
678
- <a class="pr-cta" id="pr-cta" href="/pricing">Hire and add to project →</a>
679
- <div class="pr-foot">Opens checkout · cancel anytime</div>
680
- </div>
681
- </div>
682
- </div>
683
-
684
- <!-- Issue #538: Hire a human manager modal -->
685
- <div id="hm-modal" class="modal-overlay" hidden>
686
- <div class="modal-card" style="max-width:560px;">
687
- <div class="modal-hdr">
688
- <button class="modal-close" id="hm-close" type="button" aria-label="Close">×</button>
689
- <h2>Hire a human manager</h2>
690
- <p id="hm-sub">Find a great human to manage your AI employee. We pre-fill the search and a job description with the qualities of a strong AI manager.</p>
691
- </div>
692
- <div class="modal-body">
693
- <div class="hm-fieldrow">
694
- <div class="hm-field" style="flex:1;">
695
- <label for="hm-role">Managing which AI employee</label>
696
- <select id="hm-role"></select>
697
- </div>
698
- <div class="hm-field" style="max-width:200px;">
699
- <label for="hm-loc">Location (optional)</label>
700
- <input type="text" id="hm-loc" placeholder="e.g. San Francisco, CA" />
701
- </div>
702
- </div>
703
- <div class="hm-field">
704
- <label>Search query</label>
705
- <div class="hm-query"><code id="hm-query"></code><button class="hm-copy-btn" id="hm-copy-q" type="button">Copy</button></div>
706
- </div>
707
- <div class="hm-field">
708
- <label>Qualities of a strong AI manager (built into the search &amp; job description)</label>
709
- <div class="hm-qualities" id="hm-qualities"></div>
710
- </div>
711
- <details class="hm-jd">
712
- <summary><span class="hm-chev">▸</span> Job description <button class="hm-copy-btn" id="hm-copy-jd" type="button" style="margin-left:auto;">Copy JD</button></summary>
713
- <div class="hm-jd-body" id="hm-jd-body"></div>
714
- </details>
715
- <div>
716
- <div class="hm-providers-label">Open in a hiring service (search pre-filled)</div>
717
- <div class="hm-providers">
718
- <a class="hm-provider" id="hm-linkedin" target="_blank" rel="noopener"><span class="hm-logo linkedin">in</span><strong>LinkedIn</strong><small>Open search</small></a>
719
- <a class="hm-provider" id="hm-indeed" target="_blank" rel="noopener"><span class="hm-logo indeed">id</span><strong>Indeed</strong><small>Open search</small></a>
720
- <a class="hm-provider" id="hm-seekout" target="_blank" rel="noopener"><span class="hm-logo seekout">SO</span><strong>SeekOut</strong><small>Copy + open</small></a>
721
- </div>
722
- </div>
723
- <p class="hm-foot">We don't send your data anywhere. Clicking a service opens it in a new tab with the role keywords in the URL; the job description is copied to your clipboard for you to paste.</p>
724
- </div>
725
- </div>
726
- </div>
727
-
728
- <!-- Issue #693 R2: single consolidated "New Assignment" modal. Replaces the two
729
- separate Schedule / Trigger modals. A segmented control switches between
730
- Scheduled and Triggered, revealing only the type-specific fields. Shared
731
- fields (Name, Job, AI Agent, Instructions) are common to both. Inner ids
732
- (dep-sch-*, dep-wh-inbound-*) are preserved so the cron-preset and inbound-URL
733
- helpers keep working. -->
734
- <div id="dep-assignment-modal" class="modal-overlay" hidden>
735
- <div class="modal-card dep-modal-card">
736
- <div class="modal-hdr">
737
- <button class="modal-close" id="dep-assign-close" type="button" aria-label="Close">×</button>
738
- <h2 id="dep-assign-title">New assignment</h2>
739
- <p>Run a job automatically - on a schedule, or when an external system calls in.</p>
740
- </div>
741
- <div class="modal-body">
742
- <div class="dep-type-seg" id="dep-type-seg">
743
- <button type="button" class="dep-type-btn on" data-dep-type="scheduled">&#9201; Scheduled</button>
744
- <button type="button" class="dep-type-btn" data-dep-type="triggered">&#128279; Triggered</button>
745
- </div>
746
- <div class="hm-field">
747
- <label for="dep-label">Name</label>
748
- <input type="text" id="dep-label" placeholder="e.g. Daily standup digest" />
749
- </div>
750
- <div class="hm-fieldrow">
751
- <div class="hm-field">
752
- <label for="dep-job">Job</label>
753
- <select id="dep-job"></select>
754
- </div>
755
- <div class="hm-field">
756
- <label for="dep-agent">AI Agent</label>
757
- <select id="dep-agent"></select>
758
- </div>
759
- </div>
760
- <!-- Scheduled-only fields -->
761
- <div id="dep-sched-block">
762
- <div class="hm-field">
763
- <label>Runs</label>
764
- <div class="dep-preset-chips" id="dep-sch-presets">
765
- <button type="button" class="dep-preset-chip" data-preset="daily">Daily</button>
766
- <button type="button" class="dep-preset-chip" data-preset="weekdays">Weekdays</button>
767
- <button type="button" class="dep-preset-chip" data-preset="weekly">Weekly</button>
768
- <button type="button" class="dep-preset-chip" data-preset="custom">Custom</button>
769
- </div>
770
- </div>
771
- <div id="dep-sch-time-row" class="hm-fieldrow" hidden>
772
- <div class="hm-field" id="dep-sch-day-field" hidden>
773
- <label for="dep-sch-day">Day</label>
774
- <select id="dep-sch-day">
775
- <option value="1">Monday</option>
776
- <option value="2">Tuesday</option>
777
- <option value="3">Wednesday</option>
778
- <option value="4">Thursday</option>
779
- <option value="5">Friday</option>
780
- <option value="6">Saturday</option>
781
- <option value="0">Sunday</option>
782
- </select>
783
- </div>
784
- <div class="hm-field">
785
- <label for="dep-sch-time">Time</label>
786
- <input type="time" id="dep-sch-time" value="09:00" />
787
- </div>
788
- </div>
789
- <div id="dep-sch-custom-row" hidden>
790
- <div class="hm-field">
791
- <label for="dep-sch-cron">Cron expression</label>
792
- <input type="text" id="dep-sch-cron" placeholder="e.g. 0 9 * * 1-5" />
793
- <p id="dep-sch-cron-preview" class="dep-cron-preview"></p>
794
- </div>
795
- </div>
796
- <input type="hidden" id="dep-sch-cron-preset" />
797
- </div>
798
- <!-- Triggered-only note -->
799
- <div id="dep-trig-block" hidden>
800
- <p class="dep-trig-note">Runs when an external system POSTs to the inbound URL, generated after you add the assignment.</p>
801
- </div>
802
- <div class="hm-field">
803
- <label for="dep-instructions">Instructions <span class="dep-optional">(optional)</span></label>
804
- <textarea id="dep-instructions" rows="2" placeholder="Optional message sent to the agent at the start of each run"></textarea>
805
- </div>
806
- <div class="dep-modal-actions">
807
- <button type="button" id="dep-save-btn" class="send-button">Add assignment</button>
808
- <button type="button" id="dep-cancel-btn" class="cancel-button">Cancel</button>
809
- </div>
810
- <p id="dep-error" class="dep-error" hidden></p>
811
- <div id="dep-wh-inbound-row" class="dep-wh-inbound-reveal" hidden>
812
- <div class="dep-wh-inbound-header">
813
- <span class="dep-wh-inbound-label">Inbound URL</span>
814
- <span class="dep-wh-inbound-hint">POST to this URL from any external system to trigger a run</span>
815
- </div>
816
- <div class="dep-inbound-url-row">
817
- <code id="dep-wh-inbound-url" class="dep-inbound-url"></code>
818
- <button type="button" id="dep-wh-copy-btn" class="hm-copy-btn">Copy</button>
819
- </div>
820
- </div>
821
- </div>
822
- </div>
823
- </div>
824
-
825
- <!-- Issue #539: Command palette overlay — replaces 2-step modal as job-launch surface -->
826
- <div id="cp-modal" class="cp-backdrop" role="dialog" aria-modal="true" aria-label="Start a job" hidden>
827
- <div class="cp-palette">
828
- <div class="cp-search-row">
829
- <span class="cp-search-icon">⌕</span>
830
- <input id="cp-search" type="text"
831
- placeholder="Job name, /huxley, /pam, or describe your task…"
832
- autocomplete="off" spellcheck="false">
833
- </div>
834
- <div id="cp-results" class="cp-results-scroll">
835
- <div id="cp-recent-section" class="cp-section" hidden>
836
- <div class="cp-section-label">RECENT</div>
837
- <div id="cp-recent-list"></div>
838
- </div>
839
- <div id="cp-catalog-section" class="cp-section">
840
- <div class="cp-section-label">CATALOG</div>
841
- <div id="cp-catalog-list"></div>
842
- </div>
843
- </div>
844
- <div id="cp-instructions-row" class="cp-instructions-row" hidden>
845
- <div id="cp-selected-job-chip" class="cp-job-chip"></div>
846
- <textarea id="cp-instructions"
847
- placeholder="What outcome do you want? A few sentences is enough."
848
- rows="3"></textarea>
849
- <button type="button" id="cp-start-btn" class="send-button">Start</button>
850
- </div>
851
- <div class="cp-hints-bar">
852
- <span class="cp-hint"><kbd>&#x2191;&#x2193;</kbd> navigate</span>
853
- <span class="cp-hint"><kbd>&#x21B5;</kbd> select/start</span>
854
- <span class="cp-hint"><kbd>&#x21E7;&#x21B5;</kbd> new line</span>
855
- <span class="cp-hint"><kbd>Esc</kbd> close</span>
856
- <span class="cp-hint cp-hint--right"><kbd id="cp-rerun-kbd">&#x2318;&#x21E7;R</kbd> re-run last</span>
857
- </div>
858
- <div class="cp-employee-footer">
859
- <span class="cp-agent-label">Run with:</span>
860
- <span id="cp-agent-picker" class="cp-agent-pills"></span>
861
- </div>
862
- <div id="cp-agent-install-panel" class="cp-agent-install-panel" data-testid="cp-cli-setup-panel" hidden></div>
863
- </div>
864
- </div>
865
-
866
- <!-- Issue #540: Hire checkout email-capture modal. Opens when "Add to Company" or
867
- "Get for your company" is clicked; calls /api/payment/create-session and
868
- redirects to Stripe. -->
869
- <div class="modal-backdrop" id="hcm" role="dialog" aria-modal="true" aria-labelledby="hcm-title" hidden>
870
- <div class="modal" style="max-width:420px">
871
- <div class="modal-header">
872
- <h2 id="hcm-title">Hire <span id="hcm-persona-name">this employee</span></h2>
873
- <p id="hcm-persona-role" style="color:var(--text-secondary);margin-top:2px"></p>
874
- </div>
875
- <div class="modal-body" style="padding-top:12px">
876
- <label style="display:block;font-size:13px;font-weight:500;margin-bottom:6px" for="hcm-email">Work email</label>
877
- <input id="hcm-email" type="email" class="search" placeholder="you@company.com" autocomplete="email" style="margin-bottom:0">
878
- <p id="hcm-error" style="color:var(--red,#e53935);font-size:12px;margin-top:6px;min-height:16px"></p>
879
- <p style="font-size:12px;color:var(--text-secondary);margin-top:4px">
880
- You'll be taken to Stripe to complete the purchase. Your seat is activated immediately after payment.
881
- </p>
882
- </div>
883
- <div class="modal-footer">
884
- <div class="right">
885
- <button class="ghost" type="button" id="hcm-cancel">Cancel</button>
886
- <button class="send-button" type="button" id="hcm-submit">Continue to payment →</button>
887
- </div>
888
- </div>
889
- </div>
890
- </div>
891
-
892
- <script src="./script.js?v=persona-mgr-del-20260707"></script>
893
- </body>
894
- </html>