@method-ai-hq/sdk 0.0.0-stage → 0.14.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/LICENSE +21 -0
- package/README.md +23 -2
- package/dist/packages/contracts/src/identity.d.ts +16 -0
- package/dist/packages/contracts/src/identity.js +41 -0
- package/dist/packages/contracts/src/method-package.d.ts +71 -0
- package/dist/packages/contracts/src/method-package.js +22 -0
- package/dist/packages/method-document/src/conversion-report.d.ts +138 -0
- package/dist/packages/method-document/src/conversion-report.js +23 -0
- package/dist/packages/sdk/examples/daily-briefing/README.md +31 -0
- package/dist/packages/sdk/examples/daily-briefing/TASK.md +3 -0
- package/dist/packages/sdk/examples/daily-briefing/approved-report.md +138 -0
- package/dist/packages/sdk/examples/daily-briefing/briefing_artifacts.py +39 -0
- package/dist/packages/sdk/examples/daily-briefing/briefing_check_inputs.py +47 -0
- package/dist/packages/sdk/examples/daily-briefing/briefing_files.py +31 -0
- package/dist/packages/sdk/examples/daily-briefing/briefing_manifest.py +23 -0
- package/dist/packages/sdk/examples/daily-briefing/briefing_markdown.py +67 -0
- package/dist/packages/sdk/examples/daily-briefing/briefing_progress.py +18 -0
- package/dist/packages/sdk/examples/daily-briefing/briefing_render.py +71 -0
- package/dist/packages/sdk/examples/daily-briefing/briefing_sessions.py +37 -0
- package/dist/packages/sdk/examples/daily-briefing/briefing_times.py +158 -0
- package/dist/packages/sdk/examples/daily-briefing/briefing_validation.py +101 -0
- package/dist/packages/sdk/examples/daily-briefing/briefing_website.py +215 -0
- package/dist/packages/sdk/examples/daily-briefing/checks.json +19 -0
- package/dist/packages/sdk/examples/daily-briefing/daily-briefing.method +158 -0
- package/dist/packages/sdk/examples/daily-briefing/inputs.json +1 -0
- package/dist/packages/sdk/examples/daily-briefing/package-lock.json +10 -0
- package/dist/packages/sdk/examples/daily-briefing/package.json +4 -0
- package/dist/packages/sdk/examples/daily-briefing/pyproject.toml +8 -0
- package/dist/packages/sdk/examples/daily-briefing/reader/reader.css +35 -0
- package/dist/packages/sdk/examples/daily-briefing/reader/reader.js +42 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/context.json +1 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/documents/document-001.md +219 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/media.json +1 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/metadata/documents.json +39 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0001.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0002.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0003.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0004.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0005.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0006.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0007.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0008.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0009.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0010.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0011.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0012.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0013.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0014.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0015.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0016.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0017.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0018.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0019.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0020.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0021.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0022.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0023.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0024.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0025.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0026.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0027.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/records/chatgpt-0028.json +49 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/sessions.json +1 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/timeline.jsonl +28 -0
- package/dist/packages/sdk/examples/daily-briefing/sample/untimed.jsonl +0 -0
- package/dist/packages/sdk/examples/daily-briefing/sample-output.zip +0 -0
- package/dist/packages/sdk/examples/daily-briefing/sample-report.md +51 -0
- package/dist/packages/sdk/examples/daily-briefing/uv.lock +128 -0
- package/dist/packages/sdk/examples/daily-briefing/vendor/marked-LICENSE.md +44 -0
- package/dist/packages/sdk/examples/daily-briefing/vendor/marked.mjs +77 -0
- package/dist/packages/sdk/examples/files.json +126 -0
- package/dist/packages/sdk/examples/message-routing/README.md +23 -0
- package/dist/packages/sdk/examples/message-routing/TASK.md +5 -0
- package/dist/packages/sdk/examples/message-routing/choose-destination.mjs +10 -0
- package/dist/packages/sdk/examples/message-routing/create-ticket.mjs +15 -0
- package/dist/packages/sdk/examples/message-routing/inputs.json +1 -0
- package/dist/packages/sdk/examples/message-routing/message-routing.method +45 -0
- package/dist/packages/sdk/examples/message-routing/result.fixture.json +6 -0
- package/dist/packages/sdk/examples/message-routing/routing.mjs +29 -0
- package/dist/packages/sdk/examples/message-routing/routing.test.mjs +27 -0
- package/dist/packages/sdk/examples/message-routing/ticket.method +88 -0
- package/dist/packages/sdk/examples/message-routing/ticket.test.mjs +64 -0
- package/dist/packages/sdk/examples/notes-summary/README.md +23 -0
- package/dist/packages/sdk/examples/notes-summary/TASK.md +3 -0
- package/dist/packages/sdk/examples/notes-summary/cases/dates-in-decisions/case.json +36 -0
- package/dist/packages/sdk/examples/notes-summary/cases/dates-in-decisions/examples.json +16 -0
- package/dist/packages/sdk/examples/notes-summary/cases/dates-in-decisions/files/0 +10 -0
- package/dist/packages/sdk/examples/notes-summary/cases/dates-in-decisions/recording.json +195 -0
- package/dist/packages/sdk/examples/notes-summary/notes/2026-10-05-standup.md +4 -0
- package/dist/packages/sdk/examples/notes-summary/notes/2026-10-07-planning.md +3 -0
- package/dist/packages/sdk/examples/notes-summary/notes-summary.method +54 -0
- package/dist/packages/sdk/examples/notes-summary/out/.keep +0 -0
- package/dist/packages/sdk/examples/notes-summary/read-notes.mjs +4 -0
- package/dist/packages/sdk/examples/notes-summary/save.mjs +7 -0
- package/dist/packages/sdk/examples/outbound-management/README.md +119 -0
- package/dist/packages/sdk/examples/outbound-management/TASK.md +5 -0
- package/dist/packages/sdk/examples/outbound-management/check_plan.py +16 -0
- package/dist/packages/sdk/examples/outbound-management/check_sources.py +14 -0
- package/dist/packages/sdk/examples/outbound-management/crm.py +153 -0
- package/dist/packages/sdk/examples/outbound-management/crm_test.py +141 -0
- package/dist/packages/sdk/examples/outbound-management/fixtures/README.md +15 -0
- package/dist/packages/sdk/examples/outbound-management/fixtures/crm.json +54 -0
- package/dist/packages/sdk/examples/outbound-management/fixtures/day-1/messages.json +29 -0
- package/dist/packages/sdk/examples/outbound-management/fixtures/day-2/messages.json +38 -0
- package/dist/packages/sdk/examples/outbound-management/fixtures/observations.json +12 -0
- package/dist/packages/sdk/examples/outbound-management/fixtures/plan.json +69 -0
- package/dist/packages/sdk/examples/outbound-management/fixtures/receipt.json +1 -0
- package/dist/packages/sdk/examples/outbound-management/fixtures/state.json +99 -0
- package/dist/packages/sdk/examples/outbound-management/fixtures/tasks.md +16 -0
- package/dist/packages/sdk/examples/outbound-management/inputs.json +4 -0
- package/dist/packages/sdk/examples/outbound-management/outbound.method +277 -0
- package/dist/packages/sdk/examples/outbound-management/read_crm.py +4 -0
- package/dist/packages/sdk/examples/outbound-management/save_day.py +4 -0
- package/dist/packages/sdk/examples/outbound-management/starter/crm.json +11 -0
- package/dist/packages/sdk/examples/social-briefing/README.md +41 -0
- package/dist/packages/sdk/examples/social-briefing/TASK.md +5 -0
- package/dist/packages/sdk/examples/social-briefing/inputs.json +5 -0
- package/dist/packages/sdk/examples/social-briefing/result.fixture.json +14 -0
- package/dist/packages/sdk/examples/social-briefing/social-briefing.method +110 -0
- package/dist/packages/sdk/examples/support-triage/README.md +77 -0
- package/dist/packages/sdk/examples/support-triage/TASK.md +3 -0
- package/dist/packages/sdk/examples/support-triage/cases/double-charge-to-billing/case.json +40 -0
- package/dist/packages/sdk/examples/support-triage/cases/double-charge-to-billing/recording.json +460 -0
- package/dist/packages/sdk/examples/support-triage/fake-helpdesk.mjs +38 -0
- package/dist/packages/sdk/examples/support-triage/helpdesk.mjs +33 -0
- package/dist/packages/sdk/examples/support-triage/inputs.json +1 -0
- package/dist/packages/sdk/examples/support-triage/read-ticket.mjs +8 -0
- package/dist/packages/sdk/examples/support-triage/route.mjs +4 -0
- package/dist/packages/sdk/examples/support-triage/sample-tickets.json +5 -0
- package/dist/packages/sdk/examples/support-triage/set-ticket.mjs +9 -0
- package/dist/packages/sdk/examples/support-triage/support-triage.method +165 -0
- package/dist/packages/sdk/examples/support-triage/triage.mjs +38 -0
- package/dist/packages/sdk/examples/support-triage/triage.test.mjs +68 -0
- package/dist/packages/sdk/observers/mail.delivery/fetch.mjs +87 -0
- package/dist/packages/sdk/observers/mail.delivery/fixtures/bounce-by-recipient.json +1 -0
- package/dist/packages/sdk/observers/mail.delivery/fixtures/bounce.json +1 -0
- package/dist/packages/sdk/observers/mail.delivery/fixtures/delayed.json +1 -0
- package/dist/packages/sdk/observers/mail.delivery/fixtures/delivered.json +1 -0
- package/dist/packages/sdk/observers/mail.delivery/fixtures/empty.json +1 -0
- package/dist/packages/sdk/observers/mail.delivery/fixtures/other-message.json +1 -0
- package/dist/packages/sdk/observers/mail.delivery/judge.mjs +13 -0
- package/dist/packages/sdk/observers/mail.delivery/observer.json +14 -0
- package/dist/packages/sdk/package.json +232 -0
- package/dist/packages/sdk/src/authoring-example.d.ts +91 -0
- package/dist/packages/sdk/src/authoring-example.js +50 -0
- package/dist/packages/sdk/src/authoring-instructions.d.ts +20 -0
- package/dist/packages/sdk/src/authoring-instructions.js +151 -0
- package/dist/packages/sdk/src/authoring-prompt.d.ts +2 -0
- package/dist/packages/sdk/src/authoring-prompt.js +8 -0
- package/dist/packages/sdk/src/authoring.d.ts +10 -0
- package/dist/packages/sdk/src/authoring.js +287 -0
- package/dist/packages/sdk/src/bindings.d.ts +4 -0
- package/dist/packages/sdk/src/bindings.js +124 -0
- package/dist/packages/sdk/src/bridge.d.ts +2 -0
- package/dist/packages/sdk/src/bridge.js +23 -0
- package/dist/packages/sdk/src/browser-runtime/pyproject.toml +5 -0
- package/dist/packages/sdk/src/browser-runtime/tools.json +189 -0
- package/dist/packages/sdk/src/browser-runtime/uv.lock +3894 -0
- package/dist/packages/sdk/src/browser-service.py +127 -0
- package/dist/packages/sdk/src/browser.d.ts +38 -0
- package/dist/packages/sdk/src/browser.js +203 -0
- package/dist/packages/sdk/src/capabilities.d.ts +13 -0
- package/dist/packages/sdk/src/capabilities.js +68 -0
- package/dist/packages/sdk/src/classification-client.d.ts +4 -0
- package/dist/packages/sdk/src/classification-client.js +27 -0
- package/dist/packages/sdk/src/cloud.d.ts +23 -0
- package/dist/packages/sdk/src/cloud.js +43 -0
- package/dist/packages/sdk/src/computer-settings.d.ts +28 -0
- package/dist/packages/sdk/src/computer-settings.js +57 -0
- package/dist/packages/sdk/src/connect.d.ts +47 -0
- package/dist/packages/sdk/src/connect.js +203 -0
- package/dist/packages/sdk/src/current-inspection.d.ts +3 -0
- package/dist/packages/sdk/src/current-inspection.js +146 -0
- package/dist/packages/sdk/src/current-runtime.d.ts +14 -0
- package/dist/packages/sdk/src/current-runtime.js +167 -0
- package/dist/packages/sdk/src/doctor.d.ts +17 -0
- package/dist/packages/sdk/src/doctor.js +68 -0
- package/dist/packages/sdk/src/executable.d.ts +2 -0
- package/dist/packages/sdk/src/executable.js +22 -0
- package/dist/packages/sdk/src/explain-effects.d.ts +32 -0
- package/dist/packages/sdk/src/explain-effects.js +192 -0
- package/dist/packages/sdk/src/explain.d.ts +115 -0
- package/dist/packages/sdk/src/explain.js +441 -0
- package/dist/packages/sdk/src/files.d.ts +9 -0
- package/dist/packages/sdk/src/files.js +50 -0
- package/dist/packages/sdk/src/guard-keys.d.ts +5 -0
- package/dist/packages/sdk/src/guard-keys.js +42 -0
- package/dist/packages/sdk/src/hosted-models.d.ts +49 -0
- package/dist/packages/sdk/src/hosted-models.js +81 -0
- package/dist/packages/sdk/src/improve.d.ts +55 -0
- package/dist/packages/sdk/src/improve.js +159 -0
- package/dist/packages/sdk/src/index.d.ts +13 -0
- package/dist/packages/sdk/src/index.js +13 -0
- package/dist/packages/sdk/src/inspect.d.ts +6 -0
- package/dist/packages/sdk/src/inspect.js +17 -0
- package/dist/packages/sdk/src/link.d.ts +12 -0
- package/dist/packages/sdk/src/link.js +53 -0
- package/dist/packages/sdk/src/local-cli.d.ts +24 -0
- package/dist/packages/sdk/src/local-cli.js +146 -0
- package/dist/packages/sdk/src/local-setup.d.ts +15 -0
- package/dist/packages/sdk/src/local-setup.js +42 -0
- package/dist/packages/sdk/src/method-client.d.ts +30 -0
- package/dist/packages/sdk/src/method-client.js +250 -0
- package/dist/packages/sdk/src/method-files.d.ts +29 -0
- package/dist/packages/sdk/src/method-files.js +93 -0
- package/dist/packages/sdk/src/method-help.d.ts +19 -0
- package/dist/packages/sdk/src/method-help.js +404 -0
- package/dist/packages/sdk/src/method-issues.d.ts +86 -0
- package/dist/packages/sdk/src/method-issues.js +192 -0
- package/dist/packages/sdk/src/method-sync.d.ts +46 -0
- package/dist/packages/sdk/src/method-sync.js +293 -0
- package/dist/packages/sdk/src/method.d.ts +5 -0
- package/dist/packages/sdk/src/method.js +359 -0
- package/dist/packages/sdk/src/model-checks.d.ts +96 -0
- package/dist/packages/sdk/src/model-checks.js +181 -0
- package/dist/packages/sdk/src/outbox.d.ts +120 -0
- package/dist/packages/sdk/src/outbox.js +297 -0
- package/dist/packages/sdk/src/own-model-key.d.ts +22 -0
- package/dist/packages/sdk/src/own-model-key.js +76 -0
- package/dist/packages/sdk/src/prepare.d.ts +24 -0
- package/dist/packages/sdk/src/prepare.js +245 -0
- package/dist/packages/sdk/src/process.d.ts +15 -0
- package/dist/packages/sdk/src/process.js +107 -0
- package/dist/packages/sdk/src/production.d.ts +182 -0
- package/dist/packages/sdk/src/production.js +284 -0
- package/dist/packages/sdk/src/progress.d.ts +12 -0
- package/dist/packages/sdk/src/progress.js +48 -0
- package/dist/packages/sdk/src/proposals.d.ts +73 -0
- package/dist/packages/sdk/src/proposals.js +284 -0
- package/dist/packages/sdk/src/quality.d.ts +82 -0
- package/dist/packages/sdk/src/quality.js +294 -0
- package/dist/packages/sdk/src/result-files.d.ts +5 -0
- package/dist/packages/sdk/src/result-files.js +149 -0
- package/dist/packages/sdk/src/result-transfer.d.ts +21 -0
- package/dist/packages/sdk/src/result-transfer.js +37 -0
- package/dist/packages/sdk/src/run-data.d.ts +11 -0
- package/dist/packages/sdk/src/run-data.js +80 -0
- package/dist/packages/sdk/src/run-method.d.ts +2 -0
- package/dist/packages/sdk/src/run-method.js +2 -0
- package/dist/packages/sdk/src/run-saved.d.ts +5 -0
- package/dist/packages/sdk/src/run-saved.js +138 -0
- package/dist/packages/sdk/src/run-worker.d.ts +6 -0
- package/dist/packages/sdk/src/run-worker.js +131 -0
- package/dist/packages/sdk/src/secrets.d.ts +37 -0
- package/dist/packages/sdk/src/secrets.js +196 -0
- package/dist/packages/sdk/src/update.d.ts +5 -0
- package/dist/packages/sdk/src/update.js +39 -0
- package/dist/packages/sdk/src/versions.d.ts +58 -0
- package/dist/packages/sdk/src/versions.js +144 -0
- package/dist/packages/sdk/src/worker.d.ts +120 -0
- package/dist/packages/sdk/src/worker.js +443 -0
- package/dist/packages/workflow-language/src/execution.d.ts +1 -0
- package/dist/packages/workflow-language/src/execution.js +1 -0
- package/dist/packages/workflow-language/src/inspection.d.ts +990 -0
- package/dist/packages/workflow-language/src/inspection.js +130 -0
- package/dist/packages/workflow-language/src/result-files.d.ts +160 -0
- package/dist/packages/workflow-language/src/result-files.js +67 -0
- package/dist/packages/workflow-language/src/schema.d.ts +207 -0
- package/dist/packages/workflow-language/src/schema.js +56 -0
- package/dist/packages/workflow-language/src/validate.d.ts +11 -0
- package/dist/packages/workflow-language/src/validate.js +77 -0
- package/package.json +230 -4
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"updated_contacts": [
|
|
3
|
+
{
|
|
4
|
+
"id": "c1",
|
|
5
|
+
"name": "Alex Kim",
|
|
6
|
+
"email": "alex@north.example",
|
|
7
|
+
"company": "North",
|
|
8
|
+
"role": "Operations lead",
|
|
9
|
+
"fit": "Manages a small logistics team",
|
|
10
|
+
"sources": [],
|
|
11
|
+
"status": "replied",
|
|
12
|
+
"next_action": "Send pricing",
|
|
13
|
+
"next_action_date": "2026-09-17",
|
|
14
|
+
"introduction_path": ""
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "c2",
|
|
18
|
+
"name": "Morgan Bell",
|
|
19
|
+
"email": "morgan@south.example",
|
|
20
|
+
"company": "South",
|
|
21
|
+
"role": "Operations lead",
|
|
22
|
+
"fit": "Manages a small logistics team",
|
|
23
|
+
"sources": [],
|
|
24
|
+
"status": "customer",
|
|
25
|
+
"next_action": "",
|
|
26
|
+
"next_action_date": "",
|
|
27
|
+
"introduction_path": ""
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "c3",
|
|
31
|
+
"name": "Sam Lee",
|
|
32
|
+
"email": "sam@east.example",
|
|
33
|
+
"company": "East",
|
|
34
|
+
"role": "Operations lead",
|
|
35
|
+
"fit": "Manages a small logistics team",
|
|
36
|
+
"sources": [],
|
|
37
|
+
"status": "opted_out",
|
|
38
|
+
"next_action": "",
|
|
39
|
+
"next_action_date": "",
|
|
40
|
+
"introduction_path": ""
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"resolutions": [
|
|
44
|
+
{
|
|
45
|
+
"id": "m1",
|
|
46
|
+
"contact_id": "c1",
|
|
47
|
+
"resolution": "Recorded reply"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "m2",
|
|
51
|
+
"contact_id": "c3",
|
|
52
|
+
"resolution": "Recorded reply"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "m3",
|
|
56
|
+
"contact_id": "",
|
|
57
|
+
"resolution": "Review sender"
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"day_tasks": [
|
|
61
|
+
{
|
|
62
|
+
"contact_id": "c1",
|
|
63
|
+
"action": "Send pricing",
|
|
64
|
+
"due_date": "2026-09-17",
|
|
65
|
+
"reason": "Requested by Alex",
|
|
66
|
+
"draft": "Hello Alex, let us review your needs."
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"day": "2026-09-17", "crm_sha256": "71a30d38fb2fcffb773ab3071367a239af0c01abca0394daef1d66a58fde9635", "contacts": 3, "messages": 3}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"target": {
|
|
3
|
+
"customer": "Operations leaders at small US logistics companies who still process customer requests manually.",
|
|
4
|
+
"offer": "A service that turns repeated work into reusable automated workflows.",
|
|
5
|
+
"new_prospects_per_day": 3,
|
|
6
|
+
"mailbox_url": "https://mail.google.com/mail/u/0/"
|
|
7
|
+
},
|
|
8
|
+
"contacts": [
|
|
9
|
+
{
|
|
10
|
+
"id": "c1",
|
|
11
|
+
"name": "Alex Kim",
|
|
12
|
+
"email": "alex@north.example",
|
|
13
|
+
"company": "North",
|
|
14
|
+
"role": "Operations lead",
|
|
15
|
+
"fit": "Manages a small logistics team",
|
|
16
|
+
"sources": [],
|
|
17
|
+
"status": "replied",
|
|
18
|
+
"next_action": "Send pricing",
|
|
19
|
+
"next_action_date": "2026-09-17",
|
|
20
|
+
"manual_notes": "Keep this owner note.",
|
|
21
|
+
"introduction_path": ""
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "c2",
|
|
25
|
+
"name": "Morgan Bell",
|
|
26
|
+
"email": "morgan@south.example",
|
|
27
|
+
"company": "South",
|
|
28
|
+
"role": "Operations lead",
|
|
29
|
+
"fit": "Manages a small logistics team",
|
|
30
|
+
"sources": [],
|
|
31
|
+
"status": "customer",
|
|
32
|
+
"next_action": "",
|
|
33
|
+
"next_action_date": "",
|
|
34
|
+
"manual_notes": "Keep this owner note.",
|
|
35
|
+
"introduction_path": ""
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"id": "c3",
|
|
39
|
+
"name": "Sam Lee",
|
|
40
|
+
"email": "sam@east.example",
|
|
41
|
+
"company": "East",
|
|
42
|
+
"role": "Operations lead",
|
|
43
|
+
"fit": "Manages a small logistics team",
|
|
44
|
+
"sources": [],
|
|
45
|
+
"status": "opted_out",
|
|
46
|
+
"next_action": "",
|
|
47
|
+
"next_action_date": "",
|
|
48
|
+
"manual_notes": "Keep this owner note.",
|
|
49
|
+
"introduction_path": ""
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"messages": [
|
|
53
|
+
{
|
|
54
|
+
"id": "m1",
|
|
55
|
+
"url": "https://mail.google.com/mail/u/0/#inbox/m1",
|
|
56
|
+
"email": "alex@north.example",
|
|
57
|
+
"at": "2026-09-17T09:00:00-04:00",
|
|
58
|
+
"direction": "received",
|
|
59
|
+
"text": "Can you send pricing today?",
|
|
60
|
+
"contact_id": "c1",
|
|
61
|
+
"resolution": "Recorded reply"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"id": "m2",
|
|
65
|
+
"url": "https://mail.google.com/mail/u/0/#inbox/m2",
|
|
66
|
+
"email": "sam@east.example",
|
|
67
|
+
"at": "2026-09-17T10:00:00-04:00",
|
|
68
|
+
"direction": "received",
|
|
69
|
+
"text": "Please stop contacting me.",
|
|
70
|
+
"contact_id": "c3",
|
|
71
|
+
"resolution": "Recorded reply"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"id": "m3",
|
|
75
|
+
"url": "https://mail.google.com/mail/u/0/#inbox/m3",
|
|
76
|
+
"email": "",
|
|
77
|
+
"at": "2026-09-17T11:00:00-04:00",
|
|
78
|
+
"direction": "received",
|
|
79
|
+
"text": "Alex: send the contract. Sender address was not captured.",
|
|
80
|
+
"contact_id": "",
|
|
81
|
+
"resolution": "Review sender"
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
"days": {
|
|
85
|
+
"2026-09-17": {
|
|
86
|
+
"tasks": [
|
|
87
|
+
{
|
|
88
|
+
"contact_id": "c1",
|
|
89
|
+
"action": "Send pricing",
|
|
90
|
+
"due_date": "2026-09-17",
|
|
91
|
+
"reason": "Requested by Alex",
|
|
92
|
+
"draft": "Hello Alex, let us review your needs."
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"research_notes": "Happenstance: No new prospects in this state test."
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"last_plan": "f3052a54726c6e2b793368cd8138303959e788fe23adee2f2975fdf4303737f4"
|
|
99
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Outbound tasks — 2026-09-17
|
|
2
|
+
|
|
3
|
+
## Send pricing: Alex Kim · North
|
|
4
|
+
Due: 2026-09-17
|
|
5
|
+
|
|
6
|
+
Requested by Alex
|
|
7
|
+
|
|
8
|
+
Hello Alex, let us review your needs.
|
|
9
|
+
|
|
10
|
+
## Messages to review
|
|
11
|
+
|
|
12
|
+
m3: Review sender
|
|
13
|
+
|
|
14
|
+
## Research notes
|
|
15
|
+
|
|
16
|
+
Happenstance: No new prospects in this state test.
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
format: method/3.4
|
|
2
|
+
name: Manage daily outbound
|
|
3
|
+
goal: Read campaign email, find prospects in Happenstance, enrich them from company and LinkedIn pages, update the CRM, and prepare today's outreach tasks.
|
|
4
|
+
inputs:
|
|
5
|
+
day:
|
|
6
|
+
type: text
|
|
7
|
+
description: Date to plan, YYYY-MM-DD.
|
|
8
|
+
from_date:
|
|
9
|
+
type: text
|
|
10
|
+
description: First email date to read, YYYY-MM-DD. Use an overlap with the last run.
|
|
11
|
+
state:
|
|
12
|
+
crm:
|
|
13
|
+
type: text
|
|
14
|
+
description: CRM as JSON text in shared Method account state. Updated only by save_day, after every check passes.
|
|
15
|
+
environment:
|
|
16
|
+
browser:
|
|
17
|
+
type: browser
|
|
18
|
+
description: Browser signed in to email, Happenstance, and LinkedIn.
|
|
19
|
+
steps:
|
|
20
|
+
read_crm:
|
|
21
|
+
name: Read the CRM
|
|
22
|
+
purpose: Rejects an invalid date or an email start date after the planned day. Returns the target settings, the contacts, the IDs of messages already matched to a contact, and the hash of the supplied CRM text. Changes nothing.
|
|
23
|
+
in:
|
|
24
|
+
day: inputs.day
|
|
25
|
+
from_date: inputs.from_date
|
|
26
|
+
crm: state.crm
|
|
27
|
+
do: {kind: run, runtime: python, entrypoint: read_crm.py}
|
|
28
|
+
out:
|
|
29
|
+
target:
|
|
30
|
+
type: record
|
|
31
|
+
fields: {customer: text, offer: text, new_prospects_per_day: number, mailbox_url: text}
|
|
32
|
+
description: Target customer, offer, daily prospect limit, and mailbox URL.
|
|
33
|
+
contacts:
|
|
34
|
+
type: list
|
|
35
|
+
fields:
|
|
36
|
+
id: text
|
|
37
|
+
name: text
|
|
38
|
+
email: text
|
|
39
|
+
company: text
|
|
40
|
+
role: text
|
|
41
|
+
fit: text
|
|
42
|
+
sources: {type: list, items: text}
|
|
43
|
+
status: text
|
|
44
|
+
next_action: text
|
|
45
|
+
next_action_date: text
|
|
46
|
+
introduction_path: text
|
|
47
|
+
manual_notes: text
|
|
48
|
+
description: Contacts saved in the CRM.
|
|
49
|
+
resolved:
|
|
50
|
+
type: list
|
|
51
|
+
items: text
|
|
52
|
+
description: IDs of saved messages that are matched to a contact.
|
|
53
|
+
crm_sha256:
|
|
54
|
+
type: text
|
|
55
|
+
description: SHA-256 of the CRM text that this run read.
|
|
56
|
+
|
|
57
|
+
read_email:
|
|
58
|
+
name: Read campaign email
|
|
59
|
+
no_effect_reason: Reads the mailbox in the browser; sends, replies to, and deletes nothing.
|
|
60
|
+
accept:
|
|
61
|
+
untrusted_content_can_act: The agent needs the signed-in mailbox to read campaign email. The prompt asks it only to search and read; nothing is sent until a person reviews the tasks.
|
|
62
|
+
changes: [environment.browser]
|
|
63
|
+
in:
|
|
64
|
+
mailbox_url: target.mailbox_url
|
|
65
|
+
offer: target.offer
|
|
66
|
+
from_date: inputs.from_date
|
|
67
|
+
day: inputs.day
|
|
68
|
+
contacts: contacts
|
|
69
|
+
do:
|
|
70
|
+
kind: agent
|
|
71
|
+
model: default
|
|
72
|
+
browser: environment.browser
|
|
73
|
+
prompt: |
|
|
74
|
+
Open {{mailbox_url}} and read the received and sent campaign email from {{from_date}} through {{day}}.
|
|
75
|
+
Search by the addresses and companies in contacts and by this offer: {{offer}}
|
|
76
|
+
Open each matching thread and keep every message, including opt-outs and replies from people who are not in contacts.
|
|
77
|
+
Set contact_id when the address matches a contact; otherwise leave it empty. Leave email empty when the address is not shown.
|
|
78
|
+
If you cannot open the mailbox, set status to blocked and say why in notes.
|
|
79
|
+
out:
|
|
80
|
+
messages:
|
|
81
|
+
type: list
|
|
82
|
+
fields: {id: text, url: text, email: text, at: text, direction: text, text: text, contact_id: text}
|
|
83
|
+
description: Campaign messages. id is the mailbox message ID, url the thread link, at an ISO date and time, direction received or sent.
|
|
84
|
+
email_search:
|
|
85
|
+
type: record
|
|
86
|
+
fields: {status: text, notes: text}
|
|
87
|
+
description: complete or blocked, and what limited the search.
|
|
88
|
+
check: {kind: run, runtime: python, entrypoint: check_sources.py, args: [email]}
|
|
89
|
+
reading:
|
|
90
|
+
check_name: Check email records
|
|
91
|
+
check: Requires a complete search, unique message IDs, valid dates, https thread links, and message text.
|
|
92
|
+
|
|
93
|
+
find_prospects:
|
|
94
|
+
name: Find prospects in Happenstance
|
|
95
|
+
no_effect_reason: Searches Happenstance in the browser; sends no messages or introduction requests.
|
|
96
|
+
accept:
|
|
97
|
+
untrusted_content_can_act: The agent needs the signed-in Happenstance account to search the network. The prompt asks it only to search; no message or introduction request is sent.
|
|
98
|
+
changes: [environment.browser]
|
|
99
|
+
after: read_email
|
|
100
|
+
in:
|
|
101
|
+
customer: target.customer
|
|
102
|
+
offer: target.offer
|
|
103
|
+
limit: target.new_prospects_per_day
|
|
104
|
+
contacts: contacts
|
|
105
|
+
do:
|
|
106
|
+
kind: agent
|
|
107
|
+
model: default
|
|
108
|
+
browser: environment.browser
|
|
109
|
+
prompt: |
|
|
110
|
+
Open https://happenstance.ai and ask:
|
|
111
|
+
"Find people in my network who fit this customer description: {{customer}}
|
|
112
|
+
I offer {{offer}} Show their current roles, companies, profile links,
|
|
113
|
+
and how I can reach them or get an introduction."
|
|
114
|
+
Choose up to {{limit}} people from the results who fit the description and are not in contacts.
|
|
115
|
+
Copy their details as Happenstance shows them. Leave email empty when it is not shown.
|
|
116
|
+
If no one fits, return no prospects. If you cannot search, set status to blocked and say why in notes.
|
|
117
|
+
out:
|
|
118
|
+
prospects:
|
|
119
|
+
type: list
|
|
120
|
+
fields: {name: text, email: text, company: text, role: text, profile_url: text, introduction_path: text}
|
|
121
|
+
description: New people who fit the target customer.
|
|
122
|
+
prospect_search:
|
|
123
|
+
type: record
|
|
124
|
+
fields: {status: text, notes: text}
|
|
125
|
+
description: complete or blocked, and what limited the search.
|
|
126
|
+
check: {kind: run, runtime: python, entrypoint: check_sources.py, args: [prospects]}
|
|
127
|
+
reading:
|
|
128
|
+
check_name: Check search access
|
|
129
|
+
check: Requires a complete Happenstance search. A complete search may find no prospects.
|
|
130
|
+
|
|
131
|
+
enrich:
|
|
132
|
+
name: Check each prospect's pages
|
|
133
|
+
no_effect_reason: Reads company and LinkedIn pages in the browser; sends no messages or connection requests.
|
|
134
|
+
accept:
|
|
135
|
+
untrusted_content_can_act: The agent needs the signed-in browser to read LinkedIn profiles. The prompt asks it only to read pages; no message or connection request is sent.
|
|
136
|
+
changes: [environment.browser]
|
|
137
|
+
after: find_prospects
|
|
138
|
+
each: {prospect: prospects}
|
|
139
|
+
in:
|
|
140
|
+
offer: target.offer
|
|
141
|
+
do:
|
|
142
|
+
kind: agent
|
|
143
|
+
model: default
|
|
144
|
+
browser: environment.browser
|
|
145
|
+
prompt: |
|
|
146
|
+
Open the website of {{prospect.company}} and the LinkedIn profile of {{prospect.name}} ({{prospect.profile_url}}; search LinkedIn when this is empty).
|
|
147
|
+
Record each page you read with its URL and the facts you read there.
|
|
148
|
+
From those facts, give the current role and one sentence on why this offer fits: {{offer}}
|
|
149
|
+
Give an email address only when a page shows it; otherwise leave email empty.
|
|
150
|
+
In notes, name each page that you could not open.
|
|
151
|
+
out:
|
|
152
|
+
enrichment:
|
|
153
|
+
type: record
|
|
154
|
+
fields:
|
|
155
|
+
email: text
|
|
156
|
+
role: text
|
|
157
|
+
fit: text
|
|
158
|
+
sources: {type: list, fields: {url: text, facts: text}}
|
|
159
|
+
notes: text
|
|
160
|
+
description: What the prospect's pages show.
|
|
161
|
+
check: {kind: run, runtime: python, entrypoint: check_sources.py, args: [enrichment]}
|
|
162
|
+
reading:
|
|
163
|
+
check_name: Check page records
|
|
164
|
+
check: Requires at least one source, each with an https link and the facts read there.
|
|
165
|
+
|
|
166
|
+
update_contacts:
|
|
167
|
+
name: Update contacts
|
|
168
|
+
in:
|
|
169
|
+
contacts: contacts
|
|
170
|
+
resolved: resolved
|
|
171
|
+
messages: messages
|
|
172
|
+
prospects: prospects
|
|
173
|
+
enrichment: enrichment
|
|
174
|
+
do:
|
|
175
|
+
kind: call
|
|
176
|
+
model: default
|
|
177
|
+
prompt: |
|
|
178
|
+
Return each contact that the new messages or the new prospects add or change.
|
|
179
|
+
Skip messages whose id is in resolved. Match each other message to a contact by contact_id or exact email.
|
|
180
|
+
Give each message a short resolution, such as "Asked for pricing". When no contact matches, leave contact_id empty and say what a person must check.
|
|
181
|
+
Set the contact's status, next_action, and next_action_date from its messages. Status is new, contacted, replied, qualified, meeting, customer, closed, or opted_out.
|
|
182
|
+
Never change a customer or opted_out status. Leave next_action_date empty when nothing is due.
|
|
183
|
+
Add each prospect with status new. The enrichment at the same position gives its role, fit, email, and sources (the page URLs).
|
|
184
|
+
Use email:<address> as a new contact's id, or its profile_url when the email is unknown. Leave an unknown email empty.
|
|
185
|
+
out:
|
|
186
|
+
updated_contacts:
|
|
187
|
+
type: list
|
|
188
|
+
fields:
|
|
189
|
+
id: text
|
|
190
|
+
name: text
|
|
191
|
+
email: text
|
|
192
|
+
company: text
|
|
193
|
+
role: text
|
|
194
|
+
fit: text
|
|
195
|
+
sources: {type: list, items: text}
|
|
196
|
+
status: text
|
|
197
|
+
next_action: text
|
|
198
|
+
next_action_date: text
|
|
199
|
+
introduction_path: text
|
|
200
|
+
description: New and changed contacts.
|
|
201
|
+
resolutions:
|
|
202
|
+
type: list
|
|
203
|
+
fields: {id: text, contact_id: text, resolution: text}
|
|
204
|
+
description: One entry for each new message.
|
|
205
|
+
check: {kind: run, runtime: python, entrypoint: check_plan.py, args: [contacts]}
|
|
206
|
+
reading:
|
|
207
|
+
check_name: Check contacts
|
|
208
|
+
check: Requires unique contacts with a valid status and date, collected sources and a fit for new prospects, one contact per email, unchanged customer and opt-out status, and one resolution per new message whose contact matches by ID or exact email.
|
|
209
|
+
|
|
210
|
+
draft_tasks:
|
|
211
|
+
name: Draft today's tasks
|
|
212
|
+
in:
|
|
213
|
+
day: inputs.day
|
|
214
|
+
offer: target.offer
|
|
215
|
+
contacts: contacts
|
|
216
|
+
updated_contacts: updated_contacts
|
|
217
|
+
enrichment: enrichment
|
|
218
|
+
do:
|
|
219
|
+
kind: call
|
|
220
|
+
model: default
|
|
221
|
+
prompt: |
|
|
222
|
+
Write the outreach tasks due on {{day}}. A contact in updated_contacts replaces the contact with the same id in contacts.
|
|
223
|
+
Make one task for each contact whose next_action_date is {{day}} or earlier, and one for each contact with status new.
|
|
224
|
+
Skip contacts whose status is customer, closed, or opted_out.
|
|
225
|
+
Set action to the next action, due_date to next_action_date or {{day}} when it is empty, and reason to one sentence.
|
|
226
|
+
Write a short draft email that uses the contact's facts and this offer: {{offer}} Leave draft empty when the task is not an email, such as a meeting.
|
|
227
|
+
Two tasks written the way they should be, for other contacts:
|
|
228
|
+
- A reply that asked for pricing: action "Send pricing", reason "Jordan asked for pricing on 2026-09-15.",
|
|
229
|
+
draft "Hi Jordan, thanks for asking. Pricing starts at $400 a month for one workflow; I attached the one-page summary. Would a 20-minute call next week help?"
|
|
230
|
+
- A new prospect: action "Ask Sam for an introduction", reason "New prospect; Sam knows Priya from their time at Bayside Freight.",
|
|
231
|
+
draft "Hi Sam, could you introduce me to Priya at Coastline Logistics? Her team still handles customer requests by hand, and I think our workflows could help."
|
|
232
|
+
out:
|
|
233
|
+
day_tasks:
|
|
234
|
+
type: list
|
|
235
|
+
fields: {contact_id: text, action: text, due_date: text, reason: text, draft: text}
|
|
236
|
+
description: Tasks and outreach drafts for review.
|
|
237
|
+
check: {kind: run, runtime: python, entrypoint: check_plan.py, args: [tasks]}
|
|
238
|
+
reading:
|
|
239
|
+
check_name: Check tasks
|
|
240
|
+
check: Requires unique tasks with an action and a reason, due by the planned day, for known contacts that are not customers, closed, or opted out.
|
|
241
|
+
|
|
242
|
+
save_day:
|
|
243
|
+
name: Update the CRM and save today's tasks
|
|
244
|
+
purpose: Repeats the contact and task checks, then rejects a changed CRM unless this plan is already saved. Saves new and changed contacts with their owner notes kept, message resolutions, today's tasks, and research notes made from the search and page notes. Returns the replacement for state.crm, the task list, and a receipt. Repeating the same plan reuses its state update and rewrites the same local result files.
|
|
245
|
+
changes: [state.crm]
|
|
246
|
+
in:
|
|
247
|
+
crm: state.crm
|
|
248
|
+
crm_sha256: crm_sha256
|
|
249
|
+
day: inputs.day
|
|
250
|
+
contacts: contacts
|
|
251
|
+
resolved: resolved
|
|
252
|
+
messages: messages
|
|
253
|
+
email_search: email_search
|
|
254
|
+
prospect_search: prospect_search
|
|
255
|
+
enrichment: enrichment
|
|
256
|
+
updated_contacts: updated_contacts
|
|
257
|
+
resolutions: resolutions
|
|
258
|
+
day_tasks: day_tasks
|
|
259
|
+
do: {kind: run, runtime: python, entrypoint: save_day.py}
|
|
260
|
+
out:
|
|
261
|
+
tasks:
|
|
262
|
+
type: file
|
|
263
|
+
description: Daily task list and outreach drafts for review.
|
|
264
|
+
receipt:
|
|
265
|
+
type: file
|
|
266
|
+
description: Saved CRM hash, contact count, and message count.
|
|
267
|
+
check: {file: tasks}
|
|
268
|
+
result:
|
|
269
|
+
tasks: tasks
|
|
270
|
+
receipt: receipt
|
|
271
|
+
run_prompt: Run Manage daily outbound for today using my CRM and new messages. Show me the tasks and outreach drafts for review.
|
|
272
|
+
files:
|
|
273
|
+
- crm.py
|
|
274
|
+
- read_crm.py
|
|
275
|
+
- check_sources.py
|
|
276
|
+
- check_plan.py
|
|
277
|
+
- save_day.py
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"target": {
|
|
3
|
+
"customer": "Operations leaders at small US logistics companies who still process customer requests manually.",
|
|
4
|
+
"offer": "A service that turns repeated work into reusable automated workflows.",
|
|
5
|
+
"new_prospects_per_day": 3,
|
|
6
|
+
"mailbox_url": "https://mail.google.com/mail/u/0/"
|
|
7
|
+
},
|
|
8
|
+
"contacts": [],
|
|
9
|
+
"messages": [],
|
|
10
|
+
"days": {}
|
|
11
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Social research example
|
|
2
|
+
|
|
3
|
+
This Method researches a topic on Grok, alphaXiv, and LinkedIn, then writes a
|
|
4
|
+
briefing with quotes and source links. It uses the SDK's standard browser tools.
|
|
5
|
+
|
|
6
|
+
The Method has two steps:
|
|
7
|
+
|
|
8
|
+
1. `gather_sources` (agent with a browser): opens Grok, alphaXiv, and LinkedIn in
|
|
9
|
+
browser tabs, asks the two quoted questions, searches LinkedIn, and reads the
|
|
10
|
+
useful posts and papers. It returns the sources and its research notes.
|
|
11
|
+
2. `write_briefing` (call): writes the briefing from the collected sources. It
|
|
12
|
+
needs no browser and no tools, so it is a call, not an agent.
|
|
13
|
+
|
|
14
|
+
The result contains the briefing draft, the sources, and the research notes. The
|
|
15
|
+
sample topic and dates are in `inputs.json`; change them for the next run.
|
|
16
|
+
|
|
17
|
+
## Run
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
method run social-briefing.method --inputs inputs.json
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The step selects `browser: environment.browser`. The SDK supplies browser-use's
|
|
24
|
+
standard controls and connects the browser during normal run setup. On macOS, the
|
|
25
|
+
default connection copies the last-used Chrome profile and runs headless. Run
|
|
26
|
+
`method browser connect` to choose another browser.
|
|
27
|
+
|
|
28
|
+
## Two choices in the file
|
|
29
|
+
|
|
30
|
+
- `no_effect_reason`: the browser step only reads. It sends, posts, and submits
|
|
31
|
+
nothing, so there is no change to read back.
|
|
32
|
+
- `accept: {untrusted_content_can_act: ...}`: `validate` warns when an agent that
|
|
33
|
+
reads web pages could also change things with the same browser. Here the agent
|
|
34
|
+
needs the signed-in browser to read, and a person reads the briefing before it
|
|
35
|
+
is shared, so the warning is accepted with that reason.
|
|
36
|
+
|
|
37
|
+
The count check stops an empty source list. It does not show that all three sites
|
|
38
|
+
were covered or that the briefing is good; read the briefing and open its links.
|
|
39
|
+
|
|
40
|
+
`result.fixture.json` is a fictional illustration of the result shape. It is not
|
|
41
|
+
a recorded research result.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"briefing": "Here is the latest on what people are saying on coding agent reliability.\n\nThis fictional fixture shows the result format. Alex says \u201cChecks need to cover the changed behavior.\u201d [Source](https://example.com/research).",
|
|
3
|
+
"sources": [
|
|
4
|
+
{
|
|
5
|
+
"platform": "LinkedIn",
|
|
6
|
+
"author": "Alex (fictional)",
|
|
7
|
+
"published": "2026-09-15",
|
|
8
|
+
"url": "https://example.com/research",
|
|
9
|
+
"quote": "Checks need to cover the changed behavior.",
|
|
10
|
+
"summary": "A fictional source about testing agent changes."
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"research_notes": "Illustrative fixture only. No browser research was run to produce this file."
|
|
14
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
format: method/3.4
|
|
2
|
+
name: Research social posts and papers
|
|
3
|
+
goal: Read recent posts and papers in the browser, then write a briefing with quotes and links.
|
|
4
|
+
inputs:
|
|
5
|
+
topic:
|
|
6
|
+
type: text
|
|
7
|
+
from_date:
|
|
8
|
+
type: text
|
|
9
|
+
description: First publication date, YYYY-MM-DD.
|
|
10
|
+
to_date:
|
|
11
|
+
type: text
|
|
12
|
+
description: Last publication date, YYYY-MM-DD.
|
|
13
|
+
environment:
|
|
14
|
+
browser:
|
|
15
|
+
type: browser
|
|
16
|
+
description: Browser with access to Grok, LinkedIn, and alphaXiv.
|
|
17
|
+
steps:
|
|
18
|
+
gather_sources:
|
|
19
|
+
no_effect_reason: Reads posts and papers in the browser; sends, posts and submits nothing.
|
|
20
|
+
accept:
|
|
21
|
+
untrusted_content_can_act: The agent needs the signed-in browser to read Grok, alphaXiv, and LinkedIn. The prompt asks it only to search and read, and a person reads the briefing before it is shared.
|
|
22
|
+
name: Find and read sources
|
|
23
|
+
changes:
|
|
24
|
+
- environment.browser
|
|
25
|
+
in:
|
|
26
|
+
topic: inputs.topic
|
|
27
|
+
from_date: inputs.from_date
|
|
28
|
+
to_date: inputs.to_date
|
|
29
|
+
do:
|
|
30
|
+
kind: agent
|
|
31
|
+
model: default
|
|
32
|
+
browser: environment.browser
|
|
33
|
+
prompt: |
|
|
34
|
+
Use the browser to research {{topic}} from {{from_date}} through {{to_date}}.
|
|
35
|
+
Open tabs for https://x.com/i/grok, https://www.alphaxiv.org, and https://www.linkedin.com.
|
|
36
|
+
|
|
37
|
+
Ask Grok: "What are people saying on Twitter about {{topic}} from {{from_date}}
|
|
38
|
+
through {{to_date}}? Find useful original posts and disagreements. Give names,
|
|
39
|
+
dates, direct post links, and short exact quotes. Link both sides of each argument."
|
|
40
|
+
|
|
41
|
+
Ask alphaXiv: "Find papers about {{topic}} published from {{from_date}} through
|
|
42
|
+
{{to_date}}. What is new, and what do the papers say? Give titles, authors,
|
|
43
|
+
dates, paper links, and short exact quotes."
|
|
44
|
+
|
|
45
|
+
Search LinkedIn for posts about the same topic and dates. Open and read the
|
|
46
|
+
useful posts and papers. Collect who said what, publication dates, direct
|
|
47
|
+
links, and short exact quotes. In research_notes, record what you searched
|
|
48
|
+
on each site and any pages you could not read.
|
|
49
|
+
out:
|
|
50
|
+
sources:
|
|
51
|
+
type: list
|
|
52
|
+
items:
|
|
53
|
+
type: record
|
|
54
|
+
fields:
|
|
55
|
+
platform:
|
|
56
|
+
type: text
|
|
57
|
+
author:
|
|
58
|
+
type: text
|
|
59
|
+
published:
|
|
60
|
+
type: text
|
|
61
|
+
url:
|
|
62
|
+
type: text
|
|
63
|
+
quote:
|
|
64
|
+
type: text
|
|
65
|
+
description: Short exact quote from the page read; empty when unavailable.
|
|
66
|
+
summary:
|
|
67
|
+
type: text
|
|
68
|
+
research_notes:
|
|
69
|
+
type: text
|
|
70
|
+
check:
|
|
71
|
+
count:
|
|
72
|
+
value: sources
|
|
73
|
+
min: 1
|
|
74
|
+
write_briefing:
|
|
75
|
+
name: Write the briefing
|
|
76
|
+
in:
|
|
77
|
+
topic: inputs.topic
|
|
78
|
+
sources: sources
|
|
79
|
+
research_notes: research_notes
|
|
80
|
+
do:
|
|
81
|
+
kind: call
|
|
82
|
+
model: default
|
|
83
|
+
prompt: |
|
|
84
|
+
Write a briefing from the collected sources. Start with:
|
|
85
|
+
"Here is the latest on what people are saying on {{topic}}."
|
|
86
|
+
|
|
87
|
+
Give a short topline paragraph with highlights from the posts and papers.
|
|
88
|
+
Then use short paragraphs like these:
|
|
89
|
+
|
|
90
|
+
<Name> on Twitter says "<quote>" [link]. <Useful context.>
|
|
91
|
+
|
|
92
|
+
<Name> and <name> are arguing over <issue>: one says "<quote>",
|
|
93
|
+
while the other says "<quote>" [links to both posts].
|
|
94
|
+
|
|
95
|
+
There is a new paper about <finding>. <Authors> say "<quote>" [paper link].
|
|
96
|
+
|
|
97
|
+
Include useful LinkedIn posts in the same style. Describe disagreements
|
|
98
|
+
when the sources show them. Use the collected quotes and put links beside
|
|
99
|
+
each claim. Keep quotes to at most 25 words per source in total.
|
|
100
|
+
When a source has no quote, describe it without quotation marks. When
|
|
101
|
+
research_notes name a site that could not be read, say so in the last sentence.
|
|
102
|
+
out:
|
|
103
|
+
briefing:
|
|
104
|
+
type: text
|
|
105
|
+
description: Briefing draft with source links.
|
|
106
|
+
result:
|
|
107
|
+
briefing: briefing
|
|
108
|
+
sources: sources
|
|
109
|
+
research_notes: research_notes
|
|
110
|
+
run_prompt: Run this Method for the requested topic and dates. Show the briefing draft and its source links.
|