@synap-core/workspace-templates 0.6.0 → 0.6.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/dist/index.js CHANGED
@@ -1,3 +1,11 @@
1
+ // src/types.ts
2
+ var PACKAGE_DEPENDENCY_KINDS = [
3
+ "workspace",
4
+ "capability",
5
+ /** @deprecated Retired by CP 0049 in favour of `workflow`. See note above. */
6
+ "automation"
7
+ ];
8
+
1
9
  // src/templates.ts
2
10
  var DATA = {
3
11
  "agent-fleet": {
@@ -2341,6 +2349,7 @@ var DATA = {
2341
2349
  "viewName": "Agent Fleet Home",
2342
2350
  "blocks": [
2343
2351
  {
2352
+ "kind": "widget",
2344
2353
  "widgetType": "welcome-header",
2345
2354
  "pos": {
2346
2355
  "x": 0,
@@ -2354,6 +2363,7 @@ var DATA = {
2354
2363
  }
2355
2364
  },
2356
2365
  {
2366
+ "kind": "widget",
2357
2367
  "widgetType": "entity-count",
2358
2368
  "pos": {
2359
2369
  "x": 0,
@@ -2368,6 +2378,7 @@ var DATA = {
2368
2378
  }
2369
2379
  },
2370
2380
  {
2381
+ "kind": "widget",
2371
2382
  "widgetType": "entity-count",
2372
2383
  "pos": {
2373
2384
  "x": 3,
@@ -2382,6 +2393,7 @@ var DATA = {
2382
2393
  }
2383
2394
  },
2384
2395
  {
2396
+ "kind": "widget",
2385
2397
  "widgetType": "entity-count",
2386
2398
  "pos": {
2387
2399
  "x": 6,
@@ -2396,6 +2408,7 @@ var DATA = {
2396
2408
  }
2397
2409
  },
2398
2410
  {
2411
+ "kind": "widget",
2399
2412
  "widgetType": "entity-count",
2400
2413
  "pos": {
2401
2414
  "x": 9,
@@ -2410,6 +2423,7 @@ var DATA = {
2410
2423
  }
2411
2424
  },
2412
2425
  {
2426
+ "kind": "widget",
2413
2427
  "widgetType": "entity-spotlight",
2414
2428
  "pos": {
2415
2429
  "x": 0,
@@ -2426,6 +2440,7 @@ var DATA = {
2426
2440
  }
2427
2441
  },
2428
2442
  {
2443
+ "kind": "widget",
2429
2444
  "widgetType": "entity-list",
2430
2445
  "pos": {
2431
2446
  "x": 4,
@@ -2441,6 +2456,7 @@ var DATA = {
2441
2456
  }
2442
2457
  },
2443
2458
  {
2459
+ "kind": "widget",
2444
2460
  "widgetType": "entity-list",
2445
2461
  "pos": {
2446
2462
  "x": 8,
@@ -6502,6 +6518,26 @@ var DATA = {
6502
6518
  "label": "Depends on"
6503
6519
  }
6504
6520
  ],
6521
+ "playbooks": [
6522
+ {
6523
+ "name": "Evaluate Feature",
6524
+ "description": "Assess a feature \u2014 its current state, whether it's worth building, and how it fits the rest of the system.",
6525
+ "goalTemplate": "Evaluate this feature ({feature}): where it stands today (its status, progress, and any blockers), whether it is actually useful (the problem it solves and for whom), and how it integrates with the existing apps, packages, services, and environments in this workspace. Finish with a clear recommendation \u2014 continue, cut, or reshape \u2014 and the reasoning behind it.",
6526
+ "subjectProfile": {
6527
+ "profileSlug": "devplane_feature"
6528
+ },
6529
+ "params": [
6530
+ {
6531
+ "name": "feature",
6532
+ "type": "entity",
6533
+ "label": "Feature",
6534
+ "required": true
6535
+ }
6536
+ ],
6537
+ "executor": "is-agent",
6538
+ "status": "active"
6539
+ }
6540
+ ],
6505
6541
  "onboarding": {
6506
6542
  "goal": "Capture the real engineering surface \u2014 the apps that are shipped, where their code lives, what runs behind them, where they deploy, and what's in flight \u2014 so the workspace mirrors what the team actually builds and runs, not a generic template.",
6507
6543
  "framing": "THE STAFF ENGINEER: Act as a pragmatic, precise staff/platform engineer standing up a developer command center. Tease out what's actually shipped vs. planned, where the code lives (repos + local paths), what runs behind each app, where it deploys, and what's on the bench right now. Prefer concrete over aspirational \u2014 a repo URL beats a wish. Tie the roadmap back to the Foundation's mission and audiences: the surface exists to serve them.\n",
@@ -6753,7 +6789,7 @@ var DATA = {
6753
6789
  "narrative.positioning"
6754
6790
  ],
6755
6791
  "sourceRoles": {
6756
- "brand": "provider",
6792
+ "brand": "consumer",
6757
6793
  "narrative": "provider"
6758
6794
  }
6759
6795
  },
@@ -7834,762 +7870,1155 @@ var DATA = {
7834
7870
  ]
7835
7871
  }
7836
7872
  },
7837
- "content-studio": {
7873
+ "content-os": {
7838
7874
  "meta": {
7839
- "slug": "content-studio",
7840
- "name": "Content Studio",
7841
- "description": "HyperFrames + Remotion video pipeline \u2014 script, design, compose, render, publish.",
7842
- "icon": "clapperboard",
7843
- "color": "violet",
7875
+ "slug": "content-os",
7876
+ "name": "Content OS",
7877
+ "description": "Your editorial operating system \u2014 pillars, posts, platforms, and newsletters. Turn raw thinking into a published content engine, all connected to your campaigns and brand voice.",
7878
+ "icon": "pen-tool",
7879
+ "color": "#6366F1",
7844
7880
  "tags": [
7845
7881
  "content",
7846
- "video",
7847
- "creation",
7848
- "pipeline"
7882
+ "editorial",
7883
+ "publishing",
7884
+ "creator",
7885
+ "newsletter"
7849
7886
  ],
7850
7887
  "isPublic": true
7851
7888
  },
7889
+ "dependencies": [
7890
+ {
7891
+ "slug": "foundation",
7892
+ "kind": "workspace",
7893
+ "relation": "require",
7894
+ "reason": "Provides the pod-wide sponsor role vocabulary this workspace's posts/newsletters reference."
7895
+ },
7896
+ {
7897
+ "slug": "marketing-campaign",
7898
+ "kind": "workspace",
7899
+ "relation": "require",
7900
+ "reason": "Provides the campaign kind (and its SSOT property body) this workspace's posts/newsletters link to."
7901
+ }
7902
+ ],
7852
7903
  "workspace": {
7853
- "name": "Content Studio",
7854
- "description": "Content creation pipeline \u2014 HyperFrames for rapid design, Remotion for production rendering. Create videos, carousels, reels, and social content from one workspace.\n",
7855
- "proposalId": "content-studio-v1",
7856
- "subtype": "content-studio",
7904
+ "name": "Content OS",
7905
+ "description": "The editorial operating system \u2014 a view-driven workspace over your content model. Organize by pillar, track every post from Idea to Published, run your platforms and newsletters, and keep it all wired to the campaigns and brand voice that give it context.\n",
7906
+ "proposalId": "content-os-v1",
7907
+ "subtype": "content-os",
7857
7908
  "visibility": "pod_visible",
7858
7909
  "capabilities": [
7859
- "content.pipeline",
7860
- "content.compose",
7861
- "content.render",
7862
- "content.assets",
7863
- "content.templates"
7910
+ "content.editorial",
7911
+ "content.pillars",
7912
+ "content.calendar",
7913
+ "content.newsletter"
7864
7914
  ],
7865
7915
  "sourceRoles": {
7866
7916
  "brand": "consumer",
7917
+ "marketing": "consumer",
7867
7918
  "content": "provider"
7868
7919
  }
7869
7920
  },
7870
7921
  "profiles": [
7871
7922
  {
7872
- "slug": "content-pipeline",
7873
- "displayName": "Pipeline",
7874
- "icon": "workflow",
7875
- "color": "violet",
7876
- "description": "A content creation pipeline: script \u2192 design \u2192 compose \u2192 render.",
7877
- "semanticSlug": "content.pipeline",
7923
+ "slug": "post",
7924
+ "displayName": "Post",
7925
+ "icon": "file-edit",
7926
+ "color": "#6366F1",
7927
+ "description": "Your atomic content unit. One idea, multiple platform formats \u2014 tracked from spark to publication.",
7928
+ "scope": "WORKSPACE",
7878
7929
  "properties": [
7879
7930
  {
7880
- "slug": "pipeline-kind",
7881
- "label": "Kind",
7931
+ "slug": "post-status",
7932
+ "label": "Status",
7882
7933
  "valueType": "string",
7883
7934
  "inputType": "select",
7884
7935
  "enumValues": [
7885
- "reel",
7886
- "carousel",
7887
- "demo",
7888
- "explainer",
7889
- "custom"
7890
- ],
7891
- "constraints": {
7892
- "defaultValue": "reel"
7893
- }
7936
+ "Idea",
7937
+ "Briefed",
7938
+ "In Draft",
7939
+ "Review",
7940
+ "Scheduled",
7941
+ "Published",
7942
+ "Archived"
7943
+ ]
7894
7944
  },
7895
7945
  {
7896
- "slug": "pipeline-platform",
7897
- "label": "Platform",
7946
+ "slug": "post-format",
7947
+ "label": "Format",
7898
7948
  "valueType": "string",
7899
7949
  "inputType": "select",
7900
7950
  "enumValues": [
7901
- "instagram",
7902
- "tiktok",
7903
- "youtube",
7904
- "linkedin",
7905
- "x",
7906
- "all"
7907
- ],
7908
- "constraints": {
7909
- "defaultValue": "instagram"
7910
- }
7951
+ "Article",
7952
+ "Thread",
7953
+ "Short Video",
7954
+ "Long Video",
7955
+ "Carousel",
7956
+ "Image Post",
7957
+ "Story",
7958
+ "Newsletter Section",
7959
+ "Podcast Episode",
7960
+ "Other"
7961
+ ]
7911
7962
  },
7912
7963
  {
7913
- "slug": "pipeline-mode",
7914
- "label": "Mode",
7964
+ "slug": "post-platform",
7965
+ "label": "Platform",
7915
7966
  "valueType": "string",
7916
7967
  "inputType": "select",
7917
7968
  "enumValues": [
7918
- "fast",
7919
- "quality",
7920
- "data"
7921
- ],
7922
- "constraints": {
7923
- "defaultValue": "quality"
7924
- }
7969
+ "LinkedIn",
7970
+ "Instagram",
7971
+ "TikTok",
7972
+ "YouTube",
7973
+ "Twitter / X",
7974
+ "Threads",
7975
+ "Bluesky",
7976
+ "Newsletter",
7977
+ "Podcast",
7978
+ "Blog",
7979
+ "Other"
7980
+ ]
7925
7981
  },
7926
7982
  {
7927
- "slug": "pipeline-script",
7928
- "label": "Script",
7929
- "valueType": "string",
7930
- "inputType": "textarea"
7983
+ "slug": "post-pillar",
7984
+ "label": "Pillar",
7985
+ "valueType": "entity_id",
7986
+ "targetProfileSlug": "pillar",
7987
+ "inputType": "entity_select"
7931
7988
  },
7932
7989
  {
7933
- "slug": "pipeline-stages",
7934
- "label": "Stages",
7935
- "valueType": "string",
7936
- "inputType": "textarea"
7937
- }
7938
- ]
7939
- },
7940
- {
7941
- "slug": "content-composition",
7942
- "displayName": "Composition",
7943
- "icon": "clapperboard",
7944
- "color": "blue",
7945
- "description": "A Remotion composition or HyperFrames sequence ready for rendering.",
7946
- "semanticSlug": "content.composition",
7947
- "properties": [
7990
+ "slug": "post-campaign",
7991
+ "label": "Campaign",
7992
+ "valueType": "entity_id",
7993
+ "targetProfileSlug": "campaign",
7994
+ "inputType": "entity_select"
7995
+ },
7948
7996
  {
7949
- "slug": "composition-id",
7950
- "label": "Composition ID",
7997
+ "slug": "post-sponsor",
7998
+ "label": "Sponsor",
7999
+ "valueType": "entity_id",
8000
+ "targetProfileSlug": "sponsor",
8001
+ "inputType": "entity_select"
8002
+ },
8003
+ {
8004
+ "slug": "publish-date",
8005
+ "label": "Publish Date",
8006
+ "valueType": "date"
8007
+ },
8008
+ {
8009
+ "slug": "post-hook",
8010
+ "label": "Hook / Headline",
7951
8011
  "valueType": "string",
7952
- "inputType": "text"
8012
+ "inputType": "text",
8013
+ "placeholder": "Opening line or headline that stops the scroll"
7953
8014
  },
7954
8015
  {
7955
- "slug": "aspect-ratio",
7956
- "label": "Aspect Ratio",
8016
+ "slug": "post-cta",
8017
+ "label": "CTA",
7957
8018
  "valueType": "string",
7958
- "inputType": "select",
7959
- "enumValues": [
7960
- "9:16",
7961
- "16:9",
7962
- "1:1",
7963
- "4:5"
7964
- ],
7965
- "constraints": {
7966
- "defaultValue": "16:9"
7967
- }
8019
+ "inputType": "text",
8020
+ "placeholder": "What should the audience do?"
7968
8021
  },
7969
8022
  {
7970
- "slug": "duration-seconds",
7971
- "label": "Duration (seconds)",
8023
+ "slug": "post-tags",
8024
+ "label": "Tags",
8025
+ "valueType": "array"
8026
+ },
8027
+ {
8028
+ "slug": "engagement-score",
8029
+ "label": "Engagement Score",
7972
8030
  "valueType": "number",
7973
- "inputType": "number"
8031
+ "inputType": "number",
8032
+ "placeholder": "Numeric performance metric (likes + comments + shares)"
7974
8033
  },
7975
8034
  {
7976
- "slug": "hyperframes-meta",
7977
- "label": "HyperFrames JSON",
7978
- "valueType": "string",
7979
- "inputType": "textarea"
8035
+ "slug": "post-reach",
8036
+ "label": "Reach / Views",
8037
+ "valueType": "number",
8038
+ "inputType": "number"
7980
8039
  },
7981
8040
  {
7982
- "slug": "template-id",
7983
- "label": "Template",
8041
+ "slug": "repurposed-from",
8042
+ "label": "Repurposed From",
7984
8043
  "valueType": "string",
7985
- "inputType": "text"
8044
+ "inputType": "text",
8045
+ "placeholder": "Source post or content this was adapted from"
7986
8046
  },
7987
8047
  {
7988
- "slug": "pipeline-ref",
7989
- "label": "Pipeline",
8048
+ "slug": "post-url",
8049
+ "label": "Published URL",
7990
8050
  "valueType": "string",
7991
- "inputType": "text"
8051
+ "inputType": "text",
8052
+ "placeholder": "https://...",
8053
+ "constraints": {
8054
+ "format": "url"
8055
+ }
7992
8056
  }
7993
8057
  ]
7994
8058
  },
7995
8059
  {
7996
- "slug": "content-asset",
7997
- "displayName": "Asset",
7998
- "icon": "image",
7999
- "color": "green",
8000
- "description": "Media asset: image, video clip, audio track, font, or script.",
8001
- "semanticSlug": "content.asset",
8060
+ "slug": "pillar",
8061
+ "displayName": "Pillar",
8062
+ "icon": "columns",
8063
+ "color": "#8B5CF6",
8064
+ "description": "A recurring content theme \u2014 the lens through which your audience knows you. The organizing principle of your brand.",
8065
+ "scope": "WORKSPACE",
8002
8066
  "properties": [
8003
8067
  {
8004
- "slug": "asset-kind",
8005
- "label": "Kind",
8068
+ "slug": "pillar-status",
8069
+ "label": "Status",
8006
8070
  "valueType": "string",
8007
8071
  "inputType": "select",
8008
8072
  "enumValues": [
8009
- "image",
8010
- "video",
8011
- "audio",
8012
- "font",
8013
- "script",
8014
- "other"
8073
+ "Active",
8074
+ "Developing",
8075
+ "Paused",
8076
+ "Retired"
8015
8077
  ]
8016
8078
  },
8017
8079
  {
8018
- "slug": "source-kind",
8019
- "label": "Source",
8080
+ "slug": "pillar-audience",
8081
+ "label": "Audience Segment",
8020
8082
  "valueType": "string",
8021
- "inputType": "select",
8022
- "enumValues": [
8023
- "uploaded",
8024
- "brand",
8025
- "generated"
8026
- ],
8027
- "constraints": {
8028
- "defaultValue": "uploaded"
8029
- }
8083
+ "inputType": "text",
8084
+ "placeholder": "Who does this pillar speak to?"
8030
8085
  },
8031
8086
  {
8032
- "slug": "source-url",
8033
- "label": "URL",
8087
+ "slug": "pillar-goal",
8088
+ "label": "Audience Goal",
8034
8089
  "valueType": "string",
8035
- "inputType": "url"
8090
+ "inputType": "text",
8091
+ "placeholder": "What should the audience think, feel, or do after consuming this pillar?"
8036
8092
  },
8037
8093
  {
8038
- "slug": "brand-asset-ref",
8039
- "label": "Brand Asset Ref",
8094
+ "slug": "pillar-formats",
8095
+ "label": "Primary Formats",
8040
8096
  "valueType": "string",
8041
- "inputType": "text"
8097
+ "inputType": "select",
8098
+ "enumValues": [
8099
+ "Articles + Threads",
8100
+ "Short Video",
8101
+ "Long Video",
8102
+ "Newsletter",
8103
+ "Podcast",
8104
+ "Carousel",
8105
+ "Mixed"
8106
+ ]
8042
8107
  },
8043
8108
  {
8044
- "slug": "file-id",
8045
- "label": "File ID",
8109
+ "slug": "post-count-pillar",
8110
+ "label": "Total Posts Published",
8111
+ "valueType": "number",
8112
+ "inputType": "number"
8113
+ },
8114
+ {
8115
+ "slug": "avg-engagement",
8116
+ "label": "Avg Engagement Score",
8117
+ "valueType": "number",
8118
+ "inputType": "number"
8119
+ },
8120
+ {
8121
+ "slug": "top-post",
8122
+ "label": "Top Performing Post",
8046
8123
  "valueType": "string",
8047
- "inputType": "text"
8124
+ "inputType": "text",
8125
+ "placeholder": "Title of best performing post in this pillar"
8048
8126
  },
8049
8127
  {
8050
- "slug": "document-id",
8051
- "label": "Document ID",
8128
+ "slug": "posting-frequency",
8129
+ "label": "Target Frequency",
8052
8130
  "valueType": "string",
8053
- "inputType": "text"
8131
+ "inputType": "select",
8132
+ "enumValues": [
8133
+ "Daily",
8134
+ "3x / week",
8135
+ "2x / week",
8136
+ "Weekly",
8137
+ "Bi-weekly",
8138
+ "Monthly",
8139
+ "Ad hoc"
8140
+ ]
8141
+ },
8142
+ {
8143
+ "slug": "pillar-tags",
8144
+ "label": "Tags",
8145
+ "valueType": "array"
8054
8146
  }
8055
8147
  ]
8056
8148
  },
8057
8149
  {
8058
- "slug": "render-job",
8059
- "displayName": "Render Job",
8060
- "icon": "play",
8061
- "color": "amber",
8062
- "description": "A render execution \u2014 queued, rendering, done, or failed.",
8063
- "semanticSlug": "content.render",
8150
+ "slug": "platform",
8151
+ "displayName": "Platform",
8152
+ "icon": "share-2",
8153
+ "color": "#06B6D4",
8154
+ "description": "A social account, newsletter publication, or podcast channel. Each platform has its own audience metrics and publishing rhythm.",
8155
+ "scope": "WORKSPACE",
8064
8156
  "properties": [
8065
8157
  {
8066
- "slug": "job-status",
8067
- "label": "Status",
8158
+ "slug": "platform-type",
8159
+ "label": "Type",
8068
8160
  "valueType": "string",
8069
8161
  "inputType": "select",
8070
8162
  "enumValues": [
8071
- "queued",
8072
- "rendering",
8073
- "done",
8074
- "failed"
8075
- ],
8076
- "constraints": {
8077
- "defaultValue": "queued"
8078
- }
8163
+ "LinkedIn",
8164
+ "Instagram",
8165
+ "TikTok",
8166
+ "YouTube",
8167
+ "Twitter / X",
8168
+ "Threads",
8169
+ "Bluesky",
8170
+ "Newsletter",
8171
+ "Podcast",
8172
+ "Blog / Website",
8173
+ "Other"
8174
+ ]
8079
8175
  },
8080
8176
  {
8081
- "slug": "output-format",
8082
- "label": "Format",
8177
+ "slug": "platform-status",
8178
+ "label": "Status",
8083
8179
  "valueType": "string",
8084
8180
  "inputType": "select",
8085
8181
  "enumValues": [
8086
- "mp4",
8087
- "gif",
8088
- "webm",
8089
- "mp3"
8090
- ],
8091
- "constraints": {
8092
- "defaultValue": "mp4"
8093
- }
8182
+ "Active",
8183
+ "Building",
8184
+ "Maintenance Mode",
8185
+ "Inactive"
8186
+ ]
8094
8187
  },
8095
8188
  {
8096
- "slug": "output-url",
8097
- "label": "Output URL",
8189
+ "slug": "platform-url",
8190
+ "label": "Profile URL",
8098
8191
  "valueType": "string",
8099
- "inputType": "url"
8192
+ "inputType": "text",
8193
+ "placeholder": "https://...",
8194
+ "constraints": {
8195
+ "format": "url"
8196
+ }
8100
8197
  },
8101
8198
  {
8102
- "slug": "render-duration-ms",
8103
- "label": "Render Duration (ms)",
8199
+ "slug": "follower-count",
8200
+ "label": "Follower / Subscriber Count",
8104
8201
  "valueType": "number",
8105
8202
  "inputType": "number"
8106
8203
  },
8107
8204
  {
8108
- "slug": "error-message",
8109
- "label": "Error",
8110
- "valueType": "string",
8111
- "inputType": "textarea"
8205
+ "slug": "follower-target",
8206
+ "label": "Target Count",
8207
+ "valueType": "number",
8208
+ "inputType": "number"
8112
8209
  },
8113
8210
  {
8114
- "slug": "composition-ref",
8115
- "label": "Composition",
8116
- "valueType": "string",
8117
- "inputType": "text"
8118
- }
8119
- ]
8120
- },
8121
- {
8122
- "slug": "content-template",
8123
- "displayName": "Template",
8124
- "icon": "layout-template",
8125
- "color": "pink",
8126
- "description": "Reusable video template \u2014 HyperFrames, Remotion, or hybrid.",
8127
- "semanticSlug": "content.template",
8128
- "properties": [
8211
+ "slug": "avg-engagement-rate",
8212
+ "label": "Avg Engagement Rate (%)",
8213
+ "valueType": "number",
8214
+ "inputType": "number"
8215
+ },
8129
8216
  {
8130
- "slug": "template-kind",
8131
- "label": "Kind",
8217
+ "slug": "platform-posting-freq",
8218
+ "label": "Posting Frequency",
8132
8219
  "valueType": "string",
8133
8220
  "inputType": "select",
8134
8221
  "enumValues": [
8135
- "hyperframes",
8136
- "remotion",
8137
- "hybrid"
8138
- ],
8139
- "constraints": {
8140
- "defaultValue": "hyperframes"
8141
- }
8222
+ "Daily",
8223
+ "3x / week",
8224
+ "2x / week",
8225
+ "Weekly",
8226
+ "Bi-weekly",
8227
+ "Monthly",
8228
+ "As Needed"
8229
+ ]
8142
8230
  },
8143
8231
  {
8144
- "slug": "aspect-ratio",
8145
- "label": "Aspect Ratio",
8146
- "valueType": "string",
8147
- "inputType": "select",
8148
- "enumValues": [
8149
- "9:16",
8150
- "16:9",
8151
- "1:1",
8152
- "4:5"
8153
- ],
8154
- "constraints": {
8155
- "defaultValue": "16:9"
8156
- }
8232
+ "slug": "last-post-date",
8233
+ "label": "Last Post Date",
8234
+ "valueType": "date"
8157
8235
  },
8158
8236
  {
8159
- "slug": "template-status",
8160
- "label": "Status",
8237
+ "slug": "platform-notes",
8238
+ "label": "Notes",
8161
8239
  "valueType": "string",
8162
- "inputType": "select",
8163
- "enumValues": [
8164
- "draft",
8165
- "approved",
8166
- "deprecated"
8167
- ],
8168
- "constraints": {
8169
- "defaultValue": "approved"
8170
- }
8240
+ "inputType": "text",
8241
+ "placeholder": "What works here? Tone, format, best times..."
8171
8242
  },
8172
8243
  {
8173
- "slug": "template-config",
8174
- "label": "Config JSON",
8175
- "valueType": "string",
8176
- "inputType": "textarea"
8244
+ "slug": "platform-tags",
8245
+ "label": "Tags",
8246
+ "valueType": "array"
8177
8247
  }
8178
8248
  ]
8179
8249
  },
8180
8250
  {
8181
- "slug": "post",
8182
- "displayName": "Post",
8183
- "icon": "file-edit",
8184
- "color": "#6366F1",
8185
- "description": "Your atomic content unit. One idea, multiple platform formats \u2014 tracked from spark to publication.",
8251
+ "slug": "newsletter",
8252
+ "displayName": "Newsletter",
8253
+ "icon": "mail",
8254
+ "color": "#10B981",
8255
+ "description": "A newsletter issue \u2014 your direct channel to an owned audience. No algorithm, no platform fee, no intermediary.",
8186
8256
  "scope": "WORKSPACE",
8187
8257
  "properties": [
8188
8258
  {
8189
- "slug": "post-status",
8259
+ "slug": "newsletter-status",
8190
8260
  "label": "Status",
8191
8261
  "valueType": "string",
8192
8262
  "inputType": "select",
8193
8263
  "enumValues": [
8194
8264
  "Idea",
8195
- "Briefed",
8196
- "In Draft",
8197
- "Review",
8265
+ "Drafting",
8266
+ "Editing",
8198
8267
  "Scheduled",
8199
- "Published",
8268
+ "Sent",
8200
8269
  "Archived"
8201
8270
  ]
8202
8271
  },
8203
8272
  {
8204
- "slug": "post-format",
8205
- "label": "Format",
8273
+ "slug": "newsletter-series",
8274
+ "label": "Series",
8206
8275
  "valueType": "string",
8207
- "inputType": "select",
8208
- "enumValues": [
8209
- "Article",
8210
- "Thread",
8211
- "Short Video",
8212
- "Long Video",
8213
- "Carousel",
8214
- "Image Post",
8215
- "Story",
8216
- "Newsletter Section",
8217
- "Podcast Episode",
8218
- "Other"
8219
- ]
8220
- },
8221
- {
8222
- "slug": "post-platform",
8223
- "label": "Platform",
8224
- "valueType": "string",
8225
- "inputType": "select",
8226
- "enumValues": [
8227
- "LinkedIn",
8228
- "Instagram",
8229
- "TikTok",
8230
- "YouTube",
8231
- "Twitter / X",
8232
- "Threads",
8233
- "Bluesky",
8234
- "Newsletter",
8235
- "Podcast",
8236
- "Blog",
8237
- "Other"
8238
- ]
8239
- },
8240
- {
8241
- "slug": "post-pillar",
8242
- "label": "Pillar",
8243
- "valueType": "entity_id"
8244
- },
8245
- {
8246
- "slug": "post-campaign",
8247
- "label": "Campaign",
8248
- "valueType": "entity_id"
8249
- },
8250
- {
8251
- "slug": "post-sponsor",
8252
- "label": "Sponsor",
8253
- "valueType": "entity_id"
8276
+ "inputType": "text",
8277
+ "placeholder": "Which newsletter series is this issue part of?"
8254
8278
  },
8255
8279
  {
8256
- "slug": "publish-date",
8257
- "label": "Publish Date",
8258
- "valueType": "date"
8280
+ "slug": "issue-number",
8281
+ "label": "Issue Number",
8282
+ "valueType": "number",
8283
+ "inputType": "number"
8259
8284
  },
8260
8285
  {
8261
- "slug": "post-hook",
8262
- "label": "Hook / Headline",
8286
+ "slug": "subject-line",
8287
+ "label": "Subject Line",
8263
8288
  "valueType": "string",
8264
8289
  "inputType": "text",
8265
- "placeholder": "Opening line or headline that stops the scroll"
8290
+ "placeholder": "The subject line \u2014 your most important copy"
8266
8291
  },
8267
8292
  {
8268
- "slug": "post-cta",
8269
- "label": "CTA",
8293
+ "slug": "preview-text",
8294
+ "label": "Preview Text",
8270
8295
  "valueType": "string",
8271
8296
  "inputType": "text",
8272
- "placeholder": "What should the audience do?"
8297
+ "placeholder": "45-character preview shown in inbox (after subject)"
8273
8298
  },
8274
8299
  {
8275
- "slug": "post-tags",
8276
- "label": "Tags",
8277
- "valueType": "array"
8300
+ "slug": "send-date",
8301
+ "label": "Send Date",
8302
+ "valueType": "date"
8278
8303
  },
8279
8304
  {
8280
- "slug": "engagement-score",
8281
- "label": "Engagement Score",
8305
+ "slug": "subscriber-count",
8306
+ "label": "Subscriber Count at Send",
8282
8307
  "valueType": "number",
8283
- "inputType": "number",
8284
- "placeholder": "Numeric performance metric (likes + comments + shares)"
8308
+ "inputType": "number"
8285
8309
  },
8286
8310
  {
8287
- "slug": "post-reach",
8288
- "label": "Reach / Views",
8311
+ "slug": "open-rate",
8312
+ "label": "Open Rate (%)",
8289
8313
  "valueType": "number",
8290
8314
  "inputType": "number"
8291
8315
  },
8292
8316
  {
8293
- "slug": "repurposed-from",
8294
- "label": "Repurposed From",
8295
- "valueType": "string",
8296
- "inputType": "text",
8297
- "placeholder": "Source post or content this was adapted from"
8317
+ "slug": "click-rate",
8318
+ "label": "Click Rate (%)",
8319
+ "valueType": "number",
8320
+ "inputType": "number"
8298
8321
  },
8299
8322
  {
8300
- "slug": "post-url",
8301
- "label": "Published URL",
8302
- "valueType": "string",
8303
- "inputType": "text",
8304
- "placeholder": "https://...",
8305
- "constraints": {
8306
- "format": "url"
8307
- }
8323
+ "slug": "newsletter-sponsor",
8324
+ "label": "Sponsor",
8325
+ "valueType": "entity_id",
8326
+ "targetProfileSlug": "sponsor",
8327
+ "inputType": "entity_select"
8328
+ },
8329
+ {
8330
+ "slug": "newsletter-campaign",
8331
+ "label": "Campaign",
8332
+ "valueType": "entity_id",
8333
+ "targetProfileSlug": "campaign",
8334
+ "inputType": "entity_select"
8335
+ },
8336
+ {
8337
+ "slug": "newsletter-pillar",
8338
+ "label": "Primary Pillar",
8339
+ "valueType": "entity_id",
8340
+ "targetProfileSlug": "pillar",
8341
+ "inputType": "entity_select"
8342
+ },
8343
+ {
8344
+ "slug": "newsletter-tags",
8345
+ "label": "Tags",
8346
+ "valueType": "array"
8308
8347
  }
8309
8348
  ]
8310
8349
  },
8311
8350
  {
8312
- "slug": "pillar",
8313
- "displayName": "Pillar",
8314
- "icon": "columns",
8315
- "color": "#8B5CF6",
8316
- "description": "A recurring content theme \u2014 the lens through which your audience knows you. The organizing principle of your brand.",
8317
- "scope": "WORKSPACE",
8351
+ "slug": "campaign",
8352
+ "displayName": "Campaign",
8353
+ "icon": "megaphone",
8354
+ "color": "pink",
8355
+ "description": "A marketing campaign \u2014 email, social, event, content, or partnership",
8356
+ "semanticSlug": "marketing.campaign",
8318
8357
  "properties": [
8319
8358
  {
8320
- "slug": "pillar-status",
8359
+ "slug": "campaign-status",
8321
8360
  "label": "Status",
8322
8361
  "valueType": "string",
8323
8362
  "inputType": "select",
8324
8363
  "enumValues": [
8325
- "Active",
8326
- "Developing",
8327
- "Paused",
8328
- "Retired"
8329
- ]
8364
+ "planning",
8365
+ "active",
8366
+ "paused",
8367
+ "completed",
8368
+ "cancelled"
8369
+ ],
8370
+ "constraints": {
8371
+ "defaultValue": "planning"
8372
+ }
8330
8373
  },
8331
8374
  {
8332
- "slug": "pillar-audience",
8333
- "label": "Audience Segment",
8375
+ "slug": "campaign-channel",
8376
+ "label": "Channel",
8334
8377
  "valueType": "string",
8335
- "inputType": "text",
8336
- "placeholder": "Who does this pillar speak to?"
8378
+ "inputType": "select",
8379
+ "enumValues": [
8380
+ "email",
8381
+ "social",
8382
+ "event",
8383
+ "content",
8384
+ "partnership",
8385
+ "paid",
8386
+ "organic",
8387
+ "other"
8388
+ ]
8337
8389
  },
8338
8390
  {
8339
- "slug": "pillar-goal",
8340
- "label": "Audience Goal",
8391
+ "slug": "campaign-goal",
8392
+ "label": "Goal",
8341
8393
  "valueType": "string",
8342
- "inputType": "text",
8343
- "placeholder": "What should the audience think, feel, or do after consuming this pillar?"
8394
+ "inputType": "textarea"
8344
8395
  },
8345
8396
  {
8346
- "slug": "pillar-formats",
8347
- "label": "Primary Formats",
8397
+ "slug": "campaign-target-audience",
8398
+ "label": "Target Audience",
8348
8399
  "valueType": "string",
8349
- "inputType": "select",
8350
- "enumValues": [
8351
- "Articles + Threads",
8352
- "Short Video",
8353
- "Long Video",
8354
- "Newsletter",
8355
- "Podcast",
8356
- "Carousel",
8357
- "Mixed"
8358
- ]
8400
+ "inputType": "textarea"
8359
8401
  },
8360
8402
  {
8361
- "slug": "post-count-pillar",
8362
- "label": "Total Posts Published",
8403
+ "slug": "campaign-start-date",
8404
+ "label": "Start Date",
8405
+ "valueType": "date",
8406
+ "inputType": "date"
8407
+ },
8408
+ {
8409
+ "slug": "campaign-end-date",
8410
+ "label": "End Date",
8411
+ "valueType": "date",
8412
+ "inputType": "date"
8413
+ },
8414
+ {
8415
+ "slug": "campaign-budget",
8416
+ "label": "Budget",
8363
8417
  "valueType": "number",
8364
8418
  "inputType": "number"
8365
8419
  },
8366
8420
  {
8367
- "slug": "avg-engagement",
8368
- "label": "Avg Engagement Score",
8421
+ "slug": "campaign-lead-count",
8422
+ "label": "Lead Count",
8369
8423
  "valueType": "number",
8370
8424
  "inputType": "number"
8371
8425
  },
8372
8426
  {
8373
- "slug": "top-post",
8374
- "label": "Top Performing Post",
8375
- "valueType": "string",
8376
- "inputType": "text",
8377
- "placeholder": "Title of best performing post in this pillar"
8427
+ "slug": "campaign-conversion-rate",
8428
+ "label": "Conversion Rate (%)",
8429
+ "valueType": "number",
8430
+ "inputType": "number"
8378
8431
  },
8379
8432
  {
8380
- "slug": "posting-frequency",
8381
- "label": "Target Frequency",
8433
+ "slug": "campaign-notes",
8434
+ "label": "Notes",
8382
8435
  "valueType": "string",
8383
- "inputType": "select",
8384
- "enumValues": [
8385
- "Daily",
8386
- "3x / week",
8387
- "2x / week",
8388
- "Weekly",
8389
- "Bi-weekly",
8390
- "Monthly",
8391
- "Ad hoc"
8392
- ]
8393
- },
8394
- {
8395
- "slug": "pillar-tags",
8396
- "label": "Tags",
8397
- "valueType": "array"
8436
+ "inputType": "textarea"
8398
8437
  }
8399
8438
  ]
8400
8439
  },
8401
8440
  {
8402
- "slug": "platform",
8403
- "displayName": "Platform",
8404
- "icon": "share-2",
8405
- "color": "#06B6D4",
8406
- "description": "A social account, newsletter publication, or podcast channel. Each platform has its own audience metrics and publishing rhythm.",
8407
- "scope": "WORKSPACE",
8441
+ "slug": "sponsor",
8442
+ "displayName": "Sponsor",
8443
+ "icon": "hand-coins",
8444
+ "color": "amber",
8445
+ "description": "A backer or sponsor of a program, round, or event.",
8446
+ "scope": "shared",
8447
+ "profileKind": "role",
8448
+ "applicableKinds": [
8449
+ "person",
8450
+ "company"
8451
+ ],
8408
8452
  "properties": [
8409
8453
  {
8410
- "slug": "platform-type",
8411
- "label": "Type",
8412
- "valueType": "string",
8454
+ "slug": "sponsorStatus",
8455
+ "label": "Status",
8456
+ "valueType": "string",
8413
8457
  "inputType": "select",
8414
8458
  "enumValues": [
8415
- "LinkedIn",
8416
- "Instagram",
8417
- "TikTok",
8418
- "YouTube",
8419
- "Twitter / X",
8420
- "Threads",
8421
- "Bluesky",
8422
- "Newsletter",
8423
- "Podcast",
8424
- "Blog / Website",
8425
- "Other"
8459
+ "prospect",
8460
+ "active",
8461
+ "paused"
8426
8462
  ]
8427
8463
  },
8428
8464
  {
8429
- "slug": "platform-status",
8430
- "label": "Status",
8465
+ "slug": "sponsorType",
8466
+ "label": "Sponsor Type",
8467
+ "valueType": "string",
8468
+ "inputType": "text"
8469
+ },
8470
+ {
8471
+ "slug": "notes",
8472
+ "label": "Notes",
8473
+ "valueType": "string",
8474
+ "inputType": "textarea"
8475
+ }
8476
+ ]
8477
+ }
8478
+ ],
8479
+ "views": [
8480
+ {
8481
+ "name": "Posts",
8482
+ "slug": "content-posts",
8483
+ "type": "kanban",
8484
+ "scopeProfileSlug": "post",
8485
+ "groupBy": "post-status",
8486
+ "description": "Content posts by status."
8487
+ },
8488
+ {
8489
+ "name": "Pillars",
8490
+ "slug": "content-pillars",
8491
+ "type": "list",
8492
+ "scopeProfileSlug": "pillar",
8493
+ "description": "Content pillars \u2014 the recurring themes."
8494
+ },
8495
+ {
8496
+ "name": "Platforms",
8497
+ "slug": "content-platforms",
8498
+ "type": "table",
8499
+ "scopeProfileSlug": "platform",
8500
+ "description": "Channels and their audience metrics."
8501
+ },
8502
+ {
8503
+ "name": "Newsletters",
8504
+ "slug": "content-newsletters",
8505
+ "type": "kanban",
8506
+ "scopeProfileSlug": "newsletter",
8507
+ "groupBy": "newsletter-status",
8508
+ "description": "Newsletter issues by status."
8509
+ }
8510
+ ],
8511
+ "app": {
8512
+ "kind": "stored",
8513
+ "cellKey": "entity-detail"
8514
+ },
8515
+ "layout": {
8516
+ "pinnedApps": [
8517
+ "dashboard",
8518
+ "data"
8519
+ ],
8520
+ "defaultView": "Posts",
8521
+ "defaultApp": null,
8522
+ "sidebarItems": [
8523
+ {
8524
+ "kind": "view",
8525
+ "viewName": "Posts",
8526
+ "label": "Posts",
8527
+ "icon": "file-edit"
8528
+ },
8529
+ {
8530
+ "kind": "view",
8531
+ "viewName": "Pillars",
8532
+ "label": "Pillars",
8533
+ "icon": "columns"
8534
+ },
8535
+ {
8536
+ "kind": "view",
8537
+ "viewName": "Platforms",
8538
+ "label": "Platforms",
8539
+ "icon": "share-2"
8540
+ },
8541
+ {
8542
+ "kind": "view",
8543
+ "viewName": "Newsletters",
8544
+ "label": "Newsletters",
8545
+ "icon": "mail"
8546
+ }
8547
+ ]
8548
+ },
8549
+ "bento": {
8550
+ "viewName": "Posts",
8551
+ "blocks": [
8552
+ {
8553
+ "kind": "view",
8554
+ "viewName": "Pillars",
8555
+ "pos": {
8556
+ "x": 0,
8557
+ "y": 0,
8558
+ "w": 6,
8559
+ "h": 5
8560
+ }
8561
+ },
8562
+ {
8563
+ "kind": "view",
8564
+ "viewName": "Newsletters",
8565
+ "pos": {
8566
+ "x": 6,
8567
+ "y": 0,
8568
+ "w": 6,
8569
+ "h": 5
8570
+ }
8571
+ }
8572
+ ]
8573
+ },
8574
+ "entityLinks": [
8575
+ {
8576
+ "sourceProfileSlug": "post",
8577
+ "targetProfileSlug": "campaign",
8578
+ "type": "part_of_campaign",
8579
+ "label": "Campaign"
8580
+ },
8581
+ {
8582
+ "sourceProfileSlug": "post",
8583
+ "targetProfileSlug": "pillar",
8584
+ "type": "belongs_to_pillar",
8585
+ "label": "Pillar"
8586
+ },
8587
+ {
8588
+ "sourceProfileSlug": "post",
8589
+ "targetProfileSlug": "sponsor",
8590
+ "type": "sponsored_by",
8591
+ "label": "Sponsor"
8592
+ }
8593
+ ],
8594
+ "playbooks": [
8595
+ {
8596
+ "name": "Produce Content",
8597
+ "description": "Take a captured post idea and carry it from spark to a scheduled, platform-ready draft.",
8598
+ "goalTemplate": "Produce content for {platform} from this idea ({post}). Take the raw idea, shape it into a {format} draft with a scroll-stopping hook and a clear CTA, keep it aligned to the post's pillar and the operator's brand voice, then move it to Scheduled with a publish date.",
8599
+ "subjectProfile": {
8600
+ "profileSlug": "post"
8601
+ },
8602
+ "params": [
8603
+ {
8604
+ "name": "post",
8605
+ "type": "entity",
8606
+ "label": "Post",
8607
+ "required": true
8608
+ },
8609
+ {
8610
+ "name": "platform",
8611
+ "type": "text",
8612
+ "label": "Platform",
8613
+ "required": true
8614
+ },
8615
+ {
8616
+ "name": "format",
8617
+ "type": "text",
8618
+ "label": "Format"
8619
+ }
8620
+ ],
8621
+ "executor": "is-agent",
8622
+ "status": "active"
8623
+ }
8624
+ ],
8625
+ "onboarding": {
8626
+ "goal": "Stand up the editorial engine \u2014 the pillars you're known for, the platforms you publish on, the cadence you can actually sustain, and a first post placed in the system \u2014 so the workspace mirrors how you turn thinking into published content, not a blank calendar.\n",
8627
+ "framing": `THE EDITOR-IN-CHIEF: Act as a seasoned content strategist who has grown owned audiences from zero. Anchor everything on PILLARS \u2014 the two-to-four recurring themes an audience comes to you for \u2014 because pillars are what make a content engine compound instead of drift. Pull voice and identity from Brand and the target audience from Foundation so every piece lands on-strategy. Push for a cadence they can hold for a year, not a heroic month. Be concrete: real platforms, real formats, a real first post \u2014 a fuzzy "I'll post more" helps no one.
8628
+ `,
8629
+ "expertise": {
8630
+ "starters": [
8631
+ "Pillars before posts. A creator known for 2\u20134 clear themes compounds; one posting about everything stays noise. Propose naming the pillars FIRST \u2014 each with the audience it speaks to and the transformation it delivers \u2014 then hang every post off one of them.\n",
8632
+ "Cadence you can sustain beats cadence that impresses. A weekly post held for a year outperforms daily-for-three-weeks-then-silence. Propose a realistic per-platform frequency and let the calendar enforce it, rather than an ambitious number that collapses.\n",
8633
+ "One idea, many formats \u2014 design for repurposing from the start. A single strong thought becomes a thread, a short video, a newsletter section, and a carousel. Propose the repurpose chain up front so one capture yields a week of output, tracked via `repurposed-from`.\n"
8634
+ ],
8635
+ "blindSpots": [
8636
+ "No pillars = brand drift. If they list a dozen post ideas but can't name the 2\u20134 themes underneath, that's the gap \u2014 surface it before filling the calendar, because unpillared posting never builds an identity.\n",
8637
+ "The owned-audience channel is the one most creators under-invest in. If they're all-in on algorithmic platforms with no newsletter or list, name it: the newsletter is the audience they actually own when a platform changes the rules.\n",
8638
+ "Chasing every platform at once guarantees all of them stay shallow. If they name five channels, push back: which ONE or two get real cadence and attention now, and which are experiments?\n"
8639
+ ],
8640
+ "bar": "The workspace reads like a running publication: a handful of named pillars each tied to an audience, the platforms actually committed to with a sustainable cadence, an owned newsletter channel, and a first post placed in a pillar \u2014 so a strategist could see at a glance what the brand is about, where it publishes, and what ships next.\n"
8641
+ },
8642
+ "collect": [
8643
+ {
8644
+ "profileSlug": "pillar",
8645
+ "what": "The recurring themes you're known for \u2014 the 2\u20134 lenses your audience comes to you for, each with the segment it speaks to and the goal it serves.",
8646
+ "cardinality": "few",
8647
+ "keyFields": [
8648
+ "pillar-status",
8649
+ "pillar-audience",
8650
+ "pillar-formats"
8651
+ ]
8652
+ },
8653
+ {
8654
+ "profileSlug": "platform",
8655
+ "what": "The channels you actually publish on \u2014 the social accounts, newsletter, or podcast \u2014 with their status and the cadence you can hold.",
8656
+ "cardinality": "several",
8657
+ "keyFields": [
8658
+ "platform-type",
8659
+ "platform-status",
8660
+ "platform-posting-freq"
8661
+ ]
8662
+ },
8663
+ {
8664
+ "profileSlug": "post",
8665
+ "what": "A first post or two already in motion, each placed on a pillar and a platform at its true status (Idea through Published).",
8666
+ "cardinality": "few",
8667
+ "keyFields": [
8668
+ "post-status",
8669
+ "post-format",
8670
+ "post-platform"
8671
+ ]
8672
+ }
8673
+ ],
8674
+ "openingQuestions": [
8675
+ "What are the 2\u20134 themes your audience comes to you for \u2014 the pillars everything you make ties back to?",
8676
+ "Which platforms do you actually publish on, and what cadence can you genuinely sustain on each?",
8677
+ "Do you run (or want) a newsletter \u2014 the audience you own outright \u2014 and what's the first post you'd place in the system?"
8678
+ ],
8679
+ "doneWhen": "at least one pillar + one platform with a cadence + a first post placed on a pillar."
8680
+ }
8681
+ },
8682
+ "content-studio": {
8683
+ "meta": {
8684
+ "slug": "content-studio",
8685
+ "name": "Content Studio",
8686
+ "description": "HyperFrames + Remotion video pipeline \u2014 script, design, compose, render, publish.",
8687
+ "icon": "clapperboard",
8688
+ "color": "violet",
8689
+ "tags": [
8690
+ "content",
8691
+ "video",
8692
+ "creation",
8693
+ "pipeline"
8694
+ ],
8695
+ "isPublic": true
8696
+ },
8697
+ "workspace": {
8698
+ "name": "Content Studio",
8699
+ "description": "Content creation pipeline \u2014 HyperFrames for rapid design, Remotion for production rendering. Create videos, carousels, reels, and social content from one workspace.\n",
8700
+ "proposalId": "content-studio-v1",
8701
+ "subtype": "content-studio",
8702
+ "visibility": "pod_visible",
8703
+ "capabilities": [
8704
+ "content.pipeline",
8705
+ "content.compose",
8706
+ "content.render",
8707
+ "content.assets",
8708
+ "content.templates"
8709
+ ],
8710
+ "sourceRoles": {
8711
+ "brand": "consumer",
8712
+ "content": "provider"
8713
+ }
8714
+ },
8715
+ "profiles": [
8716
+ {
8717
+ "slug": "content-pipeline",
8718
+ "displayName": "Pipeline",
8719
+ "icon": "workflow",
8720
+ "color": "violet",
8721
+ "description": "A content creation pipeline: script \u2192 design \u2192 compose \u2192 render.",
8722
+ "semanticSlug": "content.pipeline",
8723
+ "properties": [
8724
+ {
8725
+ "slug": "pipeline-kind",
8726
+ "label": "Kind",
8431
8727
  "valueType": "string",
8432
8728
  "inputType": "select",
8433
8729
  "enumValues": [
8434
- "Active",
8435
- "Building",
8436
- "Maintenance Mode",
8437
- "Inactive"
8730
+ "reel",
8731
+ "carousel",
8732
+ "demo",
8733
+ "explainer",
8734
+ "custom"
8735
+ ],
8736
+ "constraints": {
8737
+ "defaultValue": "reel"
8738
+ }
8739
+ },
8740
+ {
8741
+ "slug": "pipeline-platform",
8742
+ "label": "Platform",
8743
+ "valueType": "string",
8744
+ "inputType": "select",
8745
+ "enumValues": [
8746
+ "instagram",
8747
+ "tiktok",
8748
+ "youtube",
8749
+ "linkedin",
8750
+ "x",
8751
+ "all"
8752
+ ],
8753
+ "constraints": {
8754
+ "defaultValue": "instagram"
8755
+ }
8756
+ },
8757
+ {
8758
+ "slug": "pipeline-mode",
8759
+ "label": "Mode",
8760
+ "valueType": "string",
8761
+ "inputType": "select",
8762
+ "enumValues": [
8763
+ "fast",
8764
+ "quality",
8765
+ "data"
8766
+ ],
8767
+ "constraints": {
8768
+ "defaultValue": "quality"
8769
+ }
8770
+ },
8771
+ {
8772
+ "slug": "pipeline-script",
8773
+ "label": "Script",
8774
+ "valueType": "string",
8775
+ "inputType": "textarea"
8776
+ },
8777
+ {
8778
+ "slug": "pipeline-stages",
8779
+ "label": "Stages",
8780
+ "valueType": "string",
8781
+ "inputType": "textarea"
8782
+ }
8783
+ ]
8784
+ },
8785
+ {
8786
+ "slug": "content-composition",
8787
+ "displayName": "Composition",
8788
+ "icon": "clapperboard",
8789
+ "color": "blue",
8790
+ "description": "A Remotion composition or HyperFrames sequence ready for rendering.",
8791
+ "semanticSlug": "content.composition",
8792
+ "properties": [
8793
+ {
8794
+ "slug": "composition-id",
8795
+ "label": "Composition ID",
8796
+ "valueType": "string",
8797
+ "inputType": "text"
8798
+ },
8799
+ {
8800
+ "slug": "aspect-ratio",
8801
+ "label": "Aspect Ratio",
8802
+ "valueType": "string",
8803
+ "inputType": "select",
8804
+ "enumValues": [
8805
+ "9:16",
8806
+ "16:9",
8807
+ "1:1",
8808
+ "4:5"
8809
+ ],
8810
+ "constraints": {
8811
+ "defaultValue": "16:9"
8812
+ }
8813
+ },
8814
+ {
8815
+ "slug": "duration-seconds",
8816
+ "label": "Duration (seconds)",
8817
+ "valueType": "number",
8818
+ "inputType": "number"
8819
+ },
8820
+ {
8821
+ "slug": "hyperframes-meta",
8822
+ "label": "HyperFrames JSON",
8823
+ "valueType": "string",
8824
+ "inputType": "textarea"
8825
+ },
8826
+ {
8827
+ "slug": "template-id",
8828
+ "label": "Template",
8829
+ "valueType": "string",
8830
+ "inputType": "text"
8831
+ },
8832
+ {
8833
+ "slug": "pipeline-ref",
8834
+ "label": "Pipeline",
8835
+ "valueType": "string",
8836
+ "inputType": "text"
8837
+ }
8838
+ ]
8839
+ },
8840
+ {
8841
+ "slug": "content-asset",
8842
+ "displayName": "Asset",
8843
+ "icon": "image",
8844
+ "color": "green",
8845
+ "description": "Media asset: image, video clip, audio track, font, or script.",
8846
+ "semanticSlug": "content.asset",
8847
+ "properties": [
8848
+ {
8849
+ "slug": "asset-kind",
8850
+ "label": "Kind",
8851
+ "valueType": "string",
8852
+ "inputType": "select",
8853
+ "enumValues": [
8854
+ "image",
8855
+ "video",
8856
+ "audio",
8857
+ "font",
8858
+ "script",
8859
+ "other"
8438
8860
  ]
8439
8861
  },
8440
8862
  {
8441
- "slug": "platform-url",
8442
- "label": "Profile URL",
8863
+ "slug": "source-kind",
8864
+ "label": "Source",
8443
8865
  "valueType": "string",
8444
- "inputType": "text",
8445
- "placeholder": "https://...",
8866
+ "inputType": "select",
8867
+ "enumValues": [
8868
+ "uploaded",
8869
+ "brand",
8870
+ "generated"
8871
+ ],
8446
8872
  "constraints": {
8447
- "format": "url"
8873
+ "defaultValue": "uploaded"
8448
8874
  }
8449
8875
  },
8450
8876
  {
8451
- "slug": "follower-count",
8452
- "label": "Follower / Subscriber Count",
8453
- "valueType": "number",
8454
- "inputType": "number"
8455
- },
8456
- {
8457
- "slug": "follower-target",
8458
- "label": "Target Count",
8459
- "valueType": "number",
8460
- "inputType": "number"
8461
- },
8462
- {
8463
- "slug": "avg-engagement-rate",
8464
- "label": "Avg Engagement Rate (%)",
8465
- "valueType": "number",
8466
- "inputType": "number"
8467
- },
8468
- {
8469
- "slug": "platform-posting-freq",
8470
- "label": "Posting Frequency",
8877
+ "slug": "source-url",
8878
+ "label": "URL",
8471
8879
  "valueType": "string",
8472
- "inputType": "select",
8473
- "enumValues": [
8474
- "Daily",
8475
- "3x / week",
8476
- "2x / week",
8477
- "Weekly",
8478
- "Bi-weekly",
8479
- "Monthly",
8480
- "As Needed"
8481
- ]
8880
+ "inputType": "url"
8482
8881
  },
8483
8882
  {
8484
- "slug": "last-post-date",
8485
- "label": "Last Post Date",
8486
- "valueType": "date"
8883
+ "slug": "brand-asset-ref",
8884
+ "label": "Brand Asset Ref",
8885
+ "valueType": "string",
8886
+ "inputType": "text"
8487
8887
  },
8488
8888
  {
8489
- "slug": "platform-notes",
8490
- "label": "Notes",
8889
+ "slug": "file-id",
8890
+ "label": "File ID",
8491
8891
  "valueType": "string",
8492
- "inputType": "text",
8493
- "placeholder": "What works here? Tone, format, best times..."
8892
+ "inputType": "text"
8494
8893
  },
8495
8894
  {
8496
- "slug": "platform-tags",
8497
- "label": "Tags",
8498
- "valueType": "array"
8895
+ "slug": "document-id",
8896
+ "label": "Document ID",
8897
+ "valueType": "string",
8898
+ "inputType": "text"
8499
8899
  }
8500
8900
  ]
8501
8901
  },
8502
8902
  {
8503
- "slug": "newsletter",
8504
- "displayName": "Newsletter",
8505
- "icon": "mail",
8506
- "color": "#10B981",
8507
- "description": "A newsletter issue \u2014 your direct channel to an owned audience. No algorithm, no platform fee, no intermediary.",
8508
- "scope": "WORKSPACE",
8903
+ "slug": "render-job",
8904
+ "displayName": "Render Job",
8905
+ "icon": "play",
8906
+ "color": "amber",
8907
+ "description": "A render execution \u2014 queued, rendering, done, or failed.",
8908
+ "semanticSlug": "content.render",
8509
8909
  "properties": [
8510
8910
  {
8511
- "slug": "newsletter-status",
8911
+ "slug": "job-status",
8512
8912
  "label": "Status",
8513
8913
  "valueType": "string",
8514
8914
  "inputType": "select",
8515
8915
  "enumValues": [
8516
- "Idea",
8517
- "Drafting",
8518
- "Editing",
8519
- "Scheduled",
8520
- "Sent",
8521
- "Archived"
8522
- ]
8523
- },
8524
- {
8525
- "slug": "newsletter-series",
8526
- "label": "Series",
8527
- "valueType": "string",
8528
- "inputType": "text",
8529
- "placeholder": "Which newsletter series is this issue part of?"
8530
- },
8531
- {
8532
- "slug": "issue-number",
8533
- "label": "Issue Number",
8534
- "valueType": "number",
8535
- "inputType": "number"
8916
+ "queued",
8917
+ "rendering",
8918
+ "done",
8919
+ "failed"
8920
+ ],
8921
+ "constraints": {
8922
+ "defaultValue": "queued"
8923
+ }
8536
8924
  },
8537
8925
  {
8538
- "slug": "subject-line",
8539
- "label": "Subject Line",
8926
+ "slug": "output-format",
8927
+ "label": "Format",
8540
8928
  "valueType": "string",
8541
- "inputType": "text",
8542
- "placeholder": "The subject line \u2014 your most important copy"
8929
+ "inputType": "select",
8930
+ "enumValues": [
8931
+ "mp4",
8932
+ "gif",
8933
+ "webm",
8934
+ "mp3"
8935
+ ],
8936
+ "constraints": {
8937
+ "defaultValue": "mp4"
8938
+ }
8543
8939
  },
8544
8940
  {
8545
- "slug": "preview-text",
8546
- "label": "Preview Text",
8941
+ "slug": "output-url",
8942
+ "label": "Output URL",
8547
8943
  "valueType": "string",
8548
- "inputType": "text",
8549
- "placeholder": "45-character preview shown in inbox (after subject)"
8550
- },
8551
- {
8552
- "slug": "send-date",
8553
- "label": "Send Date",
8554
- "valueType": "date"
8944
+ "inputType": "url"
8555
8945
  },
8556
8946
  {
8557
- "slug": "subscriber-count",
8558
- "label": "Subscriber Count at Send",
8947
+ "slug": "render-duration-ms",
8948
+ "label": "Render Duration (ms)",
8559
8949
  "valueType": "number",
8560
8950
  "inputType": "number"
8561
8951
  },
8562
8952
  {
8563
- "slug": "open-rate",
8564
- "label": "Open Rate (%)",
8565
- "valueType": "number",
8566
- "inputType": "number"
8953
+ "slug": "error-message",
8954
+ "label": "Error",
8955
+ "valueType": "string",
8956
+ "inputType": "textarea"
8567
8957
  },
8568
8958
  {
8569
- "slug": "click-rate",
8570
- "label": "Click Rate (%)",
8571
- "valueType": "number",
8572
- "inputType": "number"
8573
- },
8959
+ "slug": "composition-ref",
8960
+ "label": "Composition",
8961
+ "valueType": "string",
8962
+ "inputType": "text"
8963
+ }
8964
+ ]
8965
+ },
8966
+ {
8967
+ "slug": "content-template",
8968
+ "displayName": "Template",
8969
+ "icon": "layout-template",
8970
+ "color": "pink",
8971
+ "description": "Reusable video template \u2014 HyperFrames, Remotion, or hybrid.",
8972
+ "semanticSlug": "content.template",
8973
+ "properties": [
8574
8974
  {
8575
- "slug": "newsletter-sponsor",
8576
- "label": "Sponsor",
8577
- "valueType": "entity_id"
8975
+ "slug": "template-kind",
8976
+ "label": "Kind",
8977
+ "valueType": "string",
8978
+ "inputType": "select",
8979
+ "enumValues": [
8980
+ "hyperframes",
8981
+ "remotion",
8982
+ "hybrid"
8983
+ ],
8984
+ "constraints": {
8985
+ "defaultValue": "hyperframes"
8986
+ }
8578
8987
  },
8579
8988
  {
8580
- "slug": "newsletter-campaign",
8581
- "label": "Campaign",
8582
- "valueType": "entity_id"
8989
+ "slug": "aspect-ratio",
8990
+ "label": "Aspect Ratio",
8991
+ "valueType": "string",
8992
+ "inputType": "select",
8993
+ "enumValues": [
8994
+ "9:16",
8995
+ "16:9",
8996
+ "1:1",
8997
+ "4:5"
8998
+ ],
8999
+ "constraints": {
9000
+ "defaultValue": "16:9"
9001
+ }
8583
9002
  },
8584
9003
  {
8585
- "slug": "newsletter-pillar",
8586
- "label": "Primary Pillar",
8587
- "valueType": "entity_id"
9004
+ "slug": "template-status",
9005
+ "label": "Status",
9006
+ "valueType": "string",
9007
+ "inputType": "select",
9008
+ "enumValues": [
9009
+ "draft",
9010
+ "approved",
9011
+ "deprecated"
9012
+ ],
9013
+ "constraints": {
9014
+ "defaultValue": "approved"
9015
+ }
8588
9016
  },
8589
9017
  {
8590
- "slug": "newsletter-tags",
8591
- "label": "Tags",
8592
- "valueType": "array"
9018
+ "slug": "template-config",
9019
+ "label": "Config JSON",
9020
+ "valueType": "string",
9021
+ "inputType": "textarea"
8593
9022
  }
8594
9023
  ]
8595
9024
  }
@@ -8626,39 +9055,9 @@ var DATA = {
8626
9055
  {
8627
9056
  "name": "Templates",
8628
9057
  "slug": "content-templates",
8629
- "type": "grid",
8630
- "scopeProfileSlug": "content-template",
8631
- "description": "Reusable video templates."
8632
- },
8633
- {
8634
- "name": "Posts",
8635
- "slug": "content-posts",
8636
- "type": "kanban",
8637
- "scopeProfileSlug": "post",
8638
- "groupBy": "post-status",
8639
- "description": "Content posts by status."
8640
- },
8641
- {
8642
- "name": "Pillars",
8643
- "slug": "content-pillars",
8644
- "type": "list",
8645
- "scopeProfileSlug": "pillar",
8646
- "description": "Content pillars \u2014 the recurring themes."
8647
- },
8648
- {
8649
- "name": "Platforms",
8650
- "slug": "content-platforms",
8651
- "type": "table",
8652
- "scopeProfileSlug": "platform",
8653
- "description": "Channels and their audience metrics."
8654
- },
8655
- {
8656
- "name": "Newsletters",
8657
- "slug": "content-newsletters",
8658
- "type": "kanban",
8659
- "scopeProfileSlug": "newsletter",
8660
- "groupBy": "newsletter-status",
8661
- "description": "Newsletter issues by status."
9058
+ "type": "grid",
9059
+ "scopeProfileSlug": "content-template",
9060
+ "description": "Reusable video templates."
8662
9061
  }
8663
9062
  ],
8664
9063
  "app": {
@@ -8719,30 +9118,6 @@ var DATA = {
8719
9118
  "viewName": "Templates",
8720
9119
  "label": "Templates",
8721
9120
  "icon": "layout-template"
8722
- },
8723
- {
8724
- "kind": "view",
8725
- "viewName": "Posts",
8726
- "label": "Posts",
8727
- "icon": "file-edit"
8728
- },
8729
- {
8730
- "kind": "view",
8731
- "viewName": "Pillars",
8732
- "label": "Pillars",
8733
- "icon": "columns"
8734
- },
8735
- {
8736
- "kind": "view",
8737
- "viewName": "Platforms",
8738
- "label": "Platforms",
8739
- "icon": "share-2"
8740
- },
8741
- {
8742
- "kind": "view",
8743
- "viewName": "Newsletters",
8744
- "label": "Newsletters",
8745
- "icon": "mail"
8746
9121
  }
8747
9122
  ]
8748
9123
  },
@@ -9085,33 +9460,275 @@ var DATA = {
9085
9460
  "inputType": "number"
9086
9461
  },
9087
9462
  {
9088
- "slug": "closeDate",
9089
- "label": "Expected close date",
9463
+ "slug": "closeDate",
9464
+ "label": "Expected close date",
9465
+ "valueType": "date",
9466
+ "inputType": "date"
9467
+ },
9468
+ {
9469
+ "slug": "nextStep",
9470
+ "label": "Next step",
9471
+ "valueType": "string",
9472
+ "inputType": "textarea"
9473
+ },
9474
+ {
9475
+ "slug": "description",
9476
+ "label": "Notes",
9477
+ "valueType": "string",
9478
+ "inputType": "textarea"
9479
+ },
9480
+ {
9481
+ "slug": "handoffStatus",
9482
+ "label": "Handoff status",
9483
+ "valueType": "string",
9484
+ "inputType": "select",
9485
+ "enumValues": [
9486
+ "pending",
9487
+ "ready",
9488
+ "handed_off"
9489
+ ]
9490
+ }
9491
+ ]
9492
+ },
9493
+ {
9494
+ "slug": "client",
9495
+ "displayName": "Client",
9496
+ "icon": "briefcase",
9497
+ "color": "emerald",
9498
+ "description": "An active commercial relationship \u2014 created when a deal is won.",
9499
+ "scope": "shared",
9500
+ "profileKind": "role",
9501
+ "applicableKinds": [
9502
+ "company",
9503
+ "person"
9504
+ ],
9505
+ "properties": [
9506
+ {
9507
+ "slug": "clientStatus",
9508
+ "label": "Status",
9509
+ "valueType": "string",
9510
+ "inputType": "select",
9511
+ "enumValues": [
9512
+ "prospect",
9513
+ "active",
9514
+ "paused",
9515
+ "former",
9516
+ "churned"
9517
+ ]
9518
+ },
9519
+ {
9520
+ "slug": "accountManager",
9521
+ "label": "Account Manager",
9522
+ "valueType": "string",
9523
+ "inputType": "text"
9524
+ },
9525
+ {
9526
+ "slug": "engagementStartDate",
9527
+ "label": "Engagement Start",
9528
+ "valueType": "date",
9529
+ "inputType": "date"
9530
+ },
9531
+ {
9532
+ "slug": "satisfactionScore",
9533
+ "label": "Satisfaction",
9534
+ "valueType": "number",
9535
+ "inputType": "number"
9536
+ },
9537
+ {
9538
+ "slug": "lifetimeValue",
9539
+ "label": "Lifetime Value",
9540
+ "valueType": "number",
9541
+ "inputType": "number"
9542
+ },
9543
+ {
9544
+ "slug": "notes",
9545
+ "label": "Notes",
9546
+ "valueType": "string",
9547
+ "inputType": "textarea"
9548
+ },
9549
+ {
9550
+ "slug": "contractValue",
9551
+ "label": "Contract Value",
9552
+ "valueType": "number",
9553
+ "inputType": "number"
9554
+ },
9555
+ {
9556
+ "slug": "renewalDate",
9557
+ "label": "Renewal Date",
9558
+ "valueType": "date",
9559
+ "inputType": "date"
9560
+ },
9561
+ {
9562
+ "slug": "healthScore",
9563
+ "label": "Health",
9564
+ "valueType": "string",
9565
+ "inputType": "select",
9566
+ "enumValues": [
9567
+ "healthy",
9568
+ "at_risk",
9569
+ "critical"
9570
+ ]
9571
+ }
9572
+ ]
9573
+ },
9574
+ {
9575
+ "slug": "partner",
9576
+ "displayName": "Partner",
9577
+ "icon": "handshake",
9578
+ "color": "teal",
9579
+ "description": "A partner relationship \u2014 both a referral source and a co-delivery collaborator, distinguished by partner type.",
9580
+ "scope": "shared",
9581
+ "profileKind": "role",
9582
+ "applicableKinds": [
9583
+ "company",
9584
+ "person"
9585
+ ],
9586
+ "properties": [
9587
+ {
9588
+ "slug": "partnerStatus",
9589
+ "label": "Status",
9590
+ "valueType": "string",
9591
+ "inputType": "select",
9592
+ "enumValues": [
9593
+ "prospect",
9594
+ "active",
9595
+ "paused",
9596
+ "churned"
9597
+ ]
9598
+ },
9599
+ {
9600
+ "slug": "partnerType",
9601
+ "label": "Partner Type",
9602
+ "valueType": "string",
9603
+ "inputType": "select",
9604
+ "enumValues": [
9605
+ "referral",
9606
+ "co-delivery",
9607
+ "both"
9608
+ ]
9609
+ },
9610
+ {
9611
+ "slug": "accountManager",
9612
+ "label": "Account Manager",
9613
+ "valueType": "string",
9614
+ "inputType": "text"
9615
+ },
9616
+ {
9617
+ "slug": "engagementStartDate",
9618
+ "label": "Engagement Start",
9619
+ "valueType": "date",
9620
+ "inputType": "date"
9621
+ },
9622
+ {
9623
+ "slug": "satisfactionScore",
9624
+ "label": "Satisfaction",
9625
+ "valueType": "number",
9626
+ "inputType": "number"
9627
+ },
9628
+ {
9629
+ "slug": "lifetimeValue",
9630
+ "label": "Lifetime Value",
9631
+ "valueType": "number",
9632
+ "inputType": "number"
9633
+ },
9634
+ {
9635
+ "slug": "notes",
9636
+ "label": "Notes",
9637
+ "valueType": "string",
9638
+ "inputType": "textarea"
9639
+ },
9640
+ {
9641
+ "slug": "contractValue",
9642
+ "label": "Contract Value",
9643
+ "valueType": "number",
9644
+ "inputType": "number"
9645
+ },
9646
+ {
9647
+ "slug": "renewalDate",
9648
+ "label": "Renewal Date",
9649
+ "valueType": "date",
9650
+ "inputType": "date"
9651
+ },
9652
+ {
9653
+ "slug": "healthScore",
9654
+ "label": "Health",
9655
+ "valueType": "string",
9656
+ "inputType": "select",
9657
+ "enumValues": [
9658
+ "healthy",
9659
+ "at_risk",
9660
+ "critical"
9661
+ ]
9662
+ }
9663
+ ]
9664
+ },
9665
+ {
9666
+ "slug": "lead",
9667
+ "displayName": "Lead",
9668
+ "icon": "user-plus",
9669
+ "color": "yellow",
9670
+ "description": "An early-pipeline prospect \u2014 not yet a client, being qualified or nurtured.",
9671
+ "scope": "shared",
9672
+ "profileKind": "role",
9673
+ "applicableKinds": [
9674
+ "company",
9675
+ "person"
9676
+ ],
9677
+ "properties": [
9678
+ {
9679
+ "slug": "leadStage",
9680
+ "label": "Stage",
9681
+ "valueType": "string",
9682
+ "inputType": "select",
9683
+ "enumValues": [
9684
+ "prospect",
9685
+ "qualified",
9686
+ "nurturing",
9687
+ "converted",
9688
+ "lost"
9689
+ ],
9690
+ "constraints": {
9691
+ "defaultValue": "prospect"
9692
+ }
9693
+ },
9694
+ {
9695
+ "slug": "notes",
9696
+ "label": "Notes",
9697
+ "valueType": "string",
9698
+ "inputType": "textarea"
9699
+ }
9700
+ ]
9701
+ },
9702
+ {
9703
+ "slug": "churned",
9704
+ "displayName": "Churned",
9705
+ "icon": "user-x",
9706
+ "color": "gray",
9707
+ "description": "A relationship (client, partner, or otherwise) that was active and has since ended.",
9708
+ "scope": "shared",
9709
+ "profileKind": "role",
9710
+ "applicableKinds": [
9711
+ "company",
9712
+ "person"
9713
+ ],
9714
+ "properties": [
9715
+ {
9716
+ "slug": "churnedDate",
9717
+ "label": "Churned Date",
9090
9718
  "valueType": "date",
9091
9719
  "inputType": "date"
9092
9720
  },
9093
9721
  {
9094
- "slug": "nextStep",
9095
- "label": "Next step",
9722
+ "slug": "churnReason",
9723
+ "label": "Reason",
9096
9724
  "valueType": "string",
9097
9725
  "inputType": "textarea"
9098
9726
  },
9099
9727
  {
9100
- "slug": "description",
9728
+ "slug": "notes",
9101
9729
  "label": "Notes",
9102
9730
  "valueType": "string",
9103
9731
  "inputType": "textarea"
9104
- },
9105
- {
9106
- "slug": "handoffStatus",
9107
- "label": "Handoff status",
9108
- "valueType": "string",
9109
- "inputType": "select",
9110
- "enumValues": [
9111
- "pending",
9112
- "ready",
9113
- "handed_off"
9114
- ]
9115
9732
  }
9116
9733
  ]
9117
9734
  }
@@ -11375,6 +11992,47 @@ var DATA = {
11375
11992
  "label": "Involves"
11376
11993
  }
11377
11994
  ],
11995
+ "playbooks": [
11996
+ {
11997
+ "name": "Research Competitor",
11998
+ "description": "Deep-research a competitor and position it against us \u2014 strengths, weaknesses, pricing, and the gaps we can exploit.",
11999
+ "goalTemplate": "Research this competitor ({competitor}) and compare them to us. Investigate their {focus}: positioning, strengths, weaknesses, pricing, and recent moves. Use the provided company context where relevant: {companyContext}. Produce: {outputTypes}. Update the competitor entity with what you find and make clear where we win and where we are exposed.",
12000
+ "subjectProfile": {
12001
+ "profileSlug": "competitor"
12002
+ },
12003
+ "params": [
12004
+ {
12005
+ "name": "competitor",
12006
+ "type": "entity",
12007
+ "label": "Competitor",
12008
+ "required": true
12009
+ },
12010
+ {
12011
+ "name": "focus",
12012
+ "type": "text",
12013
+ "label": "Focus area",
12014
+ "defaultValue": "product, pricing, and positioning"
12015
+ },
12016
+ {
12017
+ "name": "companyContext",
12018
+ "type": "text",
12019
+ "label": "Our company context"
12020
+ },
12021
+ {
12022
+ "name": "outputTypes",
12023
+ "type": "text",
12024
+ "label": "Outputs",
12025
+ "defaultValue": "a head-to-head comparison summary and an updated competitor profile"
12026
+ }
12027
+ ],
12028
+ "executor": "is-agent",
12029
+ "grants": [
12030
+ "Web Search",
12031
+ "Entity Creator"
12032
+ ],
12033
+ "status": "active"
12034
+ }
12035
+ ],
11378
12036
  "onboarding": {
11379
12037
  "goal": 'Map the real ecosystem \u2014 the key players (companies and people), who partners and competes with whom, and the segments and trends that matter \u2014 so strategy is grounded in the actual market, not a vague "the market".\n',
11380
12038
  "framing": 'THE ECOSYSTEM LEAD: Act as a sharp ecosystem lead who maps the market\nlandscape AND the relationships inside it. Push for REAL named players \u2014 not\n"the incumbents", but the actual companies \u2014 and for the concrete edges\nbetween them: who partners with whom, who competes, who invested in whom.\nA map with no edges is just a list; the value is in the relationships.\n',
@@ -11412,28 +12070,286 @@ var DATA = {
11412
12070
  ]
11413
12071
  },
11414
12072
  {
11415
- "profileSlug": "trend",
11416
- "what": "Directional shifts in tech, market, or behavior that affect you.",
12073
+ "profileSlug": "trend",
12074
+ "what": "Directional shifts in tech, market, or behavior that affect you.",
12075
+ "cardinality": "few",
12076
+ "keyFields": [
12077
+ "direction",
12078
+ "relevance"
12079
+ ]
12080
+ }
12081
+ ],
12082
+ "openingQuestions": [
12083
+ "Who are the key players in your space \u2014 the 3-5 companies that matter most?",
12084
+ "How do they relate \u2014 who partners with, competes with, or invested in whom?",
12085
+ "Which market segment matters most right now, and what trend is reshaping it?"
12086
+ ],
12087
+ "doneWhen": "A few companies captured, with at least one relationship edge between them, plus one market segment."
12088
+ },
12089
+ "app": {
12090
+ "kind": "stored",
12091
+ "cellKey": "entity-detail"
12092
+ },
12093
+ "layout": {
12094
+ "defaultView": "Ecosystem Map",
12095
+ "defaultApp": null,
12096
+ "pinnedApps": [
12097
+ "dashboard",
12098
+ "data"
12099
+ ],
12100
+ "sidebarItems": [
12101
+ {
12102
+ "kind": "view",
12103
+ "viewName": "Ecosystem Map",
12104
+ "label": "Ecosystem Map",
12105
+ "icon": "radar"
12106
+ },
12107
+ {
12108
+ "kind": "view",
12109
+ "viewName": "Segments",
12110
+ "label": "Segments",
12111
+ "icon": "pie-chart"
12112
+ },
12113
+ {
12114
+ "kind": "view",
12115
+ "viewName": "Trends",
12116
+ "label": "Trends",
12117
+ "icon": "trending-up"
12118
+ },
12119
+ {
12120
+ "kind": "view",
12121
+ "viewName": "Events",
12122
+ "label": "Events",
12123
+ "icon": "zap"
12124
+ },
12125
+ {
12126
+ "kind": "app",
12127
+ "appId": "data",
12128
+ "label": "Data",
12129
+ "icon": "database"
12130
+ }
12131
+ ]
12132
+ },
12133
+ "bento": {
12134
+ "viewName": "Ecosystem Map",
12135
+ "blocks": [
12136
+ {
12137
+ "kind": "view",
12138
+ "viewName": "Ecosystem Map",
12139
+ "pos": {
12140
+ "x": 0,
12141
+ "y": 0,
12142
+ "w": 8,
12143
+ "h": 6
12144
+ }
12145
+ },
12146
+ {
12147
+ "kind": "view",
12148
+ "viewName": "Segments",
12149
+ "pos": {
12150
+ "x": 8,
12151
+ "y": 0,
12152
+ "w": 4,
12153
+ "h": 3
12154
+ }
12155
+ },
12156
+ {
12157
+ "kind": "view",
12158
+ "viewName": "Trends",
12159
+ "pos": {
12160
+ "x": 8,
12161
+ "y": 3,
12162
+ "w": 4,
12163
+ "h": 3
12164
+ }
12165
+ }
12166
+ ]
12167
+ }
12168
+ },
12169
+ "enterprise-os": {
12170
+ "meta": {
12171
+ "slug": "enterprise-os",
12172
+ "name": "Enterprise OS",
12173
+ "description": "Stand up a company's public operating core in one install \u2014 strategy, market, operations, and pipeline \u2014 plus a command tower to track objectives across them.",
12174
+ "icon": "layout-dashboard",
12175
+ "color": "#4F46E5",
12176
+ "tags": [
12177
+ "suite",
12178
+ "enterprise",
12179
+ "os",
12180
+ "foundation",
12181
+ "crm",
12182
+ "operations",
12183
+ "ecosystem"
12184
+ ],
12185
+ "isPublic": true
12186
+ },
12187
+ "dependencies": [
12188
+ {
12189
+ "slug": "foundation",
12190
+ "kind": "workspace",
12191
+ "relation": "require",
12192
+ "reason": "Strategic DNA + the pod-wide role vocabulary (partner/client/lead) every other lens reuses. Must resolve first."
12193
+ },
12194
+ {
12195
+ "slug": "ecosystem",
12196
+ "kind": "workspace",
12197
+ "relation": "require",
12198
+ "reason": "The market graph \u2014 the players, segments, and trends the company operates around."
12199
+ },
12200
+ {
12201
+ "slug": "operations",
12202
+ "kind": "workspace",
12203
+ "relation": "require",
12204
+ "reason": "How the company runs \u2014 the operational lens."
12205
+ },
12206
+ {
12207
+ "slug": "crm",
12208
+ "kind": "workspace",
12209
+ "relation": "require",
12210
+ "reason": "The pipeline \u2014 contacts, leads, clients, and deals."
12211
+ },
12212
+ {
12213
+ "slug": "content-os",
12214
+ "kind": "workspace",
12215
+ "relation": "require",
12216
+ "reason": "The editorial engine \u2014 pillars, posts, platforms, and newsletters \u2014 so the company's content operation is part of the operating core."
12217
+ }
12218
+ ],
12219
+ "workspace": {
12220
+ "name": "Enterprise OS",
12221
+ "description": "The command tower for the company operating system \u2014 track strategic objectives across the strategy, market, operations, and pipeline lenses this suite installs.",
12222
+ "subtype": "enterprise-os",
12223
+ "visibility": "pod_visible",
12224
+ "sourceRoles": {
12225
+ "strategy": "consumer"
12226
+ }
12227
+ },
12228
+ "profiles": [
12229
+ {
12230
+ "slug": "objective",
12231
+ "displayName": "Objective",
12232
+ "icon": "target",
12233
+ "color": "#4F46E5",
12234
+ "description": "A company objective the operating system is driving toward \u2014 the cross-cutting outcome the lenses serve.",
12235
+ "properties": [
12236
+ {
12237
+ "slug": "outcome",
12238
+ "label": "Outcome",
12239
+ "valueType": "string",
12240
+ "inputType": "textarea"
12241
+ },
12242
+ {
12243
+ "slug": "status",
12244
+ "label": "Status",
12245
+ "valueType": "string",
12246
+ "inputType": "select",
12247
+ "enumValues": [
12248
+ "on-track",
12249
+ "at-risk",
12250
+ "off-track",
12251
+ "achieved"
12252
+ ],
12253
+ "constraints": {
12254
+ "defaultValue": "on-track"
12255
+ }
12256
+ },
12257
+ {
12258
+ "slug": "horizon",
12259
+ "label": "Horizon",
12260
+ "valueType": "string",
12261
+ "inputType": "select",
12262
+ "enumValues": [
12263
+ "now",
12264
+ "next",
12265
+ "later"
12266
+ ],
12267
+ "constraints": {
12268
+ "defaultValue": "now"
12269
+ }
12270
+ },
12271
+ {
12272
+ "slug": "owner",
12273
+ "label": "Owner",
12274
+ "valueType": "string",
12275
+ "inputType": "text"
12276
+ },
12277
+ {
12278
+ "slug": "targetDate",
12279
+ "label": "Target Date",
12280
+ "valueType": "date",
12281
+ "inputType": "date"
12282
+ }
12283
+ ]
12284
+ }
12285
+ ],
12286
+ "views": [
12287
+ {
12288
+ "name": "Objectives",
12289
+ "slug": "objectives",
12290
+ "type": "table",
12291
+ "scopeProfileSlug": "objective",
12292
+ "description": "The company's strategic objectives across every lens, by horizon and status.",
12293
+ "defaultView": true,
12294
+ "config": {
12295
+ "columns": [
12296
+ "title",
12297
+ "status",
12298
+ "horizon",
12299
+ "owner",
12300
+ "targetDate"
12301
+ ]
12302
+ }
12303
+ },
12304
+ {
12305
+ "name": "Objective Board",
12306
+ "slug": "objective-board",
12307
+ "type": "kanban",
12308
+ "scopeProfileSlug": "objective",
12309
+ "description": "Objectives grouped by status \u2014 a running scoreboard for the operating system.",
12310
+ "config": {
12311
+ "groupBy": "status"
12312
+ }
12313
+ }
12314
+ ],
12315
+ "onboarding": {
12316
+ "goal": "Stand up the company's operating core and name the handful of strategic objectives it is driving \u2014 so strategy, market, operations, and pipeline are all in place and pointed at the same outcomes from day one.\n",
12317
+ "framing": "THE CHIEF OF STAFF: Act as a sharp chief of staff standing up the company OS.\nThe four lenses (foundation, ecosystem, operations, CRM) are already\ninstalled \u2014 your job is to name the 3-5 objectives that cut across them, so\nthe operating system has a scoreboard, not just structure.\n",
12318
+ "expertise": {
12319
+ "starters": [
12320
+ "Name few, real objectives. An operating system with 20 objectives has none; force the 3-5 that actually decide the year, each with an owner and a horizon (now / next / later).\n",
12321
+ "Tie each objective to a lens. A good objective names where it lives \u2014 pipeline growth (CRM), a market move (ecosystem), an operational fix (operations), or a positioning shift (foundation) \u2014 so the scoreboard maps to the structure underneath it.\n"
12322
+ ],
12323
+ "blindSpots": [
12324
+ "Objectives with no owner and no date are wishes. Every one needs a single owner and a target date, or it will not move.\n",
12325
+ '"Grow the business" is not an objective \u2014 it is a category. Push for the specific outcome that would make this quarter a win.\n'
12326
+ ],
12327
+ "bar": "A short, honest scoreboard: 3-5 objectives, each owned, dated, placed on a horizon, and tied to the lens that serves it \u2014 sitting on top of a fully installed operating core.\n"
12328
+ },
12329
+ "collect": [
12330
+ {
12331
+ "profileSlug": "objective",
12332
+ "what": "The 3-5 strategic objectives the company is driving this horizon.",
11417
12333
  "cardinality": "few",
11418
12334
  "keyFields": [
11419
- "direction",
11420
- "relevance"
12335
+ "status",
12336
+ "horizon",
12337
+ "owner"
11421
12338
  ]
11422
12339
  }
11423
12340
  ],
11424
12341
  "openingQuestions": [
11425
- "Who are the key players in your space \u2014 the 3-5 companies that matter most?",
11426
- "How do they relate \u2014 who partners with, competes with, or invested in whom?",
11427
- "Which market segment matters most right now, and what trend is reshaping it?"
12342
+ "What are the 3-5 objectives that will decide this year for the company?",
12343
+ "Who owns each one, and is it a now, next, or later horizon?"
11428
12344
  ],
11429
- "doneWhen": "A few companies captured, with at least one relationship edge between them, plus one market segment."
12345
+ "doneWhen": "A few objectives captured, each with an owner and a horizon."
11430
12346
  },
11431
12347
  "app": {
11432
12348
  "kind": "stored",
11433
12349
  "cellKey": "entity-detail"
11434
12350
  },
11435
12351
  "layout": {
11436
- "defaultView": "Ecosystem Map",
12352
+ "defaultView": "Objectives",
11437
12353
  "defaultApp": null,
11438
12354
  "pinnedApps": [
11439
12355
  "dashboard",
@@ -11442,27 +12358,15 @@ var DATA = {
11442
12358
  "sidebarItems": [
11443
12359
  {
11444
12360
  "kind": "view",
11445
- "viewName": "Ecosystem Map",
11446
- "label": "Ecosystem Map",
11447
- "icon": "radar"
11448
- },
11449
- {
11450
- "kind": "view",
11451
- "viewName": "Segments",
11452
- "label": "Segments",
11453
- "icon": "pie-chart"
11454
- },
11455
- {
11456
- "kind": "view",
11457
- "viewName": "Trends",
11458
- "label": "Trends",
11459
- "icon": "trending-up"
12361
+ "viewName": "Objectives",
12362
+ "label": "Objectives",
12363
+ "icon": "target"
11460
12364
  },
11461
12365
  {
11462
12366
  "kind": "view",
11463
- "viewName": "Events",
11464
- "label": "Events",
11465
- "icon": "zap"
12367
+ "viewName": "Objective Board",
12368
+ "label": "Board",
12369
+ "icon": "kanban-square"
11466
12370
  },
11467
12371
  {
11468
12372
  "kind": "app",
@@ -11473,36 +12377,26 @@ var DATA = {
11473
12377
  ]
11474
12378
  },
11475
12379
  "bento": {
11476
- "viewName": "Ecosystem Map",
12380
+ "viewName": "Objectives",
11477
12381
  "blocks": [
11478
12382
  {
11479
12383
  "kind": "view",
11480
- "viewName": "Ecosystem Map",
12384
+ "viewName": "Objectives",
11481
12385
  "pos": {
11482
12386
  "x": 0,
11483
12387
  "y": 0,
11484
12388
  "w": 8,
11485
- "h": 6
12389
+ "h": 4
11486
12390
  }
11487
12391
  },
11488
12392
  {
11489
12393
  "kind": "view",
11490
- "viewName": "Segments",
12394
+ "viewName": "Objective Board",
11491
12395
  "pos": {
11492
12396
  "x": 8,
11493
12397
  "y": 0,
11494
12398
  "w": 4,
11495
- "h": 3
11496
- }
11497
- },
11498
- {
11499
- "kind": "view",
11500
- "viewName": "Trends",
11501
- "pos": {
11502
- "x": 8,
11503
- "y": 3,
11504
- "w": 4,
11505
- "h": 3
12399
+ "h": 4
11506
12400
  }
11507
12401
  }
11508
12402
  ]
@@ -20236,14 +21130,9 @@ var DATA = {
20236
21130
  "slug": "lead",
20237
21131
  "displayName": "Lead",
20238
21132
  "icon": "user-plus",
20239
- "color": "green",
20240
- "description": "A potential customer or partner contact in your pipeline",
20241
- "semanticSlug": "marketing.lead",
21133
+ "color": "yellow",
20242
21134
  "scope": "shared",
20243
21135
  "profileKind": "role",
20244
- "applicableKinds": [
20245
- "person"
20246
- ],
20247
21136
  "properties": [
20248
21137
  {
20249
21138
  "slug": "lead-source",
@@ -23793,6 +24682,234 @@ var DATA = {
23793
24682
  }
23794
24683
  ]
23795
24684
  }
24685
+ },
24686
+ "the-arch": {
24687
+ "meta": {
24688
+ "slug": "the-arch",
24689
+ "name": "The Arch",
24690
+ "description": "The complete private company brain \u2014 the whole Enterprise OS plus the grant pipeline, the web3 ecosystem overlay, and the dev dashboard.",
24691
+ "icon": "landmark",
24692
+ "color": "#7C3AED",
24693
+ "tags": [
24694
+ "suite",
24695
+ "private",
24696
+ "arch",
24697
+ "grants",
24698
+ "web3",
24699
+ "flagship"
24700
+ ],
24701
+ "isPublic": false
24702
+ },
24703
+ "dependencies": [
24704
+ {
24705
+ "slug": "enterprise-os",
24706
+ "kind": "workspace",
24707
+ "relation": "require",
24708
+ "reason": "The whole public operating core \u2014 strategy, market, operations, and pipeline \u2014 that the private flagships extend."
24709
+ },
24710
+ {
24711
+ "slug": "grants",
24712
+ "kind": "workspace",
24713
+ "relation": "require",
24714
+ "reason": "The grant-agency pipeline; composes its operations onto the Operations workspace the OS installs."
24715
+ },
24716
+ {
24717
+ "slug": "blockchain-ecosystem",
24718
+ "kind": "workspace",
24719
+ "relation": "require",
24720
+ "reason": "Web3 market actors + relations; composes onto the Ecosystem workspace the OS installs."
24721
+ },
24722
+ {
24723
+ "slug": "dev-dashboard",
24724
+ "kind": "workspace",
24725
+ "relation": "require",
24726
+ "reason": "The engineering / ops dashboard \u2014 the build-side view of the company."
24727
+ }
24728
+ ],
24729
+ "workspace": {
24730
+ "name": "The Arch",
24731
+ "description": "The private command layer over the full company brain \u2014 track the cross-workspace initiatives that span the operating system and its private flagships.",
24732
+ "subtype": "the-arch",
24733
+ "visibility": "private"
24734
+ },
24735
+ "profiles": [
24736
+ {
24737
+ "slug": "initiative",
24738
+ "displayName": "Initiative",
24739
+ "icon": "flag",
24740
+ "color": "#7C3AED",
24741
+ "description": "A cross-workspace initiative that spans the operating system and its private flagships.",
24742
+ "properties": [
24743
+ {
24744
+ "slug": "summary",
24745
+ "label": "Summary",
24746
+ "valueType": "string",
24747
+ "inputType": "textarea"
24748
+ },
24749
+ {
24750
+ "slug": "stage",
24751
+ "label": "Stage",
24752
+ "valueType": "string",
24753
+ "inputType": "select",
24754
+ "enumValues": [
24755
+ "shaping",
24756
+ "active",
24757
+ "blocked",
24758
+ "shipped",
24759
+ "archived"
24760
+ ],
24761
+ "constraints": {
24762
+ "defaultValue": "shaping"
24763
+ }
24764
+ },
24765
+ {
24766
+ "slug": "lead",
24767
+ "label": "Lead",
24768
+ "valueType": "string",
24769
+ "inputType": "text"
24770
+ },
24771
+ {
24772
+ "slug": "priority",
24773
+ "label": "Priority",
24774
+ "valueType": "string",
24775
+ "inputType": "select",
24776
+ "enumValues": [
24777
+ "low",
24778
+ "medium",
24779
+ "high",
24780
+ "critical"
24781
+ ],
24782
+ "constraints": {
24783
+ "defaultValue": "medium"
24784
+ }
24785
+ },
24786
+ {
24787
+ "slug": "dueDate",
24788
+ "label": "Due Date",
24789
+ "valueType": "date",
24790
+ "inputType": "date"
24791
+ }
24792
+ ]
24793
+ }
24794
+ ],
24795
+ "views": [
24796
+ {
24797
+ "name": "Initiatives",
24798
+ "slug": "initiatives",
24799
+ "type": "table",
24800
+ "scopeProfileSlug": "initiative",
24801
+ "description": "The cross-workspace initiatives spanning the full company brain, by stage and priority.",
24802
+ "defaultView": true,
24803
+ "config": {
24804
+ "columns": [
24805
+ "title",
24806
+ "stage",
24807
+ "priority",
24808
+ "lead",
24809
+ "dueDate"
24810
+ ]
24811
+ }
24812
+ },
24813
+ {
24814
+ "name": "Initiative Board",
24815
+ "slug": "initiative-board",
24816
+ "type": "kanban",
24817
+ "scopeProfileSlug": "initiative",
24818
+ "description": "Initiatives grouped by stage \u2014 the command view over everything in flight.",
24819
+ "config": {
24820
+ "groupBy": "stage"
24821
+ }
24822
+ }
24823
+ ],
24824
+ "onboarding": {
24825
+ "goal": "Name the cross-workspace initiatives that span the operating system and its private flagships \u2014 the few big things in flight that touch more than one lens \u2014 so The Arch is a real command layer, not just an aggregate of apps.\n",
24826
+ "framing": "THE FOUNDER'S COMMAND LAYER: Act from the seat above every lens. The whole\ncompany brain is installed \u2014 operating core plus the private grant, web3, and\ndev flagships. Your job is to surface the handful of initiatives that cut\nacross them and give each a stage, a lead, and a priority.\n",
24827
+ "expertise": {
24828
+ "starters": [
24829
+ "Name the cross-cutting few. An initiative earns a place here only if it spans more than one workspace \u2014 a grant round that pulls in operations, ecosystem, and dev. Single-lens work stays in its lens.\n",
24830
+ "Give each initiative a real stage and lead. Shaping / active / blocked / shipped is the honest status; a lead is who to ask. Without them the command layer is a wish list.\n"
24831
+ ],
24832
+ "blindSpots": [
24833
+ 'Everything marked "high priority" is the same as nothing marked. Force the ranking \u2014 what is actually critical this week?\n',
24834
+ "A blocked initiative with no note about the blocker is invisible risk. Name what is stuck and on whom.\n"
24835
+ ],
24836
+ "bar": "A short command board: the few genuinely cross-workspace initiatives, each with a stage, a lead, and an honest priority \u2014 sitting over a fully installed company brain.\n"
24837
+ },
24838
+ "collect": [
24839
+ {
24840
+ "profileSlug": "initiative",
24841
+ "what": "The cross-workspace initiatives currently in flight.",
24842
+ "cardinality": "few",
24843
+ "keyFields": [
24844
+ "stage",
24845
+ "priority",
24846
+ "lead"
24847
+ ]
24848
+ }
24849
+ ],
24850
+ "openingQuestions": [
24851
+ "What are the few big initiatives in flight that span more than one part of the company?",
24852
+ "For each, what stage is it in and who is the lead?"
24853
+ ],
24854
+ "doneWhen": "A few cross-workspace initiatives captured, each with a stage and a lead."
24855
+ },
24856
+ "app": {
24857
+ "kind": "stored",
24858
+ "cellKey": "entity-detail"
24859
+ },
24860
+ "layout": {
24861
+ "defaultView": "Initiatives",
24862
+ "defaultApp": null,
24863
+ "pinnedApps": [
24864
+ "dashboard",
24865
+ "data"
24866
+ ],
24867
+ "sidebarItems": [
24868
+ {
24869
+ "kind": "view",
24870
+ "viewName": "Initiatives",
24871
+ "label": "Initiatives",
24872
+ "icon": "flag"
24873
+ },
24874
+ {
24875
+ "kind": "view",
24876
+ "viewName": "Initiative Board",
24877
+ "label": "Board",
24878
+ "icon": "kanban-square"
24879
+ },
24880
+ {
24881
+ "kind": "app",
24882
+ "appId": "data",
24883
+ "label": "Data",
24884
+ "icon": "database"
24885
+ }
24886
+ ]
24887
+ },
24888
+ "bento": {
24889
+ "viewName": "Initiatives",
24890
+ "blocks": [
24891
+ {
24892
+ "kind": "view",
24893
+ "viewName": "Initiatives",
24894
+ "pos": {
24895
+ "x": 0,
24896
+ "y": 0,
24897
+ "w": 8,
24898
+ "h": 4
24899
+ }
24900
+ },
24901
+ {
24902
+ "kind": "view",
24903
+ "viewName": "Initiative Board",
24904
+ "pos": {
24905
+ "x": 8,
24906
+ "y": 0,
24907
+ "w": 4,
24908
+ "h": 4
24909
+ }
24910
+ }
24911
+ ]
24912
+ }
23796
24913
  }
23797
24914
  };
23798
24915
  var WORKSPACE_TEMPLATES = DATA;
@@ -23806,7 +24923,113 @@ function listPublicTemplates() {
23806
24923
  return Object.values(WORKSPACE_TEMPLATES).filter((t) => t.meta?.isPublic !== false);
23807
24924
  }
23808
24925
 
24926
+ // src/catalog.ts
24927
+ function parseSemver(v) {
24928
+ if (!v) return null;
24929
+ const m = /^\s*v?(\d+)\.(\d+)\.(\d+)/.exec(v);
24930
+ if (!m) return null;
24931
+ return [Number(m[1]), Number(m[2]), Number(m[3])];
24932
+ }
24933
+ function remoteIsStrictlyNewer(remoteVersion, bundleVersion) {
24934
+ const r = parseSemver(remoteVersion);
24935
+ const b = parseSemver(bundleVersion);
24936
+ if (!r || !b) return false;
24937
+ for (let i = 0; i < 3; i++) {
24938
+ if (r[i] > b[i]) return true;
24939
+ if (r[i] < b[i]) return false;
24940
+ }
24941
+ return false;
24942
+ }
24943
+ function bundledToEntry(tpl) {
24944
+ return {
24945
+ source: "bundled",
24946
+ slug: tpl.meta.slug,
24947
+ name: tpl.meta.name,
24948
+ description: tpl.meta.description,
24949
+ // Every bundled template is a full workspace — the CP calls this category
24950
+ // "workspace" (PACKAGE_TYPES). Finer display grouping is derived from `tags`
24951
+ // by the consumer (browser `categoryFor`), not baked in here.
24952
+ category: "workspace",
24953
+ tags: tpl.meta.tags ?? [],
24954
+ icon: tpl.meta.icon,
24955
+ isPrivate: tpl.meta.isPublic === false,
24956
+ template: tpl
24957
+ };
24958
+ }
24959
+ function remoteToEntry(row) {
24960
+ return {
24961
+ source: "remote",
24962
+ slug: row.slug,
24963
+ name: row.name,
24964
+ description: row.description,
24965
+ category: row.category,
24966
+ tags: row.tags ?? [],
24967
+ icon: row.icon ?? null,
24968
+ isPrivate: row.isPrivate ?? false,
24969
+ remote: row
24970
+ };
24971
+ }
24972
+ function mergeCatalog(input) {
24973
+ const { bundled, bundleVersion } = input;
24974
+ const remoteStatus = input.remoteStatus ?? "ok";
24975
+ const remote = input.remote ?? [];
24976
+ const bySlug = /* @__PURE__ */ new Map();
24977
+ for (const tpl of bundled) {
24978
+ bySlug.set(tpl.meta.slug, bundledToEntry(tpl));
24979
+ }
24980
+ if (remoteStatus === "ok") {
24981
+ for (const row of remote) {
24982
+ const existing = bySlug.get(row.slug);
24983
+ if (!existing) {
24984
+ bySlug.set(row.slug, remoteToEntry(row));
24985
+ continue;
24986
+ }
24987
+ if (existing.source !== "bundled") {
24988
+ continue;
24989
+ }
24990
+ const remoteVersion = row.definition?.sourcePackage?.version;
24991
+ if (remoteIsStrictlyNewer(remoteVersion, bundleVersion)) {
24992
+ bySlug.set(row.slug, remoteToEntry(row));
24993
+ }
24994
+ }
24995
+ }
24996
+ return {
24997
+ entries: [...bySlug.values()],
24998
+ sources: { bundled: "ok", remote: remoteStatus }
24999
+ };
25000
+ }
25001
+
23809
25002
  // src/define.ts
25003
+ function resolveBlockKind(block) {
25004
+ if (block.kind === "widget" || block.kind === "view") return block.kind;
25005
+ if (block.widgetType) return "widget";
25006
+ if (block.viewName) return "view";
25007
+ return null;
25008
+ }
25009
+ function splitBentoBlocks(blocks) {
25010
+ const bentoLayout = [];
25011
+ const bentoViewBlocks = [];
25012
+ for (const block of blocks ?? []) {
25013
+ const kind = resolveBlockKind(block);
25014
+ if (kind === "widget") {
25015
+ if (!block.widgetType) continue;
25016
+ bentoLayout.push({
25017
+ widgetType: block.widgetType,
25018
+ pos: block.pos,
25019
+ ...block.config ? { config: block.config } : {}
25020
+ });
25021
+ } else if (kind === "view") {
25022
+ if (!block.viewName) continue;
25023
+ bentoViewBlocks.push({
25024
+ kind: "view",
25025
+ viewName: block.viewName,
25026
+ pos: block.pos,
25027
+ ...block.overrides ? { overrides: block.overrides } : {}
25028
+ });
25029
+ }
25030
+ }
25031
+ return { bentoLayout, bentoViewBlocks };
25032
+ }
23810
25033
  function toWorkspaceDefinition(slugOrYaml, nameOverride) {
23811
25034
  const tpl = typeof slugOrYaml === "string" ? getWorkspaceTemplate(slugOrYaml) : slugOrYaml;
23812
25035
  if (!tpl) {
@@ -23815,6 +25038,7 @@ function toWorkspaceDefinition(slugOrYaml, nameOverride) {
23815
25038
  const ws = tpl.workspace;
23816
25039
  const name = nameOverride ?? ws.name;
23817
25040
  const proposalId = ws.proposalId ?? `${tpl.meta.slug}-v1`;
25041
+ const bento = splitBentoBlocks(tpl.bento?.blocks);
23818
25042
  const definition = {
23819
25043
  workspaceName: name,
23820
25044
  description: ws.description,
@@ -23827,7 +25051,8 @@ function toWorkspaceDefinition(slugOrYaml, nameOverride) {
23827
25051
  displayTemplates: tpl.displayTemplates,
23828
25052
  layoutConfig: tpl.layout,
23829
25053
  bentoViewName: tpl.bento?.viewName,
23830
- bentoViewBlocks: tpl.bento?.blocks,
25054
+ bentoLayout: bento.bentoLayout,
25055
+ bentoViewBlocks: bento.bentoViewBlocks,
23831
25056
  profileEntityBentoTemplates: tpl.profileEntityBentoTemplates,
23832
25057
  workspaceSubtype: ws.subtype,
23833
25058
  workspaceType: ws.workspaceType,
@@ -23856,6 +25081,7 @@ function toPackageDefinition(slugOrYaml) {
23856
25081
  throw new Error(`Workspace template not found: ${String(slugOrYaml)}`);
23857
25082
  }
23858
25083
  const ws = tpl.workspace;
25084
+ const bento = splitBentoBlocks(tpl.bento?.blocks);
23859
25085
  return {
23860
25086
  _meta: {
23861
25087
  slug: tpl.meta.slug,
@@ -23878,7 +25104,8 @@ function toPackageDefinition(slugOrYaml) {
23878
25104
  suggestedRelations: tpl.suggestedRelations,
23879
25105
  displayTemplates: tpl.displayTemplates,
23880
25106
  entityLinks: tpl.entityLinks,
23881
- bentoLayout: tpl.bento?.blocks,
25107
+ bentoLayout: bento.bentoLayout,
25108
+ bentoViewBlocks: bento.bentoViewBlocks,
23882
25109
  bentoViewName: tpl.bento?.viewName,
23883
25110
  profileEntityBentoTemplates: tpl.profileEntityBentoTemplates,
23884
25111
  layoutConfig: tpl.layout,
@@ -23889,10 +25116,13 @@ function toPackageDefinition(slugOrYaml) {
23889
25116
  };
23890
25117
  }
23891
25118
  export {
25119
+ PACKAGE_DEPENDENCY_KINDS,
23892
25120
  WORKSPACE_TEMPLATES,
23893
25121
  getWorkspaceTemplate,
23894
25122
  listPublicTemplates,
23895
25123
  listWorkspaceTemplates,
25124
+ mergeCatalog,
25125
+ splitBentoBlocks,
23896
25126
  toPackageDefinition,
23897
25127
  toWorkspaceDefinition
23898
25128
  };