makersclaw 0.8.0 → 0.8.2
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.
- package/README.md +9 -3
- package/package.json +1 -1
- package/r/activity-log.json +52 -0
- package/r/agent-changes.json +51 -0
- package/r/agent-chat.json +53 -0
- package/r/agent-column.json +85 -0
- package/r/agent-dock.json +57 -0
- package/r/agent-kit.json +49 -0
- package/r/agent-marks.json +49 -0
- package/r/agent-pane.json +93 -0
- package/r/ai-action.json +56 -0
- package/r/annotate.json +3 -3
- package/r/approval-request.json +2 -2
- package/r/approval.json +54 -0
- package/r/ask-bar.json +50 -0
- package/r/audio-player.json +2 -2
- package/r/auth-form.json +2 -2
- package/r/automation-editor.json +66 -0
- package/r/automation-list.json +57 -0
- package/r/automation-model.json +118 -0
- package/r/automations-screen.json +71 -0
- package/r/board.json +2 -2
- package/r/calendar-view.json +3 -3
- package/r/cart.json +2 -2
- package/r/chart.json +2 -2
- package/r/chat-pane.json +84 -0
- package/r/chat.json +2 -2
- package/r/code-editor.json +2 -2
- package/r/comment-box.json +3 -3
- package/r/connect-card.json +51 -0
- package/r/contact-section.json +2 -2
- package/r/core.json +13 -7
- package/r/cost.json +51 -0
- package/r/csv-import.json +3 -3
- package/r/data-picker.json +60 -0
- package/r/data-table.json +2 -2
- package/r/diagram.json +2 -2
- package/r/doc-editor.json +2 -2
- package/r/doc-page.json +3 -3
- package/r/email-render.json +2 -2
- package/r/faq.json +2 -2
- package/r/file-upload.json +2 -2
- package/r/first-run.json +63 -0
- package/r/fix-note.json +57 -0
- package/r/flow-canvas.json +2 -2
- package/r/flow-editor.json +79 -0
- package/r/footer.json +2 -2
- package/r/gantt.json +3 -3
- package/r/job-panel.json +2 -2
- package/r/json-editor.json +3 -3
- package/r/library-shelf.json +56 -0
- package/r/map.json +2 -2
- package/r/margin-notes.json +67 -0
- package/r/menubar.json +2 -2
- package/r/mind-map.json +3 -3
- package/r/navigation-menu.json +2 -2
- package/r/needs-you.json +55 -0
- package/r/order-detail.json +2 -2
- package/r/org-chart.json +3 -3
- package/r/pace-bar.json +69 -0
- package/r/page-builder.json +2 -2
- package/r/payment-methods.json +2 -2
- package/r/pdf-document.json +2 -2
- package/r/pdf-viewer.json +2 -2
- package/r/product-detail.json +2 -2
- package/r/product-grid.json +3 -3
- package/r/record-form.json +2 -2
- package/r/record-grid.json +52 -0
- package/r/record-notes.json +4 -4
- package/r/registry.json +4086 -1512
- package/r/run-history.json +52 -0
- package/r/run-view.json +80 -0
- package/r/schedule-card.json +54 -0
- package/r/schedule-engine.json +79 -0
- package/r/schedule-gantt.json +83 -0
- package/r/schedule-ruler.json +64 -0
- package/r/search-dialog.json +2 -2
- package/r/settings-list.json +2 -2
- package/r/setup-checklist.json +2 -2
- package/r/share-dialog.json +2 -2
- package/r/sidebar.json +2 -2
- package/r/signature-pad.json +2 -2
- package/r/sketch-canvas.json +2 -2
- package/r/source-receipt.json +52 -0
- package/r/spreadsheet.json +3 -3
- package/r/stat-cards.json +3 -3
- package/r/step-picker.json +53 -0
- package/r/step-settings.json +72 -0
- package/r/suggestion.json +58 -0
- package/r/sum-bar.json +64 -0
- package/r/task-list.json +3 -3
- package/r/task-model.json +2 -2
- package/r/testimonials.json +2 -2
- package/r/tier-map.json +67 -0
- package/r/time-grid.json +73 -0
- package/r/time-strip.json +64 -0
- package/r/top-bar.json +66 -0
- package/r/transaction-list.json +2 -2
- package/r/trigger-picker.json +61 -0
- package/r/whiteboard.json +3 -3
- package/r/workflow-view.json +55 -0
- package/registry/blocks/activity-log/README.md +112 -0
- package/registry/blocks/activity-log/activity-log.jsx +351 -0
- package/registry/blocks/activity-log/block.json +33 -0
- package/registry/blocks/activity-log/demo.jsx +48 -0
- package/registry/blocks/activity-log/index.js +4 -0
- package/registry/blocks/agent-changes/README.md +94 -0
- package/registry/blocks/agent-changes/agent-changes.jsx +118 -0
- package/registry/blocks/agent-changes/block.json +28 -0
- package/registry/blocks/agent-changes/demo.jsx +39 -0
- package/registry/blocks/agent-changes/index.js +3 -0
- package/registry/blocks/agent-chat/README.md +145 -0
- package/registry/blocks/agent-chat/agent-chat.jsx +415 -0
- package/registry/blocks/agent-chat/block.json +30 -0
- package/registry/blocks/agent-chat/demo.jsx +165 -0
- package/registry/blocks/agent-chat/index.js +3 -0
- package/registry/blocks/agent-column/README.md +197 -0
- package/registry/blocks/agent-column/agent-column.jsx +492 -0
- package/registry/blocks/agent-column/block.json +67 -0
- package/registry/blocks/agent-column/column-picker.jsx +163 -0
- package/registry/blocks/agent-column/demo.jsx +50 -0
- package/registry/blocks/agent-column/index.js +7 -0
- package/registry/blocks/agent-column/model.js +164 -0
- package/registry/blocks/agent-column/receipt.jsx +483 -0
- package/registry/blocks/agent-column/spreadsheet-type.jsx +24 -0
- package/registry/blocks/agent-dock/README.md +210 -0
- package/registry/blocks/agent-dock/agent-dock.jsx +356 -0
- package/registry/blocks/agent-dock/block.json +47 -0
- package/registry/blocks/agent-dock/demo.jsx +153 -0
- package/registry/blocks/agent-dock/dock-model.js +118 -0
- package/registry/blocks/agent-dock/index.js +5 -0
- package/registry/blocks/agent-kit/README.md +73 -0
- package/registry/blocks/agent-kit/agent-kit.jsx +86 -0
- package/registry/blocks/agent-kit/block.json +10 -0
- package/registry/blocks/agent-kit/demo.jsx +35 -0
- package/registry/blocks/agent-kit/index.js +3 -0
- package/registry/blocks/agent-marks/README.md +80 -0
- package/registry/blocks/agent-marks/agent-marks.jsx +133 -0
- package/registry/blocks/agent-marks/block.json +27 -0
- package/registry/blocks/agent-marks/demo.jsx +49 -0
- package/registry/blocks/agent-marks/index.js +3 -0
- package/registry/blocks/agent-pane/README.md +234 -0
- package/registry/blocks/agent-pane/agent-pane.jsx +246 -0
- package/registry/blocks/agent-pane/block.json +41 -0
- package/registry/blocks/agent-pane/composer.jsx +6 -0
- package/registry/blocks/agent-pane/demo.jsx +233 -0
- package/registry/blocks/agent-pane/dock-context.js +10 -0
- package/registry/blocks/agent-pane/index.js +4 -0
- package/registry/blocks/agent-pane/prose.jsx +84 -0
- package/registry/blocks/agent-pane/questions.jsx +134 -0
- package/registry/blocks/agent-pane/transcript.jsx +268 -0
- package/registry/blocks/agent-pane/work.jsx +368 -0
- package/registry/blocks/ai-action/README.md +94 -0
- package/registry/blocks/ai-action/ai-action.jsx +188 -0
- package/registry/blocks/ai-action/block.json +34 -0
- package/registry/blocks/ai-action/demo.jsx +93 -0
- package/registry/blocks/ai-action/index.js +3 -0
- package/registry/blocks/approval/README.md +145 -0
- package/registry/blocks/approval/approval.jsx +163 -0
- package/registry/blocks/approval/block.json +31 -0
- package/registry/blocks/approval/demo.jsx +121 -0
- package/registry/blocks/approval/index.js +3 -0
- package/registry/blocks/ask-bar/README.md +105 -0
- package/registry/blocks/ask-bar/ask-bar.jsx +166 -0
- package/registry/blocks/ask-bar/block.json +26 -0
- package/registry/blocks/ask-bar/demo.jsx +78 -0
- package/registry/blocks/ask-bar/index.js +3 -0
- package/registry/blocks/automation-editor/README.md +291 -0
- package/registry/blocks/automation-editor/automation-editor.jsx +656 -0
- package/registry/blocks/automation-editor/block.json +39 -0
- package/registry/blocks/automation-editor/demo.jsx +284 -0
- package/registry/blocks/automation-editor/index.js +4 -0
- package/registry/blocks/automation-editor/run-inputs.jsx +82 -0
- package/registry/blocks/automation-list/README.md +129 -0
- package/registry/blocks/automation-list/automation-list.jsx +476 -0
- package/registry/blocks/automation-list/block.json +35 -0
- package/registry/blocks/automation-list/demo.jsx +67 -0
- package/registry/blocks/automation-list/index.js +3 -0
- package/registry/blocks/automation-model/README.md +109 -0
- package/registry/blocks/automation-model/block.json +135 -0
- package/registry/blocks/automation-model/catalog.js +256 -0
- package/registry/blocks/automation-model/check.js +161 -0
- package/registry/blocks/automation-model/demo.jsx +42 -0
- package/registry/blocks/automation-model/edit.js +262 -0
- package/registry/blocks/automation-model/fixes.js +287 -0
- package/registry/blocks/automation-model/glyph.jsx +13 -0
- package/registry/blocks/automation-model/graph.js +410 -0
- package/registry/blocks/automation-model/index.js +33 -0
- package/registry/blocks/automation-model/overlay.js +175 -0
- package/registry/blocks/automation-model/parts.jsx +94 -0
- package/registry/blocks/automation-model/schedule.js +53 -0
- package/registry/blocks/automation-model/templates.js +128 -0
- package/registry/blocks/automation-model/values.js +29 -0
- package/registry/blocks/automation-model/words.js +439 -0
- package/registry/blocks/automations-screen/README.md +207 -0
- package/registry/blocks/automations-screen/automations-screen.jsx +452 -0
- package/registry/blocks/automations-screen/block.json +47 -0
- package/registry/blocks/automations-screen/demo.jsx +364 -0
- package/registry/blocks/automations-screen/index.js +4 -0
- package/registry/blocks/automations-screen/screen-model.js +129 -0
- package/registry/blocks/chat-pane/README.md +143 -0
- package/registry/blocks/chat-pane/block.json +48 -0
- package/registry/blocks/chat-pane/chat-attach.js +166 -0
- package/registry/blocks/chat-pane/chat-composer.jsx +195 -0
- package/registry/blocks/chat-pane/chat-context.js +17 -0
- package/registry/blocks/chat-pane/chat-model.js +43 -0
- package/registry/blocks/chat-pane/chat-pane.jsx +398 -0
- package/registry/blocks/chat-pane/chats-list.jsx +52 -0
- package/registry/blocks/chat-pane/demo.jsx +103 -0
- package/registry/blocks/chat-pane/index.js +9 -0
- package/registry/blocks/connect-card/README.md +99 -0
- package/registry/blocks/connect-card/block.json +10 -0
- package/registry/blocks/connect-card/connect-card.jsx +103 -0
- package/registry/blocks/connect-card/demo.jsx +49 -0
- package/registry/blocks/connect-card/index.js +3 -0
- package/registry/blocks/cost/README.md +115 -0
- package/registry/blocks/cost/block.json +10 -0
- package/registry/blocks/cost/cost.jsx +176 -0
- package/registry/blocks/cost/demo.jsx +66 -0
- package/registry/blocks/cost/index.js +3 -0
- package/registry/blocks/data-picker/README.md +81 -0
- package/registry/blocks/data-picker/block.json +38 -0
- package/registry/blocks/data-picker/data-picker.jsx +210 -0
- package/registry/blocks/data-picker/demo.jsx +34 -0
- package/registry/blocks/data-picker/fields.js +89 -0
- package/registry/blocks/data-picker/index.js +4 -0
- package/registry/blocks/data-table/demo.jsx +1 -1
- package/registry/blocks/first-run/README.md +118 -0
- package/registry/blocks/first-run/block.json +11 -0
- package/registry/blocks/first-run/demo.jsx +88 -0
- package/registry/blocks/first-run/first-run-model.js +51 -0
- package/registry/blocks/first-run/first-run.jsx +156 -0
- package/registry/blocks/first-run/index.js +5 -0
- package/registry/blocks/first-run/probe-rules.js +26 -0
- package/registry/blocks/fix-note/README.md +79 -0
- package/registry/blocks/fix-note/block.json +35 -0
- package/registry/blocks/fix-note/demo.jsx +30 -0
- package/registry/blocks/fix-note/fix-note.jsx +235 -0
- package/registry/blocks/fix-note/index.js +3 -0
- package/registry/blocks/flow-editor/README.md +108 -0
- package/registry/blocks/flow-editor/block.json +44 -0
- package/registry/blocks/flow-editor/demo.jsx +115 -0
- package/registry/blocks/flow-editor/flow-canvas.jsx +568 -0
- package/registry/blocks/flow-editor/flow-editor.jsx +154 -0
- package/registry/blocks/flow-editor/index.js +6 -0
- package/registry/blocks/flow-editor/minimap.jsx +78 -0
- package/registry/blocks/flow-editor/outline.jsx +134 -0
- package/registry/blocks/library-shelf/README.md +117 -0
- package/registry/blocks/library-shelf/block.json +28 -0
- package/registry/blocks/library-shelf/demo.jsx +68 -0
- package/registry/blocks/library-shelf/index.js +3 -0
- package/registry/blocks/library-shelf/library-shelf.jsx +211 -0
- package/registry/blocks/library-shelf/probe-rules.js +15 -0
- package/registry/blocks/margin-notes/README.md +222 -0
- package/registry/blocks/margin-notes/block.json +10 -0
- package/registry/blocks/margin-notes/demo.jsx +144 -0
- package/registry/blocks/margin-notes/index.js +20 -0
- package/registry/blocks/margin-notes/margin-model.js +224 -0
- package/registry/blocks/margin-notes/margin-notes.jsx +465 -0
- package/registry/blocks/needs-you/README.md +177 -0
- package/registry/blocks/needs-you/block.json +34 -0
- package/registry/blocks/needs-you/demo.jsx +143 -0
- package/registry/blocks/needs-you/index.js +3 -0
- package/registry/blocks/needs-you/needs-you.jsx +441 -0
- package/registry/blocks/pace-bar/README.md +230 -0
- package/registry/blocks/pace-bar/block.json +10 -0
- package/registry/blocks/pace-bar/demo.jsx +255 -0
- package/registry/blocks/pace-bar/index.js +22 -0
- package/registry/blocks/pace-bar/pace-bar.jsx +461 -0
- package/registry/blocks/pace-bar/pace-model.js +288 -0
- package/registry/blocks/record-grid/README.md +100 -0
- package/registry/blocks/record-grid/block.json +28 -0
- package/registry/blocks/record-grid/demo.jsx +43 -0
- package/registry/blocks/record-grid/index.js +3 -0
- package/registry/blocks/record-grid/record-grid.jsx +251 -0
- package/registry/blocks/run-history/README.md +138 -0
- package/registry/blocks/run-history/block.json +10 -0
- package/registry/blocks/run-history/demo.jsx +74 -0
- package/registry/blocks/run-history/index.js +3 -0
- package/registry/blocks/run-history/run-history.jsx +218 -0
- package/registry/blocks/run-view/README.md +174 -0
- package/registry/blocks/run-view/block.json +50 -0
- package/registry/blocks/run-view/demo.jsx +286 -0
- package/registry/blocks/run-view/index.js +5 -0
- package/registry/blocks/run-view/run-controls.jsx +266 -0
- package/registry/blocks/run-view/run-view.jsx +236 -0
- package/registry/blocks/run-view/runs-list.jsx +99 -0
- package/registry/blocks/schedule-card/README.md +121 -0
- package/registry/blocks/schedule-card/block.json +10 -0
- package/registry/blocks/schedule-card/demo.jsx +82 -0
- package/registry/blocks/schedule-card/index.js +3 -0
- package/registry/blocks/schedule-card/schedule-card.jsx +136 -0
- package/registry/blocks/schedule-engine/README.md +137 -0
- package/registry/blocks/schedule-engine/block.json +10 -0
- package/registry/blocks/schedule-engine/demo.jsx +82 -0
- package/registry/blocks/schedule-engine/engine.js +769 -0
- package/registry/blocks/schedule-engine/index.js +9 -0
- package/registry/blocks/schedule-engine/ops.js +71 -0
- package/registry/blocks/schedule-engine/place.js +294 -0
- package/registry/blocks/schedule-engine/tree.js +79 -0
- package/registry/blocks/schedule-engine/waits.js +80 -0
- package/registry/blocks/schedule-gantt/README.md +159 -0
- package/registry/blocks/schedule-gantt/block.json +10 -0
- package/registry/blocks/schedule-gantt/demo.jsx +223 -0
- package/registry/blocks/schedule-gantt/gantt-model.js +219 -0
- package/registry/blocks/schedule-gantt/geometry.js +176 -0
- package/registry/blocks/schedule-gantt/index.js +26 -0
- package/registry/blocks/schedule-gantt/schedule-gantt.jsx +882 -0
- package/registry/blocks/schedule-gantt/sheet.jsx +372 -0
- package/registry/blocks/schedule-gantt/track.jsx +190 -0
- package/registry/blocks/schedule-ruler/README.md +148 -0
- package/registry/blocks/schedule-ruler/block.json +10 -0
- package/registry/blocks/schedule-ruler/demo.jsx +181 -0
- package/registry/blocks/schedule-ruler/index.js +21 -0
- package/registry/blocks/schedule-ruler/ruler-model.js +239 -0
- package/registry/blocks/schedule-ruler/schedule-ruler.jsx +548 -0
- package/registry/blocks/source-receipt/README.md +97 -0
- package/registry/blocks/source-receipt/block.json +30 -0
- package/registry/blocks/source-receipt/demo.jsx +71 -0
- package/registry/blocks/source-receipt/index.js +3 -0
- package/registry/blocks/source-receipt/source-receipt.jsx +107 -0
- package/registry/blocks/spreadsheet/spreadsheet.jsx +15 -1
- package/registry/blocks/step-picker/README.md +78 -0
- package/registry/blocks/step-picker/block.json +31 -0
- package/registry/blocks/step-picker/demo.jsx +23 -0
- package/registry/blocks/step-picker/index.js +3 -0
- package/registry/blocks/step-picker/step-picker.jsx +144 -0
- package/registry/blocks/step-settings/README.md +100 -0
- package/registry/blocks/step-settings/block.json +44 -0
- package/registry/blocks/step-settings/demo.jsx +93 -0
- package/registry/blocks/step-settings/fields.jsx +58 -0
- package/registry/blocks/step-settings/flow-settings.jsx +115 -0
- package/registry/blocks/step-settings/index.js +5 -0
- package/registry/blocks/step-settings/step-settings.jsx +290 -0
- package/registry/blocks/suggestion/README.md +171 -0
- package/registry/blocks/suggestion/block.json +40 -0
- package/registry/blocks/suggestion/demo.jsx +91 -0
- package/registry/blocks/suggestion/index.js +3 -0
- package/registry/blocks/suggestion/suggestion.jsx +436 -0
- package/registry/blocks/sum-bar/README.md +122 -0
- package/registry/blocks/sum-bar/block.json +10 -0
- package/registry/blocks/sum-bar/demo.jsx +110 -0
- package/registry/blocks/sum-bar/index.js +5 -0
- package/registry/blocks/sum-bar/sum-bar.jsx +209 -0
- package/registry/blocks/sum-bar/sum-model.js +126 -0
- package/registry/blocks/tier-map/README.md +217 -0
- package/registry/blocks/tier-map/block.json +10 -0
- package/registry/blocks/tier-map/demo.jsx +222 -0
- package/registry/blocks/tier-map/index.js +24 -0
- package/registry/blocks/tier-map/tier-map.jsx +574 -0
- package/registry/blocks/tier-map/tier-model.js +318 -0
- package/registry/blocks/time-grid/README.md +305 -0
- package/registry/blocks/time-grid/block.json +10 -0
- package/registry/blocks/time-grid/demo.jsx +279 -0
- package/registry/blocks/time-grid/grid-model.js +322 -0
- package/registry/blocks/time-grid/index.js +25 -0
- package/registry/blocks/time-grid/time-grid.jsx +1325 -0
- package/registry/blocks/time-strip/README.md +141 -0
- package/registry/blocks/time-strip/block.json +10 -0
- package/registry/blocks/time-strip/demo.jsx +129 -0
- package/registry/blocks/time-strip/index.js +19 -0
- package/registry/blocks/time-strip/strip-model.js +178 -0
- package/registry/blocks/time-strip/time-strip.jsx +260 -0
- package/registry/blocks/top-bar/README.md +149 -0
- package/registry/blocks/top-bar/block.json +35 -0
- package/registry/blocks/top-bar/demo.jsx +78 -0
- package/registry/blocks/top-bar/index.js +5 -0
- package/registry/blocks/top-bar/probe-rules.js +74 -0
- package/registry/blocks/top-bar/top-bar-model.js +152 -0
- package/registry/blocks/top-bar/top-bar.jsx +244 -0
- package/registry/blocks/trigger-picker/README.md +98 -0
- package/registry/blocks/trigger-picker/block.json +38 -0
- package/registry/blocks/trigger-picker/demo.jsx +59 -0
- package/registry/blocks/trigger-picker/index.js +3 -0
- package/registry/blocks/trigger-picker/trigger-picker.jsx +374 -0
- package/registry/blocks/workflow-view/README.md +123 -0
- package/registry/blocks/workflow-view/block.json +10 -0
- package/registry/blocks/workflow-view/demo.jsx +90 -0
- package/registry/blocks/workflow-view/index.js +3 -0
- package/registry/blocks/workflow-view/workflow-view.jsx +203 -0
- package/src/install.mjs +77 -16
- package/src/registry.mjs +3 -0
- package/templates/next/browser/lib/data.js +6 -1
- package/templates/next/files/README.md +627 -24
- package/templates/next/files/check/automation-format.ts +2103 -0
- package/templates/next/files/check/automation-package.ts +142 -0
- package/templates/next/files/check/run.mjs +968 -9
- package/templates/next/files/components/ui/field.jsx +17 -4
- package/templates/next/files/components/ui/icon.jsx +13 -0
- package/templates/next/files/components/ui/index.js +2 -1
- package/templates/next/files/components/ui/layout.jsx +77 -2
- package/templates/next/files/components/ui/notice.jsx +70 -0
- package/templates/next/files/components/ui/page.jsx +124 -0
- package/templates/next/files/components/ui/stat.jsx +22 -7
- package/templates/next/files/components/ui/toast.jsx +6 -3
- package/templates/next/files/lib/automations.js +660 -0
- package/templates/next/files/lib/claw.js +241 -5
- package/templates/next/files/lib/door.js +92 -0
- package/templates/next/files/lib/hooks.js +1677 -8
- package/templates/next/files/lib/platform.js +529 -21
- package/templates/next/template.json +13 -3
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// AgentDock in the kit's AppLayout over a pretend agent — the gallery's and
|
|
4
|
+
// the smoke test's surface. Not installed into apps. The frame is an
|
|
5
|
+
// AppLayout with a rail and a top bar whose Ask button is useAgentDock's
|
|
6
|
+
// toggle; the dock is its `dock`. A width picker sets how wide the app is:
|
|
7
|
+
// at 1100 it is a column (drag its divider, or focus the divider and press
|
|
8
|
+
// the arrows; Home goes back to a quarter), at 700 it is a sheet over the
|
|
9
|
+
// app (Escape folds it). The chat is a pretend one: Chats lists two past
|
|
10
|
+
// chats, New chat clears, and any ask is answered after a moment. "Have the
|
|
11
|
+
// agent draft it" is openAgent: the dock opens with the line already sent in
|
|
12
|
+
// a new chat; "Start a line" puts the line in the box instead.
|
|
13
|
+
import { useEffect, useRef, useState } from "react";
|
|
14
|
+
import { AppLayout, Button, ButtonGroup } from "../components/ui";
|
|
15
|
+
import { AgentDock, openAgent, useAgentDock } from "../components/blocks/agent-dock";
|
|
16
|
+
import { AgentPane } from "../components/blocks/agent-pane";
|
|
17
|
+
|
|
18
|
+
const CHATS = {
|
|
19
|
+
items: [
|
|
20
|
+
{ sessionId: "past-1", requestId: "q1", title: "Who should we follow up with this week?", mark: "needs", at: new Date(Date.now() - 20 * 60 * 1000).toISOString() },
|
|
21
|
+
{ sessionId: "past-2", requestId: "q2", title: "Weekly pipeline read", mark: null, at: new Date(Date.now() - 3 * 3600 * 1000).toISOString() },
|
|
22
|
+
],
|
|
23
|
+
loading: false,
|
|
24
|
+
error: null,
|
|
25
|
+
unavailable: false,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
function usePretendChat(withChats) {
|
|
29
|
+
const [messages, setMessages] = useState([]);
|
|
30
|
+
const [state, setState] = useState(null);
|
|
31
|
+
const timers = useRef([]);
|
|
32
|
+
useEffect(() => () => timers.current.forEach(clearTimeout), []);
|
|
33
|
+
return {
|
|
34
|
+
sessionId: messages.length ? "demo" : null,
|
|
35
|
+
state,
|
|
36
|
+
needs: null,
|
|
37
|
+
turns: [],
|
|
38
|
+
view: { messages, thinking: state === "working", failure: null, questions: [] },
|
|
39
|
+
place: "app",
|
|
40
|
+
request: messages.length ? { id: "demo-request", title: "Ask" } : null,
|
|
41
|
+
pending: null,
|
|
42
|
+
sending: false,
|
|
43
|
+
loading: false,
|
|
44
|
+
error: null,
|
|
45
|
+
unavailable: false,
|
|
46
|
+
chats: withChats ? CHATS : { items: [], loading: false, error: null, unavailable: false },
|
|
47
|
+
send: (text) => {
|
|
48
|
+
const id = `m${Date.now()}`;
|
|
49
|
+
setState("working");
|
|
50
|
+
setMessages((m) => [...m, { id: `${id}u`, role: "user", text, files: [] }]);
|
|
51
|
+
timers.current.push(
|
|
52
|
+
setTimeout(() => {
|
|
53
|
+
setMessages((m) => [...m, { id: `${id}a`, role: "assistant", live: false, blocks: [{ kind: "text", key: "t", text: "Three people have gone quiet for over two weeks. Want me to draft a note to each?", streaming: false }] }]);
|
|
54
|
+
setState("done");
|
|
55
|
+
}, 900),
|
|
56
|
+
);
|
|
57
|
+
},
|
|
58
|
+
answer: async () => ({ ok: true }),
|
|
59
|
+
stop: () => setState("stopped"),
|
|
60
|
+
openOnDesk: () => true,
|
|
61
|
+
openRequest: () => true,
|
|
62
|
+
openSession: () => undefined,
|
|
63
|
+
callDetail: async () => ({ ok: false }),
|
|
64
|
+
newChat: () => {
|
|
65
|
+
setMessages([]);
|
|
66
|
+
setState(null);
|
|
67
|
+
},
|
|
68
|
+
reload: () => undefined,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const WIDTHS = [
|
|
73
|
+
{ id: "1100", label: "1100 px (a column)" },
|
|
74
|
+
{ id: "700", label: "700 px (a sheet)" },
|
|
75
|
+
];
|
|
76
|
+
|
|
77
|
+
function Frame({ withChats, label }) {
|
|
78
|
+
const dock = useAgentDock({ storageKey: "gallery-dock" });
|
|
79
|
+
const chat = usePretendChat(withChats);
|
|
80
|
+
return (
|
|
81
|
+
<AppLayout
|
|
82
|
+
height="parent"
|
|
83
|
+
navigationWidth={160}
|
|
84
|
+
navigation={<nav className="grid gap-1 p-3 text-sm"><span className="font-medium">People</span><span className="text-muted-foreground">Companies</span><span className="text-muted-foreground">Deals</span></nav>}
|
|
85
|
+
header={
|
|
86
|
+
<div className="flex h-10 items-center justify-between gap-2 px-3 text-sm">
|
|
87
|
+
<span className="font-semibold">{label}</span>
|
|
88
|
+
<Button size="sm" variant={dock.open ? "secondary" : "primary"} icon="sparkles" onClick={dock.toggle} aria-pressed={dock.open}>
|
|
89
|
+
Ask
|
|
90
|
+
</Button>
|
|
91
|
+
</div>
|
|
92
|
+
}
|
|
93
|
+
dock={
|
|
94
|
+
<AgentDock dock={dock} label="Ask the agent">
|
|
95
|
+
<AgentPane
|
|
96
|
+
chat={chat}
|
|
97
|
+
title="Ask the agent"
|
|
98
|
+
empty="The agent reads every person and deal. What it changes you can take back."
|
|
99
|
+
suggestions={["Who should we follow up with?", "What changed this week?"]}
|
|
100
|
+
/>
|
|
101
|
+
</AgentDock>
|
|
102
|
+
}
|
|
103
|
+
className="text-sm"
|
|
104
|
+
>
|
|
105
|
+
<div className="grid gap-3 p-6">
|
|
106
|
+
<h2 className="text-lg font-semibold">People</h2>
|
|
107
|
+
<p className="max-w-prose text-muted-foreground">The content reflows beside the column and keeps its own scroll. Ask opens the dock; the close in its head folds it; the width and the open state are kept in this browser.</p>
|
|
108
|
+
{/* "Have the agent do it" (X9): the dock opens with the line already sent in a new chat, no form first. */}
|
|
109
|
+
<div className="flex flex-wrap gap-2">
|
|
110
|
+
<Button variant="primary" icon="sparkles" onClick={() => openAgent("Draft a project plan for me")}>
|
|
111
|
+
Have the agent draft it
|
|
112
|
+
</Button>
|
|
113
|
+
<Button onClick={() => openAgent({ ask: "Draft a project plan for ", send: false })}>Start a line</Button>
|
|
114
|
+
</div>
|
|
115
|
+
{Array.from({ length: 12 }, (_, i) => (
|
|
116
|
+
<div key={i} className="rounded-[var(--radius)] border border-border px-3 py-2">
|
|
117
|
+
Row {i + 1}: a person, a company, the last time you spoke.
|
|
118
|
+
</div>
|
|
119
|
+
))}
|
|
120
|
+
</div>
|
|
121
|
+
</AppLayout>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export default function AgentDockDemo() {
|
|
126
|
+
const [width, setWidth] = useState("1100");
|
|
127
|
+
const [chats, setChats] = useState("some");
|
|
128
|
+
return (
|
|
129
|
+
<div className="grid gap-3 p-6">
|
|
130
|
+
<div className="flex flex-wrap items-center gap-3">
|
|
131
|
+
<ButtonGroup>
|
|
132
|
+
{WIDTHS.map((w) => (
|
|
133
|
+
<Button key={w.id} size="sm" variant={width === w.id ? "secondary" : "quiet"} onClick={() => setWidth(w.id)}>
|
|
134
|
+
{w.label}
|
|
135
|
+
</Button>
|
|
136
|
+
))}
|
|
137
|
+
</ButtonGroup>
|
|
138
|
+
<ButtonGroup>
|
|
139
|
+
<Button size="sm" variant={chats === "some" ? "secondary" : "quiet"} onClick={() => setChats("some")}>
|
|
140
|
+
Past chats
|
|
141
|
+
</Button>
|
|
142
|
+
<Button size="sm" variant={chats === "none" ? "secondary" : "quiet"} onClick={() => setChats("none")}>
|
|
143
|
+
No chats yet
|
|
144
|
+
</Button>
|
|
145
|
+
</ButtonGroup>
|
|
146
|
+
</div>
|
|
147
|
+
{/* The transform makes this box the sheet's containing block, so a sheet lays over this frame in the gallery as it lays over an app's window. */}
|
|
148
|
+
<div className="h-[640px] max-w-full overflow-hidden rounded-lg border border-border" style={{ width: `${width}px`, transform: "translateZ(0)" }}>
|
|
149
|
+
<Frame key={`${chats}`} withChats={chats === "some"} label="Pinewood CRM" />
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
);
|
|
153
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// agent-dock: the numbers and the keys, as plain functions (they work on the
|
|
2
|
+
// server too, and test/agent-dock.test.mjs holds them).
|
|
3
|
+
//
|
|
4
|
+
// The dock is a column beside the work. Its width is the member's to drag:
|
|
5
|
+
// never under MIN_W, never over half the body it sits in, a quarter of it
|
|
6
|
+
// until dragged. Below `columnAt` px of body the column has no room and the
|
|
7
|
+
// dock becomes a sheet laid over the app.
|
|
8
|
+
|
|
9
|
+
/** The narrowest the column goes, px. */
|
|
10
|
+
export const MIN_W = 280;
|
|
11
|
+
/** One press of an arrow key on the divider, px. */
|
|
12
|
+
export const STEP = 16;
|
|
13
|
+
/** The body width from which the dock is a column beside the work (the
|
|
14
|
+
* desk's own agent column uses 900). */
|
|
15
|
+
export const COLUMN_AT = 900;
|
|
16
|
+
/** The share of the body the column takes until it is dragged. */
|
|
17
|
+
export const DEFAULT_SHARE = 0.25;
|
|
18
|
+
|
|
19
|
+
/** The widest the column goes in a body this wide: half of it, never under MIN_W. */
|
|
20
|
+
export function maxWidth(body) {
|
|
21
|
+
const b = Number(body);
|
|
22
|
+
return Math.max(MIN_W, Number.isFinite(b) && b > 0 ? Math.floor(b / 2) : MIN_W);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** A width kept inside its bounds, whole px. */
|
|
26
|
+
export function clampWidth(width, body) {
|
|
27
|
+
const w = Number(width);
|
|
28
|
+
if (!Number.isFinite(w)) return MIN_W;
|
|
29
|
+
return Math.min(maxWidth(body), Math.max(MIN_W, Math.round(w)));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** What a stored width is worth: a whole number of px at least MIN_W, else
|
|
33
|
+
* null (the default). The CSS clamps it again whatever was stored. */
|
|
34
|
+
export function storedWidth(raw) {
|
|
35
|
+
if (raw === null || raw === undefined || raw === "") return null;
|
|
36
|
+
const n = Number(raw);
|
|
37
|
+
return Number.isFinite(n) && n >= MIN_W ? Math.round(n) : null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** The width the column has now: the dragged one, else a quarter of the
|
|
41
|
+
* body, kept inside the same bounds the CSS uses. */
|
|
42
|
+
export function columnWidth(width, body) {
|
|
43
|
+
const b = Number(body) > 0 ? Number(body) : 0;
|
|
44
|
+
return clampWidth(width ?? b * DEFAULT_SHARE, b);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Is there room for a column beside the work? An unmeasured body (0) is
|
|
48
|
+
* taken to have room: the first paint is never a sheet by mistake. */
|
|
49
|
+
export function hasRoom(body, columnAt = COLUMN_AT) {
|
|
50
|
+
const b = Number(body);
|
|
51
|
+
return !(Number.isFinite(b) && b > 0) || b >= columnAt;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** The divider dragged: the pointer moving left widens the column. */
|
|
55
|
+
export function dragged(startWidth, startX, x, body) {
|
|
56
|
+
return clampWidth(Number(startWidth) - (Number(x) - Number(startX)), body);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** The divider's keys. Left widens, Right narrows, End opens it to the
|
|
60
|
+
* widest, Home goes back to the default (null). `undefined` = not ours. */
|
|
61
|
+
export function nudged(key, now, body) {
|
|
62
|
+
if (key === "ArrowLeft") return clampWidth(Number(now) + STEP, body);
|
|
63
|
+
if (key === "ArrowRight") return clampWidth(Number(now) - STEP, body);
|
|
64
|
+
if (key === "End") return maxWidth(body);
|
|
65
|
+
if (key === "Home") return null;
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** The two keys this browser keeps for one app's dock. */
|
|
70
|
+
export function dockKeys(storageKey) {
|
|
71
|
+
const k = String(storageKey || "app").replace(/[^\w.-]+/g, "-");
|
|
72
|
+
return { open: `mc.dock.${k}.open`, width: `mc.dock.${k}.width` };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ---- "have the agent do it" (X9) -------------------------------------------
|
|
76
|
+
//
|
|
77
|
+
// A button that says the agent will do the work does not open a form. It
|
|
78
|
+
// opens the dock with the agent's first line already sent (or in the box),
|
|
79
|
+
// and the agent asks only for what it is missing, in the chat. openAgent()
|
|
80
|
+
// (agent-dock.jsx) is the call; this is its message.
|
|
81
|
+
|
|
82
|
+
/** The window event openAgent() dispatches; every useAgentDock hears it. */
|
|
83
|
+
export const OPEN_EVENT = "mc:agent-dock:open";
|
|
84
|
+
|
|
85
|
+
let seq = 0;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* What openAgent was asked, made whole. The argument is a line ("Draft a
|
|
89
|
+
* project plan for me") or an object:
|
|
90
|
+
*
|
|
91
|
+
* ask the starting line
|
|
92
|
+
* send true (the default): send it as the member's first words.
|
|
93
|
+
* false: put it in the box for the member to finish
|
|
94
|
+
* fresh true (the default): in a new chat, so it is its own thing
|
|
95
|
+
* and not a follow-up. false: carry on in the open one
|
|
96
|
+
* storageKey only the dock of that app (default: any dock on the page)
|
|
97
|
+
*
|
|
98
|
+
* → { ask, send, fresh, storageKey, nonce }. The line is kept as given (a
|
|
99
|
+
* trailing space is where the member goes on typing); the pane trims what it
|
|
100
|
+
* sends. The nonce is new every call: a pane takes a nonce once.
|
|
101
|
+
*/
|
|
102
|
+
export function openRequest(input, now = Date.now()) {
|
|
103
|
+
const o = typeof input === "string" ? { ask: input } : (input ?? {});
|
|
104
|
+
return {
|
|
105
|
+
ask: String(o.ask ?? ""),
|
|
106
|
+
send: o.send !== false,
|
|
107
|
+
fresh: o.fresh !== false,
|
|
108
|
+
storageKey: o.storageKey ? String(o.storageKey) : null,
|
|
109
|
+
nonce: `${now}-${++seq}`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Does an openAgent call carry a line for the pane? With no line
|
|
114
|
+
* (`openAgent()`, `{ ask: "" }`, a blank string) the dock only opens: nothing
|
|
115
|
+
* is sent and no chat is started. */
|
|
116
|
+
export function carriesLine(request) {
|
|
117
|
+
return Boolean(String(request?.ask ?? "").trim());
|
|
118
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// The AgentDock block — `makersclaw add agent-dock`. Fixed: compose it
|
|
2
|
+
// through its props (README.md beside this file). The model's helpers are
|
|
3
|
+
// plain functions; they work on the server too.
|
|
4
|
+
export { AgentDock, openAgent, useAgentDock } from "./agent-dock";
|
|
5
|
+
export { COLUMN_AT, DEFAULT_SHARE, MIN_W, OPEN_EVENT, STEP, carriesLine, clampWidth, columnWidth, dockKeys, dragged, hasRoom, maxWidth, nudged, openRequest, storedWidth } from "./dock-model";
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# AgentKit
|
|
2
|
+
|
|
3
|
+
What the app's agent knows and what it can do, shown inside the app.
|
|
4
|
+
Part of the agent kit (0.8.1).
|
|
5
|
+
|
|
6
|
+
- **What it knows** — its skills. The app's own references first, each
|
|
7
|
+
with when the agent reads it ("Before writing a follow-up"); then the
|
|
8
|
+
skills added on top, marked **Added**, and **Not installed** where one
|
|
9
|
+
is not yet.
|
|
10
|
+
- **What it can do** — its tools: the app's declared actions, by what
|
|
11
|
+
they do ("Move a deal to another stage"), with the action's name
|
|
12
|
+
under it.
|
|
13
|
+
|
|
14
|
+
Read only. Adding or removing a skill is the window's Settings › Skills;
|
|
15
|
+
`onManage` opens it ("Manage in Settings").
|
|
16
|
+
|
|
17
|
+
```jsx
|
|
18
|
+
import { AgentKit } from "../components/blocks/agent-kit"; // a Makersclaw app
|
|
19
|
+
import { AgentKit } from "@/components/makersclaw/blocks/agent-kit"; // a shadcn project
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
A client component. Its own width decides its layout: the two lists sit
|
|
23
|
+
side by side from about 768 px, one over the other below.
|
|
24
|
+
|
|
25
|
+
## Props
|
|
26
|
+
|
|
27
|
+
- `skills` — useAgentKit's `skills`: `[{ name, title, when, from: "app"
|
|
28
|
+
| "added", installed }]`.
|
|
29
|
+
- `tools` — useAgentKit's `tools`: `[{ name, description }]` (only the
|
|
30
|
+
actions the agent may run; one declared `"agent": false` is left out).
|
|
31
|
+
- `onManage` — opens the window's Settings › Skills. Leave it out for no
|
|
32
|
+
button. `manageLabel` — its words (default "Manage in Settings").
|
|
33
|
+
- `title` — the head (default "The agent"); `null` for none.
|
|
34
|
+
- `empty` — `{ skills, tools }`: what an empty list says.
|
|
35
|
+
- `className` — layout around it. Never colour.
|
|
36
|
+
|
|
37
|
+
## useAgentKit (lib/hooks.js)
|
|
38
|
+
|
|
39
|
+
```js
|
|
40
|
+
const { skills, tools } = useAgentKit();
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
It reads `GET _claw/agent` once: `own_skills` (`{ name, title, when }`,
|
|
44
|
+
from the app's `references/*.md`), `skills` (added on top, `{ name,
|
|
45
|
+
installed }`) and `actions` (`{ name, description, agent }`, the
|
|
46
|
+
declared actions). On a claw from before `own_skills` and `actions` it
|
|
47
|
+
answers empty lists: the block says so plainly, never an error.
|
|
48
|
+
|
|
49
|
+
## Who may do what
|
|
50
|
+
|
|
51
|
+
Any member reads it. Adding or removing a skill: the window's Settings ›
|
|
52
|
+
Skills, on the desk, by whoever may change the app there.
|
|
53
|
+
|
|
54
|
+
## Never
|
|
55
|
+
|
|
56
|
+
- Never an Add or Remove of a skill here: that is the desk's.
|
|
57
|
+
- Never the agent's instructions (its brief) word for word: they are
|
|
58
|
+
for the agent. Say what it knows by its skills' titles.
|
|
59
|
+
- Never a tool the app does not declare: the list is the declared
|
|
60
|
+
actions, nothing written by hand.
|
|
61
|
+
|
|
62
|
+
## Example
|
|
63
|
+
|
|
64
|
+
```jsx
|
|
65
|
+
"use client";
|
|
66
|
+
import { useAgentKit } from "../lib/hooks";
|
|
67
|
+
import { AgentKit } from "../components/blocks/agent-kit";
|
|
68
|
+
|
|
69
|
+
export default function AboutTheAgent({ openSettings }) {
|
|
70
|
+
const { skills, tools } = useAgentKit();
|
|
71
|
+
return <AgentKit title="What the CRM's agent knows" skills={skills} tools={tools} onManage={openSettings} />;
|
|
72
|
+
}
|
|
73
|
+
```
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// What the app's agent knows and what it can do, inside the app: its
|
|
4
|
+
// skills (the app's own references, with when it reads each, and those
|
|
5
|
+
// added on top, marked added and, where so, not installed) and its tools
|
|
6
|
+
// (the app's declared actions). Props in, callbacks out; read only —
|
|
7
|
+
// adding or removing a skill stays in the window's Settings › Skills,
|
|
8
|
+
// which onManage opens. Tokens only. Its own width decides its layout
|
|
9
|
+
// (@container): the two lists sit side by side from about 768 px.
|
|
10
|
+
|
|
11
|
+
import { Badge, Button, Icon, cx } from "../../ui";
|
|
12
|
+
|
|
13
|
+
function Section({ icon, title, count, children }) {
|
|
14
|
+
return (
|
|
15
|
+
<section aria-label={title} className="grid min-w-0 content-start gap-1">
|
|
16
|
+
<h3 className="m-0 flex min-w-0 items-center gap-2 px-3.5 pt-3 text-sm font-semibold">
|
|
17
|
+
<Icon name={icon} size={14} className="shrink-0 text-muted-foreground" />
|
|
18
|
+
<span className="truncate">{title}</span>
|
|
19
|
+
{count ? <span className="text-xs font-normal tabular-nums text-muted-foreground">{count}</span> : null}
|
|
20
|
+
</h3>
|
|
21
|
+
{children}
|
|
22
|
+
</section>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* skills [{ name, title, when, from: "app" | "added", installed }]
|
|
28
|
+
* (useAgentKit's `skills`)
|
|
29
|
+
* tools [{ name, description }] (useAgentKit's `tools`)
|
|
30
|
+
* onManage opens the window's Settings › Skills; leave it out for none
|
|
31
|
+
* manageLabel its words (default "Manage in Settings")
|
|
32
|
+
* title the head (default "The agent"); null for none
|
|
33
|
+
* empty { skills, tools }: what an empty list says
|
|
34
|
+
*/
|
|
35
|
+
export function AgentKit({ skills = [], tools = [], onManage, manageLabel = "Manage in Settings", title = "The agent", empty, className }) {
|
|
36
|
+
const known = Array.isArray(skills) ? skills : [];
|
|
37
|
+
const can = Array.isArray(tools) ? tools : [];
|
|
38
|
+
return (
|
|
39
|
+
<section aria-label={title ?? "The agent"} className={cx("@container grid min-w-0 overflow-hidden rounded-[var(--radius)] border border-border bg-card text-card-foreground", className)}>
|
|
40
|
+
{title || onManage ? (
|
|
41
|
+
<header className="flex min-w-0 flex-wrap items-center gap-2 border-b border-border px-3.5 py-2">
|
|
42
|
+
{title ? <b className="min-w-0 flex-1 truncate text-sm font-semibold">{title}</b> : <span className="flex-1" />}
|
|
43
|
+
{onManage ? (
|
|
44
|
+
<Button size="sm" variant="quiet" icon="settings" onClick={onManage}>
|
|
45
|
+
{manageLabel}
|
|
46
|
+
</Button>
|
|
47
|
+
) : null}
|
|
48
|
+
</header>
|
|
49
|
+
) : null}
|
|
50
|
+
<div className="grid min-w-0 divide-y divide-border @3xl:grid-cols-2 @3xl:divide-x @3xl:divide-y-0">
|
|
51
|
+
<Section icon="lightbulb" title="What it knows" count={known.length || null}>
|
|
52
|
+
{known.length ? (
|
|
53
|
+
<ul className="m-0 grid list-none p-0 pb-1.5">
|
|
54
|
+
{known.map((s) => (
|
|
55
|
+
<li key={`${s.from}-${s.name}`} className="grid min-w-0 gap-0.5 px-3.5 py-2">
|
|
56
|
+
<span className="flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1">
|
|
57
|
+
<span className="min-w-0 truncate text-[13px] font-medium">{s.title || s.name}</span>
|
|
58
|
+
{s.from === "added" ? <Badge tone="info">Added</Badge> : null}
|
|
59
|
+
{s.from === "added" && !s.installed ? <Badge tone="warning">Not installed</Badge> : null}
|
|
60
|
+
</span>
|
|
61
|
+
{s.when ? <span className="line-clamp-2 text-xs text-muted-foreground">{s.when}</span> : null}
|
|
62
|
+
</li>
|
|
63
|
+
))}
|
|
64
|
+
</ul>
|
|
65
|
+
) : (
|
|
66
|
+
<p className="m-0 px-3.5 pb-3 text-[13px] text-muted-foreground">{empty?.skills ?? "Nothing of its own yet: it works from the app's instructions."}</p>
|
|
67
|
+
)}
|
|
68
|
+
</Section>
|
|
69
|
+
<Section icon="wand" title="What it can do" count={can.length || null}>
|
|
70
|
+
{can.length ? (
|
|
71
|
+
<ul className="m-0 grid list-none p-0 pb-1.5">
|
|
72
|
+
{can.map((t) => (
|
|
73
|
+
<li key={t.name} className="grid min-w-0 gap-0.5 px-3.5 py-2">
|
|
74
|
+
<span className="min-w-0 text-[13px]">{t.description || t.name}</span>
|
|
75
|
+
{t.description ? <code className="truncate text-[11.5px] text-muted-foreground">{t.name}</code> : null}
|
|
76
|
+
</li>
|
|
77
|
+
))}
|
|
78
|
+
</ul>
|
|
79
|
+
) : (
|
|
80
|
+
<p className="m-0 px-3.5 pb-3 text-[13px] text-muted-foreground">{empty?.tools ?? "No actions declared yet: it reads, and asks before it writes."}</p>
|
|
81
|
+
)}
|
|
82
|
+
</Section>
|
|
83
|
+
</div>
|
|
84
|
+
</section>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agent-kit",
|
|
3
|
+
"title": "AgentKit",
|
|
4
|
+
"description": "What the app's agent knows and what it can do, inside the app: its skills (the app's own references, each with when the agent reads it, and the skills added on top, marked Added and, where so, Not installed) and its tools (the app's declared actions, by what they do). Read only; \"Manage in Settings\" (onManage) opens the window's Settings › Skills, where skills are added and removed. It draws what useAgentKit() returns (lib/hooks.js, GET _claw/agent).",
|
|
5
|
+
"useWhen": "An app shows its member what its agent is for and may do: an About the agent page, a side card beside the agent's chat, a settings screen's Agent section, a help panel (\"What can I ask?\"). For the agent's runs use run-history; for its schedule use schedule-card; for the chat itself use agent-chat.",
|
|
6
|
+
"tags": ["skills", "tools", "actions", "capabilities", "knowledge", "about", "settings", "help", "kit"],
|
|
7
|
+
"exports": ["AgentKit"],
|
|
8
|
+
"files": ["index.js", "agent-kit.jsx"],
|
|
9
|
+
"requires": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// AgentKit with a pretend agent — the gallery's and the smoke test's
|
|
4
|
+
// surface. Not installed into apps. A CRM's agent at 800 px (side by
|
|
5
|
+
// side from 768), the same at 320 px, and a new app's agent with nothing
|
|
6
|
+
// of its own yet.
|
|
7
|
+
import { AgentKit } from "../components/blocks/agent-kit";
|
|
8
|
+
|
|
9
|
+
const SKILLS = [
|
|
10
|
+
{ name: "reading-mail", title: "Reading the morning mail", when: "On every morning read, before it files a thread under a person", from: "app", installed: true },
|
|
11
|
+
{ name: "drafting", title: "Drafting follow-ups", when: "Before it writes a follow-up: the tone, the length, never a promise of a date", from: "app", installed: true },
|
|
12
|
+
{ name: "deal-stages", title: "What each deal stage means", when: "Before it moves a deal", from: "app", installed: true },
|
|
13
|
+
{ name: "web-research", title: "web-research", when: null, from: "added", installed: true },
|
|
14
|
+
{ name: "linkedin-lookup", title: "linkedin-lookup", when: null, from: "added", installed: false },
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const TOOLS = [
|
|
18
|
+
{ name: "add_person", description: "Add a person, with where they were found" },
|
|
19
|
+
{ name: "update_person", description: "Change a person's details" },
|
|
20
|
+
{ name: "move_deal", description: "Move a deal to another stage" },
|
|
21
|
+
{ name: "log_meeting", description: "Put a meeting on a person's timeline" },
|
|
22
|
+
{ name: "draft_follow_up", description: "Draft a follow-up for your yes" },
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
export default function AgentKitDemo() {
|
|
26
|
+
return (
|
|
27
|
+
<div className="grid gap-6 p-4">
|
|
28
|
+
<AgentKit className="w-full max-w-[800px]" title="What the CRM's agent knows" skills={SKILLS} tools={TOOLS} onManage={() => {}} />
|
|
29
|
+
<div className="flex flex-wrap items-start gap-4">
|
|
30
|
+
<AgentKit className="w-full max-w-[320px]" skills={SKILLS.slice(0, 3)} tools={TOOLS.slice(0, 3)} onManage={() => {}} />
|
|
31
|
+
<AgentKit className="w-full max-w-[368px]" title="A new app's agent" skills={[]} tools={[]} />
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# AgentMarks
|
|
2
|
+
|
|
3
|
+
Two marks and a byline, one of each for the whole platform.
|
|
4
|
+
|
|
5
|
+
- **AgentMark** — a filled diamond. The agent's work: it read, used
|
|
6
|
+
tools, wrote. It may cost more than one call.
|
|
7
|
+
- **CallMark** — a sparkle in a dashed ring. One model call: no
|
|
8
|
+
conversation, no tools ("Shorter · 1 cr").
|
|
9
|
+
- **Byline** — who did it, in words: "By the agent, on Priya's ask ·
|
|
10
|
+
11:20".
|
|
11
|
+
|
|
12
|
+
Before the kit, the store's apps drew the agent in six different glyphs.
|
|
13
|
+
A member who learns the diamond in one app now reads it in every app.
|
|
14
|
+
|
|
15
|
+
The two marks differ in **shape**, filled against dashed. Never tell them
|
|
16
|
+
apart by colour alone, and never draw a sparkle or a robot of your own.
|
|
17
|
+
|
|
18
|
+
```jsx
|
|
19
|
+
import { AgentMark, CallMark, Byline } from "../components/blocks/agent-marks"; // a Makersclaw app ("./blocks/agent-marks" from components/)
|
|
20
|
+
import { AgentMark, CallMark, Byline } from "@/components/makersclaw/blocks/agent-marks"; // a shadcn project
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
No data, no hook, no door. Props in.
|
|
24
|
+
|
|
25
|
+
## Props
|
|
26
|
+
|
|
27
|
+
### AgentMark · CallMark
|
|
28
|
+
|
|
29
|
+
- `label` — what a screen reader hears when the mark stands alone ("The
|
|
30
|
+
agent", "One model call"). Leave it out when words beside the mark
|
|
31
|
+
already say it: the mark is then decoration.
|
|
32
|
+
- `size` — `xs` · `sm` (default, 12px) · `md` · `lg`, or pixels.
|
|
33
|
+
- `children` — words drawn beside the mark ("Agent", "1 call").
|
|
34
|
+
- `className` — layout around it. Never colour: the agent's mark is the
|
|
35
|
+
theme's `primary`, the call's is muted.
|
|
36
|
+
|
|
37
|
+
### Byline
|
|
38
|
+
|
|
39
|
+
- `by` — `"agent"` (the default; its mark leads), `"call"` (one model
|
|
40
|
+
call), or a person's name ("Owen").
|
|
41
|
+
- `ask` — whose ask the agent worked on: a name ("Priya" → "on Priya's
|
|
42
|
+
ask"), `"you"` ("on your ask"), or `"run"` for a scheduled job's run
|
|
43
|
+
("on a run").
|
|
44
|
+
- `at` — when: words ("11:20"), a `Date`, or an ISO string (today reads
|
|
45
|
+
as the time, another day as "12 Sep").
|
|
46
|
+
- `mark` — `false` drops the mark before the words, for a head that
|
|
47
|
+
already draws one.
|
|
48
|
+
|
|
49
|
+
## Where each one goes
|
|
50
|
+
|
|
51
|
+
- A value the agent wrote, in a cell or beside a field: `AgentMark` with
|
|
52
|
+
`label="Written by the agent"`.
|
|
53
|
+
- A button that makes one model call: `CallMark` (the `ai-action` block
|
|
54
|
+
draws it for you).
|
|
55
|
+
- The head of a receipt, a timeline line, a draft: `Byline`.
|
|
56
|
+
|
|
57
|
+
## Never
|
|
58
|
+
|
|
59
|
+
- Never mark a person's own work with either mark.
|
|
60
|
+
- Never use `AgentMark` for one model call, or `CallMark` for an ask: the
|
|
61
|
+
member reads cost and reach from the shape.
|
|
62
|
+
- Never colour a mark through `className`.
|
|
63
|
+
|
|
64
|
+
## Example
|
|
65
|
+
|
|
66
|
+
```jsx
|
|
67
|
+
import { AgentMark, Byline } from "./blocks/agent-marks";
|
|
68
|
+
|
|
69
|
+
export function WrittenBy({ note }) {
|
|
70
|
+
return (
|
|
71
|
+
<div className="grid gap-1">
|
|
72
|
+
<p className="flex items-center gap-1.5">
|
|
73
|
+
<AgentMark label="Written by the agent" />
|
|
74
|
+
{note.text}
|
|
75
|
+
</p>
|
|
76
|
+
<Byline by="agent" ask={note.asked_by_name} at={note.created_at} />
|
|
77
|
+
</div>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
```
|