forge-openclaw-plugin 0.2.26 → 0.2.28

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 (109) hide show
  1. package/README.md +60 -3
  2. package/dist/assets/{board-ta0rUHOf.js → board-DPFvZf-D.js} +2 -2
  3. package/dist/assets/{board-ta0rUHOf.js.map → board-DPFvZf-D.js.map} +1 -1
  4. package/dist/assets/index-Auw3JrdE.css +1 -0
  5. package/dist/assets/index-D1H7myQH.js +85 -0
  6. package/dist/assets/index-D1H7myQH.js.map +1 -0
  7. package/dist/assets/knowledge-graph-layout.worker-DRvzPxhP.js +2 -0
  8. package/dist/assets/knowledge-graph-layout.worker-DRvzPxhP.js.map +1 -0
  9. package/dist/assets/{motion-fBKPB6yw.js → motion-Bvwc85ch.js} +2 -2
  10. package/dist/assets/{motion-fBKPB6yw.js.map → motion-Bvwc85ch.js.map} +1 -1
  11. package/dist/assets/{table-C-IGTQni.js → table-FJQTJvUR.js} +2 -2
  12. package/dist/assets/{table-C-IGTQni.js.map → table-FJQTJvUR.js.map} +1 -1
  13. package/dist/assets/{ui-DInOpaYF.js → ui-GXFcgvSw.js} +2 -2
  14. package/dist/assets/{ui-DInOpaYF.js.map → ui-GXFcgvSw.js.map} +1 -1
  15. package/dist/assets/vendor-Cwf49UMz.js +1247 -0
  16. package/dist/assets/vendor-Cwf49UMz.js.map +1 -0
  17. package/dist/index.html +7 -7
  18. package/dist/openclaw/local-runtime.js +16 -0
  19. package/dist/openclaw/routes.d.ts +27 -0
  20. package/dist/openclaw/routes.js +16 -12
  21. package/dist/server/server/migrations/037_workbench_public_inputs_and_run_inputs.sql +5 -0
  22. package/dist/server/server/migrations/038_data_management_settings.sql +11 -0
  23. package/dist/server/server/migrations/039_life_force_and_action_points.sql +114 -0
  24. package/dist/server/server/migrations/040_screen_time_domain.sql +89 -0
  25. package/dist/server/server/migrations/041_companion_source_states.sql +21 -0
  26. package/dist/server/server/migrations/042_movement_boxes.sql +47 -0
  27. package/dist/server/server/migrations/043_movement_box_overlap_overrides.sql +26 -0
  28. package/dist/server/server/src/app.js +1900 -91
  29. package/dist/server/server/src/connectors/box-registry.js +44 -9
  30. package/dist/server/server/src/data-management-types.js +107 -0
  31. package/dist/server/server/src/db.js +68 -4
  32. package/dist/server/server/src/demo-data.js +2 -2
  33. package/dist/server/server/src/health.js +702 -18
  34. package/dist/server/server/src/managers/platform/llm-manager.js +7 -4
  35. package/dist/server/server/src/managers/platform/mock-workbench-provider.js +149 -0
  36. package/dist/server/server/src/managers/platform/secrets-manager.js +18 -1
  37. package/dist/server/server/src/managers/runtime.js +9 -0
  38. package/dist/server/server/src/movement.js +1971 -112
  39. package/dist/server/server/src/openapi.js +1390 -105
  40. package/dist/server/server/src/psyche-types.js +9 -1
  41. package/dist/server/server/src/repositories/activity-events.js +8 -0
  42. package/dist/server/server/src/repositories/ai-connectors.js +522 -74
  43. package/dist/server/server/src/repositories/calendar.js +151 -0
  44. package/dist/server/server/src/repositories/habits.js +37 -1
  45. package/dist/server/server/src/repositories/model-settings.js +13 -3
  46. package/dist/server/server/src/repositories/notes.js +3 -0
  47. package/dist/server/server/src/repositories/settings.js +380 -18
  48. package/dist/server/server/src/repositories/tasks.js +170 -10
  49. package/dist/server/server/src/runtime-data-root.js +82 -0
  50. package/dist/server/server/src/screen-time.js +802 -0
  51. package/dist/server/server/src/services/data-management.js +788 -0
  52. package/dist/server/server/src/services/entity-crud.js +205 -2
  53. package/dist/server/server/src/services/knowledge-graph.js +1455 -0
  54. package/dist/server/server/src/services/life-force-model.js +217 -0
  55. package/dist/server/server/src/services/life-force.js +2506 -0
  56. package/dist/server/server/src/services/psyche-observation-calendar.js +383 -16
  57. package/dist/server/server/src/types.js +307 -14
  58. package/dist/server/server/src/web.js +228 -13
  59. package/dist/server/src/components/customization/utility-widgets.js +136 -27
  60. package/dist/server/src/components/ui/info-tooltip.js +25 -0
  61. package/dist/server/src/components/workbench-boxes/calendar/calendar-boxes.js +78 -0
  62. package/dist/server/src/components/workbench-boxes/goals/goals-boxes.js +62 -0
  63. package/dist/server/src/components/workbench-boxes/habits/habits-boxes.js +62 -0
  64. package/dist/server/src/components/workbench-boxes/health/health-boxes.js +63 -8
  65. package/dist/server/src/components/workbench-boxes/insights/insights-boxes.js +50 -0
  66. package/dist/server/src/components/workbench-boxes/kanban/kanban-boxes.js +62 -54
  67. package/dist/server/src/components/workbench-boxes/movement/movement-boxes.js +18 -8
  68. package/dist/server/src/components/workbench-boxes/notes/notes-boxes.js +56 -38
  69. package/dist/server/src/components/workbench-boxes/overview/overview-boxes.js +65 -0
  70. package/dist/server/src/components/workbench-boxes/preferences/preferences-boxes.js +78 -0
  71. package/dist/server/src/components/workbench-boxes/projects/projects-boxes.js +35 -30
  72. package/dist/server/src/components/workbench-boxes/psyche/psyche-boxes.js +88 -0
  73. package/dist/server/src/components/workbench-boxes/questionnaires/questionnaires-boxes.js +61 -0
  74. package/dist/server/src/components/workbench-boxes/review/review-boxes.js +53 -0
  75. package/dist/server/src/components/workbench-boxes/shared/define-workbench-box.js +3 -1
  76. package/dist/server/src/components/workbench-boxes/shared/generic-node-view.js +39 -3
  77. package/dist/server/src/components/workbench-boxes/strategies/strategies-boxes.js +62 -0
  78. package/dist/server/src/components/workbench-boxes/tasks/tasks-boxes.js +76 -0
  79. package/dist/server/src/components/workbench-boxes/today/today-boxes.js +47 -32
  80. package/dist/server/src/components/workbench-boxes/wiki/wiki-boxes.js +60 -0
  81. package/dist/server/src/lib/api.js +280 -21
  82. package/dist/server/src/lib/data-management-types.js +1 -0
  83. package/dist/server/src/lib/entity-visuals.js +279 -0
  84. package/dist/server/src/lib/knowledge-graph-types.js +276 -0
  85. package/dist/server/src/lib/knowledge-graph.js +470 -0
  86. package/dist/server/src/lib/schemas.js +4 -0
  87. package/dist/server/src/lib/snapshot-normalizer.js +45 -1
  88. package/dist/server/src/lib/workbench/contracts.js +229 -0
  89. package/dist/server/src/lib/workbench/nodes.js +200 -0
  90. package/dist/server/src/lib/workbench/registry.js +52 -5
  91. package/dist/server/src/lib/workbench/runtime.js +254 -38
  92. package/dist/server/src/lib/workbench/tool-catalog.js +68 -0
  93. package/openclaw.plugin.json +1 -1
  94. package/package.json +1 -1
  95. package/server/migrations/037_workbench_public_inputs_and_run_inputs.sql +5 -0
  96. package/server/migrations/038_data_management_settings.sql +11 -0
  97. package/server/migrations/039_life_force_and_action_points.sql +114 -0
  98. package/server/migrations/040_screen_time_domain.sql +89 -0
  99. package/server/migrations/041_companion_source_states.sql +21 -0
  100. package/server/migrations/042_movement_boxes.sql +47 -0
  101. package/server/migrations/043_movement_box_overlap_overrides.sql +26 -0
  102. package/skills/forge-openclaw/SKILL.md +41 -11
  103. package/skills/forge-openclaw/entity_conversation_playbooks.md +448 -34
  104. package/skills/forge-openclaw/psyche_entity_playbooks.md +170 -17
  105. package/dist/assets/index-Ro0ZF_az.css +0 -1
  106. package/dist/assets/index-ytlpSj23.js +0 -79
  107. package/dist/assets/index-ytlpSj23.js.map +0 -1
  108. package/dist/assets/vendor-lE3tZJcC.js +0 -876
  109. package/dist/assets/vendor-lE3tZJcC.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
  }
@@ -2591,9 +2620,15 @@ export function buildOpenApiDocument() {
2591
2620
  "conceptModel",
2592
2621
  "psycheSubmoduleModel",
2593
2622
  "psycheCoachingPlaybooks",
2623
+ "conversationRules",
2624
+ "entityConversationPlaybooks",
2594
2625
  "relationshipModel",
2626
+ "entityRouteModel",
2627
+ "multiUserModel",
2628
+ "strategyContractModel",
2595
2629
  "entityCatalog",
2596
2630
  "toolInputCatalog",
2631
+ "connectionGuides",
2597
2632
  "verificationPaths",
2598
2633
  "recommendedPluginTools",
2599
2634
  "interactionGuidance",
@@ -2690,10 +2725,20 @@ export function buildOpenApiDocument() {
2690
2725
  "task",
2691
2726
  "taskRun",
2692
2727
  "note",
2728
+ "wiki",
2729
+ "sleepSession",
2730
+ "workoutSession",
2731
+ "preferences",
2732
+ "questionnaire",
2733
+ "selfObservation",
2693
2734
  "insight",
2694
2735
  "calendar",
2695
2736
  "workBlock",
2696
2737
  "taskTimebox",
2738
+ "workAdjustment",
2739
+ "movement",
2740
+ "lifeForce",
2741
+ "workbench",
2697
2742
  "psyche"
2698
2743
  ],
2699
2744
  properties: {
@@ -2702,10 +2747,20 @@ export function buildOpenApiDocument() {
2702
2747
  task: { type: "string" },
2703
2748
  taskRun: { type: "string" },
2704
2749
  note: { type: "string" },
2750
+ wiki: { type: "string" },
2751
+ sleepSession: { type: "string" },
2752
+ workoutSession: { type: "string" },
2753
+ preferences: { type: "string" },
2754
+ questionnaire: { type: "string" },
2755
+ selfObservation: { type: "string" },
2705
2756
  insight: { type: "string" },
2706
2757
  calendar: { type: "string" },
2707
2758
  workBlock: { type: "string" },
2708
2759
  taskTimebox: { type: "string" },
2760
+ workAdjustment: { type: "string" },
2761
+ movement: { type: "string" },
2762
+ lifeForce: { type: "string" },
2763
+ workbench: { type: "string" },
2709
2764
  psyche: { type: "string" }
2710
2765
  }
2711
2766
  },
@@ -2761,24 +2816,138 @@ export function buildOpenApiDocument() {
2761
2816
  notes: arrayOf({ type: "string" })
2762
2817
  }
2763
2818
  }),
2819
+ conversationRules: arrayOf({ type: "string" }),
2820
+ entityConversationPlaybooks: arrayOf({
2821
+ type: "object",
2822
+ additionalProperties: false,
2823
+ required: ["focus", "openingQuestion", "coachingGoal", "askSequence"],
2824
+ properties: {
2825
+ focus: { type: "string" },
2826
+ openingQuestion: { type: "string" },
2827
+ coachingGoal: { type: "string" },
2828
+ askSequence: arrayOf({ type: "string" })
2829
+ }
2830
+ }),
2764
2831
  relationshipModel: arrayOf({ type: "string" }),
2832
+ entityRouteModel: {
2833
+ type: "object",
2834
+ additionalProperties: false,
2835
+ required: [
2836
+ "batchCrudEntities",
2837
+ "batchRoutes",
2838
+ "specializedCrudEntities",
2839
+ "actionEntities",
2840
+ "specializedDomainSurfaces",
2841
+ "readModelOnlySurfaces"
2842
+ ],
2843
+ properties: {
2844
+ batchCrudEntities: arrayOf({ type: "string" }),
2845
+ batchRoutes: {
2846
+ type: "object",
2847
+ additionalProperties: false,
2848
+ required: ["search", "create", "update", "delete", "restore"],
2849
+ properties: {
2850
+ search: { type: "string" },
2851
+ create: { type: "string" },
2852
+ update: { type: "string" },
2853
+ delete: { type: "string" },
2854
+ restore: { type: "string" }
2855
+ }
2856
+ },
2857
+ specializedCrudEntities: {
2858
+ type: "object",
2859
+ additionalProperties: {
2860
+ type: "object",
2861
+ additionalProperties: { type: "string" }
2862
+ }
2863
+ },
2864
+ actionEntities: {
2865
+ type: "object",
2866
+ additionalProperties: {
2867
+ type: "object",
2868
+ additionalProperties: true
2869
+ }
2870
+ },
2871
+ specializedDomainSurfaces: {
2872
+ type: "object",
2873
+ additionalProperties: {
2874
+ type: "object",
2875
+ additionalProperties: true
2876
+ }
2877
+ },
2878
+ readModelOnlySurfaces: {
2879
+ type: "object",
2880
+ additionalProperties: { type: "string" }
2881
+ }
2882
+ }
2883
+ },
2884
+ multiUserModel: {
2885
+ type: "object",
2886
+ additionalProperties: false,
2887
+ required: [
2888
+ "summary",
2889
+ "defaultUserScopeBehavior",
2890
+ "routeScoping",
2891
+ "relationshipGraphDefaults"
2892
+ ],
2893
+ properties: {
2894
+ summary: { type: "string" },
2895
+ defaultUserScopeBehavior: { type: "string" },
2896
+ routeScoping: arrayOf({ type: "string" }),
2897
+ relationshipGraphDefaults: arrayOf({ type: "string" })
2898
+ }
2899
+ },
2900
+ strategyContractModel: {
2901
+ type: "object",
2902
+ additionalProperties: false,
2903
+ required: [
2904
+ "draftSummary",
2905
+ "lockSummary",
2906
+ "unlockSummary",
2907
+ "alignmentSummary",
2908
+ "metricBreakdown"
2909
+ ],
2910
+ properties: {
2911
+ draftSummary: { type: "string" },
2912
+ lockSummary: { type: "string" },
2913
+ unlockSummary: { type: "string" },
2914
+ alignmentSummary: { type: "string" },
2915
+ metricBreakdown: arrayOf({ type: "string" })
2916
+ }
2917
+ },
2765
2918
  entityCatalog: arrayOf({
2766
2919
  type: "object",
2767
2920
  additionalProperties: false,
2768
2921
  required: [
2769
2922
  "entityType",
2923
+ "classification",
2770
2924
  "purpose",
2771
2925
  "minimumCreateFields",
2772
2926
  "relationshipRules",
2773
2927
  "searchHints",
2774
- "fieldGuide"
2928
+ "fieldGuide",
2929
+ "preferredMutationPath"
2775
2930
  ],
2776
2931
  properties: {
2777
2932
  entityType: { type: "string" },
2933
+ classification: {
2934
+ type: "string",
2935
+ enum: [
2936
+ "batch_crud_entity",
2937
+ "specialized_crud_entity",
2938
+ "action_workflow_entity",
2939
+ "read_model_only_surface"
2940
+ ]
2941
+ },
2778
2942
  purpose: { type: "string" },
2779
2943
  minimumCreateFields: arrayOf({ type: "string" }),
2780
2944
  relationshipRules: arrayOf({ type: "string" }),
2781
2945
  searchHints: arrayOf({ type: "string" }),
2946
+ routeBase: nullable({ type: "string" }),
2947
+ preferredMutationPath: { type: "string" },
2948
+ preferredReadPath: nullable({ type: "string" }),
2949
+ preferredMutationTool: nullable({ type: "string" }),
2950
+ examples: arrayOf({ type: "string" }),
2782
2951
  fieldGuide: arrayOf({
2783
2952
  type: "object",
2784
2953
  additionalProperties: false,
@@ -2831,6 +3000,15 @@ export function buildOpenApiDocument() {
2831
3000
  "context",
2832
3001
  "xpMetrics",
2833
3002
  "weeklyReview",
3003
+ "sleepOverview",
3004
+ "sportsOverview",
3005
+ "lifeForce",
3006
+ "movementTimeline",
3007
+ "movementAllTime",
3008
+ "workbenchFlows",
3009
+ "wikiSettings",
3010
+ "wikiSearch",
3011
+ "wikiHealth",
2834
3012
  "calendarOverview",
2835
3013
  "settingsBin",
2836
3014
  "batchSearch",
@@ -2842,6 +3020,15 @@ export function buildOpenApiDocument() {
2842
3020
  context: { type: "string" },
2843
3021
  xpMetrics: { type: "string" },
2844
3022
  weeklyReview: { type: "string" },
3023
+ sleepOverview: { type: "string" },
3024
+ sportsOverview: { type: "string" },
3025
+ lifeForce: { type: "string" },
3026
+ movementTimeline: { type: "string" },
3027
+ movementAllTime: { type: "string" },
3028
+ workbenchFlows: { type: "string" },
3029
+ wikiSettings: { type: "string" },
3030
+ wikiSearch: { type: "string" },
3031
+ wikiHealth: { type: "string" },
2845
3032
  calendarOverview: { type: "string" },
2846
3033
  settingsBin: { type: "string" },
2847
3034
  batchSearch: { type: "string" },
@@ -2858,6 +3045,9 @@ export function buildOpenApiDocument() {
2858
3045
  "readModels",
2859
3046
  "uiWorkflow",
2860
3047
  "entityWorkflow",
3048
+ "wikiWorkflow",
3049
+ "healthWorkflow",
3050
+ "rewardWorkflow",
2861
3051
  "workWorkflow",
2862
3052
  "calendarWorkflow",
2863
3053
  "insightWorkflow"
@@ -2867,6 +3057,9 @@ export function buildOpenApiDocument() {
2867
3057
  readModels: arrayOf({ type: "string" }),
2868
3058
  uiWorkflow: arrayOf({ type: "string" }),
2869
3059
  entityWorkflow: arrayOf({ type: "string" }),
3060
+ wikiWorkflow: arrayOf({ type: "string" }),
3061
+ healthWorkflow: arrayOf({ type: "string" }),
3062
+ rewardWorkflow: arrayOf({ type: "string" }),
2870
3063
  workWorkflow: arrayOf({ type: "string" }),
2871
3064
  calendarWorkflow: arrayOf({ type: "string" }),
2872
3065
  insightWorkflow: arrayOf({ type: "string" })
@@ -2880,6 +3073,8 @@ export function buildOpenApiDocument() {
2880
3073
  "saveSuggestionPlacement",
2881
3074
  "saveSuggestionTone",
2882
3075
  "maxQuestionsPerTurn",
3076
+ "psycheExplorationRule",
3077
+ "psycheOpeningQuestionRule",
2883
3078
  "duplicateCheckRoute",
2884
3079
  "uiSuggestionRule",
2885
3080
  "browserFallbackRule",
@@ -2890,12 +3085,28 @@ export function buildOpenApiDocument() {
2890
3085
  saveSuggestionPlacement: { type: "string" },
2891
3086
  saveSuggestionTone: { type: "string" },
2892
3087
  maxQuestionsPerTurn: { type: "integer" },
3088
+ psycheExplorationRule: { type: "string" },
3089
+ psycheOpeningQuestionRule: { type: "string" },
2893
3090
  duplicateCheckRoute: { type: "string" },
2894
3091
  uiSuggestionRule: { type: "string" },
2895
3092
  browserFallbackRule: { type: "string" },
2896
3093
  writeConsentRule: { type: "string" }
2897
3094
  }
2898
3095
  },
3096
+ connectionGuides: {
3097
+ type: "object",
3098
+ additionalProperties: {
3099
+ type: "object",
3100
+ additionalProperties: false,
3101
+ required: ["label", "installSteps", "verifyCommands", "configNotes"],
3102
+ properties: {
3103
+ label: { type: "string" },
3104
+ installSteps: arrayOf({ type: "string" }),
3105
+ verifyCommands: arrayOf({ type: "string" }),
3106
+ configNotes: arrayOf({ type: "string" })
3107
+ }
3108
+ }
3109
+ },
2899
3110
  mutationGuidance: {
2900
3111
  type: "object",
2901
3112
  additionalProperties: false,
@@ -3843,6 +4054,19 @@ export function buildOpenApiDocument() {
3843
4054
  }
3844
4055
  }, "Sleep overview")
3845
4056
  }
4057
+ },
4058
+ post: {
4059
+ summary: "Create one manual sleep session",
4060
+ responses: {
4061
+ "201": jsonResponse({
4062
+ type: "object",
4063
+ required: ["sleep"],
4064
+ properties: {
4065
+ sleep: { $ref: "#/components/schemas/SleepSession" }
4066
+ }
4067
+ }, "Created sleep session"),
4068
+ default: { $ref: "#/components/responses/Error" }
4069
+ }
3846
4070
  }
3847
4071
  },
3848
4072
  "/api/v1/health/fitness": {
@@ -3859,226 +4083,1037 @@ export function buildOpenApiDocument() {
3859
4083
  }
3860
4084
  }
3861
4085
  },
3862
- "/api/v1/health/workouts/{id}": {
3863
- patch: {
3864
- summary: "Update one workout session's reflective metadata",
4086
+ "/api/v1/health/workouts": {
4087
+ post: {
4088
+ summary: "Create one manual workout session",
3865
4089
  responses: {
3866
- "200": jsonResponse({
4090
+ "201": jsonResponse({
3867
4091
  type: "object",
3868
4092
  required: ["workout"],
3869
4093
  properties: {
3870
4094
  workout: { $ref: "#/components/schemas/WorkoutSession" }
3871
4095
  }
3872
- }, "Updated workout session"),
3873
- "404": { $ref: "#/components/responses/Error" }
3874
- }
3875
- }
3876
- },
3877
- "/api/v1/health/sleep/{id}": {
3878
- patch: {
3879
- summary: "Update one sleep session's reflective metadata",
3880
- responses: {
3881
- "200": jsonResponse({
3882
- type: "object",
3883
- required: ["sleep"],
3884
- properties: {
3885
- sleep: { $ref: "#/components/schemas/SleepSession" }
3886
- }
3887
- }, "Updated sleep session"),
3888
- "404": { $ref: "#/components/responses/Error" }
4096
+ }, "Created workout session"),
4097
+ default: { $ref: "#/components/responses/Error" }
3889
4098
  }
3890
4099
  }
3891
4100
  },
3892
- "/api/v1/wiki/settings": {
4101
+ "/api/v1/health/workouts/{id}": {
3893
4102
  get: {
3894
- summary: "Read wiki spaces plus enabled LLM and embedding profiles",
4103
+ summary: "Read one workout session",
3895
4104
  responses: {
3896
4105
  "200": jsonResponse({
3897
4106
  type: "object",
3898
- required: ["settings"],
4107
+ required: ["workout"],
3899
4108
  properties: {
3900
- settings: {
3901
- type: "object",
3902
- additionalProperties: true
3903
- }
4109
+ workout: { $ref: "#/components/schemas/WorkoutSession" }
3904
4110
  }
3905
- }, "Wiki settings")
4111
+ }, "Workout session"),
4112
+ "404": { $ref: "#/components/responses/Error" }
3906
4113
  }
3907
- }
3908
- },
3909
- "/api/v1/wiki/pages": {
3910
- get: {
3911
- summary: "List wiki or evidence pages inside one space",
4114
+ },
4115
+ patch: {
4116
+ summary: "Update one workout session's reflective metadata",
3912
4117
  responses: {
3913
4118
  "200": jsonResponse({
3914
4119
  type: "object",
3915
- required: ["pages"],
4120
+ required: ["workout"],
3916
4121
  properties: {
3917
- pages: arrayOf({
3918
- type: "object",
3919
- additionalProperties: true
3920
- })
4122
+ workout: { $ref: "#/components/schemas/WorkoutSession" }
3921
4123
  }
3922
- }, "Wiki page list")
4124
+ }, "Updated workout session"),
4125
+ "404": { $ref: "#/components/responses/Error" }
3923
4126
  }
3924
4127
  },
3925
- post: {
3926
- summary: "Create a wiki page through the file-backed wiki surface",
4128
+ delete: {
4129
+ summary: "Delete one workout session immediately",
3927
4130
  responses: {
3928
4131
  "200": jsonResponse({
3929
4132
  type: "object",
3930
- required: ["page"],
4133
+ required: ["workout"],
3931
4134
  properties: {
3932
- page: { type: "object", additionalProperties: true }
4135
+ workout: { $ref: "#/components/schemas/WorkoutSession" }
3933
4136
  }
3934
- }, "Created wiki page"),
4137
+ }, "Deleted workout session"),
3935
4138
  "404": { $ref: "#/components/responses/Error" }
3936
4139
  }
3937
4140
  }
3938
4141
  },
3939
- "/api/v1/wiki/pages/{id}": {
4142
+ "/api/v1/health/sleep/{id}": {
3940
4143
  get: {
3941
- summary: "Read one wiki page with backlinks and attached metadata",
4144
+ summary: "Read one sleep session",
3942
4145
  responses: {
3943
4146
  "200": jsonResponse({
3944
4147
  type: "object",
3945
- required: ["page"],
4148
+ required: ["sleep"],
3946
4149
  properties: {
3947
- page: { type: "object", additionalProperties: true }
4150
+ sleep: { $ref: "#/components/schemas/SleepSession" }
3948
4151
  }
3949
- }, "Wiki page detail"),
4152
+ }, "Sleep session"),
3950
4153
  "404": { $ref: "#/components/responses/Error" }
3951
4154
  }
3952
4155
  },
3953
4156
  patch: {
3954
- summary: "Update an existing wiki page through the file-backed surface",
4157
+ summary: "Update one sleep session's reflective metadata",
3955
4158
  responses: {
3956
4159
  "200": jsonResponse({
3957
4160
  type: "object",
3958
- required: ["page"],
4161
+ required: ["sleep"],
3959
4162
  properties: {
3960
- page: { type: "object", additionalProperties: true }
4163
+ sleep: { $ref: "#/components/schemas/SleepSession" }
3961
4164
  }
3962
- }, "Updated wiki page"),
4165
+ }, "Updated sleep session"),
3963
4166
  "404": { $ref: "#/components/responses/Error" }
3964
4167
  }
3965
- }
3966
- },
3967
- "/api/v1/wiki/search": {
3968
- post: {
3969
- summary: "Search the wiki with text, semantic, entity, or hybrid retrieval",
4168
+ },
4169
+ delete: {
4170
+ summary: "Delete one sleep session immediately",
3970
4171
  responses: {
3971
4172
  "200": jsonResponse({
3972
4173
  type: "object",
3973
- required: ["results"],
4174
+ required: ["sleep"],
3974
4175
  properties: {
3975
- results: arrayOf({
3976
- type: "object",
3977
- additionalProperties: true
3978
- })
4176
+ sleep: { $ref: "#/components/schemas/SleepSession" }
3979
4177
  }
3980
- }, "Wiki search results")
4178
+ }, "Deleted sleep session"),
4179
+ "404": { $ref: "#/components/responses/Error" }
3981
4180
  }
3982
4181
  }
3983
4182
  },
3984
- "/api/v1/wiki/health": {
4183
+ "/api/v1/life-force": {
3985
4184
  get: {
3986
- summary: "Read wiki health signals for one space",
4185
+ summary: "Read the current life-force overview with stats, drains, curve state, warnings, and recommendations",
3987
4186
  responses: {
3988
4187
  "200": jsonResponse({
3989
4188
  type: "object",
3990
- required: ["health"],
4189
+ required: ["lifeForce", "templates"],
3991
4190
  properties: {
3992
- health: { type: "object", additionalProperties: true }
4191
+ lifeForce: {
4192
+ type: "object",
4193
+ additionalProperties: true
4194
+ },
4195
+ templates: arrayOf({
4196
+ type: "object",
4197
+ additionalProperties: true
4198
+ })
3993
4199
  }
3994
- }, "Wiki health")
4200
+ }, "Life-force overview"),
4201
+ default: { $ref: "#/components/responses/Error" }
3995
4202
  }
3996
4203
  }
3997
4204
  },
3998
- "/api/v1/wiki/sync": {
3999
- post: {
4000
- summary: "Resync markdown files from the local wiki vault into Forge metadata",
4205
+ "/api/v1/life-force/profile": {
4206
+ patch: {
4207
+ summary: "Update the user-controlled life-force profile settings",
4001
4208
  responses: {
4002
4209
  "200": jsonResponse({
4003
4210
  type: "object",
4004
- additionalProperties: true
4005
- }, "Wiki sync result")
4211
+ required: ["lifeForce", "actor"],
4212
+ properties: {
4213
+ lifeForce: {
4214
+ type: "object",
4215
+ additionalProperties: true
4216
+ },
4217
+ actor: { type: "string" }
4218
+ }
4219
+ }, "Updated life-force profile"),
4220
+ default: { $ref: "#/components/responses/Error" }
4006
4221
  }
4007
4222
  }
4008
4223
  },
4009
- "/api/v1/wiki/reindex": {
4010
- post: {
4011
- summary: "Recompute wiki embedding chunks for one space and optional profile",
4224
+ "/api/v1/life-force/templates/{weekday}": {
4225
+ put: {
4226
+ summary: "Replace one weekday life-force curve template",
4012
4227
  responses: {
4013
4228
  "200": jsonResponse({
4014
4229
  type: "object",
4015
- additionalProperties: true
4016
- }, "Wiki reindex result")
4230
+ required: ["weekday", "points", "actor"],
4231
+ properties: {
4232
+ weekday: { type: "integer" },
4233
+ points: arrayOf({
4234
+ type: "object",
4235
+ additionalProperties: true
4236
+ }),
4237
+ actor: { type: "string" }
4238
+ }
4239
+ }, "Updated weekday curve template"),
4240
+ default: { $ref: "#/components/responses/Error" }
4017
4241
  }
4018
4242
  }
4019
4243
  },
4020
- "/api/v1/wiki/ingest-jobs": {
4244
+ "/api/v1/life-force/fatigue-signals": {
4021
4245
  post: {
4022
- summary: "Queue a wiki ingest job from raw text, local files, or a URL",
4246
+ summary: "Record a tired or recovered fatigue signal and rebuild life-force state",
4023
4247
  responses: {
4024
4248
  "200": jsonResponse({
4025
4249
  type: "object",
4026
- additionalProperties: true
4027
- }, "Queued wiki ingest job")
4250
+ required: ["lifeForce", "actor"],
4251
+ properties: {
4252
+ lifeForce: {
4253
+ type: "object",
4254
+ additionalProperties: true
4255
+ },
4256
+ actor: { type: "string" }
4257
+ }
4258
+ }, "Updated life-force state after fatigue signal"),
4259
+ default: { $ref: "#/components/responses/Error" }
4028
4260
  }
4029
4261
  }
4030
4262
  },
4031
- "/api/v1/context": {
4263
+ "/api/v1/movement/day": {
4032
4264
  get: {
4033
- summary: "Get the full Forge snapshot for the routed app shell",
4265
+ summary: "Read one day of movement detail with distance, stays, trips, gaps, and summaries",
4034
4266
  responses: {
4035
- "200": jsonResponse({ $ref: "#/components/schemas/ForgeSnapshot" }, "Forge snapshot"),
4267
+ "200": jsonResponse({
4268
+ type: "object",
4269
+ required: ["movement"],
4270
+ properties: {
4271
+ movement: {
4272
+ type: "object",
4273
+ additionalProperties: true
4274
+ }
4275
+ }
4276
+ }, "Movement day detail"),
4036
4277
  default: { $ref: "#/components/responses/Error" }
4037
4278
  }
4038
4279
  }
4039
4280
  },
4040
- "/api/v1/operator/context": {
4281
+ "/api/v1/movement/month": {
4041
4282
  get: {
4042
- summary: "Get the operator-focused Forge context for agents and assistant workflows",
4283
+ summary: "Read one month of movement summary",
4043
4284
  responses: {
4044
4285
  "200": jsonResponse({
4045
4286
  type: "object",
4046
- required: ["context"],
4287
+ required: ["movement"],
4047
4288
  properties: {
4048
- context: {
4049
- $ref: "#/components/schemas/OperatorContextPayload"
4289
+ movement: {
4290
+ type: "object",
4291
+ additionalProperties: true
4050
4292
  }
4051
4293
  }
4052
- }, "Operator context")
4294
+ }, "Movement month summary"),
4295
+ default: { $ref: "#/components/responses/Error" }
4053
4296
  }
4054
4297
  }
4055
4298
  },
4056
- "/api/v1/users/directory": {
4299
+ "/api/v1/movement/all-time": {
4057
4300
  get: {
4058
- summary: "Read the live human and bot directory with ownership summaries and directional relationship graph",
4301
+ summary: "Read all-time movement summary including place and trip distribution",
4059
4302
  responses: {
4060
4303
  "200": jsonResponse({
4061
4304
  type: "object",
4062
- required: ["directory"],
4305
+ required: ["movement"],
4063
4306
  properties: {
4064
- directory: {
4307
+ movement: {
4065
4308
  type: "object",
4066
4309
  additionalProperties: true
4067
4310
  }
4068
4311
  }
4069
- }, "User directory")
4312
+ }, "Movement all-time summary"),
4313
+ default: { $ref: "#/components/responses/Error" }
4070
4314
  }
4071
4315
  }
4072
4316
  },
4073
- "/api/v1/preferences/workspace": {
4317
+ "/api/v1/movement/timeline": {
4074
4318
  get: {
4075
- summary: "Get the inferred Preferences workspace for one user, domain, and optional context",
4319
+ summary: "Read the paginated movement timeline with stays, trips, missing spans, and projected boxes",
4076
4320
  responses: {
4077
4321
  "200": jsonResponse({
4078
4322
  type: "object",
4079
- required: ["workspace"],
4323
+ required: ["movement"],
4080
4324
  properties: {
4081
- workspace: {
4325
+ movement: {
4326
+ type: "object",
4327
+ additionalProperties: true
4328
+ }
4329
+ }
4330
+ }, "Movement timeline"),
4331
+ default: { $ref: "#/components/responses/Error" }
4332
+ }
4333
+ }
4334
+ },
4335
+ "/api/v1/movement/settings": {
4336
+ get: {
4337
+ summary: "Read movement capture settings",
4338
+ responses: {
4339
+ "200": jsonResponse({
4340
+ type: "object",
4341
+ required: ["settings"],
4342
+ properties: {
4343
+ settings: {
4344
+ type: "object",
4345
+ additionalProperties: true
4346
+ }
4347
+ }
4348
+ }, "Movement settings"),
4349
+ default: { $ref: "#/components/responses/Error" }
4350
+ }
4351
+ },
4352
+ patch: {
4353
+ summary: "Update movement capture settings",
4354
+ responses: {
4355
+ "200": jsonResponse({
4356
+ type: "object",
4357
+ required: ["settings"],
4358
+ properties: {
4359
+ settings: {
4360
+ type: "object",
4361
+ additionalProperties: true
4362
+ }
4363
+ }
4364
+ }, "Updated movement settings"),
4365
+ default: { $ref: "#/components/responses/Error" }
4366
+ }
4367
+ }
4368
+ },
4369
+ "/api/v1/movement/places": {
4370
+ get: {
4371
+ summary: "List known movement places",
4372
+ responses: {
4373
+ "200": jsonResponse({
4374
+ type: "object",
4375
+ required: ["places"],
4376
+ properties: {
4377
+ places: arrayOf({
4378
+ type: "object",
4379
+ additionalProperties: true
4380
+ })
4381
+ }
4382
+ }, "Movement places"),
4383
+ default: { $ref: "#/components/responses/Error" }
4384
+ }
4385
+ },
4386
+ post: {
4387
+ summary: "Create one user-defined movement place",
4388
+ responses: {
4389
+ "201": jsonResponse({
4390
+ type: "object",
4391
+ required: ["place"],
4392
+ properties: {
4393
+ place: {
4394
+ type: "object",
4395
+ additionalProperties: true
4396
+ }
4397
+ }
4398
+ }, "Created movement place"),
4399
+ default: { $ref: "#/components/responses/Error" }
4400
+ }
4401
+ }
4402
+ },
4403
+ "/api/v1/movement/places/{id}": {
4404
+ patch: {
4405
+ summary: "Update one known movement place",
4406
+ responses: {
4407
+ "200": jsonResponse({
4408
+ type: "object",
4409
+ required: ["place"],
4410
+ properties: {
4411
+ place: {
4412
+ type: "object",
4413
+ additionalProperties: true
4414
+ }
4415
+ }
4416
+ }, "Updated movement place"),
4417
+ "404": { $ref: "#/components/responses/Error" }
4418
+ }
4419
+ }
4420
+ },
4421
+ "/api/v1/movement/user-boxes": {
4422
+ post: {
4423
+ summary: "Create a user-defined movement overlay box such as a manual stay, trip, or missing-data override",
4424
+ responses: {
4425
+ "201": jsonResponse({
4426
+ type: "object",
4427
+ required: ["box"],
4428
+ properties: {
4429
+ box: {
4430
+ type: "object",
4431
+ additionalProperties: true
4432
+ }
4433
+ }
4434
+ }, "Created movement user box"),
4435
+ default: { $ref: "#/components/responses/Error" }
4436
+ }
4437
+ }
4438
+ },
4439
+ "/api/v1/movement/user-boxes/preflight": {
4440
+ post: {
4441
+ summary: "Analyze a proposed movement overlay before saving it, especially when replacing a missing gap or overlapping another box",
4442
+ responses: {
4443
+ "200": jsonResponse({
4444
+ type: "object",
4445
+ required: ["preflight"],
4446
+ properties: {
4447
+ preflight: {
4448
+ type: "object",
4449
+ additionalProperties: true
4450
+ }
4451
+ }
4452
+ }, "Movement user-box preflight"),
4453
+ default: { $ref: "#/components/responses/Error" }
4454
+ }
4455
+ }
4456
+ },
4457
+ "/api/v1/movement/user-boxes/{id}": {
4458
+ patch: {
4459
+ summary: "Update one user-defined movement overlay box",
4460
+ responses: {
4461
+ "200": jsonResponse({
4462
+ type: "object",
4463
+ required: ["box"],
4464
+ properties: {
4465
+ box: {
4466
+ type: "object",
4467
+ additionalProperties: true
4468
+ }
4469
+ }
4470
+ }, "Updated movement user box"),
4471
+ "404": { $ref: "#/components/responses/Error" }
4472
+ }
4473
+ },
4474
+ delete: {
4475
+ summary: "Delete one user-defined movement box",
4476
+ responses: {
4477
+ "200": jsonResponse({
4478
+ type: "object",
4479
+ additionalProperties: true
4480
+ }, "Deleted movement user box"),
4481
+ "404": { $ref: "#/components/responses/Error" }
4482
+ }
4483
+ }
4484
+ },
4485
+ "/api/v1/movement/automatic-boxes/{id}/invalidate": {
4486
+ post: {
4487
+ summary: "Hide one automatic movement box and project the resulting user-defined overlay",
4488
+ responses: {
4489
+ "201": jsonResponse({
4490
+ type: "object",
4491
+ required: ["box"],
4492
+ properties: {
4493
+ box: {
4494
+ type: "object",
4495
+ additionalProperties: true
4496
+ }
4497
+ }
4498
+ }, "Invalidated automatic movement box"),
4499
+ "404": { $ref: "#/components/responses/Error" }
4500
+ }
4501
+ }
4502
+ },
4503
+ "/api/v1/movement/stays/{id}": {
4504
+ patch: {
4505
+ summary: "Update one recorded movement stay",
4506
+ responses: {
4507
+ "200": jsonResponse({
4508
+ type: "object",
4509
+ required: ["stay"],
4510
+ properties: {
4511
+ stay: {
4512
+ type: "object",
4513
+ additionalProperties: true
4514
+ }
4515
+ }
4516
+ }, "Updated movement stay"),
4517
+ "404": { $ref: "#/components/responses/Error" }
4518
+ }
4519
+ },
4520
+ delete: {
4521
+ summary: "Delete one recorded movement stay",
4522
+ responses: {
4523
+ "200": jsonResponse({
4524
+ type: "object",
4525
+ additionalProperties: true
4526
+ }, "Deleted movement stay"),
4527
+ "404": { $ref: "#/components/responses/Error" }
4528
+ }
4529
+ }
4530
+ },
4531
+ "/api/v1/movement/trips/{id}": {
4532
+ get: {
4533
+ summary: "Read one movement trip with its full detail",
4534
+ responses: {
4535
+ "200": jsonResponse({
4536
+ type: "object",
4537
+ required: ["movement"],
4538
+ properties: {
4539
+ movement: {
4540
+ type: "object",
4541
+ additionalProperties: true
4542
+ }
4543
+ }
4544
+ }, "Movement trip detail"),
4545
+ "404": { $ref: "#/components/responses/Error" }
4546
+ }
4547
+ },
4548
+ patch: {
4549
+ summary: "Update one movement trip",
4550
+ responses: {
4551
+ "200": jsonResponse({
4552
+ type: "object",
4553
+ required: ["trip"],
4554
+ properties: {
4555
+ trip: {
4556
+ type: "object",
4557
+ additionalProperties: true
4558
+ }
4559
+ }
4560
+ }, "Updated movement trip"),
4561
+ "404": { $ref: "#/components/responses/Error" }
4562
+ }
4563
+ },
4564
+ delete: {
4565
+ summary: "Delete one movement trip",
4566
+ responses: {
4567
+ "200": jsonResponse({
4568
+ type: "object",
4569
+ additionalProperties: true
4570
+ }, "Deleted movement trip"),
4571
+ "404": { $ref: "#/components/responses/Error" }
4572
+ }
4573
+ }
4574
+ },
4575
+ "/api/v1/movement/trips/{id}/points/{pointId}": {
4576
+ patch: {
4577
+ summary: "Update one movement trip datapoint",
4578
+ responses: {
4579
+ "200": jsonResponse({
4580
+ type: "object",
4581
+ additionalProperties: true
4582
+ }, "Updated movement trip point"),
4583
+ "404": { $ref: "#/components/responses/Error" }
4584
+ }
4585
+ },
4586
+ delete: {
4587
+ summary: "Delete one movement trip datapoint",
4588
+ responses: {
4589
+ "200": jsonResponse({
4590
+ type: "object",
4591
+ additionalProperties: true
4592
+ }, "Deleted movement trip point"),
4593
+ "404": { $ref: "#/components/responses/Error" }
4594
+ }
4595
+ }
4596
+ },
4597
+ "/api/v1/movement/selection": {
4598
+ post: {
4599
+ summary: "Aggregate one selected movement range or set of segments",
4600
+ responses: {
4601
+ "200": jsonResponse({
4602
+ type: "object",
4603
+ required: ["movement"],
4604
+ properties: {
4605
+ movement: {
4606
+ type: "object",
4607
+ additionalProperties: true
4608
+ }
4609
+ }
4610
+ }, "Movement selection aggregate"),
4611
+ default: { $ref: "#/components/responses/Error" }
4612
+ }
4613
+ }
4614
+ },
4615
+ "/api/v1/workbench/catalog/boxes": {
4616
+ get: {
4617
+ summary: "List registered Workbench boxes and their contracts",
4618
+ responses: {
4619
+ "200": jsonResponse({
4620
+ type: "object",
4621
+ required: ["boxes"],
4622
+ properties: {
4623
+ boxes: arrayOf({
4624
+ type: "object",
4625
+ additionalProperties: true
4626
+ })
4627
+ }
4628
+ }, "Workbench box catalog"),
4629
+ default: { $ref: "#/components/responses/Error" }
4630
+ }
4631
+ }
4632
+ },
4633
+ "/api/v1/workbench/flows": {
4634
+ get: {
4635
+ summary: "List Workbench flows and recent execution summaries",
4636
+ responses: {
4637
+ "200": jsonResponse({
4638
+ type: "object",
4639
+ required: ["flows"],
4640
+ properties: {
4641
+ flows: arrayOf({
4642
+ type: "object",
4643
+ additionalProperties: true
4644
+ })
4645
+ }
4646
+ }, "Workbench flow collection"),
4647
+ default: { $ref: "#/components/responses/Error" }
4648
+ }
4649
+ },
4650
+ post: {
4651
+ summary: "Create one Workbench flow",
4652
+ responses: {
4653
+ "201": jsonResponse({
4654
+ type: "object",
4655
+ required: ["flow"],
4656
+ properties: {
4657
+ flow: {
4658
+ type: "object",
4659
+ additionalProperties: true
4660
+ }
4661
+ }
4662
+ }, "Created Workbench flow"),
4663
+ default: { $ref: "#/components/responses/Error" }
4664
+ }
4665
+ }
4666
+ },
4667
+ "/api/v1/workbench/flows/{id}": {
4668
+ get: {
4669
+ summary: "Read one Workbench flow with runs",
4670
+ responses: {
4671
+ "200": jsonResponse({
4672
+ type: "object",
4673
+ required: ["flow", "runs"],
4674
+ properties: {
4675
+ flow: {
4676
+ type: "object",
4677
+ additionalProperties: true
4678
+ },
4679
+ runs: arrayOf({
4680
+ type: "object",
4681
+ additionalProperties: true
4682
+ })
4683
+ }
4684
+ }, "Workbench flow detail"),
4685
+ "404": { $ref: "#/components/responses/Error" }
4686
+ }
4687
+ },
4688
+ patch: {
4689
+ summary: "Update one Workbench flow",
4690
+ responses: {
4691
+ "200": jsonResponse({
4692
+ type: "object",
4693
+ required: ["flow"],
4694
+ properties: {
4695
+ flow: {
4696
+ type: "object",
4697
+ additionalProperties: true
4698
+ }
4699
+ }
4700
+ }, "Updated Workbench flow"),
4701
+ "404": { $ref: "#/components/responses/Error" }
4702
+ }
4703
+ },
4704
+ delete: {
4705
+ summary: "Delete one Workbench flow",
4706
+ responses: {
4707
+ "200": jsonResponse({
4708
+ type: "object",
4709
+ additionalProperties: true
4710
+ }, "Deleted Workbench flow"),
4711
+ "404": { $ref: "#/components/responses/Error" }
4712
+ }
4713
+ }
4714
+ },
4715
+ "/api/v1/workbench/flows/by-slug/{slug}": {
4716
+ get: {
4717
+ summary: "Read one Workbench flow by slug",
4718
+ responses: {
4719
+ "200": jsonResponse({
4720
+ type: "object",
4721
+ required: ["flow"],
4722
+ properties: {
4723
+ flow: {
4724
+ type: "object",
4725
+ additionalProperties: true
4726
+ }
4727
+ }
4728
+ }, "Workbench flow by slug"),
4729
+ "404": { $ref: "#/components/responses/Error" }
4730
+ }
4731
+ }
4732
+ },
4733
+ "/api/v1/workbench/flows/{id}/run": {
4734
+ post: {
4735
+ summary: "Run one Workbench flow by id",
4736
+ responses: {
4737
+ "200": jsonResponse({
4738
+ type: "object",
4739
+ required: ["flow", "run", "conversation"],
4740
+ properties: {
4741
+ flow: {
4742
+ type: "object",
4743
+ additionalProperties: true
4744
+ },
4745
+ run: {
4746
+ type: "object",
4747
+ additionalProperties: true
4748
+ },
4749
+ conversation: {
4750
+ type: "object",
4751
+ additionalProperties: true
4752
+ }
4753
+ }
4754
+ }, "Workbench flow execution"),
4755
+ "404": { $ref: "#/components/responses/Error" }
4756
+ }
4757
+ }
4758
+ },
4759
+ "/api/v1/workbench/run": {
4760
+ post: {
4761
+ summary: "Run one Workbench flow by payload with flowId",
4762
+ responses: {
4763
+ "200": jsonResponse({
4764
+ type: "object",
4765
+ required: ["flow", "run", "conversation"],
4766
+ properties: {
4767
+ flow: {
4768
+ type: "object",
4769
+ additionalProperties: true
4770
+ },
4771
+ run: {
4772
+ type: "object",
4773
+ additionalProperties: true
4774
+ },
4775
+ conversation: {
4776
+ type: "object",
4777
+ additionalProperties: true
4778
+ }
4779
+ }
4780
+ }, "Workbench flow execution"),
4781
+ "404": { $ref: "#/components/responses/Error" }
4782
+ }
4783
+ }
4784
+ },
4785
+ "/api/v1/workbench/flows/{id}/chat": {
4786
+ post: {
4787
+ summary: "Continue or start one Workbench chat flow",
4788
+ responses: {
4789
+ "200": jsonResponse({
4790
+ type: "object",
4791
+ additionalProperties: true
4792
+ }, "Workbench chat response"),
4793
+ "404": { $ref: "#/components/responses/Error" }
4794
+ }
4795
+ }
4796
+ },
4797
+ "/api/v1/workbench/flows/{id}/output": {
4798
+ get: {
4799
+ summary: "Read the latest published whole-flow output",
4800
+ responses: {
4801
+ "200": jsonResponse({
4802
+ type: "object",
4803
+ additionalProperties: true
4804
+ }, "Workbench published output"),
4805
+ "404": { $ref: "#/components/responses/Error" }
4806
+ }
4807
+ }
4808
+ },
4809
+ "/api/v1/workbench/flows/{id}/runs": {
4810
+ get: {
4811
+ summary: "List Workbench runs for one flow",
4812
+ responses: {
4813
+ "200": jsonResponse({
4814
+ type: "object",
4815
+ required: ["flow", "runs"],
4816
+ properties: {
4817
+ flow: {
4818
+ type: "object",
4819
+ additionalProperties: true
4820
+ },
4821
+ runs: arrayOf({
4822
+ type: "object",
4823
+ additionalProperties: true
4824
+ })
4825
+ }
4826
+ }, "Workbench run list"),
4827
+ "404": { $ref: "#/components/responses/Error" }
4828
+ }
4829
+ }
4830
+ },
4831
+ "/api/v1/workbench/flows/{id}/runs/{runId}": {
4832
+ get: {
4833
+ summary: "Read one Workbench run detail",
4834
+ responses: {
4835
+ "200": jsonResponse({
4836
+ type: "object",
4837
+ required: ["flow", "run"],
4838
+ properties: {
4839
+ flow: {
4840
+ type: "object",
4841
+ additionalProperties: true
4842
+ },
4843
+ run: {
4844
+ type: "object",
4845
+ additionalProperties: true
4846
+ }
4847
+ }
4848
+ }, "Workbench run detail"),
4849
+ "404": { $ref: "#/components/responses/Error" }
4850
+ }
4851
+ }
4852
+ },
4853
+ "/api/v1/workbench/flows/{id}/runs/{runId}/nodes": {
4854
+ get: {
4855
+ summary: "List node results for one Workbench run",
4856
+ responses: {
4857
+ "200": jsonResponse({
4858
+ type: "object",
4859
+ required: ["flow", "run", "nodeResults"],
4860
+ properties: {
4861
+ flow: {
4862
+ type: "object",
4863
+ additionalProperties: true
4864
+ },
4865
+ run: {
4866
+ type: "object",
4867
+ additionalProperties: true
4868
+ },
4869
+ nodeResults: arrayOf({
4870
+ type: "object",
4871
+ additionalProperties: true
4872
+ })
4873
+ }
4874
+ }, "Workbench node results"),
4875
+ "404": { $ref: "#/components/responses/Error" }
4876
+ }
4877
+ }
4878
+ },
4879
+ "/api/v1/workbench/flows/{id}/runs/{runId}/nodes/{nodeId}": {
4880
+ get: {
4881
+ summary: "Read one node result for one Workbench run",
4882
+ responses: {
4883
+ "200": jsonResponse({
4884
+ type: "object",
4885
+ required: ["flow", "nodeResult"],
4886
+ properties: {
4887
+ flow: {
4888
+ type: "object",
4889
+ additionalProperties: true
4890
+ },
4891
+ nodeResult: {
4892
+ type: "object",
4893
+ additionalProperties: true
4894
+ }
4895
+ }
4896
+ }, "Workbench node result"),
4897
+ "404": { $ref: "#/components/responses/Error" }
4898
+ }
4899
+ }
4900
+ },
4901
+ "/api/v1/workbench/flows/{id}/nodes/{nodeId}/output": {
4902
+ get: {
4903
+ summary: "Read the latest successful output for one Workbench node",
4904
+ responses: {
4905
+ "200": jsonResponse({
4906
+ type: "object",
4907
+ required: ["flow", "run", "nodeResult"],
4908
+ properties: {
4909
+ flow: {
4910
+ type: "object",
4911
+ additionalProperties: true
4912
+ },
4913
+ run: {
4914
+ type: "object",
4915
+ additionalProperties: true
4916
+ },
4917
+ nodeResult: {
4918
+ type: "object",
4919
+ additionalProperties: true
4920
+ }
4921
+ }
4922
+ }, "Workbench latest node output"),
4923
+ "404": { $ref: "#/components/responses/Error" }
4924
+ }
4925
+ }
4926
+ },
4927
+ "/api/v1/wiki/settings": {
4928
+ get: {
4929
+ summary: "Read wiki spaces plus enabled LLM and embedding profiles",
4930
+ responses: {
4931
+ "200": jsonResponse({
4932
+ type: "object",
4933
+ required: ["settings"],
4934
+ properties: {
4935
+ settings: {
4936
+ type: "object",
4937
+ additionalProperties: true
4938
+ }
4939
+ }
4940
+ }, "Wiki settings")
4941
+ }
4942
+ }
4943
+ },
4944
+ "/api/v1/wiki/pages": {
4945
+ get: {
4946
+ summary: "List wiki or evidence pages inside one space",
4947
+ responses: {
4948
+ "200": jsonResponse({
4949
+ type: "object",
4950
+ required: ["pages"],
4951
+ properties: {
4952
+ pages: arrayOf({
4953
+ type: "object",
4954
+ additionalProperties: true
4955
+ })
4956
+ }
4957
+ }, "Wiki page list")
4958
+ }
4959
+ },
4960
+ post: {
4961
+ summary: "Create a wiki page through the file-backed wiki surface",
4962
+ responses: {
4963
+ "200": jsonResponse({
4964
+ type: "object",
4965
+ required: ["page"],
4966
+ properties: {
4967
+ page: { type: "object", additionalProperties: true }
4968
+ }
4969
+ }, "Created wiki page"),
4970
+ "404": { $ref: "#/components/responses/Error" }
4971
+ }
4972
+ }
4973
+ },
4974
+ "/api/v1/wiki/pages/{id}": {
4975
+ get: {
4976
+ summary: "Read one wiki page with backlinks and attached metadata",
4977
+ responses: {
4978
+ "200": jsonResponse({
4979
+ type: "object",
4980
+ required: ["page"],
4981
+ properties: {
4982
+ page: { type: "object", additionalProperties: true }
4983
+ }
4984
+ }, "Wiki page detail"),
4985
+ "404": { $ref: "#/components/responses/Error" }
4986
+ }
4987
+ },
4988
+ patch: {
4989
+ summary: "Update an existing wiki page through the file-backed surface",
4990
+ responses: {
4991
+ "200": jsonResponse({
4992
+ type: "object",
4993
+ required: ["page"],
4994
+ properties: {
4995
+ page: { type: "object", additionalProperties: true }
4996
+ }
4997
+ }, "Updated wiki page"),
4998
+ "404": { $ref: "#/components/responses/Error" }
4999
+ }
5000
+ }
5001
+ },
5002
+ "/api/v1/wiki/search": {
5003
+ post: {
5004
+ summary: "Search the wiki with text, semantic, entity, or hybrid retrieval",
5005
+ responses: {
5006
+ "200": jsonResponse({
5007
+ type: "object",
5008
+ required: ["results"],
5009
+ properties: {
5010
+ results: arrayOf({
5011
+ type: "object",
5012
+ additionalProperties: true
5013
+ })
5014
+ }
5015
+ }, "Wiki search results")
5016
+ }
5017
+ }
5018
+ },
5019
+ "/api/v1/wiki/health": {
5020
+ get: {
5021
+ summary: "Read wiki health signals for one space",
5022
+ responses: {
5023
+ "200": jsonResponse({
5024
+ type: "object",
5025
+ required: ["health"],
5026
+ properties: {
5027
+ health: { type: "object", additionalProperties: true }
5028
+ }
5029
+ }, "Wiki health")
5030
+ }
5031
+ }
5032
+ },
5033
+ "/api/v1/wiki/sync": {
5034
+ post: {
5035
+ summary: "Resync markdown files from the local wiki vault into Forge metadata",
5036
+ responses: {
5037
+ "200": jsonResponse({
5038
+ type: "object",
5039
+ additionalProperties: true
5040
+ }, "Wiki sync result")
5041
+ }
5042
+ }
5043
+ },
5044
+ "/api/v1/wiki/reindex": {
5045
+ post: {
5046
+ summary: "Recompute wiki embedding chunks for one space and optional profile",
5047
+ responses: {
5048
+ "200": jsonResponse({
5049
+ type: "object",
5050
+ additionalProperties: true
5051
+ }, "Wiki reindex result")
5052
+ }
5053
+ }
5054
+ },
5055
+ "/api/v1/wiki/ingest-jobs": {
5056
+ post: {
5057
+ summary: "Queue a wiki ingest job from raw text, local files, or a URL",
5058
+ responses: {
5059
+ "200": jsonResponse({
5060
+ type: "object",
5061
+ additionalProperties: true
5062
+ }, "Queued wiki ingest job")
5063
+ }
5064
+ }
5065
+ },
5066
+ "/api/v1/context": {
5067
+ get: {
5068
+ summary: "Get the full Forge snapshot for the routed app shell",
5069
+ responses: {
5070
+ "200": jsonResponse({ $ref: "#/components/schemas/ForgeSnapshot" }, "Forge snapshot"),
5071
+ default: { $ref: "#/components/responses/Error" }
5072
+ }
5073
+ }
5074
+ },
5075
+ "/api/v1/operator/context": {
5076
+ get: {
5077
+ summary: "Get the operator-focused Forge context for agents and assistant workflows",
5078
+ responses: {
5079
+ "200": jsonResponse({
5080
+ type: "object",
5081
+ required: ["context"],
5082
+ properties: {
5083
+ context: {
5084
+ $ref: "#/components/schemas/OperatorContextPayload"
5085
+ }
5086
+ }
5087
+ }, "Operator context")
5088
+ }
5089
+ }
5090
+ },
5091
+ "/api/v1/users/directory": {
5092
+ get: {
5093
+ summary: "Read the live human and bot directory with ownership summaries and directional relationship graph",
5094
+ responses: {
5095
+ "200": jsonResponse({
5096
+ type: "object",
5097
+ required: ["directory"],
5098
+ properties: {
5099
+ directory: {
5100
+ type: "object",
5101
+ additionalProperties: true
5102
+ }
5103
+ }
5104
+ }, "User directory")
5105
+ }
5106
+ }
5107
+ },
5108
+ "/api/v1/preferences/workspace": {
5109
+ get: {
5110
+ summary: "Get the inferred Preferences workspace for one user, domain, and optional context",
5111
+ responses: {
5112
+ "200": jsonResponse({
5113
+ type: "object",
5114
+ required: ["workspace"],
5115
+ properties: {
5116
+ workspace: {
4082
5117
  type: "object",
4083
5118
  additionalProperties: true
4084
5119
  }
@@ -4107,6 +5142,22 @@ export function buildOpenApiDocument() {
4107
5142
  }
4108
5143
  },
4109
5144
  "/api/v1/preferences/catalogs": {
5145
+ get: {
5146
+ summary: "List Preferences concept lists",
5147
+ responses: {
5148
+ "200": jsonResponse({
5149
+ type: "object",
5150
+ required: ["catalogs"],
5151
+ properties: {
5152
+ catalogs: arrayOf({
5153
+ type: "object",
5154
+ additionalProperties: true
5155
+ })
5156
+ }
5157
+ }, "Preferences catalogs"),
5158
+ default: { $ref: "#/components/responses/Error" }
5159
+ }
5160
+ },
4110
5161
  post: {
4111
5162
  summary: "Create a Preferences concept list",
4112
5163
  responses: {
@@ -4125,6 +5176,22 @@ export function buildOpenApiDocument() {
4125
5176
  }
4126
5177
  },
4127
5178
  "/api/v1/preferences/catalogs/{id}": {
5179
+ get: {
5180
+ summary: "Get one Preferences concept list",
5181
+ responses: {
5182
+ "200": jsonResponse({
5183
+ type: "object",
5184
+ required: ["catalog"],
5185
+ properties: {
5186
+ catalog: {
5187
+ type: "object",
5188
+ additionalProperties: true
5189
+ }
5190
+ }
5191
+ }, "Preferences catalog"),
5192
+ default: { $ref: "#/components/responses/Error" }
5193
+ }
5194
+ },
4128
5195
  patch: {
4129
5196
  summary: "Update a Preferences concept list",
4130
5197
  responses: {
@@ -4159,6 +5226,22 @@ export function buildOpenApiDocument() {
4159
5226
  }
4160
5227
  },
4161
5228
  "/api/v1/preferences/catalog-items": {
5229
+ get: {
5230
+ summary: "List Preferences concept entries",
5231
+ responses: {
5232
+ "200": jsonResponse({
5233
+ type: "object",
5234
+ required: ["items"],
5235
+ properties: {
5236
+ items: arrayOf({
5237
+ type: "object",
5238
+ additionalProperties: true
5239
+ })
5240
+ }
5241
+ }, "Preferences catalog items"),
5242
+ default: { $ref: "#/components/responses/Error" }
5243
+ }
5244
+ },
4162
5245
  post: {
4163
5246
  summary: "Create a Preferences concept entry",
4164
5247
  responses: {
@@ -4177,6 +5260,22 @@ export function buildOpenApiDocument() {
4177
5260
  }
4178
5261
  },
4179
5262
  "/api/v1/preferences/catalog-items/{id}": {
5263
+ get: {
5264
+ summary: "Get one Preferences concept entry",
5265
+ responses: {
5266
+ "200": jsonResponse({
5267
+ type: "object",
5268
+ required: ["item"],
5269
+ properties: {
5270
+ item: {
5271
+ type: "object",
5272
+ additionalProperties: true
5273
+ }
5274
+ }
5275
+ }, "Preferences catalog item"),
5276
+ default: { $ref: "#/components/responses/Error" }
5277
+ }
5278
+ },
4180
5279
  patch: {
4181
5280
  summary: "Update a Preferences concept entry",
4182
5281
  responses: {
@@ -4211,6 +5310,22 @@ export function buildOpenApiDocument() {
4211
5310
  }
4212
5311
  },
4213
5312
  "/api/v1/preferences/contexts": {
5313
+ get: {
5314
+ summary: "List Preferences contexts",
5315
+ responses: {
5316
+ "200": jsonResponse({
5317
+ type: "object",
5318
+ required: ["contexts"],
5319
+ properties: {
5320
+ contexts: arrayOf({
5321
+ type: "object",
5322
+ additionalProperties: true
5323
+ })
5324
+ }
5325
+ }, "Preferences contexts"),
5326
+ default: { $ref: "#/components/responses/Error" }
5327
+ }
5328
+ },
4214
5329
  post: {
4215
5330
  summary: "Create a Preferences context",
4216
5331
  responses: {
@@ -4229,6 +5344,22 @@ export function buildOpenApiDocument() {
4229
5344
  }
4230
5345
  },
4231
5346
  "/api/v1/preferences/contexts/{id}": {
5347
+ get: {
5348
+ summary: "Get one Preferences context",
5349
+ responses: {
5350
+ "200": jsonResponse({
5351
+ type: "object",
5352
+ required: ["context"],
5353
+ properties: {
5354
+ context: {
5355
+ type: "object",
5356
+ additionalProperties: true
5357
+ }
5358
+ }
5359
+ }, "Preferences context"),
5360
+ default: { $ref: "#/components/responses/Error" }
5361
+ }
5362
+ },
4232
5363
  patch: {
4233
5364
  summary: "Update a Preferences context",
4234
5365
  responses: {
@@ -4244,6 +5375,22 @@ export function buildOpenApiDocument() {
4244
5375
  }, "Updated Preferences context"),
4245
5376
  default: { $ref: "#/components/responses/Error" }
4246
5377
  }
5378
+ },
5379
+ delete: {
5380
+ summary: "Delete a Preferences context",
5381
+ responses: {
5382
+ "200": jsonResponse({
5383
+ type: "object",
5384
+ required: ["context"],
5385
+ properties: {
5386
+ context: {
5387
+ type: "object",
5388
+ additionalProperties: true
5389
+ }
5390
+ }
5391
+ }, "Deleted Preferences context"),
5392
+ default: { $ref: "#/components/responses/Error" }
5393
+ }
4247
5394
  }
4248
5395
  },
4249
5396
  "/api/v1/preferences/contexts/merge": {
@@ -4265,6 +5412,22 @@ export function buildOpenApiDocument() {
4265
5412
  }
4266
5413
  },
4267
5414
  "/api/v1/preferences/items": {
5415
+ get: {
5416
+ summary: "List Preferences items",
5417
+ responses: {
5418
+ "200": jsonResponse({
5419
+ type: "object",
5420
+ required: ["items"],
5421
+ properties: {
5422
+ items: arrayOf({
5423
+ type: "object",
5424
+ additionalProperties: true
5425
+ })
5426
+ }
5427
+ }, "Preferences items"),
5428
+ default: { $ref: "#/components/responses/Error" }
5429
+ }
5430
+ },
4268
5431
  post: {
4269
5432
  summary: "Create a standalone Preferences item",
4270
5433
  responses: {
@@ -4283,6 +5446,22 @@ export function buildOpenApiDocument() {
4283
5446
  }
4284
5447
  },
4285
5448
  "/api/v1/preferences/items/{id}": {
5449
+ get: {
5450
+ summary: "Get one Preferences item",
5451
+ responses: {
5452
+ "200": jsonResponse({
5453
+ type: "object",
5454
+ required: ["item"],
5455
+ properties: {
5456
+ item: {
5457
+ type: "object",
5458
+ additionalProperties: true
5459
+ }
5460
+ }
5461
+ }, "Preferences item"),
5462
+ default: { $ref: "#/components/responses/Error" }
5463
+ }
5464
+ },
4286
5465
  patch: {
4287
5466
  summary: "Update a Preferences item",
4288
5467
  responses: {
@@ -4298,6 +5477,22 @@ export function buildOpenApiDocument() {
4298
5477
  }, "Updated Preferences item"),
4299
5478
  default: { $ref: "#/components/responses/Error" }
4300
5479
  }
5480
+ },
5481
+ delete: {
5482
+ summary: "Delete a Preferences item",
5483
+ responses: {
5484
+ "200": jsonResponse({
5485
+ type: "object",
5486
+ required: ["item"],
5487
+ properties: {
5488
+ item: {
5489
+ type: "object",
5490
+ additionalProperties: true
5491
+ }
5492
+ }
5493
+ }, "Deleted Preferences item"),
5494
+ default: { $ref: "#/components/responses/Error" }
5495
+ }
4301
5496
  }
4302
5497
  },
4303
5498
  "/api/v1/preferences/items/from-entity": {
@@ -4422,6 +5617,38 @@ export function buildOpenApiDocument() {
4422
5617
  }, "Questionnaire instrument detail"),
4423
5618
  default: { $ref: "#/components/responses/Error" }
4424
5619
  }
5620
+ },
5621
+ patch: {
5622
+ summary: "Update one questionnaire instrument through the direct route",
5623
+ responses: {
5624
+ "200": jsonResponse({
5625
+ type: "object",
5626
+ required: ["instrument"],
5627
+ properties: {
5628
+ instrument: {
5629
+ type: "object",
5630
+ additionalProperties: true
5631
+ }
5632
+ }
5633
+ }, "Updated questionnaire instrument"),
5634
+ default: { $ref: "#/components/responses/Error" }
5635
+ }
5636
+ },
5637
+ delete: {
5638
+ summary: "Archive one questionnaire instrument through the direct route",
5639
+ responses: {
5640
+ "200": jsonResponse({
5641
+ type: "object",
5642
+ required: ["instrument"],
5643
+ properties: {
5644
+ instrument: {
5645
+ type: "object",
5646
+ additionalProperties: true
5647
+ }
5648
+ }
5649
+ }, "Archived questionnaire instrument"),
5650
+ default: { $ref: "#/components/responses/Error" }
5651
+ }
4425
5652
  }
4426
5653
  },
4427
5654
  "/api/v1/psyche/questionnaires/{id}/clone": {
@@ -5611,6 +6838,21 @@ export function buildOpenApiDocument() {
5611
6838
  }
5612
6839
  }
5613
6840
  },
6841
+ "/api/v1/calendar/work-block-templates/{id}": {
6842
+ get: {
6843
+ summary: "Get one recurring work-block template",
6844
+ responses: {
6845
+ "200": jsonResponse({
6846
+ type: "object",
6847
+ required: ["template"],
6848
+ properties: {
6849
+ template: { $ref: "#/components/schemas/WorkBlockTemplate" }
6850
+ }
6851
+ }, "Work-block template"),
6852
+ default: { $ref: "#/components/responses/Error" }
6853
+ }
6854
+ }
6855
+ },
5614
6856
  "/api/v1/calendar/timeboxes": {
5615
6857
  get: {
5616
6858
  summary: "List task timeboxes",
@@ -5641,6 +6883,21 @@ export function buildOpenApiDocument() {
5641
6883
  }
5642
6884
  }
5643
6885
  },
6886
+ "/api/v1/calendar/timeboxes/{id}": {
6887
+ get: {
6888
+ summary: "Get one task timebox",
6889
+ responses: {
6890
+ "200": jsonResponse({
6891
+ type: "object",
6892
+ required: ["timebox"],
6893
+ properties: {
6894
+ timebox: { $ref: "#/components/schemas/TaskTimebox" }
6895
+ }
6896
+ }, "Task timebox"),
6897
+ default: { $ref: "#/components/responses/Error" }
6898
+ }
6899
+ }
6900
+ },
5644
6901
  "/api/v1/calendar/timeboxes/recommend": {
5645
6902
  post: {
5646
6903
  summary: "Suggest future timeboxes for a task",
@@ -5660,6 +6917,21 @@ export function buildOpenApiDocument() {
5660
6917
  }
5661
6918
  },
5662
6919
  "/api/v1/calendar/events": {
6920
+ get: {
6921
+ summary: "List native and mirrored calendar events for a range",
6922
+ responses: {
6923
+ "200": jsonResponse({
6924
+ type: "object",
6925
+ required: ["events"],
6926
+ properties: {
6927
+ events: arrayOf({
6928
+ $ref: "#/components/schemas/CalendarEvent"
6929
+ })
6930
+ }
6931
+ }, "Calendar events"),
6932
+ default: { $ref: "#/components/responses/Error" }
6933
+ }
6934
+ },
5663
6935
  post: {
5664
6936
  summary: "Create a native Forge calendar event",
5665
6937
  description: "Forge stores the event canonically first, then projects it to a connected writable calendar when a preferred calendar is selected.",
@@ -5676,6 +6948,19 @@ export function buildOpenApiDocument() {
5676
6948
  }
5677
6949
  },
5678
6950
  "/api/v1/calendar/events/{id}": {
6951
+ get: {
6952
+ summary: "Get one Forge calendar event",
6953
+ responses: {
6954
+ "200": jsonResponse({
6955
+ type: "object",
6956
+ required: ["event"],
6957
+ properties: {
6958
+ event: { $ref: "#/components/schemas/CalendarEvent" }
6959
+ }
6960
+ }, "Calendar event"),
6961
+ default: { $ref: "#/components/responses/Error" }
6962
+ }
6963
+ },
5679
6964
  patch: {
5680
6965
  summary: "Update a Forge calendar event and sync remote projections",
5681
6966
  responses: {