makersclaw 0.8.2 → 0.8.3
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/package.json +1 -1
- package/r/activity-log.json +3 -3
- package/r/agent-changes.json +3 -3
- package/r/agent-chat.json +3 -3
- package/r/agent-column.json +3 -3
- package/r/agent-dock.json +3 -3
- package/r/agent-kit.json +2 -2
- package/r/agent-marks.json +2 -2
- package/r/agent-pane.json +6 -6
- package/r/ai-action.json +4 -4
- package/r/annotate.json +3 -3
- package/r/approval-request.json +2 -2
- package/r/approval.json +3 -3
- package/r/ask-bar.json +2 -2
- package/r/audio-player.json +2 -2
- package/r/auth-form.json +2 -2
- package/r/automation-editor.json +7 -7
- package/r/automation-list.json +3 -3
- package/r/automation-model.json +2 -2
- package/r/automations-screen.json +7 -7
- 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 +2 -2
- 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 +2 -2
- package/r/contact-section.json +2 -2
- package/r/cost.json +2 -2
- package/r/csv-import.json +3 -3
- package/r/data-picker.json +3 -3
- 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 +2 -2
- package/r/fix-note.json +4 -4
- package/r/flow-canvas.json +2 -2
- package/r/flow-editor.json +4 -4
- 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 +2 -2
- package/r/map.json +2 -2
- package/r/margin-notes.json +3 -3
- 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 +2 -2
- package/r/order-detail.json +2 -2
- package/r/org-chart.json +3 -3
- package/r/pace-bar.json +3 -3
- 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 +2 -2
- package/r/record-notes.json +4 -4
- package/r/registry.json +249 -249
- package/r/run-history.json +2 -2
- package/r/run-view.json +6 -6
- package/r/schedule-card.json +2 -2
- package/r/schedule-engine.json +2 -2
- package/r/schedule-gantt.json +3 -3
- package/r/schedule-ruler.json +2 -2
- 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 +3 -3
- package/r/spreadsheet.json +2 -2
- package/r/stat-cards.json +3 -3
- package/r/step-picker.json +3 -3
- package/r/step-settings.json +5 -5
- package/r/suggestion.json +2 -2
- package/r/sum-bar.json +2 -2
- 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 +2 -2
- package/r/time-grid.json +2 -2
- package/r/time-strip.json +2 -2
- package/r/top-bar.json +2 -2
- package/r/transaction-list.json +2 -2
- package/r/trigger-picker.json +3 -3
- package/r/whiteboard.json +3 -3
- package/r/workflow-view.json +3 -3
- package/registry/blocks/agent-pane/README.md +7 -0
- package/registry/blocks/agent-pane/agent-pane.jsx +23 -18
package/package.json
CHANGED
package/r/activity-log.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"title": "ActivityLog",
|
|
6
6
|
"description": "Who did what, to what, when, newest first: one row per event on a vertical timeline, \"Anna Lee edited deals\" with the line's detail under it, a kind dot and the time. The agent is an author like a person, with its own mark: \"Agent, for anna@acme.com\", \"Agent, on a run\". It takes the app's activity lines as useActivity() returns them (lib/hooks.js; with a row, one record's timeline) and words them itself, or rows you shaped. leading=\"icon\" draws one subject's journey instead.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/agent-marks.json"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": [],
|
|
12
12
|
"files": [
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"docs": "Installed to components/makersclaw/blocks/activity-log. Import: import { ActivityLog, ActivityFeed, activityItems, activityAuthor, activityTime } from \"@/components/makersclaw/blocks/activity-log\". Props and an example: components/makersclaw/blocks/activity-log/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
46
46
|
"meta": {
|
|
47
47
|
"makersclaw": {
|
|
48
|
-
"version": "0.8.
|
|
48
|
+
"version": "0.8.3",
|
|
49
49
|
"useWhen": "A record's story (what happened to this deal, and who did it), an app's recent changes on a home screen, a review of what the agent did this week next to what people did. Not for one job's own steps (job-panel), one ask's changes with an undo (agent-changes), or a sortable audit table (data-table)."
|
|
50
50
|
}
|
|
51
51
|
}
|
package/r/agent-changes.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"title": "AgentChanges",
|
|
6
6
|
"description": "The receipt of one ask: what the agent did in one line (\"Sorted 46 stickies into 6 groups\"), who asked and when, the changes listed (folded after five, \"Show 41 more\"), and \"Undo this ask\" — your async undo, the app's own declared action, answering { ok } — then the undone state, struck through, in words. The block draws; the app knows what an ask changed and takes it back.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/agent-marks.json"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": [],
|
|
12
12
|
"files": [
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"docs": "Installed to components/makersclaw/blocks/agent-changes. Import: import { AgentChanges } from \"@/components/makersclaw/blocks/agent-changes\". Props and an example: components/makersclaw/blocks/agent-changes/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
45
45
|
"meta": {
|
|
46
46
|
"makersclaw": {
|
|
47
|
-
"version": "0.8.
|
|
47
|
+
"version": "0.8.3",
|
|
48
48
|
"useWhen": "After the agent changes many things at once on a member's ask and the member should see them and take them all back in one press: a whiteboard sorted into groups, a mind map grown, a plan drafted onto a Gantt, a batch of records tidied. Not for proposals waiting to be kept (suggestion) or for the app's whole history (activity-log)."
|
|
49
49
|
}
|
|
50
50
|
}
|
package/r/agent-chat.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"title": "AgentChat",
|
|
6
6
|
"description": "The app's own chat with its agent, in the app's look: the member's words, the agent's answer as it is written, one line per step (\"Worked through 6 steps\"), Stop while it works, and what waits on the member settled in place — the agent's question is answered in the chat (its options, and the member's own words where it welcomes them), and its yes is the `approval` block's press frame, handed in as `yes`; a need the app cannot settle (connecting an account, spending money) says so and links to the desk. It draws what useAgentThread() returns (lib/hooks.js): the same conversation the desk's agent column shows, one session, two views. Optional row makes it a chat about one record. fill=false for a compact card in a column.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/needs-you.json"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": [],
|
|
12
12
|
"files": [
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"docs": "Installed to components/makersclaw/blocks/agent-chat. Import: import { AgentChat } from \"@/components/makersclaw/blocks/agent-chat\". Props and an example: components/makersclaw/blocks/agent-chat/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
47
47
|
"meta": {
|
|
48
48
|
"makersclaw": {
|
|
49
|
-
"version": "0.8.
|
|
49
|
+
"version": "0.8.3",
|
|
50
50
|
"useWhen": "The app should hold its conversation with its agent: an Ask panel beside a record, an ask box on a home screen, a sheet behind an Ask button. Place it and set \"agent_in_app\": true in the package's blueprint, so the desk keeps its agent column folded for the app. For work the founder commissions from a verb and watches land, use job-panel."
|
|
51
51
|
}
|
|
52
52
|
}
|
package/r/agent-column.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"title": "AgentColumn",
|
|
6
6
|
"description": "A column an agent fills (or suggests) for every record, cell by cell: each answer shows its state in words (queued, waits for another column, looking up, found, not found, two answers, can't fill, failed, out of date, checked or typed by a person) and how sure it is as a mark that differs in shape (filled sure, half likely, dashed guess, a tick for a person). Its detail shows the source, the words on the page with the answer marked in them, how it was found, both answers when sources disagree, what was tried when nothing was found, and what a person can do: accept, pick one of two, type their own, ask again with a hint, keep not found, or keep and drop a suggestion. With a column header that carries live progress, a legend, and a picker that chooses columns with their cost per record. Works in data-table cells, a spreadsheet column type, or a list of its own. Grown in Data Enrichment 0.5.0: the receipt (an answer opened as a claim with its citation: each source a clipping with the deciding words underlined, two clippings to pick from, what was tried crossed off), the one-line answer and trust mark a dense grid draws, and a column heading drawn as a job (its progress, its cost per row, its menu).",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/agent-marks.json"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": [],
|
|
12
12
|
"files": [
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"docs": "Installed to components/makersclaw/blocks/agent-column. Import: import { AnswerCell, AnswerDetail, ColumnHeader, SureMark, SureLegend, Source, AgentMark, AnswerLine, Clipping, JobHeader, Receipt, ReceiptActions, TriedList, TrustMark, ColumnPicker, answerColumnType, answerState, answerWords, needsCheck, summarizeAnswers, progressWords, markWords, decidingWords, plainWords, shortUrl, CONFIDENCE } from \"@/components/makersclaw/blocks/agent-column\". Props and an example: components/makersclaw/blocks/agent-column/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
79
79
|
"meta": {
|
|
80
80
|
"makersclaw": {
|
|
81
|
-
"version": "0.8.
|
|
81
|
+
"version": "0.8.3",
|
|
82
82
|
"useWhen": "An app whose agent fills or proposes values record by record and a person checks them: enrichment of a list, a CRM filling in a contact, a base whose agent fills a field or suggests a cleaner value, a research table. Not for a single agent reply (job-panel) or a person's own typing (spreadsheet, record-form)."
|
|
83
83
|
}
|
|
84
84
|
}
|
package/r/agent-dock.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"title": "AgentDock",
|
|
6
6
|
"description": "Where an app's agent lives, as the desk's agent sidebar does: a column on the right beside the work, under the top bar, with the content reflowing beside it. A quarter of the body until the member drags the divider (never under 280 px, never over half), the width and the open state remembered in this browser per app; the divider is a separator a keyboard can move (arrows nudge, Home goes back to a quarter, End to the widest). Where the body is under 900 px (a container measure, not the window) the dock becomes a sheet laid over the app from the right, folded by Escape, and the chat does not remount on the way. It is the host only: the pane inside draws its own head (title, New chat, Chats, close) and its empty state (past chats listed, suggestions, the box); the dock tells the pane how to close. The pane stays mounted once opened, so a turn in flight and a draft survive folding. It sits in the `dock` slot of the kit's AppLayout. useAgentDock() holds the open state for the app's Ask button, remembered per app, and puts the cursor in the box when the member opens it. openAgent({ ask }) is how every \"have the agent do it\" button works (X9): it opens the dock with the agent's first line already sent in a new chat (or put in the box), so the agent asks only for what it is missing, in the chat, and no form comes first.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/agent-pane.json"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": [],
|
|
12
12
|
"files": [
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"docs": "Installed to components/makersclaw/blocks/agent-dock. Import: import { AgentDock, useAgentDock, openAgent, COLUMN_AT, DEFAULT_SHARE, MIN_W, OPEN_EVENT, STEP, carriesLine, clampWidth, columnWidth, dockKeys, dragged, hasRoom, maxWidth, nudged, openRequest, storedWidth } from \"@/components/makersclaw/blocks/agent-dock\". Props and an example: components/makersclaw/blocks/agent-dock/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
51
51
|
"meta": {
|
|
52
52
|
"makersclaw": {
|
|
53
|
-
"version": "0.8.
|
|
53
|
+
"version": "0.8.3",
|
|
54
54
|
"useWhen": "Any app that has an agent the member asks from the shell: the top bar's Ask, a chip that sends a question, a record whose Ask follows the open record. One dock per app, in the shell; the record's own pane is the same dock with a chat scoped to that record (useAgentPane({ row })), never a second column. Replaces a modal Sheet or an inspector tab as the agent's place. Not for work the member commissions from a verb and watches land (job-panel), and not for a conversation that fills a whole screen (agent-pane in a page of its own)."
|
|
55
55
|
}
|
|
56
56
|
}
|
package/r/agent-kit.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "AgentKit",
|
|
6
6
|
"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).",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"docs": "Installed to components/makersclaw/blocks/agent-kit. Import: import { AgentKit } from \"@/components/makersclaw/blocks/agent-kit\". Props and an example: components/makersclaw/blocks/agent-kit/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
43
43
|
"meta": {
|
|
44
44
|
"makersclaw": {
|
|
45
|
-
"version": "0.8.
|
|
45
|
+
"version": "0.8.3",
|
|
46
46
|
"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."
|
|
47
47
|
}
|
|
48
48
|
}
|
package/r/agent-marks.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "AgentMarks",
|
|
6
6
|
"description": "The platform's two marks and its byline: AgentMark, a filled diamond for the agent's work (it used tools, read and wrote, it may cost more than one call); CallMark, a sparkle in a dashed ring for one model call (a Summarize, a Shorter); and Byline, who did a thing in words (\"By the agent, on Priya's ask · 11:20\", \"By one model call\", \"By Owen\"). The two differ in shape, never colour alone, and each names itself to a screen reader when no words stand beside it.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"docs": "Installed to components/makersclaw/blocks/agent-marks. Import: import { AgentMark, CallMark, Byline } from \"@/components/makersclaw/blocks/agent-marks\". Props and an example: components/makersclaw/blocks/agent-marks/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
43
43
|
"meta": {
|
|
44
44
|
"makersclaw": {
|
|
45
|
-
"version": "0.8.
|
|
45
|
+
"version": "0.8.3",
|
|
46
46
|
"useWhen": "Anywhere a screen holds work that was not a person's own: a value the agent wrote, a line in a timeline, a draft from one model call, the head of an ask's receipt. Use these instead of drawing a sparkle or a robot of your own, so every app marks the agent the same way. The other kit blocks (ai-action, agent-changes, activity-log, needs-you) already use them."
|
|
47
47
|
}
|
|
48
48
|
}
|
package/r/agent-pane.json
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
"title": "AgentPane",
|
|
6
6
|
"description": "The desk's agent sidebar, as the app's own pane, in the app's theme (D27): the member's words, the agent's text as it is written, the plan, the work folded into \"Worked through N steps\" with each step opening to its facts and what came back, reads folded, retries a later call fixed, helpers, the agent's questions as one form, the one ask's yes as the `approval` block's press, what it made, the past chats with a dot on those that need you, New chat and Stop; and the desk's message box (the chat-pane block's: the words on top, + to attach and a round send under them, a stop in its place while a turn runs), files to send with the words and dictation in the box; a tool's yes pressed in place; the thread streamed as the agent writes; Open under an app or file it made. It draws what useAgentPane() returns (lib/hooks.js): the same conversation and the same rules the desk's sidebar runs, one session, two views. The app places it and chooses where; the platform supplies what it shows.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
10
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/needs-you.json",
|
|
10
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/chat-pane.json"
|
|
11
11
|
],
|
|
12
12
|
"dependencies": [],
|
|
13
13
|
"files": [
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"path": "registry/blocks/agent-pane/agent-pane.jsx",
|
|
28
28
|
"type": "registry:component",
|
|
29
29
|
"target": "@components/makersclaw/blocks/agent-pane/agent-pane.jsx",
|
|
30
|
-
"content": "\"use client\";\n\nimport { Button, Icon, Notice, Spinner, cx } from \"../../ui\";\nimport { ChatPane } from \"../chat-pane\";\nimport { QuestionBox } from \"../needs-you\";\nimport { Prose } from \"./prose\";\nimport { QuestionForm } from \"./questions\";\nimport { MemberWords, Message } from \"./transcript\";\n\n// AgentPane — the desk's agent sidebar, as the app's own pane (0.8.1, D27;\n// docs/AGENT-BLOCK-PLAN.md). The founder: \"the inapp component is not on\n// par with the desk agent sidebar, in terms of tool calls, questions,\n// showing information\". So this is the sidebar, drawn in the app's theme:\n// the member's words, the agent's text as it is written, the plan, the\n// work folded into \"Worked through N steps\" (each step opening to its\n// facts and what came back), helpers, several questions as one form, the\n// one ask's yes as the `approval` block's press, what it made, the past\n// chats and New chat, Stop.\n//\n// const chat = useAgentPane({ row: { kind: \"person\", id, name } });\n// <AgentPane chat={chat} title={`Ask about ${name}`} suggestions={[…]} />\n//\n// It draws the object useAgentPane() returns (lib/hooks.js) and decides\n// nothing: which lines there are and what they say is the platform's (the\n// same rules the sidebar runs), sent as data. It is the SAME conversation\n// the desk's sidebar shows: one session, two views. An app that places it\n// says so in its package (`\"agent_pane\": true` in the blueprint), and the\n// desk then draws no sidebar for the app's window.\n//\n// The frame around the lines (the head with New chat and Chats, the empty\n// state, the scroll, the desk's composer with + and the round send, a\n// starting line from the dock) is the `chat-pane` block (X5); this file is\n// what the AGENT puts in it: the lines above, and the bar of what waits.\n//\n// What waits on the member is settled here, where it was asked. The\n// agent's QUESTIONS are answered in place (`chat.answer`); its YES is the\n// `approval` block's press frame, handed in as `yes` — this pane never\n// draws an Approve of its own. A sign-in, money, or a tool approval says\n// so and opens the desk.\n\nconst STATE_LINE = {\n queued: \"Queued — it starts when the one before it ends\",\n working: \"Working on it\",\n};\n\n/** What waits on the member, as the bar under the thread says it. */\nfunction needsTitle(kind, inApp) {\n if (kind === \"yes\" || kind === \"approval\") return inApp === \"press\" ? \"Waiting for your yes\" : \"Waiting for your yes on the desk\";\n if (kind === \"question\") return inApp === \"answer\" ? \"A question for you\" : \"Waiting for your answer on the desk\";\n if (kind === \"connect\") return \"Waiting for you to connect an account on the desk\";\n if (kind === \"limit\") return \"Paused for credits — see the desk\";\n return \"Needs you on the desk\";\n}\n\n/** A claw from before the sidebar's view sends only the small turns: the\n * member's words, the agent's text, one line per step. Drawn plainly. */\nfunction LegacyTurn({ turn }) {\n return (\n <div className=\"grid min-w-0 gap-2\">\n {turn.member ? <MemberWords>{turn.member}</MemberWords> : null}\n {(turn.parts ?? []).map((p, i) =>\n p.type === \"step\" ? (\n <p key={i} className=\"flex min-w-0 items-center gap-2 text-xs text-muted-foreground\">\n {p.status === \"running\" ? <Spinner size=\"sm\" label=\"Working\" /> : <Icon name={p.status === \"failed\" ? \"warning\" : \"check\"} size={12} className=\"shrink-0\" />}\n <span className=\"min-w-0 truncate\">{p.label}</span>\n </p>\n ) : p.text?.trim() ? (\n <Prose key={i} text={p.text} />\n ) : null,\n )}\n {turn.writing ? <Prose text={`${turn.writing}▍`} /> : null}\n </div>\n );\n}\n\n/**\n * chat what useAgentPane() returns (required)\n * title the head's words (\"Ask about Pinewood\"); default \"Ask the agent\"\n * suggestions asks that fit the moment, shown before the first ask\n * empty one line before the first ask\n * placeholder the box's words\n * hint a quiet line under the box\n * yes a node drawn in the needs slot when the agent waits on a\n * yes the app can take (`chat.needs.in_app === \"press\"`):\n * the `approval` block, fed by useApproval(chat.request.id).\n * Without it that yes opens the desk\n * mark a node before the agent's turns (the app's mark), or none\n * onOpen ({ kind: \"app\", id } | { kind: \"file\", path, where, appRef })\n * the \"Open\" of something it made. Default: `chat.open`\n * (the desk opens it); with neither there is no Open\n * onClose a close in the head (a panel beside a record). Inside an\n * AgentDock it is the dock's own, unless this is given\n * recent past chats listed before the first ask (default 5; 0\n * draws none)\n * bare no head (inside a Sheet or a Card that has its own)\n * fill take the height of its container (default). false: a\n * compact pane whose thread scrolls inside a capped height\n * className layout around it. Never colour.\n */\nexport function AgentPane({\n chat,\n title = \"Ask the agent\",\n suggestions = [],\n empty,\n placeholder,\n hint,\n yes,\n mark,\n onOpen,\n onClose,\n recent = 5,\n bare = false,\n fill = true,\n className,\n}) {\n const view = chat?.view ?? null;\n const legacy = !view ? (chat?.turns ?? []) : [];\n const messages = view?.messages ?? [];\n const pending = chat?.pending && !messages.some((m) => m.role === \"user\" && m.text === chat.pending) && !legacy.some((t) => t.member === chat.pending) ? chat.pending : null;\n const needs = chat?.state === \"needs_you\" ? (chat.needs ?? { kind: \"other\", text: \"\" }) : null;\n const live = chat?.state === \"working\" || chat?.state === \"queued\" || Boolean(pending);\n const started = messages.length > 0 || legacy.length > 0 || Boolean(pending);\n const inMakersclaw = chat?.place === \"makersclaw\";\n const questions = view?.questions ?? [];\n const result = chat?.request?.status === \"done\" ? chat.request?.result?.sentence : null;\n // The thinking row: the turn runs and nothing visibly grows yet (the\n // platform says when, in the view); words just sent wait for their turn.\n const lastLegacy = legacy[legacy.length - 1];\n const starting = Boolean(pending) && !messages.some((m) => m.role === \"assistant\" && m.live);\n const thinking =\n !needs && !inMakersclaw && (pending ? true : view ? view.thinking : live && !(lastLegacy?.writing || lastLegacy?.parts?.length));\n\n const openThing = onOpen ?? (typeof chat?.open === \"function\" ? chat.open : undefined);\n const answerHere = needs?.in_app === \"answer\" && typeof chat?.answer === \"function\";\n const pressHere = needs?.in_app === \"press\" && yes != null && yes !== false;\n // A message during a question skips it and continues the same thread.\n // Approvals, account connections and credit limits keep their own gate.\n const blocked = (Boolean(needs) && needs.kind !== \"question\") || inMakersclaw;\n const closedWords = needs ? (answerHere ? \"Answer above first\" : pressHere ? \"Say yes above first\" : \"Answer on the desk first\") : \"This ask is in Makersclaw\";\n\n // What sits between the lines and the box: what waits on the member, or\n // that the agent works (its Stop is the box's, in the arrow's place), or\n // how the ask ended.\n const bar =\n needs && pressHere ? (\n <div className=\"max-h-[70%] shrink-0 overflow-y-auto border-t border-border p-2.5\">{yes}</div>\n ) : needs ? (\n <div className=\"max-h-[70%] shrink-0 overflow-y-auto border-t border-border p-2.5\">\n <div className=\"grid min-w-0 gap-2 rounded-[var(--radius)] border border-warning p-2.5\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <Icon name=\"warning\" size={16} className=\"mt-px shrink-0 text-warning\" />\n <div className=\"grid min-w-0 gap-0.5\">\n <span className=\"font-medium\">\n {answerHere && questions.length > 1 ? `${questions.length} questions for you` : needsTitle(needs.kind, answerHere ? \"answer\" : needs.in_app)}\n </span>\n {needs.text && !(answerHere && questions.length > 0) ? (\n <span className={cx(\"break-words text-muted-foreground\", !answerHere && \"line-clamp-3\")}>{needs.text}</span>\n ) : null}\n </div>\n </div>\n {answerHere && questions.length > 0 ? (\n <QuestionForm key={needs.at ?? \"q\"} questions={questions} onSubmit={(answers) => chat.answer({ answers })} />\n ) : answerHere ? (\n <QuestionBox key={needs.at ?? \"q\"} options={needs.options ?? []} free={needs.free} onAnswer={(payload) => chat.answer(payload)} />\n ) : (\n <Button size=\"sm\" variant=\"primary\" className=\"justify-self-start\" onClick={() => chat.openOnDesk?.()}>\n Open on the desk <Icon name=\"external\" size={12} />\n </Button>\n )}\n </div>\n </div>\n ) : live && !inMakersclaw ? (\n <div className=\"flex shrink-0 items-center gap-2 border-t border-border px-3.5 py-1.5 text-xs text-muted-foreground\">\n <Spinner size=\"sm\" label=\"Working\" />\n <span className=\"min-w-0 flex-1 truncate\">{STATE_LINE[chat?.state] ?? STATE_LINE.working}</span>\n </div>\n ) : result ? (\n <p className=\"flex shrink-0 items-start gap-2 border-t border-border px-3.5 py-1.5 text-xs text-muted-foreground\">\n <Icon name=\"circle-check\" size={14} className=\"mt-px shrink-0 text-success\" />\n <span className=\"min-w-0 break-words\">{result}</span>\n </p>\n ) : null;\n\n return (\n <ChatPane\n chat={chat}\n title={title}\n suggestions={suggestions}\n empty={empty}\n placeholder={placeholder}\n closedWords={closedWords}\n hint={hint}\n recent={recent}\n bare={bare}\n fill={fill}\n onClose={onClose}\n started={started || inMakersclaw}\n busy={live && !inMakersclaw}\n blocked={blocked}\n bar={bar}\n className={className}\n >\n {inMakersclaw ? (\n <Notice\n tone=\"info\"\n title=\"This ask is in Makersclaw\"\n action={\n <Button size=\"sm\" variant=\"secondary\" onClick={() => chat.openOnDesk?.()}>\n Open <Icon name=\"external\" size={12} />\n </Button>\n }\n >\n {chat.request?.title ?? \"It is followed there.\"}\n </Notice>\n ) : (\n <>\n {messages.map((m) => (\n <Message key={m.id} message={m} load={chat.callDetail} onOpen={openThing} onOpenRequest={chat.openRequest} mark={mark} />\n ))}\n {legacy.map((t) => (\n <LegacyTurn key={t.id} turn={t} />\n ))}\n {pending ? <MemberWords>{pending}</MemberWords> : null}\n {thinking ? (\n <div role=\"status\" className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner size=\"sm\" label=\"Thinking\" /> {starting ? \"Starting…\" : \"Thinking…\"}\n </div>\n ) : null}\n {!live && view?.failure ? (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n {view.failure.kind === \"stopped\" ? (\n <>\n <b>You stopped it.</b> <span className=\"text-muted-foreground\">Send a message to carry on.</span>\n </>\n ) : (\n <>\n <b>It stopped before finishing.</b> {view.failure.words} <span className=\"text-muted-foreground\">Send a message to carry on.</span>\n </>\n )}\n </p>\n ) : null}\n </>\n )}\n </ChatPane>\n );\n}\n"
|
|
30
|
+
"content": "\"use client\";\n\nimport { Button, Icon, Notice, Spinner, cx } from \"../../ui\";\nimport { ChatPane } from \"../chat-pane\";\nimport { QuestionBox } from \"../needs-you\";\nimport { Prose } from \"./prose\";\nimport { QuestionForm } from \"./questions\";\nimport { MemberWords, Message } from \"./transcript\";\n\n// AgentPane — the desk's agent sidebar, as the app's own pane (0.8.1, D27;\n// docs/AGENT-BLOCK-PLAN.md). The founder: \"the inapp component is not on\n// par with the desk agent sidebar, in terms of tool calls, questions,\n// showing information\". So this is the sidebar, drawn in the app's theme:\n// the member's words, the agent's text as it is written, the plan, the\n// work folded into \"Worked through N steps\" (each step opening to its\n// facts and what came back), helpers, several questions as one form, the\n// one ask's yes as the `approval` block's press, what it made, the past\n// chats and New chat, Stop.\n//\n// const chat = useAgentPane({ row: { kind: \"person\", id, name } });\n// <AgentPane chat={chat} title={`Ask about ${name}`} suggestions={[…]} />\n//\n// It draws the object useAgentPane() returns (lib/hooks.js) and decides\n// nothing: which lines there are and what they say is the platform's (the\n// same rules the sidebar runs), sent as data. It is the SAME conversation\n// the desk's sidebar shows: one session, two views. An app that places it\n// says so in its package (`\"agent_pane\": true` in the blueprint), and the\n// desk then draws no sidebar for the app's window.\n//\n// The frame around the lines (the head with New chat and Chats, the empty\n// state, the scroll, the desk's composer with + and the round send, a\n// starting line from the dock) is the `chat-pane` block (X5); this file is\n// what the AGENT puts in it: the lines above, and the bar of what waits.\n//\n// What waits on the member is settled here, where it was asked. The\n// agent's QUESTIONS are answered in place (`chat.answer`); its YES is the\n// `approval` block's press frame, handed in as `yes` — this pane never\n// draws an Approve of its own. A sign-in, money, or a tool approval says\n// so and opens the desk.\n\n/** Specific work or streamed words already tell the member what is moving. */\nfunction showsProgress(message) {\n if (message.role !== \"assistant\" || !message.live) return false;\n return (message.blocks ?? []).some((block) => {\n if (block.kind === \"text\") return block.streaming && Boolean(block.text?.trim());\n if (block.kind === \"plan\") return block.items?.some((item) => item.state === \"active\");\n if (block.kind !== \"work\") return false;\n return (block.runs ?? []).some((run) =>\n run.kind === \"fold\" ? run.summary?.running :\n run.kind === \"helpers\" ? run.calls?.some((call) => call.status === \"running\") :\n run.kind === \"thought\" ? run.streaming : run.status === \"running\",\n );\n });\n}\n\n/** What waits on the member, as the bar under the thread says it. */\nfunction needsTitle(kind, inApp) {\n if (kind === \"yes\" || kind === \"approval\") return inApp === \"press\" ? \"Waiting for your yes\" : \"Waiting for your yes on the desk\";\n if (kind === \"question\") return inApp === \"answer\" ? \"A question for you\" : \"Waiting for your answer on the desk\";\n if (kind === \"connect\") return \"Waiting for you to connect an account on the desk\";\n if (kind === \"limit\") return \"Paused for credits — see the desk\";\n return \"Needs you on the desk\";\n}\n\n/** A claw from before the sidebar's view sends only the small turns: the\n * member's words, the agent's text, one line per step. Drawn plainly. */\nfunction LegacyTurn({ turn }) {\n return (\n <div className=\"grid min-w-0 gap-2\">\n {turn.member ? <MemberWords>{turn.member}</MemberWords> : null}\n {(turn.parts ?? []).map((p, i) =>\n p.type === \"step\" ? (\n <p key={i} className=\"flex min-w-0 items-center gap-2 text-xs text-muted-foreground\">\n {p.status === \"running\" ? <Spinner size=\"sm\" label=\"Working\" /> : <Icon name={p.status === \"failed\" ? \"warning\" : \"check\"} size={12} className=\"shrink-0\" />}\n <span className=\"min-w-0 truncate\">{p.label}</span>\n </p>\n ) : p.text?.trim() ? (\n <Prose key={i} text={p.text} />\n ) : null,\n )}\n {turn.writing ? <Prose text={`${turn.writing}▍`} /> : null}\n </div>\n );\n}\n\n/**\n * chat what useAgentPane() returns (required)\n * title the head's words (\"Ask about Pinewood\"); default \"Ask the agent\"\n * suggestions asks that fit the moment, shown before the first ask\n * empty one line before the first ask\n * placeholder the box's words\n * hint a quiet line under the box\n * yes a node drawn in the needs slot when the agent waits on a\n * yes the app can take (`chat.needs.in_app === \"press\"`):\n * the `approval` block, fed by useApproval(chat.request.id).\n * Without it that yes opens the desk\n * mark a node before the agent's turns (the app's mark), or none\n * onOpen ({ kind: \"app\", id } | { kind: \"file\", path, where, appRef })\n * the \"Open\" of something it made. Default: `chat.open`\n * (the desk opens it); with neither there is no Open\n * onClose a close in the head (a panel beside a record). Inside an\n * AgentDock it is the dock's own, unless this is given\n * recent past chats listed before the first ask (default 5; 0\n * draws none)\n * bare no head (inside a Sheet or a Card that has its own)\n * fill take the height of its container (default). false: a\n * compact pane whose thread scrolls inside a capped height\n * className layout around it. Never colour.\n */\nexport function AgentPane({\n chat,\n title = \"Ask the agent\",\n suggestions = [],\n empty,\n placeholder,\n hint,\n yes,\n mark,\n onOpen,\n onClose,\n recent = 5,\n bare = false,\n fill = true,\n className,\n}) {\n const view = chat?.view ?? null;\n const legacy = !view ? (chat?.turns ?? []) : [];\n const messages = view?.messages ?? [];\n const pending = chat?.pending && !messages.some((m) => m.role === \"user\" && m.text === chat.pending) && !legacy.some((t) => t.member === chat.pending) ? chat.pending : null;\n const needs = chat?.state === \"needs_you\" ? (chat.needs ?? { kind: \"other\", text: \"\" }) : null;\n const live = chat?.state === \"working\" || chat?.state === \"queued\" || Boolean(pending);\n const started = messages.length > 0 || legacy.length > 0 || Boolean(pending);\n const inMakersclaw = chat?.place === \"makersclaw\";\n const questions = view?.questions ?? [];\n const result = chat?.request?.status === \"done\" ? chat.request?.result?.sentence : null;\n // One generic progress row, only while nothing specific visibly moves.\n // Pending words are a send, not proof that a worker is starting.\n const lastLegacy = legacy[legacy.length - 1];\n const visibleProgress = !pending && (view ? messages.some(showsProgress) : Boolean(lastLegacy?.writing || lastLegacy?.parts?.some((part) => part.type === \"step\" && part.status === \"running\")));\n const queued = chat?.state === \"queued\";\n const thinking =\n live && !needs && !inMakersclaw && (queued || !visibleProgress);\n\n const openThing = onOpen ?? (typeof chat?.open === \"function\" ? chat.open : undefined);\n const answerHere = needs?.in_app === \"answer\" && typeof chat?.answer === \"function\";\n const pressHere = needs?.in_app === \"press\" && yes != null && yes !== false;\n // A message during a question skips it and continues the same thread.\n // Approvals, account connections and credit limits keep their own gate.\n const blocked = (Boolean(needs) && needs.kind !== \"question\") || inMakersclaw;\n const closedWords = needs ? (answerHere ? \"Answer above first\" : pressHere ? \"Say yes above first\" : \"Answer on the desk first\") : \"This ask is in Makersclaw\";\n\n // What sits between the lines and the box: what waits on the member, or\n // how the ask ended. Progress is in the transcript; Stop is the box's.\n const bar =\n needs && pressHere ? (\n <div className=\"max-h-[70%] shrink-0 overflow-y-auto border-t border-border p-2.5\">{yes}</div>\n ) : needs ? (\n <div className=\"max-h-[70%] shrink-0 overflow-y-auto border-t border-border p-2.5\">\n <div className=\"grid min-w-0 gap-2 rounded-[var(--radius)] border border-warning p-2.5\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <Icon name=\"warning\" size={16} className=\"mt-px shrink-0 text-warning\" />\n <div className=\"grid min-w-0 gap-0.5\">\n <span className=\"font-medium\">\n {answerHere && questions.length > 1 ? `${questions.length} questions for you` : needsTitle(needs.kind, answerHere ? \"answer\" : needs.in_app)}\n </span>\n {needs.text && !(answerHere && questions.length > 0) ? (\n <span className={cx(\"break-words text-muted-foreground\", !answerHere && \"line-clamp-3\")}>{needs.text}</span>\n ) : null}\n </div>\n </div>\n {answerHere && questions.length > 0 ? (\n <QuestionForm key={needs.at ?? \"q\"} questions={questions} onSubmit={(answers) => chat.answer({ answers })} />\n ) : answerHere ? (\n <QuestionBox key={needs.at ?? \"q\"} options={needs.options ?? []} free={needs.free} onAnswer={(payload) => chat.answer(payload)} />\n ) : (\n <Button size=\"sm\" variant=\"primary\" className=\"justify-self-start\" onClick={() => chat.openOnDesk?.()}>\n Open on the desk <Icon name=\"external\" size={12} />\n </Button>\n )}\n </div>\n </div>\n ) : !live && result ? (\n <p className=\"flex shrink-0 items-start gap-2 border-t border-border px-3.5 py-1.5 text-xs text-muted-foreground\">\n <Icon name=\"circle-check\" size={14} className=\"mt-px shrink-0 text-success\" />\n <span className=\"min-w-0 break-words\">{result}</span>\n </p>\n ) : null;\n\n return (\n <ChatPane\n chat={chat}\n title={title}\n suggestions={suggestions}\n empty={empty}\n placeholder={placeholder}\n closedWords={closedWords}\n hint={hint}\n recent={recent}\n bare={bare}\n fill={fill}\n onClose={onClose}\n started={started || inMakersclaw}\n busy={live && !inMakersclaw}\n blocked={blocked}\n bar={bar}\n className={className}\n >\n {inMakersclaw ? (\n <Notice\n tone=\"info\"\n title=\"This ask is in Makersclaw\"\n action={\n <Button size=\"sm\" variant=\"secondary\" onClick={() => chat.openOnDesk?.()}>\n Open <Icon name=\"external\" size={12} />\n </Button>\n }\n >\n {chat.request?.title ?? \"It is followed there.\"}\n </Notice>\n ) : (\n <>\n {messages.map((m) => (\n <Message key={m.id} message={m} load={chat.callDetail} onOpen={openThing} onOpenRequest={chat.openRequest} mark={mark} />\n ))}\n {legacy.map((t) => (\n <LegacyTurn key={t.id} turn={t} />\n ))}\n {pending ? <MemberWords>{pending}</MemberWords> : null}\n {thinking ? (\n <div role=\"status\" aria-label=\"Agent progress\" className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Spinner size=\"sm\" label={queued ? \"Queued\" : \"Thinking\"} /> {queued ? \"Queued — it starts when the one before it ends\" : \"Thinking…\"}\n </div>\n ) : null}\n {!live && view?.failure ? (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n {view.failure.kind === \"stopped\" ? (\n <>\n <b>You stopped it.</b> <span className=\"text-muted-foreground\">Send a message to carry on.</span>\n </>\n ) : (\n <>\n <b>It stopped before finishing.</b> {view.failure.words} <span className=\"text-muted-foreground\">Send a message to carry on.</span>\n </>\n )}\n </p>\n ) : null}\n </>\n )}\n </ChatPane>\n );\n}\n"
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
"path": "registry/blocks/agent-pane/transcript.jsx",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"path": "registry/blocks/agent-pane/README.md",
|
|
64
64
|
"type": "registry:file",
|
|
65
65
|
"target": "@components/makersclaw/blocks/agent-pane/README.md",
|
|
66
|
-
"content": "# AgentPane\n\nThe desk's agent sidebar, as the app's own pane, in the app's theme (0.8.1,\nD27). It replaces `agent-chat`: the founder found that chat \"not on par\nwith the desk agent sidebar, in terms of tool calls, questions, showing\ninformation\", so this is the sidebar, not a smaller chat.\n\nIt shows what the sidebar shows:\n\n- the member's words, and the agent's text as it is written;\n- the **plan**, a checklist that ticks as the agent works;\n- the **work**, folded: the steps between two things the agent said are one\n line, \"Worked through 26 steps\" (or the step running now, with a\n spinner); open it for one line per step, each with a mono tag, what it\n did in words, and a word for how it ended. **Open a step** for its facts,\n the command or statement worth reading, what came back, and why it\n failed;\n- reads folded (\"Read 6 files\"), retries a later call fixed (\"Fixed 2\n issues on the way\"), the same line again (\"Checked on the build · 5\n times\"), a failure nothing fixed with its few plain words, and a card of\n **helpers** started side by side;\n- the agent's **questions** as one form: several at once, options as\n chips, a box for the member's own words, one submit; an answered one\n shrinks to a line;\n- the one ask's **yes** as the `approval` block's press frame (`yes`);\n- what it **made**: an app, files, addresses;\n- the **past chats** (a dot on those that need you or work), New chat,\n Stop (\"Stopping…\" after the press), \"You stopped it\", \"It stopped before\n finishing\" in plain words, jump to latest.\n\nIt is the same conversation the desk's sidebar shows: one session, two\nviews. The lines and what they say are decided by the platform, with the\nrules the sidebar runs, and sent as data; this block draws them and nothing\nelse. So a new tool the platform learns to describe reads right in every\napp at once, with no change here.\n\n```jsx\nimport { AgentPane } from \"../components/blocks/agent-pane\"; // a Makersclaw app (\"./blocks/agent-pane\" from components/)\nimport { AgentPane } from \"@/components/makersclaw/blocks/agent-pane\"; // a shadcn project\n```\n\nA client component. It draws the object `useAgentPane()` returns\n(lib/hooks.js); asking stays with the hook. The Example is at the end.\n\n## The frame is `chat-pane`\n\nThe head (title, New chat, Chats, close), the empty state, the scroll, the\nmessage box and a starting line from the dock are the `chat-pane` block\n(X5): the desk's chat pane, ported. This block is what the **agent** puts in\nit: the lines (plan, folded work, questions, what it made) and the bar of what\nwaits on the member. `AgentPane` is `ChatPane` with those inside, so every\napp that draws `AgentPane` has the desk's message box: the words on top, + to\nattach and a round send under them, the microphone beside it, a round stop in\nthe send's place while a turn runs.\n\n## Follow-ups are the same conversation\n\nA message after a Stop, a finished ask or a failed turn goes on in the\nsame session and the same request (D29): the platform opens the closed\nrequest again, so there is no second card and nothing jumps. The pane\nsends every message with the thread's session (`useAgentPane` never starts\na fresh one for it) and says \"Ask a follow-up…\" once a thread exists.\nOnly a plan or a piece of one, a change the agent sent up, a counted job\nand a hand-off that never started get a new request; for those\n`chat.sameConversation` is false and the box keeps the app's own words.\n\n## Questions keep the conversation open\n\nWhile a question waits, the main composer stays available. Sending there\nskips that question and continues the same thread, including attachments.\nAnswering the question removes it immediately while the answer is sent; a\nfailed submission restores it for retry. Stale thread reads cannot bring an\naccepted question back, but a new question still appears. Approval, account\nconnection and credit-limit gates keep their existing controls.\n\n## Tell the desk\n\nAn app that places this block says so in its package: `\"agent_pane\": true`\nin `store.json`'s `seeds.blueprint` (a built app: in its blueprint). The\ndesk then draws no agent sidebar for the app's window: no column, no Agent\ntab. The pane is the conversation. Without the flag the desk keeps its\nsidebar, and the member sees two agent panes.\n\n## What the app controls\n\n- **Where it sits**: in the app's `agent-dock` (a column beside the work, the\n desk's own shape; one per app, in the shell). Inside a dock the head's close\n folds the column with no `onClose` from you. A compact card in a column of\n its own is also fine (`fill={false}`). Do not put the shell's agent in a\n modal `Sheet` that dims the work: that is what the dock replaced. `bare`\n drops the head.\n- **What it is about**: `useAgentPane({ row })`. `row` is the record on\n screen (`{ kind, id, name }`); it rides with every ask as context and the\n thread is kept for that record. `how` is one sentence for the agent only.\n The ask is `chat.send(text)`, so an Ask button, an ask bar or a chip all\n start or continue the same conversation.\n- **Its first line**: a button that says the agent will do the work calls\n `openAgent(\"Draft a project plan for me\")` (blocks/agent-dock). The pane\n inside the dock sends that line in a new chat and the agent asks only for\n what it is missing; no form first (X9).\n- **Its words**: `title`, `empty`, `suggestions`, `placeholder`, `hint`.\n- **Nothing else.** No colour props: the app's theme paints it.\n\n## Props\n\n- `chat` — what `useAgentPane()` returns. Required.\n- `title` — the head's words, and the box's label. Default `\"Ask the\n agent\"`. About a record: `\"Ask about Pinewood\"`.\n- `suggestions` — asks that fit the moment, as chips before the first ask.\n- `empty` — one line before the first ask. Say what the agent can do here,\n in the app's words.\n- `placeholder` — the box's words. Default `\"Ask anything…\"`.\n- `hint` — a quiet line under the box.\n- `yes` — a node drawn in place of the bar when the agent waits on a yes\n the app can take (`chat.needs.in_app === \"press\"`): the `approval` block,\n fed by `useApproval(chat.request.id)`. Hook it only for that need:\n `useApproval(chat.needs?.in_app === \"press\" ? chat.request?.id : null)`.\n- `mark` — a node before the agent's turns (the app's mark). Default none.\n- `onOpen` — `({ kind: \"app\", id } | { kind: \"file\", path, where, appRef })`:\n the Open of something it made. Default: `chat.open` (the desk opens it).\n- `onClose` — a close in the head. Inside an `agent-dock` it is the dock's\n own (the column folds) unless you give one.\n- `recent` — how many past chats the empty state lists before the first ask,\n with an \"All N chats\" link past that. Default `5`; `0` lists none. With no\n chats yet it says \"No chats yet. Your first message starts one.\" The head\n always has New chat and Chats.\n- `bare` — no head, inside a `Sheet` or a `Card` that has its own.\n- `fill` — default `true`: the pane takes its container's height and the\n thread scrolls inside it. `false`: a compact pane for a card in a column;\n once a thread starts it scrolls inside a capped height.\n- `className` — layout around it. Never colour.\n\n## useAgentPane (lib/hooks.js)\n\n```js\nconst chat = useAgentPane({ row, how, job, key });\n```\n\nIt is `useAgentThread` with the sidebar's view, plus the Chats list and a\nstep's detail. It returns everything `useAgentThread` returns (`sessionId`,\n`state`, `needs`, `pending`, `place`, `request`, `sending`, `loading`,\n`error`, `unavailable`, `send`, `stop`, `answer`, `openOnDesk`, `newChat`,\n`reload`), and:\n\n- `view` — `{ messages, thinking, failure, questions }`: the thread as the\n sidebar draws it. A claw from before the view sends none; the pane then\n draws the small turns plainly.\n- `chats` — `{ items: [{ sessionId, title, mark, at }], loading, error,\n unavailable }`, the member's own threads in this app.\n- `openSession(sessionId)` — switch to one of them.\n- `callDetail(callId)` — one step, opened: `{ facts, code, result, reason,\n said }`, asked when a member opens a step, never carried with the line.\n- `answer({ answers: [{ requestId, optionId | text }] })` — every question\n the view lists, as one resume.\n- `openRequest(requestId)` — \"Open in Makersclaw\" under a change the agent\n sent up.\n\nIt reads `GET _claw/threads/<session>?view=1` and `GET _claw/threads` (lib/\nplatform.js `thread`, `threads`), the member's own threads in this app,\nnever a teammate's, and streams a working thread (`streamThread`). It looks\nevery 1.5 s while the agent works and no stream is alive, every 6 s while\nit waits on the member, and not at all once the turn has ended or the page\nis hidden. No tool's input or output is ever sent; a step's detail is\na bounded digest.\n\n## The composer, the stream, the press, Open\n\n- **Files.** The + in the box, paste and drop attach up to 4 files and 3 MB\n together; they go with the words (`chat.send(text, { files })`, `ask({\n files })`) as the desk's attachments. A message that is queued behind\n another goes without them, and `chat.notice` says so.\n- **Voice.** A microphone button dictates into the box with the browser's\n speech recognition; it is not drawn where the browser has none.\n- **Stop.** While a turn runs and the box is empty, a round stop takes the\n send arrow's place (a message typed then waits its turn: the arrow comes\n back). \"Stopping…\" after the press.\n- **Live.** A working thread is streamed (`GET _claw/threads/<session>/\n stream`): text and steps appear as they are written. The poll looks\n rarely while the stream is alive and takes over if it ends or the claw\n has none.\n- **The yes, for a tool too.** `yes` is drawn whenever `chat.needs.in_app`\n is `\"press\"`: the one ask's yes, or one parked tool call (the card says\n what it will do and shows its command). Several calls parked together\n stay on the desk.\n- **Open.** Under an app or a file it made, Open asks the desk to open it\n (`chat.open`); `onOpen` overrides.\n\n## Outside Makersclaw\n\nAny object of the same shape works: `view` (`messages` of `{ id, role:\n\"user\", text, files }` or `{ id, role: \"assistant\", live, blocks }`), the\nfields above, and the functions.\n\n## Example\n\nA pane about the person a screen has open, beside the record.\n\n```jsx\n\"use client\";\nimport { useAgentPane } from \"../lib/hooks\";\nimport { AgentPane } from \"../components/blocks/agent-pane\";\n\nexport default function PersonAsk({ person }) {\n const chat = useAgentPane({ row: { kind: \"person\", id: person.id, name: person.name } });\n return (\n <AgentPane\n chat={chat}\n title={`Ask about ${person.name}`}\n suggestions={[\"What did we last talk about?\", \"Draft a follow-up\"]}\n />\n );\n}\n```\n\nWith the yes pressed in the approval card above the box:\n\n```jsx\n\"use client\";\nimport { useAgentPane, useApproval } from \"../lib/hooks\";\nimport { AgentPane } from \"../components/blocks/agent-pane\";\nimport { Approval } from \"../components/blocks/approval\";\n\nexport default function Ask() {\n const chat = useAgentPane();\n // Only for the one ask's yes; useApproval(null) asks nothing.\n const approval = useApproval(chat.needs?.in_app === \"press\" ? chat.request?.id : null);\n return (\n <AgentPane\n chat={chat}\n yes={<Approval approval={approval} title=\"Waiting for your yes\" onOpenDesk={chat.openOnDesk} />}\n />\n );\n}\n```\n"
|
|
66
|
+
"content": "# AgentPane\n\nThe desk's agent sidebar, as the app's own pane, in the app's theme (0.8.1,\nD27). It replaces `agent-chat`: the founder found that chat \"not on par\nwith the desk agent sidebar, in terms of tool calls, questions, showing\ninformation\", so this is the sidebar, not a smaller chat.\n\nIt shows what the sidebar shows:\n\n- the member's words, and the agent's text as it is written;\n- the **plan**, a checklist that ticks as the agent works;\n- the **work**, folded: the steps between two things the agent said are one\n line, \"Worked through 26 steps\" (or the step running now, with a\n spinner); open it for one line per step, each with a mono tag, what it\n did in words, and a word for how it ended. **Open a step** for its facts,\n the command or statement worth reading, what came back, and why it\n failed;\n- reads folded (\"Read 6 files\"), retries a later call fixed (\"Fixed 2\n issues on the way\"), the same line again (\"Checked on the build · 5\n times\"), a failure nothing fixed with its few plain words, and a card of\n **helpers** started side by side;\n- the agent's **questions** as one form: several at once, options as\n chips, a box for the member's own words, one submit; an answered one\n shrinks to a line;\n- the one ask's **yes** as the `approval` block's press frame (`yes`);\n- what it **made**: an app, files, addresses;\n- the **past chats** (a dot on those that need you or work), New chat,\n Stop (\"Stopping…\" after the press), \"You stopped it\", \"It stopped before\n finishing\" in plain words, jump to latest.\n\nIt is the same conversation the desk's sidebar shows: one session, two\nviews. The lines and what they say are decided by the platform, with the\nrules the sidebar runs, and sent as data; this block draws them and nothing\nelse. So a new tool the platform learns to describe reads right in every\napp at once, with no change here.\n\n```jsx\nimport { AgentPane } from \"../components/blocks/agent-pane\"; // a Makersclaw app (\"./blocks/agent-pane\" from components/)\nimport { AgentPane } from \"@/components/makersclaw/blocks/agent-pane\"; // a shadcn project\n```\n\nA client component. It draws the object `useAgentPane()` returns\n(lib/hooks.js); asking stays with the hook. The Example is at the end.\n\n## The frame is `chat-pane`\n\nThe head (title, New chat, Chats, close), the empty state, the scroll, the\nmessage box and a starting line from the dock are the `chat-pane` block\n(X5): the desk's chat pane, ported. This block is what the **agent** puts in\nit: the lines (plan, folded work, questions, what it made) and the bar of what\nwaits on the member. `AgentPane` is `ChatPane` with those inside, so every\napp that draws `AgentPane` has the desk's message box: the words on top, + to\nattach and a round send under them, the microphone beside it, a round stop in\nthe send's place while a turn runs.\n\n## Follow-ups are the same conversation\n\nA message after a Stop, a finished ask or a failed turn goes on in the\nsame session and the same request (D29): the platform opens the closed\nrequest again, so there is no second card and nothing jumps. The pane\nsends every message with the thread's session (`useAgentPane` never starts\na fresh one for it) and says \"Ask a follow-up…\" once a thread exists.\nOnly a plan or a piece of one, a change the agent sent up, a counted job\nand a hand-off that never started get a new request; for those\n`chat.sameConversation` is false and the box keeps the app's own words.\n\n## Progress feedback\n\nThe transcript owns progress feedback: one “Thinking…” line while no live\ntext or specific tool work is moving, or an explicit queued line while the\nask waits. A pending follow-up is never labelled “Starting…”. The composer\nkeeps Stop available while the turn runs; there is no second working footer.\n\n## Questions keep the conversation open\n\nWhile a question waits, the main composer stays available. Sending there\nskips that question and continues the same thread, including attachments.\nAnswering the question removes it immediately while the answer is sent; a\nfailed submission restores it for retry. Stale thread reads cannot bring an\naccepted question back, but a new question still appears. Approval, account\nconnection and credit-limit gates keep their existing controls.\n\n## Tell the desk\n\nAn app that places this block says so in its package: `\"agent_pane\": true`\nin `store.json`'s `seeds.blueprint` (a built app: in its blueprint). The\ndesk then draws no agent sidebar for the app's window: no column, no Agent\ntab. The pane is the conversation. Without the flag the desk keeps its\nsidebar, and the member sees two agent panes.\n\n## What the app controls\n\n- **Where it sits**: in the app's `agent-dock` (a column beside the work, the\n desk's own shape; one per app, in the shell). Inside a dock the head's close\n folds the column with no `onClose` from you. A compact card in a column of\n its own is also fine (`fill={false}`). Do not put the shell's agent in a\n modal `Sheet` that dims the work: that is what the dock replaced. `bare`\n drops the head.\n- **What it is about**: `useAgentPane({ row })`. `row` is the record on\n screen (`{ kind, id, name }`); it rides with every ask as context and the\n thread is kept for that record. `how` is one sentence for the agent only.\n The ask is `chat.send(text)`, so an Ask button, an ask bar or a chip all\n start or continue the same conversation.\n- **Its first line**: a button that says the agent will do the work calls\n `openAgent(\"Draft a project plan for me\")` (blocks/agent-dock). The pane\n inside the dock sends that line in a new chat and the agent asks only for\n what it is missing; no form first (X9).\n- **Its words**: `title`, `empty`, `suggestions`, `placeholder`, `hint`.\n- **Nothing else.** No colour props: the app's theme paints it.\n\n## Props\n\n- `chat` — what `useAgentPane()` returns. Required.\n- `title` — the head's words, and the box's label. Default `\"Ask the\n agent\"`. About a record: `\"Ask about Pinewood\"`.\n- `suggestions` — asks that fit the moment, as chips before the first ask.\n- `empty` — one line before the first ask. Say what the agent can do here,\n in the app's words.\n- `placeholder` — the box's words. Default `\"Ask anything…\"`.\n- `hint` — a quiet line under the box.\n- `yes` — a node drawn in place of the bar when the agent waits on a yes\n the app can take (`chat.needs.in_app === \"press\"`): the `approval` block,\n fed by `useApproval(chat.request.id)`. Hook it only for that need:\n `useApproval(chat.needs?.in_app === \"press\" ? chat.request?.id : null)`.\n- `mark` — a node before the agent's turns (the app's mark). Default none.\n- `onOpen` — `({ kind: \"app\", id } | { kind: \"file\", path, where, appRef })`:\n the Open of something it made. Default: `chat.open` (the desk opens it).\n- `onClose` — a close in the head. Inside an `agent-dock` it is the dock's\n own (the column folds) unless you give one.\n- `recent` — how many past chats the empty state lists before the first ask,\n with an \"All N chats\" link past that. Default `5`; `0` lists none. With no\n chats yet it says \"No chats yet. Your first message starts one.\" The head\n always has New chat and Chats.\n- `bare` — no head, inside a `Sheet` or a `Card` that has its own.\n- `fill` — default `true`: the pane takes its container's height and the\n thread scrolls inside it. `false`: a compact pane for a card in a column;\n once a thread starts it scrolls inside a capped height.\n- `className` — layout around it. Never colour.\n\n## useAgentPane (lib/hooks.js)\n\n```js\nconst chat = useAgentPane({ row, how, job, key });\n```\n\nIt is `useAgentThread` with the sidebar's view, plus the Chats list and a\nstep's detail. It returns everything `useAgentThread` returns (`sessionId`,\n`state`, `needs`, `pending`, `place`, `request`, `sending`, `loading`,\n`error`, `unavailable`, `send`, `stop`, `answer`, `openOnDesk`, `newChat`,\n`reload`), and:\n\n- `view` — `{ messages, thinking, failure, questions }`: the thread as the\n sidebar draws it. A claw from before the view sends none; the pane then\n draws the small turns plainly.\n- `chats` — `{ items: [{ sessionId, title, mark, at }], loading, error,\n unavailable }`, the member's own threads in this app.\n- `openSession(sessionId)` — switch to one of them.\n- `callDetail(callId)` — one step, opened: `{ facts, code, result, reason,\n said }`, asked when a member opens a step, never carried with the line.\n- `answer({ answers: [{ requestId, optionId | text }] })` — every question\n the view lists, as one resume.\n- `openRequest(requestId)` — \"Open in Makersclaw\" under a change the agent\n sent up.\n\nIt reads `GET _claw/threads/<session>?view=1` and `GET _claw/threads` (lib/\nplatform.js `thread`, `threads`), the member's own threads in this app,\nnever a teammate's, and streams a working thread (`streamThread`). It looks\nevery 1.5 s while the agent works and no stream is alive, every 6 s while\nit waits on the member, and not at all once the turn has ended or the page\nis hidden. No tool's input or output is ever sent; a step's detail is\na bounded digest.\n\n## The composer, the stream, the press, Open\n\n- **Files.** The + in the box, paste and drop attach up to 4 files and 3 MB\n together; they go with the words (`chat.send(text, { files })`, `ask({\n files })`) as the desk's attachments. A message that is queued behind\n another goes without them, and `chat.notice` says so.\n- **Voice.** A microphone button dictates into the box with the browser's\n speech recognition; it is not drawn where the browser has none.\n- **Stop.** While a turn runs and the box is empty, a round stop takes the\n send arrow's place (a message typed then waits its turn: the arrow comes\n back). \"Stopping…\" after the press.\n- **Live.** A working thread is streamed (`GET _claw/threads/<session>/\n stream`): text and steps appear as they are written. The poll looks\n rarely while the stream is alive and takes over if it ends or the claw\n has none.\n- **The yes, for a tool too.** `yes` is drawn whenever `chat.needs.in_app`\n is `\"press\"`: the one ask's yes, or one parked tool call (the card says\n what it will do and shows its command). Several calls parked together\n stay on the desk.\n- **Open.** Under an app or a file it made, Open asks the desk to open it\n (`chat.open`); `onOpen` overrides.\n\n## Outside Makersclaw\n\nAny object of the same shape works: `view` (`messages` of `{ id, role:\n\"user\", text, files }` or `{ id, role: \"assistant\", live, blocks }`), the\nfields above, and the functions.\n\n## Example\n\nA pane about the person a screen has open, beside the record.\n\n```jsx\n\"use client\";\nimport { useAgentPane } from \"../lib/hooks\";\nimport { AgentPane } from \"../components/blocks/agent-pane\";\n\nexport default function PersonAsk({ person }) {\n const chat = useAgentPane({ row: { kind: \"person\", id: person.id, name: person.name } });\n return (\n <AgentPane\n chat={chat}\n title={`Ask about ${person.name}`}\n suggestions={[\"What did we last talk about?\", \"Draft a follow-up\"]}\n />\n );\n}\n```\n\nWith the yes pressed in the approval card above the box:\n\n```jsx\n\"use client\";\nimport { useAgentPane, useApproval } from \"../lib/hooks\";\nimport { AgentPane } from \"../components/blocks/agent-pane\";\nimport { Approval } from \"../components/blocks/approval\";\n\nexport default function Ask() {\n const chat = useAgentPane();\n // Only for the one ask's yes; useApproval(null) asks nothing.\n const approval = useApproval(chat.needs?.in_app === \"press\" ? chat.request?.id : null);\n return (\n <AgentPane\n chat={chat}\n yes={<Approval approval={approval} title=\"Waiting for your yes\" onOpenDesk={chat.openOnDesk} />}\n />\n );\n}\n```\n"
|
|
67
67
|
}
|
|
68
68
|
],
|
|
69
69
|
"categories": [
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"docs": "Installed to components/makersclaw/blocks/agent-pane. Import: import { AgentPane, AgentDockContext } from \"@/components/makersclaw/blocks/agent-pane\". Props and an example: components/makersclaw/blocks/agent-pane/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
87
87
|
"meta": {
|
|
88
88
|
"makersclaw": {
|
|
89
|
-
"version": "0.8.
|
|
89
|
+
"version": "0.8.3",
|
|
90
90
|
"useWhen": "The app should hold its conversation with its agent at the level of the desk's sidebar: an Ask panel beside a record, a sheet behind an Ask button, an inspector on a home screen. It replaces agent-chat. Place it and set \"agent_pane\": true in the package's blueprint, so the desk draws no sidebar for the app's window. For work the founder commissions from a verb and watches land, use job-panel."
|
|
91
91
|
}
|
|
92
92
|
}
|
package/r/ai-action.json
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
"title": "AiAction",
|
|
6
6
|
"description": "One model call on what the screen holds — Summarize, Shorter, Explain this score, Why did it move — with its price on the button before the press (\"Shorter · 1 cr\"), a running state, the answer in place (its text, or your render of a schema's data) with Use, Copy and Again, the refusal's own words when it fails, and a quiet \"not connected yet\" on a claw without the door. It draws what useLlmAction() returns (lib/hooks.js) and wears the dashed one-call mark, never the agent's diamond.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
10
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/agent-marks.json",
|
|
10
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/cost.json"
|
|
11
11
|
],
|
|
12
12
|
"dependencies": [],
|
|
13
13
|
"files": [
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"docs": "Installed to components/makersclaw/blocks/ai-action. Import: import { AiAction, priceWords } from \"@/components/makersclaw/blocks/ai-action\". Props and an example: components/makersclaw/blocks/ai-action/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
50
50
|
"meta": {
|
|
51
51
|
"makersclaw": {
|
|
52
|
-
"version": "0.8.
|
|
52
|
+
"version": "0.8.3",
|
|
53
53
|
"useWhen": "A screen wants a quick model answer about something it already shows, with no conversation and no tools: shorten a draft, summarize a thread, explain a score, say why a number moved, suggest a subject line. For work that reads, searches or writes records, ask the agent (ask-bar, agent-chat)."
|
|
54
54
|
}
|
|
55
55
|
}
|
package/r/annotate.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"title": "Annotate",
|
|
6
6
|
"description": "Mark up a screenshot: drop, pick or paste one, then draw arrows, boxes, highlights, redaction bars and numbered notes on it (Excalidraw underneath, via sketch-canvas). A side list holds the words of each numbered note; a click on a note's number shows its pin. Starter templates (bug report, design review, walkthrough) on a fresh screenshot. The annotation is plain JSON saved through onChange / an async onSave; onSubmit hands over a PNG of the marked-up screenshot with the notes and the sketch.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/sketch-canvas.json"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": [],
|
|
12
12
|
"files": [
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"docs": "Installed to components/makersclaw/blocks/annotate. Import: import { Annotate, ANNOTATE_TOOLS, ANNOTATE_TEMPLATES, emptyAnnotation, toAnnotation, annotationNotes, annotationToText, noteMarkers, nextNoteNumber, markerSkeleton } from \"@/components/makersclaw/blocks/annotate\". Props and an example: components/makersclaw/blocks/annotate/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
56
56
|
"meta": {
|
|
57
57
|
"makersclaw": {
|
|
58
|
-
"version": "0.8.
|
|
58
|
+
"version": "0.8.3",
|
|
59
59
|
"useWhen": "Someone needs to point at parts of a screen and say something about each: a bug report, design feedback, a support question, a walkthrough, a request to an agent about what to change. Not a blank drawing board (whiteboard or sketch-canvas), not a wireframe (sketch-to-app), not an image upload alone (file-upload)."
|
|
60
60
|
}
|
|
61
61
|
}
|
package/r/approval-request.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "ApprovalRequest",
|
|
6
6
|
"description": "One request waiting on a decision: what is asked for as label/value facts (an amount in large type), who asked and when, why, a status badge, and Approve / Reject (reject asks for a reason). The decision goes out through async onApprove / onReject; the block shows it working, a failure, then the outcome in place of the buttons. A card alone, or a page of detail sections beside the card.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"docs": "Installed to components/makersclaw/blocks/approval-request. Import: import { ApprovalRequest } from \"@/components/makersclaw/blocks/approval-request\". Props and an example: components/makersclaw/blocks/approval-request/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
46
46
|
"meta": {
|
|
47
47
|
"makersclaw": {
|
|
48
|
-
"version": "0.8.
|
|
48
|
+
"version": "0.8.3",
|
|
49
49
|
"useWhen": "Someone must say yes or no to one thing another person asked for: a purchase, a refund, time off, a discount, an access request, a published post. Not for a queue of many requests (a data-table with row actions) or a yes/no about the founder's own action (kit Confirm)."
|
|
50
50
|
}
|
|
51
51
|
}
|
package/r/approval.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"title": "Approval",
|
|
6
6
|
"description": "The yes, given in the app. The app draws the card in its own theme — what will happen, to whom, the exact words, the cost — and under it sits the press: a small Makersclaw-origin frame, in the app's colours, that app code cannot script. It shows the server's own words for the request (the agent's question, who, from which account, the first message, the rule \"Always allow this kind\" would save) and only counts a press a person made on a card they can see. Fed by useApproval(requestId) (lib/hooks.js). If the frame cannot load or the member must sign in again, the card falls back to WaitingYes: \"Waiting for your yes on the desk\".",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/needs-you.json"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": [],
|
|
12
12
|
"files": [
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"docs": "Installed to components/makersclaw/blocks/approval. Import: import { Approval } from \"@/components/makersclaw/blocks/approval\". Props and an example: components/makersclaw/blocks/approval/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
48
48
|
"meta": {
|
|
49
49
|
"makersclaw": {
|
|
50
|
-
"version": "0.8.
|
|
50
|
+
"version": "0.8.3",
|
|
51
51
|
"useWhen": "Anywhere the agent is about to do something public or paid and waits for the member's yes — a send, a post, a purchase: put the app's own card (the draft, the recipients, the cost) inside it, give it useApproval(item.id) for the request that waits, and the member says yes without leaving the app. For the queue of everything that waits use needs-you; for the conversation, agent-chat."
|
|
52
52
|
}
|
|
53
53
|
}
|
package/r/ask-bar.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "AskBar",
|
|
6
6
|
"description": "One line to ask the app's agent, with chips that fit the moment (they wrap, never run off). After a send it says where the ask stands in one line — \"Working…\", \"Waiting for you on the desk\", \"Answered\" — with an Open that shows the conversation wherever the screen keeps it. It draws what useAgentThread() returns (lib/hooks.js) and sends through it, or calls your own onAsk(text). Never an Approve: a yes is given on the desk.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"docs": "Installed to components/makersclaw/blocks/ask-bar. Import: import { AskBar } from \"@/components/makersclaw/blocks/ask-bar\". Props and an example: components/makersclaw/blocks/ask-bar/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
44
44
|
"meta": {
|
|
45
45
|
"makersclaw": {
|
|
46
|
-
"version": "0.8.
|
|
46
|
+
"version": "0.8.3",
|
|
47
47
|
"useWhen": "A home screen, a list's head or a record's timeline should take an ask in one line and keep the page in view: CRM's Today, the Ask box under a record. Pair it with agent-chat (in a Sheet or the inspector) for the conversation it opens. For the full chat in place, use agent-chat alone."
|
|
48
48
|
}
|
|
49
49
|
}
|
package/r/audio-player.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "AudioPlayer",
|
|
6
6
|
"description": "A waveform audio player (wavesurfer.js) in the workspace theme: play, skip back and forward, speed, mute; regions (spans of the audio in a theme tone, labelled in a lane under the waveform, click to play one) and markers (pins at moments, click to jump); a hover time readout; drag across the waveform to mark a new region; add a marker at the playhead; keyboard like a video player (K, J, L, M, arrows). Time events and a handle (seek, play a range) for syncing a transcript.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [
|
|
11
11
|
"wavesurfer.js@8.0.0",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"docs": "Installed to components/makersclaw/blocks/audio-player. Import: import { AudioPlayer, useAudioPlayer, formatTime, formatRange, spokenTime, regionAt, TONES, RATES } from \"@/components/makersclaw/blocks/audio-player\". Props and an example: components/makersclaw/blocks/audio-player/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
68
68
|
"meta": {
|
|
69
69
|
"makersclaw": {
|
|
70
|
-
"version": "0.8.
|
|
70
|
+
"version": "0.8.3",
|
|
71
71
|
"useWhen": "A screen plays a recording: a call or meeting recording, a voice note, a podcast clip, a voicemail, a sound file on a record. The call-review block is built on it. Not for video, not for recording audio from the microphone."
|
|
72
72
|
}
|
|
73
73
|
}
|
package/r/auth-form.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "AuthForm",
|
|
6
6
|
"description": "The account screens in one form: sign in (password, email only, or provider buttons for Google, GitHub, Apple and Microsoft), sign up with extra fields, a magic link, a reset link, and changing a password against a live rules checklist. The auth is yours: each submit is an async callback that returns { ok } or an error the form shows.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"docs": "Installed to components/makersclaw/blocks/auth-form. Import: import { AuthForm, PASSWORD_RULES } from \"@/components/makersclaw/blocks/auth-form\". Props and an example: components/makersclaw/blocks/auth-form/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
49
49
|
"meta": {
|
|
50
50
|
"makersclaw": {
|
|
51
|
-
"version": "0.8.
|
|
51
|
+
"version": "0.8.3",
|
|
52
52
|
"useWhen": "An app needs a sign-in, sign-up, forgot-password or change-password screen, or a settings page where a signed-in person changes their password."
|
|
53
53
|
}
|
|
54
54
|
}
|
package/r/automation-editor.json
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
"title": "AutomationEditor",
|
|
6
6
|
"description": "The whole editor for one automation: a header with its name, a status (New, Draft, Draft ahead, Live, Off, Unsaved changes), a test chip (Not tested, Tested with the steps that would run, Last test failed), the run picker, the Live switch, Test run (a dry run: it reads real data and changes nothing) with its price on it, Keep this version and Save; a strip that says what is wrong with it, in words and by step; the node canvas (flow-editor) with an undo history; and the panel for whatever is pressed (the trigger, a step, or the automation as a whole), over the canvas on a narrow width and beside it on a wide one. It holds the working copy of the definition and knows nothing of the network: Save, Keep, Live and Test are callbacks that resolve the platform's answer. Keep and Live need a passed test; when the platform refuses for want of one, the editor offers a test or, after one more question, a deliberate skip. A draft shared with an agent is never buried: the editor remembers the version its copy began on, saves against it, and when a newer version arrives while there are edits not saved it says so (Look at it, Keep mine, or save on top of it on purpose); a line under the header says when the agent drew the draft. Delete automation is in a menu at the end of the header and asks first.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
10
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
11
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
12
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
13
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/automation-model.json",
|
|
10
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/fix-note.json",
|
|
11
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/flow-editor.json",
|
|
12
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/step-settings.json",
|
|
13
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/trigger-picker.json"
|
|
14
14
|
],
|
|
15
15
|
"dependencies": [],
|
|
16
16
|
"files": [
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"docs": "Installed to components/makersclaw/blocks/automation-editor. Import: import { AutomationEditor, RunInputs } from \"@/components/makersclaw/blocks/automation-editor\". Props and an example: components/makersclaw/blocks/automation-editor/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
60
60
|
"meta": {
|
|
61
61
|
"makersclaw": {
|
|
62
|
-
"version": "0.8.
|
|
62
|
+
"version": "0.8.3",
|
|
63
63
|
"useWhen": "A member opens, edits, tests and switches on an automation inside an app. Pair it with automation-list (the rows) and run-view (a run), and the useAutomations / useAutomation / useAutomationRun hooks (lib/hooks.js)."
|
|
64
64
|
}
|
|
65
65
|
}
|
package/r/automation-list.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"title": "AutomationList",
|
|
6
6
|
"description": "An app's automations as rows, each a WHOLE row you press to open: what it is called, when it runs (in words, in the automation's own time zone), how its last run went as a dot and a word, when the next is due, what the last one cost, and an on/off switch that keeps its own press. A line above counts what is on, what failed and what waits for its owner; a search box; grouping into Team and each app when asked. With none yet it is the first-run screen: a few ready-made starting points. StartingPoints is the picker New automation opens. With onDescribe it opens with \"Describe it\": a sentence in a box that the platform turns into a draft; the platform's own starting points say what they need and cost. Each row has a menu with Delete automation, which asks first, says what it does and leaves the runs in history.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/automation-model.json"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": [],
|
|
12
12
|
"files": [
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"docs": "Installed to components/makersclaw/blocks/automation-list. Import: import { AutomationList, StartingPoints } from \"@/components/makersclaw/blocks/automation-list\". Props and an example: components/makersclaw/blocks/automation-list/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
51
51
|
"meta": {
|
|
52
52
|
"makersclaw": {
|
|
53
|
-
"version": "0.8.
|
|
53
|
+
"version": "0.8.3",
|
|
54
54
|
"useWhen": "The Automations page of an app, or of the desk's own Automations window: the rows a member opens, switches and starts from. It replaces schedule-card for an app whose jobs run on the automations engine."
|
|
55
55
|
}
|
|
56
56
|
}
|
package/r/automation-model.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"title": "AutomationModel",
|
|
6
6
|
"description": "The pure part of the automation blocks, with no screen of its own: the step catalog (each kind's name, face, group and price flag, a fresh step, a step's title and quiet line), the canvas layout (an automation turned into boxes, curved connectors with a slot for every +, labelled branches that rejoin, a for-each box), the edits (insert, remove, update, nudge, duplicate, what a step may read), what a run did (each node's state, the path taken), the words (a schedule in cron and in speech, a time in the automation's zone, a cost, a health, a run's outcome), a quick check of a definition, and the starting points. Glyph draws a kind's face from the kit's icons.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [],
|
|
11
11
|
"files": [
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
"docs": "Installed to components/makersclaw/blocks/automation-model. Import: import { ACTIVE, GLYPH_ICON, GROUP_LABELS, GROUP_ORDER, Glyph, KINDS, LABEL_W, MARGIN, RUNNABLE, STARTING_POINTS, startsFromPlatform, testWords, wouldWords, T, WEEKDAYS, addStep, agoWords, allStepIds, availableBefore, blankAutomation, canonicalJson, checkAutomation, clockWords, creditsWords, deleteWords, cronFromParts, cronWords, curveBetween, duplicateStep, durationWords, findStep, flaggedSteps, formatCreditAmount, healthOf, humanize, innerCount, insertStep, isRunnable, issuesFor, issuesFromProblems, keyFromName, latestRows, layoutAutomation, locate, newStep, nodeIndex, nodeStateWords, nudgeStep, originWords, overlayOf, overviewOf, paletteGroups, parseTime, partsFromCron, plainWords, priceMap, readingOrder, removeStep, reportLines, runLine, runStatusWords, sameSlot, slotAfter, slotAtEnd, slotWords, stepIdForPath, stepSub, stepTitle, summaryOf, summarizeSteps, textToValue, timeText, triggerTypeWords, triggerWords, uniqueStepId, updateStep, valueToText, Chip, Dot, PanelSection, SidePanel, RunPicker, CONTROL_DONE, CONTROL_REFUSED, RETRY_FROM, agentDraftOf, changeLines, changeLinesBetween, controlsOf, draftOfStep, fixTag, latestVersionOf, newerVersionWords, retryFromOf, TRIGGER_TITLES, triggerGlyph, triggerTitle } from \"@/components/makersclaw/blocks/automation-model\". Props and an example: components/makersclaw/blocks/automation-model/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
112
112
|
"meta": {
|
|
113
113
|
"makersclaw": {
|
|
114
|
-
"version": "0.8.
|
|
114
|
+
"version": "0.8.3",
|
|
115
115
|
"useWhen": "You are building your own screen on automations (flow-editor, step-settings, automation-list and run-view all do) and need the catalog, the words or the layout without a canvas. Rarely placed on its own: it is laid with the blocks that need it."
|
|
116
116
|
}
|
|
117
117
|
}
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
"title": "AutomationsScreen",
|
|
6
6
|
"description": "The whole Automations page of an app as ONE block. The places a member goes: the list (every automation as a row that opens whole, a switch, New automation with starting points and Describe it, the week's allowance shown once, a slot for jobs that run on request and one for the app's own extras); a new automation in the editor; one automation (its flow, edited, tested, kept and switched on; its Runs; the app's own tabs); and one run, step by step with the run's controls and the agent's fixes. It composes automation-list, automation-editor, run-view and cost, and decides what they leave open: which place is showing and how it travels in a page address (placeFromParams, paramsOfPlace), Back to where the member WAS (the list with the words in its search box, the Runs tab a run was opened from), a save that names the version the copy began on, a delete that asks first and can be undone for a few seconds, the platform's triggers and webhook handed to both editors, Describe it (to the platform, or handed on to the agent beside the page), and an older schedule an app has not updated yet shown read-only. It reads nothing itself: the engine's hooks come in as a hooks prop.",
|
|
7
7
|
"registryDependencies": [
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
10
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
11
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
12
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
13
|
-
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/core.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/automation-editor.json",
|
|
10
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/automation-list.json",
|
|
11
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/automation-model.json",
|
|
12
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/cost.json",
|
|
13
|
+
"https://cdn.jsdelivr.net/npm/makersclaw@0.8.3/r/run-view.json"
|
|
14
14
|
],
|
|
15
15
|
"dependencies": [],
|
|
16
16
|
"files": [
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"docs": "Installed to components/makersclaw/blocks/automations-screen. Import: import { AutomationsScreen, deletedWords, normalizePlace, paramsOfPlace, placeFromParams } from \"@/components/makersclaw/blocks/automations-screen\". Props and an example: components/makersclaw/blocks/automations-screen/README.md. Makersclaw builds whole apps from these blocks: https://makersclaw.com",
|
|
65
65
|
"meta": {
|
|
66
66
|
"makersclaw": {
|
|
67
|
-
"version": "0.8.
|
|
67
|
+
"version": "0.8.3",
|
|
68
68
|
"useWhen": "An app has jobs that run on the automations engine and needs its Automations page: the list, the editor, the runs and a run, in the app's theme. One component, one source, so a fix to this page reaches every app through update. The app adds only what is its own: the allowance, jobs a press or an ask starts, extra tabs on an automation, a notice above one, its own starting points and its declared actions."
|
|
69
69
|
}
|
|
70
70
|
}
|