forge-openclaw-plugin 0.2.27 → 0.2.29

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.
Files changed (39) hide show
  1. package/README.md +2 -1
  2. package/dist/assets/{board-C6jCchjI.js → board-q8cfwaAW.js} +2 -2
  3. package/dist/assets/{board-C6jCchjI.js.map → board-q8cfwaAW.js.map} +1 -1
  4. package/dist/assets/index-C6PCeHD_.css +1 -0
  5. package/dist/assets/index-bfHIqj0-.js +85 -0
  6. package/dist/assets/index-bfHIqj0-.js.map +1 -0
  7. package/dist/assets/{motion-DFHrH2rd.js → motion-DHfqFntt.js} +2 -2
  8. package/dist/assets/{motion-DFHrH2rd.js.map → motion-DHfqFntt.js.map} +1 -1
  9. package/dist/assets/{table-ZL7Di_u3.js → table-DLweENXt.js} +2 -2
  10. package/dist/assets/{table-ZL7Di_u3.js.map → table-DLweENXt.js.map} +1 -1
  11. package/dist/assets/{ui-CKNPpz7q.js → ui-BV0OYxkH.js} +2 -2
  12. package/dist/assets/{ui-CKNPpz7q.js.map → ui-BV0OYxkH.js.map} +1 -1
  13. package/dist/assets/{vendor-DoNZuFhn.js → vendor-OwcH20PM.js} +204 -204
  14. package/dist/assets/vendor-OwcH20PM.js.map +1 -0
  15. package/dist/index.html +7 -7
  16. package/dist/server/server/migrations/044_macos_local_calendar_provider.sql +21 -0
  17. package/dist/server/server/src/app.js +331 -14
  18. package/dist/server/server/src/openapi.js +828 -3
  19. package/dist/server/server/src/repositories/calendar.js +295 -12
  20. package/dist/server/server/src/repositories/tasks.js +36 -17
  21. package/dist/server/server/src/services/calendar-runtime.js +613 -32
  22. package/dist/server/server/src/services/life-force-model.js +20 -0
  23. package/dist/server/server/src/services/life-force.js +1333 -97
  24. package/dist/server/server/src/services/macos-calendar-helper.js +748 -0
  25. package/dist/server/server/src/types.js +67 -3
  26. package/dist/server/src/lib/api-error.js +2 -0
  27. package/dist/server/src/lib/api.js +39 -2
  28. package/dist/server/src/lib/calendar-name-deduper.js +2 -0
  29. package/dist/server/src/lib/snapshot-normalizer.js +2 -0
  30. package/openclaw.plugin.json +1 -1
  31. package/package.json +1 -1
  32. package/server/migrations/044_macos_local_calendar_provider.sql +21 -0
  33. package/skills/forge-openclaw/SKILL.md +38 -5
  34. package/skills/forge-openclaw/entity_conversation_playbooks.md +326 -5
  35. package/skills/forge-openclaw/psyche_entity_playbooks.md +57 -0
  36. package/dist/assets/index-DVvS8iiU.css +0 -1
  37. package/dist/assets/index-zYB-9Dfo.js +0 -85
  38. package/dist/assets/index-zYB-9Dfo.js.map +0 -1
  39. package/dist/assets/vendor-DoNZuFhn.js.map +0 -1
@@ -37,6 +37,14 @@ const API_TAGS = [
37
37
  name: "Health",
38
38
  description: "Runtime health, sleep, sports, workout, and mobile sync surfaces."
39
39
  },
40
+ {
41
+ name: "Movement",
42
+ description: "Movement overviews, timeline history, known places, stays, trips, selection aggregates, and user-defined overlay routes."
43
+ },
44
+ {
45
+ name: "Life Force",
46
+ description: "Energy-budget, fatigue, and action-point modeling routes."
47
+ },
40
48
  {
41
49
  name: "Auth",
42
50
  description: "Operator session bootstrapping for trusted local usage."
@@ -125,6 +133,10 @@ const API_TAGS = [
125
133
  name: "Insights",
126
134
  description: "Stored insights and structured feedback on them."
127
135
  },
136
+ {
137
+ name: "Workbench",
138
+ description: "Graph-flow catalog, execution, published outputs, and node-result routes."
139
+ },
128
140
  {
129
141
  name: "Metrics",
130
142
  description: "XP, reward-ledger, and runtime metric surfaces."
@@ -145,7 +157,11 @@ const API_TAGS = [
145
157
  const API_TAG_GROUPS = [
146
158
  {
147
159
  name: "Runtime",
148
- tags: ["Meta", "Health", "Auth", "Platform", "Operator", "Diagnostics"]
160
+ tags: ["Meta", "Auth", "Platform", "Operator", "Diagnostics"]
161
+ },
162
+ {
163
+ name: "Embodied Context",
164
+ tags: ["Health", "Movement", "Life Force"]
149
165
  },
150
166
  {
151
167
  name: "Core Work",
@@ -162,7 +178,8 @@ const API_TAG_GROUPS = [
162
178
  "Activity",
163
179
  "Metrics",
164
180
  "Reviews",
165
- "Insights"
181
+ "Insights",
182
+ "Workbench"
166
183
  ]
167
184
  },
168
185
  {
@@ -188,6 +205,18 @@ function resolveTagsForPath(path) {
188
205
  path.startsWith("/api/v1/mobile")) {
189
206
  return ["Health"];
190
207
  }
208
+ if (path.startsWith("/api/v1/movement")) {
209
+ return ["Movement"];
210
+ }
211
+ if (path.startsWith("/api/v1/life-force")) {
212
+ return ["Life Force"];
213
+ }
214
+ if (path.startsWith("/api/v1/workbench")) {
215
+ return ["Workbench"];
216
+ }
217
+ if (path.startsWith("/api/v1/screen-time")) {
218
+ return ["Health"];
219
+ }
191
220
  if (path === "/api/v1/context" || path.startsWith("/api/v1/domains")) {
192
221
  return ["Platform"];
193
222
  }
@@ -2706,6 +2735,10 @@ export function buildOpenApiDocument() {
2706
2735
  "calendar",
2707
2736
  "workBlock",
2708
2737
  "taskTimebox",
2738
+ "workAdjustment",
2739
+ "movement",
2740
+ "lifeForce",
2741
+ "workbench",
2709
2742
  "psyche"
2710
2743
  ],
2711
2744
  properties: {
@@ -2724,6 +2757,10 @@ export function buildOpenApiDocument() {
2724
2757
  calendar: { type: "string" },
2725
2758
  workBlock: { type: "string" },
2726
2759
  taskTimebox: { type: "string" },
2760
+ workAdjustment: { type: "string" },
2761
+ movement: { type: "string" },
2762
+ lifeForce: { type: "string" },
2763
+ workbench: { type: "string" },
2727
2764
  psyche: { type: "string" }
2728
2765
  }
2729
2766
  },
@@ -2800,6 +2837,7 @@ export function buildOpenApiDocument() {
2800
2837
  "batchRoutes",
2801
2838
  "specializedCrudEntities",
2802
2839
  "actionEntities",
2840
+ "specializedDomainSurfaces",
2803
2841
  "readModelOnlySurfaces"
2804
2842
  ],
2805
2843
  properties: {
@@ -2830,6 +2868,13 @@ export function buildOpenApiDocument() {
2830
2868
  additionalProperties: true
2831
2869
  }
2832
2870
  },
2871
+ specializedDomainSurfaces: {
2872
+ type: "object",
2873
+ additionalProperties: {
2874
+ type: "object",
2875
+ additionalProperties: true
2876
+ }
2877
+ },
2833
2878
  readModelOnlySurfaces: {
2834
2879
  type: "object",
2835
2880
  additionalProperties: { type: "string" }
@@ -2957,6 +3002,24 @@ export function buildOpenApiDocument() {
2957
3002
  "weeklyReview",
2958
3003
  "sleepOverview",
2959
3004
  "sportsOverview",
3005
+ "lifeForce",
3006
+ "lifeForceProfile",
3007
+ "lifeForceWeekdayTemplate",
3008
+ "lifeForceFatigueSignals",
3009
+ "movementDay",
3010
+ "movementMonth",
3011
+ "movementTimeline",
3012
+ "movementAllTime",
3013
+ "movementPlaces",
3014
+ "movementTripDetail",
3015
+ "movementSelection",
3016
+ "movementUserBoxPreflight",
3017
+ "workbenchFlows",
3018
+ "workbenchFlowBySlug",
3019
+ "workbenchPublishedOutput",
3020
+ "workbenchRunDetail",
3021
+ "workbenchNodeResult",
3022
+ "workbenchLatestNodeOutput",
2960
3023
  "wikiSettings",
2961
3024
  "wikiSearch",
2962
3025
  "wikiHealth",
@@ -2973,6 +3036,24 @@ export function buildOpenApiDocument() {
2973
3036
  weeklyReview: { type: "string" },
2974
3037
  sleepOverview: { type: "string" },
2975
3038
  sportsOverview: { type: "string" },
3039
+ lifeForce: { type: "string" },
3040
+ lifeForceProfile: { type: "string" },
3041
+ lifeForceWeekdayTemplate: { type: "string" },
3042
+ lifeForceFatigueSignals: { type: "string" },
3043
+ movementDay: { type: "string" },
3044
+ movementMonth: { type: "string" },
3045
+ movementTimeline: { type: "string" },
3046
+ movementAllTime: { type: "string" },
3047
+ movementPlaces: { type: "string" },
3048
+ movementTripDetail: { type: "string" },
3049
+ movementSelection: { type: "string" },
3050
+ movementUserBoxPreflight: { type: "string" },
3051
+ workbenchFlows: { type: "string" },
3052
+ workbenchFlowBySlug: { type: "string" },
3053
+ workbenchPublishedOutput: { type: "string" },
3054
+ workbenchRunDetail: { type: "string" },
3055
+ workbenchNodeResult: { type: "string" },
3056
+ workbenchLatestNodeOutput: { type: "string" },
2976
3057
  wikiSettings: { type: "string" },
2977
3058
  wikiSearch: { type: "string" },
2978
3059
  wikiHealth: { type: "string" },
@@ -4127,6 +4208,750 @@ export function buildOpenApiDocument() {
4127
4208
  }
4128
4209
  }
4129
4210
  },
4211
+ "/api/v1/life-force": {
4212
+ get: {
4213
+ summary: "Read the current life-force overview with stats, drains, curve state, warnings, and recommendations",
4214
+ responses: {
4215
+ "200": jsonResponse({
4216
+ type: "object",
4217
+ required: ["lifeForce", "templates"],
4218
+ properties: {
4219
+ lifeForce: {
4220
+ type: "object",
4221
+ additionalProperties: true
4222
+ },
4223
+ templates: arrayOf({
4224
+ type: "object",
4225
+ additionalProperties: true
4226
+ })
4227
+ }
4228
+ }, "Life-force overview"),
4229
+ default: { $ref: "#/components/responses/Error" }
4230
+ }
4231
+ }
4232
+ },
4233
+ "/api/v1/life-force/profile": {
4234
+ patch: {
4235
+ summary: "Update the user-controlled life-force profile settings",
4236
+ responses: {
4237
+ "200": jsonResponse({
4238
+ type: "object",
4239
+ required: ["lifeForce", "actor"],
4240
+ properties: {
4241
+ lifeForce: {
4242
+ type: "object",
4243
+ additionalProperties: true
4244
+ },
4245
+ actor: { type: "string" }
4246
+ }
4247
+ }, "Updated life-force profile"),
4248
+ default: { $ref: "#/components/responses/Error" }
4249
+ }
4250
+ }
4251
+ },
4252
+ "/api/v1/life-force/templates/{weekday}": {
4253
+ put: {
4254
+ summary: "Replace one weekday life-force curve template",
4255
+ responses: {
4256
+ "200": jsonResponse({
4257
+ type: "object",
4258
+ required: ["weekday", "points", "actor"],
4259
+ properties: {
4260
+ weekday: { type: "integer" },
4261
+ points: arrayOf({
4262
+ type: "object",
4263
+ additionalProperties: true
4264
+ }),
4265
+ actor: { type: "string" }
4266
+ }
4267
+ }, "Updated weekday curve template"),
4268
+ default: { $ref: "#/components/responses/Error" }
4269
+ }
4270
+ }
4271
+ },
4272
+ "/api/v1/life-force/fatigue-signals": {
4273
+ post: {
4274
+ summary: "Record a tired or recovered fatigue signal and rebuild life-force state",
4275
+ responses: {
4276
+ "200": jsonResponse({
4277
+ type: "object",
4278
+ required: ["lifeForce", "actor"],
4279
+ properties: {
4280
+ lifeForce: {
4281
+ type: "object",
4282
+ additionalProperties: true
4283
+ },
4284
+ actor: { type: "string" }
4285
+ }
4286
+ }, "Updated life-force state after fatigue signal"),
4287
+ default: { $ref: "#/components/responses/Error" }
4288
+ }
4289
+ }
4290
+ },
4291
+ "/api/v1/movement/day": {
4292
+ get: {
4293
+ summary: "Read one day of movement detail with distance, stays, trips, gaps, and summaries",
4294
+ responses: {
4295
+ "200": jsonResponse({
4296
+ type: "object",
4297
+ required: ["movement"],
4298
+ properties: {
4299
+ movement: {
4300
+ type: "object",
4301
+ additionalProperties: true
4302
+ }
4303
+ }
4304
+ }, "Movement day detail"),
4305
+ default: { $ref: "#/components/responses/Error" }
4306
+ }
4307
+ }
4308
+ },
4309
+ "/api/v1/movement/month": {
4310
+ get: {
4311
+ summary: "Read one month of movement summary",
4312
+ responses: {
4313
+ "200": jsonResponse({
4314
+ type: "object",
4315
+ required: ["movement"],
4316
+ properties: {
4317
+ movement: {
4318
+ type: "object",
4319
+ additionalProperties: true
4320
+ }
4321
+ }
4322
+ }, "Movement month summary"),
4323
+ default: { $ref: "#/components/responses/Error" }
4324
+ }
4325
+ }
4326
+ },
4327
+ "/api/v1/movement/all-time": {
4328
+ get: {
4329
+ summary: "Read all-time movement summary including place and trip distribution",
4330
+ responses: {
4331
+ "200": jsonResponse({
4332
+ type: "object",
4333
+ required: ["movement"],
4334
+ properties: {
4335
+ movement: {
4336
+ type: "object",
4337
+ additionalProperties: true
4338
+ }
4339
+ }
4340
+ }, "Movement all-time summary"),
4341
+ default: { $ref: "#/components/responses/Error" }
4342
+ }
4343
+ }
4344
+ },
4345
+ "/api/v1/movement/timeline": {
4346
+ get: {
4347
+ summary: "Read the paginated movement timeline with stays, trips, missing spans, and projected boxes",
4348
+ responses: {
4349
+ "200": jsonResponse({
4350
+ type: "object",
4351
+ required: ["movement"],
4352
+ properties: {
4353
+ movement: {
4354
+ type: "object",
4355
+ additionalProperties: true
4356
+ }
4357
+ }
4358
+ }, "Movement timeline"),
4359
+ default: { $ref: "#/components/responses/Error" }
4360
+ }
4361
+ }
4362
+ },
4363
+ "/api/v1/movement/settings": {
4364
+ get: {
4365
+ summary: "Read movement capture settings",
4366
+ responses: {
4367
+ "200": jsonResponse({
4368
+ type: "object",
4369
+ required: ["settings"],
4370
+ properties: {
4371
+ settings: {
4372
+ type: "object",
4373
+ additionalProperties: true
4374
+ }
4375
+ }
4376
+ }, "Movement settings"),
4377
+ default: { $ref: "#/components/responses/Error" }
4378
+ }
4379
+ },
4380
+ patch: {
4381
+ summary: "Update movement capture settings",
4382
+ responses: {
4383
+ "200": jsonResponse({
4384
+ type: "object",
4385
+ required: ["settings"],
4386
+ properties: {
4387
+ settings: {
4388
+ type: "object",
4389
+ additionalProperties: true
4390
+ }
4391
+ }
4392
+ }, "Updated movement settings"),
4393
+ default: { $ref: "#/components/responses/Error" }
4394
+ }
4395
+ }
4396
+ },
4397
+ "/api/v1/movement/places": {
4398
+ get: {
4399
+ summary: "List known movement places",
4400
+ responses: {
4401
+ "200": jsonResponse({
4402
+ type: "object",
4403
+ required: ["places"],
4404
+ properties: {
4405
+ places: arrayOf({
4406
+ type: "object",
4407
+ additionalProperties: true
4408
+ })
4409
+ }
4410
+ }, "Movement places"),
4411
+ default: { $ref: "#/components/responses/Error" }
4412
+ }
4413
+ },
4414
+ post: {
4415
+ summary: "Create one user-defined movement place",
4416
+ responses: {
4417
+ "201": jsonResponse({
4418
+ type: "object",
4419
+ required: ["place"],
4420
+ properties: {
4421
+ place: {
4422
+ type: "object",
4423
+ additionalProperties: true
4424
+ }
4425
+ }
4426
+ }, "Created movement place"),
4427
+ default: { $ref: "#/components/responses/Error" }
4428
+ }
4429
+ }
4430
+ },
4431
+ "/api/v1/movement/places/{id}": {
4432
+ patch: {
4433
+ summary: "Update one known movement place",
4434
+ responses: {
4435
+ "200": jsonResponse({
4436
+ type: "object",
4437
+ required: ["place"],
4438
+ properties: {
4439
+ place: {
4440
+ type: "object",
4441
+ additionalProperties: true
4442
+ }
4443
+ }
4444
+ }, "Updated movement place"),
4445
+ "404": { $ref: "#/components/responses/Error" }
4446
+ }
4447
+ }
4448
+ },
4449
+ "/api/v1/movement/user-boxes": {
4450
+ post: {
4451
+ summary: "Create a user-defined movement overlay box such as a manual stay, trip, or missing-data override",
4452
+ responses: {
4453
+ "201": jsonResponse({
4454
+ type: "object",
4455
+ required: ["box"],
4456
+ properties: {
4457
+ box: {
4458
+ type: "object",
4459
+ additionalProperties: true
4460
+ }
4461
+ }
4462
+ }, "Created movement user box"),
4463
+ default: { $ref: "#/components/responses/Error" }
4464
+ }
4465
+ }
4466
+ },
4467
+ "/api/v1/movement/user-boxes/preflight": {
4468
+ post: {
4469
+ summary: "Analyze a proposed movement overlay before saving it, especially when replacing a missing gap or overlapping another box",
4470
+ responses: {
4471
+ "200": jsonResponse({
4472
+ type: "object",
4473
+ required: ["preflight"],
4474
+ properties: {
4475
+ preflight: {
4476
+ type: "object",
4477
+ additionalProperties: true
4478
+ }
4479
+ }
4480
+ }, "Movement user-box preflight"),
4481
+ default: { $ref: "#/components/responses/Error" }
4482
+ }
4483
+ }
4484
+ },
4485
+ "/api/v1/movement/user-boxes/{id}": {
4486
+ patch: {
4487
+ summary: "Update one user-defined movement overlay box",
4488
+ responses: {
4489
+ "200": jsonResponse({
4490
+ type: "object",
4491
+ required: ["box"],
4492
+ properties: {
4493
+ box: {
4494
+ type: "object",
4495
+ additionalProperties: true
4496
+ }
4497
+ }
4498
+ }, "Updated movement user box"),
4499
+ "404": { $ref: "#/components/responses/Error" }
4500
+ }
4501
+ },
4502
+ delete: {
4503
+ summary: "Delete one user-defined movement box",
4504
+ responses: {
4505
+ "200": jsonResponse({
4506
+ type: "object",
4507
+ additionalProperties: true
4508
+ }, "Deleted movement user box"),
4509
+ "404": { $ref: "#/components/responses/Error" }
4510
+ }
4511
+ }
4512
+ },
4513
+ "/api/v1/movement/automatic-boxes/{id}/invalidate": {
4514
+ post: {
4515
+ summary: "Hide one automatic movement box and project the resulting user-defined overlay",
4516
+ responses: {
4517
+ "201": jsonResponse({
4518
+ type: "object",
4519
+ required: ["box"],
4520
+ properties: {
4521
+ box: {
4522
+ type: "object",
4523
+ additionalProperties: true
4524
+ }
4525
+ }
4526
+ }, "Invalidated automatic movement box"),
4527
+ "404": { $ref: "#/components/responses/Error" }
4528
+ }
4529
+ }
4530
+ },
4531
+ "/api/v1/movement/stays/{id}": {
4532
+ patch: {
4533
+ summary: "Update one recorded movement stay",
4534
+ responses: {
4535
+ "200": jsonResponse({
4536
+ type: "object",
4537
+ required: ["stay"],
4538
+ properties: {
4539
+ stay: {
4540
+ type: "object",
4541
+ additionalProperties: true
4542
+ }
4543
+ }
4544
+ }, "Updated movement stay"),
4545
+ "404": { $ref: "#/components/responses/Error" }
4546
+ }
4547
+ },
4548
+ delete: {
4549
+ summary: "Delete one recorded movement stay",
4550
+ responses: {
4551
+ "200": jsonResponse({
4552
+ type: "object",
4553
+ additionalProperties: true
4554
+ }, "Deleted movement stay"),
4555
+ "404": { $ref: "#/components/responses/Error" }
4556
+ }
4557
+ }
4558
+ },
4559
+ "/api/v1/movement/trips/{id}": {
4560
+ get: {
4561
+ summary: "Read one movement trip with its full detail",
4562
+ responses: {
4563
+ "200": jsonResponse({
4564
+ type: "object",
4565
+ required: ["movement"],
4566
+ properties: {
4567
+ movement: {
4568
+ type: "object",
4569
+ additionalProperties: true
4570
+ }
4571
+ }
4572
+ }, "Movement trip detail"),
4573
+ "404": { $ref: "#/components/responses/Error" }
4574
+ }
4575
+ },
4576
+ patch: {
4577
+ summary: "Update one movement trip",
4578
+ responses: {
4579
+ "200": jsonResponse({
4580
+ type: "object",
4581
+ required: ["trip"],
4582
+ properties: {
4583
+ trip: {
4584
+ type: "object",
4585
+ additionalProperties: true
4586
+ }
4587
+ }
4588
+ }, "Updated movement trip"),
4589
+ "404": { $ref: "#/components/responses/Error" }
4590
+ }
4591
+ },
4592
+ delete: {
4593
+ summary: "Delete one movement trip",
4594
+ responses: {
4595
+ "200": jsonResponse({
4596
+ type: "object",
4597
+ additionalProperties: true
4598
+ }, "Deleted movement trip"),
4599
+ "404": { $ref: "#/components/responses/Error" }
4600
+ }
4601
+ }
4602
+ },
4603
+ "/api/v1/movement/trips/{id}/points/{pointId}": {
4604
+ patch: {
4605
+ summary: "Update one movement trip datapoint",
4606
+ responses: {
4607
+ "200": jsonResponse({
4608
+ type: "object",
4609
+ additionalProperties: true
4610
+ }, "Updated movement trip point"),
4611
+ "404": { $ref: "#/components/responses/Error" }
4612
+ }
4613
+ },
4614
+ delete: {
4615
+ summary: "Delete one movement trip datapoint",
4616
+ responses: {
4617
+ "200": jsonResponse({
4618
+ type: "object",
4619
+ additionalProperties: true
4620
+ }, "Deleted movement trip point"),
4621
+ "404": { $ref: "#/components/responses/Error" }
4622
+ }
4623
+ }
4624
+ },
4625
+ "/api/v1/movement/selection": {
4626
+ post: {
4627
+ summary: "Aggregate one selected movement range or set of segments",
4628
+ responses: {
4629
+ "200": jsonResponse({
4630
+ type: "object",
4631
+ required: ["movement"],
4632
+ properties: {
4633
+ movement: {
4634
+ type: "object",
4635
+ additionalProperties: true
4636
+ }
4637
+ }
4638
+ }, "Movement selection aggregate"),
4639
+ default: { $ref: "#/components/responses/Error" }
4640
+ }
4641
+ }
4642
+ },
4643
+ "/api/v1/workbench/catalog/boxes": {
4644
+ get: {
4645
+ summary: "List registered Workbench boxes and their contracts",
4646
+ responses: {
4647
+ "200": jsonResponse({
4648
+ type: "object",
4649
+ required: ["boxes"],
4650
+ properties: {
4651
+ boxes: arrayOf({
4652
+ type: "object",
4653
+ additionalProperties: true
4654
+ })
4655
+ }
4656
+ }, "Workbench box catalog"),
4657
+ default: { $ref: "#/components/responses/Error" }
4658
+ }
4659
+ }
4660
+ },
4661
+ "/api/v1/workbench/flows": {
4662
+ get: {
4663
+ summary: "List Workbench flows and recent execution summaries",
4664
+ responses: {
4665
+ "200": jsonResponse({
4666
+ type: "object",
4667
+ required: ["flows"],
4668
+ properties: {
4669
+ flows: arrayOf({
4670
+ type: "object",
4671
+ additionalProperties: true
4672
+ })
4673
+ }
4674
+ }, "Workbench flow collection"),
4675
+ default: { $ref: "#/components/responses/Error" }
4676
+ }
4677
+ },
4678
+ post: {
4679
+ summary: "Create one Workbench flow",
4680
+ responses: {
4681
+ "201": jsonResponse({
4682
+ type: "object",
4683
+ required: ["flow"],
4684
+ properties: {
4685
+ flow: {
4686
+ type: "object",
4687
+ additionalProperties: true
4688
+ }
4689
+ }
4690
+ }, "Created Workbench flow"),
4691
+ default: { $ref: "#/components/responses/Error" }
4692
+ }
4693
+ }
4694
+ },
4695
+ "/api/v1/workbench/flows/{id}": {
4696
+ get: {
4697
+ summary: "Read one Workbench flow with runs",
4698
+ responses: {
4699
+ "200": jsonResponse({
4700
+ type: "object",
4701
+ required: ["flow", "runs"],
4702
+ properties: {
4703
+ flow: {
4704
+ type: "object",
4705
+ additionalProperties: true
4706
+ },
4707
+ runs: arrayOf({
4708
+ type: "object",
4709
+ additionalProperties: true
4710
+ })
4711
+ }
4712
+ }, "Workbench flow detail"),
4713
+ "404": { $ref: "#/components/responses/Error" }
4714
+ }
4715
+ },
4716
+ patch: {
4717
+ summary: "Update one Workbench flow",
4718
+ responses: {
4719
+ "200": jsonResponse({
4720
+ type: "object",
4721
+ required: ["flow"],
4722
+ properties: {
4723
+ flow: {
4724
+ type: "object",
4725
+ additionalProperties: true
4726
+ }
4727
+ }
4728
+ }, "Updated Workbench flow"),
4729
+ "404": { $ref: "#/components/responses/Error" }
4730
+ }
4731
+ },
4732
+ delete: {
4733
+ summary: "Delete one Workbench flow",
4734
+ responses: {
4735
+ "200": jsonResponse({
4736
+ type: "object",
4737
+ additionalProperties: true
4738
+ }, "Deleted Workbench flow"),
4739
+ "404": { $ref: "#/components/responses/Error" }
4740
+ }
4741
+ }
4742
+ },
4743
+ "/api/v1/workbench/flows/by-slug/{slug}": {
4744
+ get: {
4745
+ summary: "Read one Workbench flow by slug",
4746
+ responses: {
4747
+ "200": jsonResponse({
4748
+ type: "object",
4749
+ required: ["flow"],
4750
+ properties: {
4751
+ flow: {
4752
+ type: "object",
4753
+ additionalProperties: true
4754
+ }
4755
+ }
4756
+ }, "Workbench flow by slug"),
4757
+ "404": { $ref: "#/components/responses/Error" }
4758
+ }
4759
+ }
4760
+ },
4761
+ "/api/v1/workbench/flows/{id}/run": {
4762
+ post: {
4763
+ summary: "Run one Workbench flow by id",
4764
+ responses: {
4765
+ "200": jsonResponse({
4766
+ type: "object",
4767
+ required: ["flow", "run", "conversation"],
4768
+ properties: {
4769
+ flow: {
4770
+ type: "object",
4771
+ additionalProperties: true
4772
+ },
4773
+ run: {
4774
+ type: "object",
4775
+ additionalProperties: true
4776
+ },
4777
+ conversation: {
4778
+ type: "object",
4779
+ additionalProperties: true
4780
+ }
4781
+ }
4782
+ }, "Workbench flow execution"),
4783
+ "404": { $ref: "#/components/responses/Error" }
4784
+ }
4785
+ }
4786
+ },
4787
+ "/api/v1/workbench/run": {
4788
+ post: {
4789
+ summary: "Run one Workbench flow by payload with flowId",
4790
+ responses: {
4791
+ "200": jsonResponse({
4792
+ type: "object",
4793
+ required: ["flow", "run", "conversation"],
4794
+ properties: {
4795
+ flow: {
4796
+ type: "object",
4797
+ additionalProperties: true
4798
+ },
4799
+ run: {
4800
+ type: "object",
4801
+ additionalProperties: true
4802
+ },
4803
+ conversation: {
4804
+ type: "object",
4805
+ additionalProperties: true
4806
+ }
4807
+ }
4808
+ }, "Workbench flow execution"),
4809
+ "404": { $ref: "#/components/responses/Error" }
4810
+ }
4811
+ }
4812
+ },
4813
+ "/api/v1/workbench/flows/{id}/chat": {
4814
+ post: {
4815
+ summary: "Continue or start one Workbench chat flow",
4816
+ responses: {
4817
+ "200": jsonResponse({
4818
+ type: "object",
4819
+ additionalProperties: true
4820
+ }, "Workbench chat response"),
4821
+ "404": { $ref: "#/components/responses/Error" }
4822
+ }
4823
+ }
4824
+ },
4825
+ "/api/v1/workbench/flows/{id}/output": {
4826
+ get: {
4827
+ summary: "Read the latest published whole-flow output",
4828
+ responses: {
4829
+ "200": jsonResponse({
4830
+ type: "object",
4831
+ additionalProperties: true
4832
+ }, "Workbench published output"),
4833
+ "404": { $ref: "#/components/responses/Error" }
4834
+ }
4835
+ }
4836
+ },
4837
+ "/api/v1/workbench/flows/{id}/runs": {
4838
+ get: {
4839
+ summary: "List Workbench runs for one flow",
4840
+ responses: {
4841
+ "200": jsonResponse({
4842
+ type: "object",
4843
+ required: ["flow", "runs"],
4844
+ properties: {
4845
+ flow: {
4846
+ type: "object",
4847
+ additionalProperties: true
4848
+ },
4849
+ runs: arrayOf({
4850
+ type: "object",
4851
+ additionalProperties: true
4852
+ })
4853
+ }
4854
+ }, "Workbench run list"),
4855
+ "404": { $ref: "#/components/responses/Error" }
4856
+ }
4857
+ }
4858
+ },
4859
+ "/api/v1/workbench/flows/{id}/runs/{runId}": {
4860
+ get: {
4861
+ summary: "Read one Workbench run detail",
4862
+ responses: {
4863
+ "200": jsonResponse({
4864
+ type: "object",
4865
+ required: ["flow", "run"],
4866
+ properties: {
4867
+ flow: {
4868
+ type: "object",
4869
+ additionalProperties: true
4870
+ },
4871
+ run: {
4872
+ type: "object",
4873
+ additionalProperties: true
4874
+ }
4875
+ }
4876
+ }, "Workbench run detail"),
4877
+ "404": { $ref: "#/components/responses/Error" }
4878
+ }
4879
+ }
4880
+ },
4881
+ "/api/v1/workbench/flows/{id}/runs/{runId}/nodes": {
4882
+ get: {
4883
+ summary: "List node results for one Workbench run",
4884
+ responses: {
4885
+ "200": jsonResponse({
4886
+ type: "object",
4887
+ required: ["flow", "run", "nodeResults"],
4888
+ properties: {
4889
+ flow: {
4890
+ type: "object",
4891
+ additionalProperties: true
4892
+ },
4893
+ run: {
4894
+ type: "object",
4895
+ additionalProperties: true
4896
+ },
4897
+ nodeResults: arrayOf({
4898
+ type: "object",
4899
+ additionalProperties: true
4900
+ })
4901
+ }
4902
+ }, "Workbench node results"),
4903
+ "404": { $ref: "#/components/responses/Error" }
4904
+ }
4905
+ }
4906
+ },
4907
+ "/api/v1/workbench/flows/{id}/runs/{runId}/nodes/{nodeId}": {
4908
+ get: {
4909
+ summary: "Read one node result for one Workbench run",
4910
+ responses: {
4911
+ "200": jsonResponse({
4912
+ type: "object",
4913
+ required: ["flow", "nodeResult"],
4914
+ properties: {
4915
+ flow: {
4916
+ type: "object",
4917
+ additionalProperties: true
4918
+ },
4919
+ nodeResult: {
4920
+ type: "object",
4921
+ additionalProperties: true
4922
+ }
4923
+ }
4924
+ }, "Workbench node result"),
4925
+ "404": { $ref: "#/components/responses/Error" }
4926
+ }
4927
+ }
4928
+ },
4929
+ "/api/v1/workbench/flows/{id}/nodes/{nodeId}/output": {
4930
+ get: {
4931
+ summary: "Read the latest successful output for one Workbench node",
4932
+ responses: {
4933
+ "200": jsonResponse({
4934
+ type: "object",
4935
+ required: ["flow", "run", "nodeResult"],
4936
+ properties: {
4937
+ flow: {
4938
+ type: "object",
4939
+ additionalProperties: true
4940
+ },
4941
+ run: {
4942
+ type: "object",
4943
+ additionalProperties: true
4944
+ },
4945
+ nodeResult: {
4946
+ type: "object",
4947
+ additionalProperties: true
4948
+ }
4949
+ }
4950
+ }, "Workbench latest node output"),
4951
+ "404": { $ref: "#/components/responses/Error" }
4952
+ }
4953
+ }
4954
+ },
4130
4955
  "/api/v1/wiki/settings": {
4131
4956
  get: {
4132
4957
  summary: "Read wiki spaces plus enabled LLM and embedding profiles",
@@ -5979,7 +6804,7 @@ export function buildOpenApiDocument() {
5979
6804
  },
5980
6805
  post: {
5981
6806
  summary: "Create a Google, Apple, or custom CalDAV calendar connection",
5982
- description: "Forge first discovers the writable calendars for the account, then stores the chosen mirrored calendars and dedicated Forge write calendar.",
6807
+ description: "Forge first discovers the writable calendars for the account, then stores the chosen mirrored calendars and either reuses the existing shared Forge write target or saves a new one when needed.",
5983
6808
  responses: {
5984
6809
  "201": jsonResponse({
5985
6810
  type: "object",