@synap-core/workspace-templates 0.11.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +483 -0
- package/automations/bookmark-enrichment.automation.json +321 -0
- package/automations/github-pr-events.automation.json +505 -0
- package/automations/mail-feed.automation.json +86 -0
- package/automations/ship-a-change-checks-green.automation.json +106 -0
- package/automations/ship-a-change-checks-red.automation.json +106 -0
- package/automations/ship-a-change-deployed.automation.json +56 -0
- package/automations/ship-a-change-pr-merged.automation.json +110 -0
- package/automations/ship-a-change-pr-opened.automation.json +104 -0
- package/automations/url-bookmark-capture.automation.json +132 -0
- package/capabilities/agency-skills.capability.json +157 -0
- package/capabilities/apify.capability.json +265 -0
- package/capabilities/apollo.capability.json +120 -0
- package/capabilities/arch-backend.capability.json +97 -0
- package/capabilities/arch-client-intelligence.capability.json +401 -0
- package/capabilities/backblaze-b2.capability.json +205 -0
- package/capabilities/cal-com.capability.json +266 -0
- package/capabilities/canva.capability.json +274 -0
- package/capabilities/claude-code-routines.capability.json +172 -0
- package/capabilities/claude-managed-agents.capability.json +215 -0
- package/capabilities/client-comms-report.capability.json +246 -0
- package/capabilities/content-idea-to-production.capability.json +29 -0
- package/capabilities/datagouv.capability.json +315 -0
- package/capabilities/discord-bot.capability.json +157 -0
- package/capabilities/dropbox.capability.json +281 -0
- package/capabilities/exa.capability.json +109 -0
- package/capabilities/fal-ai.capability.json +83 -0
- package/capabilities/fal-media-lab.capability.json +158 -0
- package/capabilities/fireflies.capability.json +191 -0
- package/capabilities/freellmapi.capability.json +114 -0
- package/capabilities/generic-apikey.capability.json +92 -0
- package/capabilities/github-merge.capability.json +99 -0
- package/capabilities/github-read.capability.json +325 -0
- package/capabilities/governance-tighten-recommender.capability.json +81 -0
- package/capabilities/jev.capability.json +226 -0
- package/capabilities/lead-conversion-enrollment.capability.json +246 -0
- package/capabilities/mail-feed.capability.json +277 -0
- package/capabilities/mailgun.capability.json +52 -0
- package/capabilities/nango-google.capability.json +639 -0
- package/capabilities/notion.capability.json +417 -0
- package/capabilities/omniroute.capability.json +137 -0
- package/capabilities/posthog-analytics.capability.json +258 -0
- package/capabilities/postiz.capability.json +467 -0
- package/capabilities/proactive-digest.capability.json +190 -0
- package/capabilities/proton.capability.json +288 -0
- package/capabilities/replicate-rvm.capability.json +97 -0
- package/capabilities/research-methods.capability.json +57 -0
- package/capabilities/shopify.capability.json +395 -0
- package/capabilities/slack.capability.json +369 -0
- package/capabilities/stripe.capability.json +420 -0
- package/capabilities/telegram-bridge.capability.json +56 -0
- package/capabilities/treg.capability.json +102 -0
- package/capabilities/unipile-linkedin.capability.json +471 -0
- package/capabilities/vercel.capability.json +424 -0
- package/dist/define-CPS0n8BV.d.ts +1331 -0
- package/dist/index.d.ts +189 -900
- package/dist/index.js +24654 -21639
- package/dist/index.js.map +1 -1
- package/dist/wire.d.ts +222 -0
- package/dist/wire.js +77 -0
- package/dist/wire.js.map +1 -0
- package/package.json +41 -27
- package/packs/bookmark-views-pack.json +33 -0
- package/packs/crm-pack.json +76 -0
- package/packs/customer-profile.json +28 -0
- package/packs/deep-research.playbook.json +30 -0
- package/packs/event-views-pack.json +33 -0
- package/packs/habit-profile.json +27 -0
- package/packs/hr-pack.json +54 -0
- package/packs/invoice-profile.json +28 -0
- package/packs/knowledge-base-pack.json +56 -0
- package/packs/meeting-profile.json +29 -0
- package/packs/product-profile.json +30 -0
- package/packs/project-management-pack.json +49 -0
- package/packs/recipe-profile.json +29 -0
- package/packs/task-views-pack.json +39 -0
- package/retired.yaml +136 -0
- package/skills/app-factory-build-slice/SKILL.md +70 -0
- package/skills/app-factory-build-slice.catalog.json +17 -0
- package/skills/app-factory-design-canvas/SKILL.md +96 -0
- package/skills/app-factory-design-canvas.catalog.json +17 -0
- package/skills/app-factory-design-review/SKILL.md +99 -0
- package/skills/app-factory-design-review.catalog.json +18 -0
- package/skills/app-factory-research/SKILL.md +123 -0
- package/skills/app-factory-research.catalog.json +17 -0
- package/skills/bookmark-enrichment/SKILL.md +40 -0
- package/skills/carousel-format/carousel-format.skill.json +18 -0
- package/skills/collage-broll/collage-broll.skill.json +20 -0
- package/skills/content-taste/content-taste.skill.json +18 -0
- package/skills/creative-director/creative-director.skill.json +18 -0
- package/skills/design-critique/SKILL.md +135 -0
- package/skills/design-critique.catalog.json +12 -0
- package/skills/designing-with-real-components/SKILL.md +140 -0
- package/skills/designing-with-real-components.catalog.json +12 -0
- package/skills/edit-loop/edit-loop.skill.json +25 -0
- package/skills/facecam-edit/facecam-edit.skill.json +24 -0
- package/skills/mapping-the-server/SKILL.md +54 -0
- package/skills/math-explainer-manimgx/math-explainer-manimgx.skill.json +20 -0
- package/skills/motion-quality-gates/motion-quality-gates.skill.json +20 -0
- package/skills/open-design-edit/open-design-edit.skill.json +24 -0
- package/skills/reading-client-progress/SKILL.md +65 -0
- package/skills/routing-to-channels/SKILL.md +54 -0
- package/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
- package/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
- package/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
- package/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
- package/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
- package/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
- package/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
- package/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
- package/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
- package/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
- package/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
- package/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
- package/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
- package/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
- package/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
- package/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
- package/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
- package/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
- package/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
- package/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
- package/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
- package/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
- package/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
- package/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
- package/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
- package/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
- package/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
- package/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
- package/skills/video-direction/video-direction.skill.json +20 -0
- package/skills/video-style-vocabulary/video-style-vocabulary.skill.json +20 -0
- package/skills/video-toolbox/video-toolbox.skill.json +20 -0
- package/src/__fixtures__/lifecycle-presets.flat-before.json +205 -0
- package/src/agency-os.yaml +122 -0
- package/src/agent-os-skill-slugs.test.ts +65 -0
- package/src/apify-social-reader.test.ts +317 -0
- package/src/base.template.test.ts +25 -19
- package/src/base.yaml +95 -39
- package/src/blockchain-ecosystem.yaml +1 -0
- package/src/brand-library.yaml +525 -14
- package/src/builder-dev-fold.template.test.ts +113 -0
- package/src/builder.yaml +798 -92
- package/src/business-model-catalog-description.test.ts +47 -0
- package/src/business-model-grp.template.test.ts +214 -0
- package/src/business-model.yaml +598 -0
- package/src/catalog-safety.test.ts +198 -0
- package/src/catalog.template-items.test.ts +75 -0
- package/src/catalog.ts +85 -2
- package/src/civic-france.yaml +102 -0
- package/src/concept-guard.test.ts +28 -8
- package/src/concept-guard.ts +2 -2
- package/src/content-creation.template.test.ts +52 -0
- package/src/content-creation.yaml +192 -0
- package/src/content-os.edit-loop.template.test.ts +210 -0
- package/src/content-os.publish-due-posts.template.test.ts +261 -0
- package/src/content-os.template.test.ts +322 -0
- package/src/content-os.video-takes.template.test.ts +338 -0
- package/src/content-os.work-a-take.template.test.ts +125 -0
- package/src/content-os.yaml +1830 -39
- package/src/content-studio-retired.template.test.ts +82 -0
- package/src/corpus-flow-validity.test.ts +4 -5
- package/src/crm-absorbs-outreach.template.test.ts +117 -0
- package/src/crm-build-plan.template.test.ts +128 -0
- package/src/crm-lists.template.test.ts +96 -0
- package/src/crm-messages-cadence.template.test.ts +164 -0
- package/src/crm-one-send-door.template.test.ts +65 -0
- package/src/crm.yaml +1456 -181
- package/src/decisions-wave.template.test.ts +186 -0
- package/src/define.ts +130 -17
- package/src/design-to-implementation.template.test.ts +94 -0
- package/src/dist-freshness.test.ts +97 -0
- package/src/domain-template-type.test.ts +75 -0
- package/src/ecosystem.yaml +27 -66
- package/src/enterprise-os.yaml +10 -134
- package/src/facecam-edit.audio-studio.test.ts +188 -0
- package/src/fal-generate-image.test.ts +200 -0
- package/src/fal-media-lab-pod-files.test.ts +180 -0
- package/src/finance.yaml +254 -1
- package/src/foundation.yaml +130 -28
- package/src/frame-host-modules.d.mts +6 -0
- package/src/frame-host-modules.mjs +58 -0
- package/src/generate.mjs +9 -3
- package/src/github-merge.test.ts +210 -0
- package/src/grants.yaml +57 -17
- package/src/hr.yaml +39 -6
- package/src/index.ts +36 -1
- package/src/intent.test.ts +161 -0
- package/src/internal-runbook.yaml +19 -1
- package/src/jev.test.ts +356 -0
- package/src/legal.yaml +33 -1
- package/src/life-os.yaml +65 -240
- package/src/lifecycle-coverage.test.ts +124 -0
- package/src/lifecycle-declarations.test.ts +252 -0
- package/src/lifecycle-presets.test.ts +468 -0
- package/src/lifecycle-presets.ts +494 -0
- package/src/lifecycle-stuck.test.ts +46 -0
- package/src/lifecycle-waits.parity.test.ts +319 -0
- package/src/marketing.yaml +108 -4
- package/src/meetings-knowledge.yaml +18 -0
- package/src/networking.yaml +23 -2
- package/src/operations.yaml +304 -4
- package/src/pipeline-views.template.test.ts +88 -0
- package/src/playbook-goal-placeholders.test.ts +57 -0
- package/src/postiz-contract.test.ts +134 -0
- package/src/presentation-declarations.test.ts +174 -0
- package/src/process-contract.validate.test.ts +352 -0
- package/src/project-management.yaml +39 -740
- package/src/publish-body.d.mts +29 -0
- package/src/publish-body.mjs +74 -0
- package/src/publish-body.test.ts +74 -0
- package/src/publish-official-lib.test.ts +176 -0
- package/src/replicate-rvm.test.ts +504 -0
- package/src/research-base.yaml +119 -20
- package/src/research-decision.yaml +60 -3
- package/src/reserved-profile-slugs.test.ts +83 -0
- package/src/retired-goal-kinds.test.ts +58 -0
- package/src/role-reference-and-step-domain.test.ts +192 -0
- package/src/seed-obligation.test.ts +176 -0
- package/src/send-message-maps.test.ts +227 -0
- package/src/shared-role-ssot.test.ts +42 -1
- package/src/ship-a-change.template.test.ts +177 -0
- package/src/skills.test.ts +170 -0
- package/src/social.yaml +85 -27
- package/src/space-packages.freshness.test.ts +97 -0
- package/src/space-packages.generated.ts +40 -0
- package/src/space-packages.test.ts +125 -0
- package/src/space-packages.ts +73 -0
- package/src/start.test.ts +188 -0
- package/src/task-intents.test.ts +293 -0
- package/src/templates.ts +21639 -21522
- package/src/types.ts +443 -60
- package/src/unipile-publish-post.test.ts +162 -0
- package/src/validate-flow.drift.test.ts +2 -3
- package/src/validate-flow.ts +32 -2
- package/src/validate-onboarding.test.ts +59 -0
- package/src/validate.test.ts +156 -3
- package/src/validate.ts +1384 -7
- package/src/wire-core.ts +231 -0
- package/src/wire.test.ts +159 -0
- package/src/wire.ts +107 -0
- package/src/__fixtures__/report-automation-flow.json +0 -393
- package/src/agent-fleet.yaml +0 -1645
- package/src/business-developer.template.test.ts +0 -351
- package/src/business-developer.yaml +0 -860
- package/src/content-studio.yaml +0 -361
- package/src/dev-dashboard.yaml +0 -990
- package/src/outreach-comms.yaml +0 -486
- package/src/the-arch.yaml +0 -201
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Bookmark Enrichment (auto)",
|
|
3
|
+
"triggerType": "event",
|
|
4
|
+
"status": "active",
|
|
5
|
+
"triggerConfig": {
|
|
6
|
+
"eventPattern": "entity.create.completed",
|
|
7
|
+
"filters": {
|
|
8
|
+
"profileSlug": "bookmark"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"flowDefinition": {
|
|
12
|
+
"nodes": [
|
|
13
|
+
{
|
|
14
|
+
"id": "trigger",
|
|
15
|
+
"type": "trigger",
|
|
16
|
+
"position": {
|
|
17
|
+
"x": 0,
|
|
18
|
+
"y": 0
|
|
19
|
+
},
|
|
20
|
+
"data": {
|
|
21
|
+
"triggerType": "event",
|
|
22
|
+
"label": "Bookmark created",
|
|
23
|
+
"config": {
|
|
24
|
+
"eventPattern": "entity.create.completed",
|
|
25
|
+
"filters": {
|
|
26
|
+
"profileSlug": "bookmark"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "read",
|
|
33
|
+
"type": "entity_read",
|
|
34
|
+
"position": {
|
|
35
|
+
"x": 0,
|
|
36
|
+
"y": 120
|
|
37
|
+
},
|
|
38
|
+
"data": {
|
|
39
|
+
"label": "Read the bookmark",
|
|
40
|
+
"entityId": "{{trigger.payload.subjectId}}"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "graph-context",
|
|
45
|
+
"type": "related_entities",
|
|
46
|
+
"position": {
|
|
47
|
+
"x": 0,
|
|
48
|
+
"y": 240
|
|
49
|
+
},
|
|
50
|
+
"data": {
|
|
51
|
+
"label": "What the graph already connects (deterministic)",
|
|
52
|
+
"entityId": "{{trigger.payload.subjectId}}",
|
|
53
|
+
"direction": "both",
|
|
54
|
+
"limit": 10
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "channel-talk",
|
|
59
|
+
"type": "messages_query",
|
|
60
|
+
"position": {
|
|
61
|
+
"x": 0,
|
|
62
|
+
"y": 360
|
|
63
|
+
},
|
|
64
|
+
"data": {
|
|
65
|
+
"label": "What was being discussed (deterministic)",
|
|
66
|
+
"channelId": "{{steps.read.output.entity.properties.sourceChannelId}}",
|
|
67
|
+
"limit": 10,
|
|
68
|
+
"errorHandling": {
|
|
69
|
+
"continueOnError": true
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"id": "sharer-lookup",
|
|
75
|
+
"type": "query",
|
|
76
|
+
"position": {
|
|
77
|
+
"x": 0,
|
|
78
|
+
"y": 480
|
|
79
|
+
},
|
|
80
|
+
"data": {
|
|
81
|
+
"label": "Resolve the sharer to a person entity (deterministic)",
|
|
82
|
+
"profileSlug": "person",
|
|
83
|
+
"filter": "{\"title\": \"{{steps.read.output.entity.properties.sharedBy}}\"}",
|
|
84
|
+
"limit": 5
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"id": "has-sharer-name",
|
|
89
|
+
"type": "condition",
|
|
90
|
+
"position": {
|
|
91
|
+
"x": 0,
|
|
92
|
+
"y": 600
|
|
93
|
+
},
|
|
94
|
+
"data": {
|
|
95
|
+
"label": "Bookmark carries a sharer name?",
|
|
96
|
+
"expression": "steps.read.output.entity.properties.sharedBy !== ''"
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "sharer-matches",
|
|
101
|
+
"type": "condition",
|
|
102
|
+
"position": {
|
|
103
|
+
"x": 0,
|
|
104
|
+
"y": 720
|
|
105
|
+
},
|
|
106
|
+
"data": {
|
|
107
|
+
"label": "Matched person's title equals the sharer name exactly?",
|
|
108
|
+
"expression": "steps.sharer-lookup.output.entities.0.title === steps.read.output.entity.properties.sharedBy"
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"id": "link-sharer",
|
|
113
|
+
"type": "output",
|
|
114
|
+
"position": {
|
|
115
|
+
"x": 0,
|
|
116
|
+
"y": 840
|
|
117
|
+
},
|
|
118
|
+
"data": {
|
|
119
|
+
"label": "Link bookmark → the person who shared it",
|
|
120
|
+
"outputType": "relation_create",
|
|
121
|
+
"config": {
|
|
122
|
+
"fromEntityId": "{{trigger.payload.subjectId}}",
|
|
123
|
+
"toEntityId": "{{steps.sharer-lookup.output.entities.0.id}}",
|
|
124
|
+
"relationType": "created_by"
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "classify",
|
|
130
|
+
"type": "capability",
|
|
131
|
+
"position": {
|
|
132
|
+
"x": 0,
|
|
133
|
+
"y": 1200
|
|
134
|
+
},
|
|
135
|
+
"data": {
|
|
136
|
+
"label": "Describe + classify (AI) — title only if the captured one is unusable",
|
|
137
|
+
"verbId": "ai.generate",
|
|
138
|
+
"inputMapping": {
|
|
139
|
+
"system": "You name saved links for a personal knowledge base. Answer with a JSON object and nothing else: {\"title\": string, \"description\": string, \"category\": string}. `title` is a short human-readable name for the link (max 70 chars, no URL, no quotes). `description` is one factual sentence (max 200 chars). `category` is ONE lowercase word from: article, video, tool, repo, docs, social, media, other. You CANNOT open the link. Use ONLY the URL, the already-resolved graph context and the surrounding conversation you are given. `description` and `category` are ALWAYS used. `title` is used ONLY when the link has no usable name yet — when 'Current name' below already reads like a real title, it is kept and yours is discarded, so never optimise for replacing it. If the material does not tell you what the page is, set `title` to the empty string rather than guessing.",
|
|
140
|
+
"prompt": "URL: {{steps.read.output.entity.properties.url}}\nCurrent name: {{steps.read.output.entity.title}}\nShared by: {{steps.read.output.entity.properties.sharedBy}}\n\nAlready connected in the graph:\n{{steps.graph-context.output.entities}}\n\nSurrounding conversation in the source channel:\n{{steps.channel-talk.output.messages}}\n\nThe message it arrived in:\n{{steps.read.output.entity.preview}}",
|
|
141
|
+
"json": "true",
|
|
142
|
+
"maxTokens": "2000"
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"id": "apply-enrich",
|
|
148
|
+
"type": "output",
|
|
149
|
+
"position": {
|
|
150
|
+
"x": -400,
|
|
151
|
+
"y": 1500
|
|
152
|
+
},
|
|
153
|
+
"data": {
|
|
154
|
+
"label": "Write description + category back (always)",
|
|
155
|
+
"outputType": "entity_update",
|
|
156
|
+
"config": {
|
|
157
|
+
"entityId": "{{trigger.payload.subjectId}}",
|
|
158
|
+
"properties": {
|
|
159
|
+
"description": "{{steps.classify.output.description}}",
|
|
160
|
+
"category": "{{steps.classify.output.category}}"
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"id": "title-present",
|
|
167
|
+
"type": "condition",
|
|
168
|
+
"position": {
|
|
169
|
+
"x": 400,
|
|
170
|
+
"y": 1350
|
|
171
|
+
},
|
|
172
|
+
"data": {
|
|
173
|
+
"label": "Did the link arrive with a name?",
|
|
174
|
+
"expression": "steps.read.output.entity.title !== ''"
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"id": "title-not-url",
|
|
179
|
+
"type": "condition",
|
|
180
|
+
"position": {
|
|
181
|
+
"x": 400,
|
|
182
|
+
"y": 1470
|
|
183
|
+
},
|
|
184
|
+
"data": {
|
|
185
|
+
"label": "…and is that name more than the raw URL?",
|
|
186
|
+
"expression": "steps.read.output.entity.title !== steps.read.output.entity.properties.url"
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"id": "usable-title",
|
|
191
|
+
"type": "guard",
|
|
192
|
+
"position": {
|
|
193
|
+
"x": 0,
|
|
194
|
+
"y": 1320
|
|
195
|
+
},
|
|
196
|
+
"data": {
|
|
197
|
+
"label": "Only rename when the model produced a real title",
|
|
198
|
+
"checks": [
|
|
199
|
+
{
|
|
200
|
+
"path": "steps.classify.output.title",
|
|
201
|
+
"minLength": 3,
|
|
202
|
+
"message": "ai.generate returned no usable title — leaving the bookmark's captured name untouched."
|
|
203
|
+
}
|
|
204
|
+
]
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"id": "apply-title",
|
|
209
|
+
"type": "output",
|
|
210
|
+
"position": {
|
|
211
|
+
"x": 0,
|
|
212
|
+
"y": 1440
|
|
213
|
+
},
|
|
214
|
+
"data": {
|
|
215
|
+
"label": "Write the AI title back (only when the captured one was unusable)",
|
|
216
|
+
"outputType": "entity_update",
|
|
217
|
+
"config": {
|
|
218
|
+
"entityId": "{{trigger.payload.subjectId}}",
|
|
219
|
+
"title": "{{steps.classify.output.title}}",
|
|
220
|
+
"properties": {
|
|
221
|
+
"title": "{{steps.classify.output.title}}"
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
],
|
|
227
|
+
"edges": [
|
|
228
|
+
{
|
|
229
|
+
"id": "trigger->read",
|
|
230
|
+
"source": "trigger",
|
|
231
|
+
"target": "read"
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"id": "read->graph-context",
|
|
235
|
+
"source": "read",
|
|
236
|
+
"target": "graph-context"
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"id": "graph-context->channel-talk",
|
|
240
|
+
"source": "graph-context",
|
|
241
|
+
"target": "channel-talk"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"id": "channel-talk->sharer-lookup",
|
|
245
|
+
"source": "channel-talk",
|
|
246
|
+
"target": "sharer-lookup"
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"id": "sharer-lookup->has-sharer-name",
|
|
250
|
+
"source": "sharer-lookup",
|
|
251
|
+
"target": "has-sharer-name"
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"id": "has-sharer-name->sharer-matches",
|
|
255
|
+
"source": "has-sharer-name",
|
|
256
|
+
"target": "sharer-matches",
|
|
257
|
+
"sourceHandle": "yes"
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"id": "sharer-matches->link-sharer",
|
|
261
|
+
"source": "sharer-matches",
|
|
262
|
+
"target": "link-sharer",
|
|
263
|
+
"sourceHandle": "yes"
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"id": "link-sharer->classify",
|
|
267
|
+
"source": "link-sharer",
|
|
268
|
+
"target": "classify"
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"id": "has-sharer-name->classify",
|
|
272
|
+
"source": "has-sharer-name",
|
|
273
|
+
"target": "classify",
|
|
274
|
+
"sourceHandle": "no"
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"id": "sharer-matches->classify",
|
|
278
|
+
"source": "sharer-matches",
|
|
279
|
+
"target": "classify",
|
|
280
|
+
"sourceHandle": "no"
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
"id": "classify->apply-enrich",
|
|
284
|
+
"source": "classify",
|
|
285
|
+
"target": "apply-enrich"
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
"id": "classify->title-present",
|
|
289
|
+
"source": "classify",
|
|
290
|
+
"target": "title-present"
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
"id": "title-present->title-not-url",
|
|
294
|
+
"source": "title-present",
|
|
295
|
+
"target": "title-not-url",
|
|
296
|
+
"sourceHandle": "yes"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"id": "title-present->usable-title",
|
|
300
|
+
"source": "title-present",
|
|
301
|
+
"target": "usable-title",
|
|
302
|
+
"sourceHandle": "no"
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"id": "title-not-url->usable-title",
|
|
306
|
+
"source": "title-not-url",
|
|
307
|
+
"target": "usable-title",
|
|
308
|
+
"sourceHandle": "no"
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"id": "usable-title->apply-title",
|
|
312
|
+
"source": "usable-title",
|
|
313
|
+
"target": "apply-title"
|
|
314
|
+
}
|
|
315
|
+
]
|
|
316
|
+
},
|
|
317
|
+
"metadata": {
|
|
318
|
+
"source": "bridge-template",
|
|
319
|
+
"note": "DETERMINISTIC-FIRST. Everything reachable without a network call runs BEFORE the AI: `related_entities` (what the graph already connects to this bookmark — the capture flow's `references` edge to the channel's bound entity lands here), `messages_query` on the captured `sourceChannelId` (what was being discussed), and a `query` on `person` resolving the captured `sharedBy` display name to a real person entity, linked with the EXISTING `created_by` relation def (no new def, no new node type). ai.generate is now the LAST RESORT: it runs only when the captured name is empty OR is the raw URL — the branch `title-present`→`title-not-url` — so a human-written message preview is never overwritten by a guess, and when the AI does run it is handed the deterministic context instead of a bare URL. Two condition merges (`title-present`, `classify`) rely on markDescendantsSkipped's live-parent rule (graph-topology.ts) — a merge node survives as long as ONE incoming edge is unpruned. `sharer-lookup` uses the STRING filter form on purpose: `parseQueryFilterConditions` template-resolves a STRING filter but pushes an OBJECT filter's values RAW, so the object form would have compared the literal `{{...}}` text and silently matched nothing. The `sharer-matches` exact-equality condition is the containment for that string form: if a name with a quote breaks JSON.parse the filter is dropped and the query widens, and this check refuses to link a non-identical title. `messages_query` carries `continueOnError` because it THROWS when the channel is not visible in the automation's workspace. NOT expressible today: host→company/tool matching. `transform` has no host/hostname pipe and the query filter compiles only exact equality ($eq/$gt/$gte/$lt/$lte/$ne — no substring/LIKE), so a host could never be matched against a `website` property holding a full URL. A page `fetch` is deliberately still absent."
|
|
320
|
+
}
|
|
321
|
+
}
|