forge-openclaw-plugin 0.2.25 → 0.2.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -3
- package/dist/assets/{board-VmF4FAfr.js → board-C6jCchjI.js} +3 -3
- package/dist/assets/{board-VmF4FAfr.js.map → board-C6jCchjI.js.map} +1 -1
- package/dist/assets/index-DVvS8iiU.css +1 -0
- package/dist/assets/index-zYB-9Dfo.js +85 -0
- package/dist/assets/index-zYB-9Dfo.js.map +1 -0
- package/dist/assets/knowledge-graph-layout.worker-DRvzPxhP.js +2 -0
- package/dist/assets/knowledge-graph-layout.worker-DRvzPxhP.js.map +1 -0
- package/dist/assets/{motion-DvkU14p-.js → motion-DFHrH2rd.js} +2 -2
- package/dist/assets/{motion-DvkU14p-.js.map → motion-DFHrH2rd.js.map} +1 -1
- package/dist/assets/{table-DgiPof9E.js → table-ZL7Di_u3.js} +2 -2
- package/dist/assets/{table-DgiPof9E.js.map → table-ZL7Di_u3.js.map} +1 -1
- package/dist/assets/{ui-nYfoC0Gq.js → ui-CKNPpz7q.js} +2 -2
- package/dist/assets/{ui-nYfoC0Gq.js.map → ui-CKNPpz7q.js.map} +1 -1
- package/dist/assets/vendor-DoNZuFhn.js +1247 -0
- package/dist/assets/vendor-DoNZuFhn.js.map +1 -0
- package/dist/index.html +7 -8
- package/dist/openclaw/local-runtime.d.ts +3 -1
- package/dist/openclaw/local-runtime.js +67 -15
- package/dist/openclaw/plugin-entry-shared.js +24 -2
- package/dist/openclaw/plugin-sdk-types.d.ts +17 -0
- package/dist/openclaw/routes.d.ts +27 -0
- package/dist/openclaw/routes.js +16 -12
- package/dist/openclaw/tools.js +0 -3
- package/dist/server/server/migrations/001_core.sql +411 -0
- package/dist/server/server/migrations/002_psyche.sql +392 -0
- package/dist/server/server/migrations/003_habits.sql +30 -0
- package/dist/server/server/migrations/004_habit_links.sql +8 -0
- package/dist/server/server/migrations/005_habit_psyche_links.sql +24 -0
- package/dist/server/server/migrations/006_work_adjustments.sql +14 -0
- package/dist/server/server/migrations/007_weekly_review_closures.sql +17 -0
- package/dist/server/server/migrations/008_calendar_execution.sql +147 -0
- package/dist/server/server/migrations/009_true_calendar_events.sql +195 -0
- package/dist/server/server/migrations/010_calendar_selection_state.sql +6 -0
- package/dist/server/server/migrations/011_calendar_timezone_backfill.sql +11 -0
- package/dist/server/server/migrations/012_work_block_ranges.sql +7 -0
- package/dist/server/server/migrations/013_microsoft_local_auth_settings.sql +8 -0
- package/dist/server/server/migrations/014_note_tags_and_ephemeral.sql +8 -0
- package/dist/server/server/migrations/015_multi_user_and_strategies.sql +244 -0
- package/dist/server/server/migrations/016_health_companion.sql +158 -0
- package/dist/server/server/migrations/016_strategy_contracts_and_user_graph.sql +22 -0
- package/dist/server/server/migrations/017_preferences.sql +131 -0
- package/dist/server/server/migrations/018_preference_catalogs.sql +31 -0
- package/dist/server/server/migrations/019_wiki_memory.sql +255 -0
- package/dist/server/server/migrations/020_wiki_page_hierarchy.sql +11 -0
- package/dist/server/server/migrations/021_hide_evidence_from_wiki_index.sql +3 -0
- package/dist/server/server/migrations/022_wiki_ingest_background.sql +85 -0
- package/dist/server/server/migrations/023_diagnostic_logs.sql +28 -0
- package/dist/server/server/migrations/024_questionnaires.sql +96 -0
- package/dist/server/server/migrations/025_ai_model_connections.sql +26 -0
- package/dist/server/server/migrations/026_custom_theme_settings.sql +2 -0
- package/dist/server/server/migrations/027_ai_processors.sql +31 -0
- package/dist/server/server/migrations/028_movement_domain.sql +136 -0
- package/dist/server/server/migrations/029_watch_micro_capture.sql +23 -0
- package/dist/server/server/migrations/030_surface_layouts.sql +5 -0
- package/dist/server/server/migrations/031_ai_processor_runtime_upgrades.sql +10 -0
- package/dist/server/server/migrations/032_ai_connectors.sql +44 -0
- package/dist/server/server/migrations/033_movement_trip_point_sync.sql +36 -0
- package/dist/server/server/migrations/034_movement_segment_sync.sql +49 -0
- package/dist/server/server/migrations/035_google_local_auth_settings.sql +2 -0
- package/dist/server/server/migrations/036_google_local_auth_client_secret.sql +2 -0
- package/dist/server/server/migrations/037_workbench_public_inputs_and_run_inputs.sql +5 -0
- package/dist/server/server/migrations/038_data_management_settings.sql +11 -0
- package/dist/server/server/migrations/039_life_force_and_action_points.sql +114 -0
- package/dist/server/server/migrations/040_screen_time_domain.sql +89 -0
- package/dist/server/server/migrations/041_companion_source_states.sql +21 -0
- package/dist/server/server/migrations/042_movement_boxes.sql +47 -0
- package/dist/server/server/migrations/043_movement_box_overlap_overrides.sql +26 -0
- package/dist/server/{app.js → server/src/app.js} +2112 -414
- package/dist/server/server/src/connectors/box-registry.js +223 -0
- package/dist/server/server/src/data-management-types.js +107 -0
- package/dist/server/{db.js → server/src/db.js} +72 -4
- package/dist/server/server/src/debug.js +19 -0
- package/dist/server/{demo-data.js → server/src/demo-data.js} +2 -2
- package/dist/server/{health.js → server/src/health.js} +702 -18
- package/dist/server/{managers → server/src/managers}/platform/llm-manager.js +7 -4
- package/dist/server/server/src/managers/platform/mock-workbench-provider.js +149 -0
- package/dist/server/{managers → server/src/managers}/platform/secrets-manager.js +18 -1
- package/dist/server/{managers → server/src/managers}/runtime.js +9 -0
- package/dist/server/{movement.js → server/src/movement.js} +1971 -112
- package/dist/server/{openapi.js → server/src/openapi.js} +491 -3
- package/dist/server/{psyche-types.js → server/src/psyche-types.js} +9 -1
- package/dist/server/{repositories → server/src/repositories}/activity-events.js +8 -0
- package/dist/server/{repositories → server/src/repositories}/ai-connectors.js +758 -47
- package/dist/server/{repositories → server/src/repositories}/calendar.js +1 -1
- package/dist/server/{repositories → server/src/repositories}/habits.js +37 -1
- package/dist/server/{repositories → server/src/repositories}/model-settings.js +13 -3
- package/dist/server/{repositories → server/src/repositories}/notes.js +3 -0
- package/dist/server/{repositories → server/src/repositories}/settings.js +431 -21
- package/dist/server/{repositories → server/src/repositories}/tasks.js +170 -10
- package/dist/server/server/src/runtime-data-root.js +82 -0
- package/dist/server/server/src/screen-time.js +802 -0
- package/dist/server/{services → server/src/services}/calendar-runtime.js +775 -58
- package/dist/server/server/src/services/data-management.js +788 -0
- package/dist/server/{services → server/src/services}/entity-crud.js +205 -2
- package/dist/server/server/src/services/google-calendar-oauth-config.js +176 -0
- package/dist/server/server/src/services/knowledge-graph.js +1455 -0
- package/dist/server/server/src/services/life-force-model.js +197 -0
- package/dist/server/server/src/services/life-force.js +1270 -0
- package/dist/server/server/src/services/psyche-observation-calendar.js +413 -0
- package/dist/server/{types.js → server/src/types.js} +420 -29
- package/dist/server/server/src/web.js +332 -0
- package/dist/server/src/components/customization/utility-widgets.js +439 -0
- package/dist/server/src/components/ui/info-tooltip.js +25 -0
- package/dist/server/src/components/workbench-boxes/calendar/calendar-boxes.js +78 -0
- package/dist/server/src/components/workbench-boxes/goals/goals-boxes.js +62 -0
- package/dist/server/src/components/workbench-boxes/habits/habits-boxes.js +62 -0
- package/dist/server/src/components/workbench-boxes/health/health-boxes.js +147 -0
- package/dist/server/src/components/workbench-boxes/insights/insights-boxes.js +50 -0
- package/dist/server/src/components/workbench-boxes/kanban/kanban-boxes.js +136 -0
- package/dist/server/src/components/workbench-boxes/movement/movement-boxes.js +47 -0
- package/dist/server/src/components/workbench-boxes/notes/notes-boxes.js +132 -0
- package/dist/server/src/components/workbench-boxes/overview/overview-boxes.js +65 -0
- package/dist/server/src/components/workbench-boxes/preferences/preferences-boxes.js +78 -0
- package/dist/server/src/components/workbench-boxes/projects/projects-boxes.js +62 -0
- package/dist/server/src/components/workbench-boxes/psyche/psyche-boxes.js +88 -0
- package/dist/server/src/components/workbench-boxes/questionnaires/questionnaires-boxes.js +61 -0
- package/dist/server/src/components/workbench-boxes/review/review-boxes.js +53 -0
- package/dist/server/src/components/workbench-boxes/shared/define-workbench-box.js +6 -0
- package/dist/server/src/components/workbench-boxes/shared/generic-node-view.js +49 -0
- package/dist/server/src/components/workbench-boxes/strategies/strategies-boxes.js +62 -0
- package/dist/server/src/components/workbench-boxes/tasks/tasks-boxes.js +76 -0
- package/dist/server/src/components/workbench-boxes/today/today-boxes.js +78 -0
- package/dist/server/src/components/workbench-boxes/wiki/wiki-boxes.js +60 -0
- package/dist/server/src/lib/api-error.js +37 -0
- package/dist/server/src/lib/api.js +2118 -0
- package/dist/server/src/lib/calendar-name-deduper.js +144 -0
- package/dist/server/src/lib/data-management-types.js +1 -0
- package/dist/server/src/lib/diagnostics.js +67 -0
- package/dist/server/src/lib/entity-visuals.js +279 -0
- package/dist/server/src/lib/knowledge-graph-types.js +276 -0
- package/dist/server/src/lib/knowledge-graph.js +470 -0
- package/dist/server/src/lib/psyche-types.js +1 -0
- package/dist/server/src/lib/questionnaire-types.js +1 -0
- package/dist/server/src/lib/runtime-paths.js +24 -0
- package/dist/server/src/lib/schemas.js +238 -0
- package/dist/server/src/lib/snapshot-normalizer.js +416 -0
- package/dist/server/src/lib/theme-system.js +319 -0
- package/dist/server/src/lib/types.js +1 -0
- package/dist/server/src/lib/utils.js +22 -0
- package/dist/server/src/lib/workbench/boxes.js +16 -0
- package/dist/server/src/lib/workbench/contracts.js +229 -0
- package/dist/server/src/lib/workbench/nodes.js +215 -0
- package/dist/server/src/lib/workbench/registry.js +120 -0
- package/dist/server/src/lib/workbench/runtime.js +397 -0
- package/dist/server/src/lib/workbench/tool-catalog.js +68 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/server/index.js +68 -0
- package/server/migrations/035_google_local_auth_settings.sql +2 -0
- package/server/migrations/036_google_local_auth_client_secret.sql +2 -0
- package/server/migrations/037_workbench_public_inputs_and_run_inputs.sql +5 -0
- package/server/migrations/038_data_management_settings.sql +11 -0
- package/server/migrations/039_life_force_and_action_points.sql +114 -0
- package/server/migrations/040_screen_time_domain.sql +89 -0
- package/server/migrations/041_companion_source_states.sql +21 -0
- package/server/migrations/042_movement_boxes.sql +47 -0
- package/server/migrations/043_movement_box_overlap_overrides.sql +26 -0
- package/skills/forge-openclaw/SKILL.md +27 -11
- package/skills/forge-openclaw/entity_conversation_playbooks.md +411 -46
- package/skills/forge-openclaw/psyche_entity_playbooks.md +195 -20
- package/dist/assets/index-CFCKDIMH.js +0 -67
- package/dist/assets/index-CFCKDIMH.js.map +0 -1
- package/dist/assets/index-ZPY6U1TU.css +0 -1
- package/dist/assets/vendor-D9PTEPSB.js +0 -824
- package/dist/assets/vendor-D9PTEPSB.js.map +0 -1
- package/dist/assets/viz-Cqb6s--o.js +0 -34
- package/dist/assets/viz-Cqb6s--o.js.map +0 -1
- package/dist/server/connectors/box-registry.js +0 -257
- package/dist/server/services/psyche-observation-calendar.js +0 -46
- package/dist/server/web.js +0 -98
- /package/dist/server/{discovery-advertiser.js → server/src/discovery-advertiser.js} +0 -0
- /package/dist/server/{e2e-server.js → server/src/e2e-server.js} +0 -0
- /package/dist/server/{errors.js → server/src/errors.js} +0 -0
- /package/dist/server/{index.js → server/src/index.js} +0 -0
- /package/dist/server/{managers → server/src/managers}/base.js +0 -0
- /package/dist/server/{managers → server/src/managers}/contracts.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/api-gateway-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/audit-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/authentication-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/authorization-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/background-job-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/configuration-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/database-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/event-bus-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/external-service-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/health-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/migration-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/openai-responses-provider.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/search-index-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/session-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/storage-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/token-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/transaction-manager.js +0 -0
- /package/dist/server/{managers → server/src/managers}/platform/trusted-network.js +0 -0
- /package/dist/server/{managers → server/src/managers}/type-guards.js +0 -0
- /package/dist/server/{preferences-seeds.js → server/src/preferences-seeds.js} +0 -0
- /package/dist/server/{preferences-types.js → server/src/preferences-types.js} +0 -0
- /package/dist/server/{questionnaire-flow.js → server/src/questionnaire-flow.js} +0 -0
- /package/dist/server/{questionnaire-seeds.js → server/src/questionnaire-seeds.js} +0 -0
- /package/dist/server/{questionnaire-types.js → server/src/questionnaire-types.js} +0 -0
- /package/dist/server/{repositories → server/src/repositories}/ai-processors.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/collaboration.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/deleted-entities.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/diagnostic-logs.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/domains.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/entity-ownership.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/event-log.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/goals.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/preferences.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/projects.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/psyche.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/questionnaires.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/rewards.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/strategies.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/surface-layouts.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/tags.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/task-runs.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/users.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/weekly-reviews.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/wiki-memory.js +0 -0
- /package/dist/server/{repositories → server/src/repositories}/work-adjustments.js +0 -0
- /package/dist/server/{seed-demo.js → server/src/seed-demo.js} +0 -0
- /package/dist/server/{services → server/src/services}/context.js +0 -0
- /package/dist/server/{services → server/src/services}/dashboard.js +0 -0
- /package/dist/server/{services → server/src/services}/gamification.js +0 -0
- /package/dist/server/{services → server/src/services}/insights.js +0 -0
- /package/dist/server/{services → server/src/services}/openai-codex-oauth.js +0 -0
- /package/dist/server/{services → server/src/services}/projects.js +0 -0
- /package/dist/server/{services → server/src/services}/psyche.js +0 -0
- /package/dist/server/{services → server/src/services}/relations.js +0 -0
- /package/dist/server/{services → server/src/services}/reviews.js +0 -0
- /package/dist/server/{services → server/src/services}/run-recovery.js +0 -0
- /package/dist/server/{services → server/src/services}/tagging.js +0 -0
- /package/dist/server/{services → server/src/services}/task-run-watchdog.js +0 -0
- /package/dist/server/{services → server/src/services}/work-time.js +0 -0
- /package/dist/server/{watch-mobile.js → server/src/watch-mobile.js} +0 -0
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const forgeThemePreferenceValues = [
|
|
3
|
+
"obsidian",
|
|
4
|
+
"solar",
|
|
5
|
+
"aurora",
|
|
6
|
+
"ember",
|
|
7
|
+
"paper",
|
|
8
|
+
"dawn",
|
|
9
|
+
"atelier",
|
|
10
|
+
"custom",
|
|
11
|
+
"system"
|
|
12
|
+
];
|
|
13
|
+
export const forgeThemePreferenceSchema = z.enum(forgeThemePreferenceValues);
|
|
14
|
+
const hexColorSchema = z
|
|
15
|
+
.string()
|
|
16
|
+
.trim()
|
|
17
|
+
.regex(/^#[0-9a-fA-F]{6}$/, "Use a 6-digit hex color");
|
|
18
|
+
export const forgeCustomThemeSchema = z.object({
|
|
19
|
+
label: z.string().trim().min(1, "Theme name is required").max(40),
|
|
20
|
+
primary: hexColorSchema,
|
|
21
|
+
secondary: hexColorSchema,
|
|
22
|
+
tertiary: hexColorSchema,
|
|
23
|
+
canvas: hexColorSchema,
|
|
24
|
+
panel: hexColorSchema,
|
|
25
|
+
panelHigh: hexColorSchema,
|
|
26
|
+
panelLow: hexColorSchema,
|
|
27
|
+
ink: hexColorSchema
|
|
28
|
+
});
|
|
29
|
+
const CUSTOM_THEME_STORAGE_KEYS = [
|
|
30
|
+
"--primary",
|
|
31
|
+
"--secondary",
|
|
32
|
+
"--tertiary",
|
|
33
|
+
"--surface",
|
|
34
|
+
"--surface-low",
|
|
35
|
+
"--surface-panel",
|
|
36
|
+
"--surface-high",
|
|
37
|
+
"--surface-glass",
|
|
38
|
+
"--surface-psyche",
|
|
39
|
+
"--surface-psyche-high",
|
|
40
|
+
"--hero-gradient",
|
|
41
|
+
"--card-gradient",
|
|
42
|
+
"--card-shadow",
|
|
43
|
+
"--card-shadow-hover",
|
|
44
|
+
"--forge-body-ambient-primary",
|
|
45
|
+
"--forge-body-ambient-secondary",
|
|
46
|
+
"--forge-body-gradient-start",
|
|
47
|
+
"--forge-body-gradient-end",
|
|
48
|
+
"--forge-body-text"
|
|
49
|
+
];
|
|
50
|
+
export const defaultCustomTheme = {
|
|
51
|
+
label: "Custom Forge",
|
|
52
|
+
primary: "#7cc7ff",
|
|
53
|
+
secondary: "#4edea3",
|
|
54
|
+
tertiary: "#ffb95f",
|
|
55
|
+
canvas: "#0b1326",
|
|
56
|
+
panel: "#171f33",
|
|
57
|
+
panelHigh: "#222a3d",
|
|
58
|
+
panelLow: "#131b2e",
|
|
59
|
+
ink: "#eef2ff"
|
|
60
|
+
};
|
|
61
|
+
export const forgeThemeCatalog = {
|
|
62
|
+
obsidian: {
|
|
63
|
+
label: "Obsidian",
|
|
64
|
+
description: "Deep indigo with cool neon edges. This is the current default.",
|
|
65
|
+
mode: "dark",
|
|
66
|
+
preview: {
|
|
67
|
+
label: "Obsidian",
|
|
68
|
+
primary: "#c0c1ff",
|
|
69
|
+
secondary: "#4edea3",
|
|
70
|
+
tertiary: "#ffb95f",
|
|
71
|
+
canvas: "#0b1326",
|
|
72
|
+
panel: "#171f33",
|
|
73
|
+
panelHigh: "#222a3d",
|
|
74
|
+
panelLow: "#131b2e",
|
|
75
|
+
ink: "#eef2ff"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
solar: {
|
|
79
|
+
label: "Catppuccin",
|
|
80
|
+
description: "Pastel mocha surfaces inspired by the widely adopted Catppuccin palette.",
|
|
81
|
+
mode: "dark",
|
|
82
|
+
preview: {
|
|
83
|
+
label: "Catppuccin",
|
|
84
|
+
primary: "#cba6f7",
|
|
85
|
+
secondary: "#94e2d5",
|
|
86
|
+
tertiary: "#fab387",
|
|
87
|
+
canvas: "#1e1e2e",
|
|
88
|
+
panel: "#313244",
|
|
89
|
+
panelHigh: "#45475a",
|
|
90
|
+
panelLow: "#181825",
|
|
91
|
+
ink: "#cdd6f4"
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
aurora: {
|
|
95
|
+
label: "Nord",
|
|
96
|
+
description: "Arctic blue-grey surfaces based on Nord's clean and uncluttered palette.",
|
|
97
|
+
mode: "dark",
|
|
98
|
+
preview: {
|
|
99
|
+
label: "Nord",
|
|
100
|
+
primary: "#88c0d0",
|
|
101
|
+
secondary: "#a3be8c",
|
|
102
|
+
tertiary: "#ebcb8b",
|
|
103
|
+
canvas: "#2e3440",
|
|
104
|
+
panel: "#3b4252",
|
|
105
|
+
panelHigh: "#434c5e",
|
|
106
|
+
panelLow: "#242933",
|
|
107
|
+
ink: "#eceff4"
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
ember: {
|
|
111
|
+
label: "Dracula",
|
|
112
|
+
description: "High-contrast purple and pink accents drawn from the official Dracula specification.",
|
|
113
|
+
mode: "dark",
|
|
114
|
+
preview: {
|
|
115
|
+
label: "Dracula",
|
|
116
|
+
primary: "#bd93f9",
|
|
117
|
+
secondary: "#8be9fd",
|
|
118
|
+
tertiary: "#ff79c6",
|
|
119
|
+
canvas: "#282a36",
|
|
120
|
+
panel: "#343746",
|
|
121
|
+
panelHigh: "#424450",
|
|
122
|
+
panelLow: "#21222c",
|
|
123
|
+
ink: "#f8f8f2"
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
paper: {
|
|
127
|
+
label: "Paper",
|
|
128
|
+
description: "Warm ivory surfaces with navy ink and restrained blue-green accents for a crisp daytime workspace.",
|
|
129
|
+
mode: "light",
|
|
130
|
+
preview: {
|
|
131
|
+
label: "Paper",
|
|
132
|
+
primary: "#2f6fed",
|
|
133
|
+
secondary: "#1d8f6b",
|
|
134
|
+
tertiary: "#c9772b",
|
|
135
|
+
canvas: "#f4efe6",
|
|
136
|
+
panel: "#fbf7f1",
|
|
137
|
+
panelHigh: "#ffffff",
|
|
138
|
+
panelLow: "#e5ddd0",
|
|
139
|
+
ink: "#182235"
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
dawn: {
|
|
143
|
+
label: "Dawn",
|
|
144
|
+
description: "Rosy morning tones with plum-blue ink and enough contrast to stay readable across dense settings screens.",
|
|
145
|
+
mode: "light",
|
|
146
|
+
preview: {
|
|
147
|
+
label: "Dawn",
|
|
148
|
+
primary: "#8b5cf6",
|
|
149
|
+
secondary: "#ec7a6b",
|
|
150
|
+
tertiary: "#d0a12b",
|
|
151
|
+
canvas: "#f8eef1",
|
|
152
|
+
panel: "#fff7f8",
|
|
153
|
+
panelHigh: "#ffffff",
|
|
154
|
+
panelLow: "#ead9df",
|
|
155
|
+
ink: "#2d1834"
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
atelier: {
|
|
159
|
+
label: "Atelier",
|
|
160
|
+
description: "Cool drafting-table neutrals with slate ink and modern cobalt accents for a brighter, studio-like shell.",
|
|
161
|
+
mode: "light",
|
|
162
|
+
preview: {
|
|
163
|
+
label: "Atelier",
|
|
164
|
+
primary: "#2563eb",
|
|
165
|
+
secondary: "#0f8b6d",
|
|
166
|
+
tertiary: "#b85c38",
|
|
167
|
+
canvas: "#edf3f7",
|
|
168
|
+
panel: "#f8fbfd",
|
|
169
|
+
panelHigh: "#ffffff",
|
|
170
|
+
panelLow: "#dbe5ec",
|
|
171
|
+
ink: "#162334"
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
export const forgeThemeOptions = [
|
|
176
|
+
{
|
|
177
|
+
value: "obsidian",
|
|
178
|
+
label: forgeThemeCatalog.obsidian.label,
|
|
179
|
+
description: forgeThemeCatalog.obsidian.description
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
value: "solar",
|
|
183
|
+
label: forgeThemeCatalog.solar.label,
|
|
184
|
+
description: forgeThemeCatalog.solar.description
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
value: "aurora",
|
|
188
|
+
label: forgeThemeCatalog.aurora.label,
|
|
189
|
+
description: forgeThemeCatalog.aurora.description
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
value: "ember",
|
|
193
|
+
label: forgeThemeCatalog.ember.label,
|
|
194
|
+
description: forgeThemeCatalog.ember.description
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
value: "paper",
|
|
198
|
+
label: forgeThemeCatalog.paper.label,
|
|
199
|
+
description: forgeThemeCatalog.paper.description
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
value: "dawn",
|
|
203
|
+
label: forgeThemeCatalog.dawn.label,
|
|
204
|
+
description: forgeThemeCatalog.dawn.description
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
value: "atelier",
|
|
208
|
+
label: forgeThemeCatalog.atelier.label,
|
|
209
|
+
description: forgeThemeCatalog.atelier.description
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
value: "custom",
|
|
213
|
+
label: "Custom",
|
|
214
|
+
description: "Use your own Forge token set through the guided editor or direct JSON import."
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
value: "system",
|
|
218
|
+
label: "System",
|
|
219
|
+
description: "Follow the device preference. Forge maps dark mode to Obsidian and light mode to Paper."
|
|
220
|
+
}
|
|
221
|
+
];
|
|
222
|
+
function hexToRgb(value) {
|
|
223
|
+
const normalized = value.replace("#", "");
|
|
224
|
+
return {
|
|
225
|
+
r: Number.parseInt(normalized.slice(0, 2), 16),
|
|
226
|
+
g: Number.parseInt(normalized.slice(2, 4), 16),
|
|
227
|
+
b: Number.parseInt(normalized.slice(4, 6), 16)
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function rgbToHex({ r, g, b }) {
|
|
231
|
+
return `#${[r, g, b]
|
|
232
|
+
.map((channel) => Math.max(0, Math.min(255, Math.round(channel)))
|
|
233
|
+
.toString(16)
|
|
234
|
+
.padStart(2, "0"))
|
|
235
|
+
.join("")}`;
|
|
236
|
+
}
|
|
237
|
+
function mixHex(base, overlay, weight) {
|
|
238
|
+
const baseRgb = hexToRgb(base);
|
|
239
|
+
const overlayRgb = hexToRgb(overlay);
|
|
240
|
+
return rgbToHex({
|
|
241
|
+
r: baseRgb.r + (overlayRgb.r - baseRgb.r) * weight,
|
|
242
|
+
g: baseRgb.g + (overlayRgb.g - baseRgb.g) * weight,
|
|
243
|
+
b: baseRgb.b + (overlayRgb.b - baseRgb.b) * weight
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
function alpha(hex, opacity) {
|
|
247
|
+
const { r, g, b } = hexToRgb(hex);
|
|
248
|
+
return `rgba(${r}, ${g}, ${b}, ${opacity})`;
|
|
249
|
+
}
|
|
250
|
+
export function resolveForgeThemePreference(preference, prefersDark) {
|
|
251
|
+
if (preference === "system") {
|
|
252
|
+
return prefersDark ? "obsidian" : "paper";
|
|
253
|
+
}
|
|
254
|
+
return preference;
|
|
255
|
+
}
|
|
256
|
+
export function getForgeThemePreview(preference, customTheme) {
|
|
257
|
+
if (preference === "custom") {
|
|
258
|
+
return customTheme ?? defaultCustomTheme;
|
|
259
|
+
}
|
|
260
|
+
if (preference === "system") {
|
|
261
|
+
return forgeThemeCatalog.obsidian.preview;
|
|
262
|
+
}
|
|
263
|
+
return forgeThemeCatalog[preference].preview;
|
|
264
|
+
}
|
|
265
|
+
export function buildForgeThemeVariables(theme) {
|
|
266
|
+
const cardTop = mixHex(theme.panelHigh, theme.primary, 0.08);
|
|
267
|
+
const heroTop = mixHex(theme.panelHigh, theme.primary, 0.16);
|
|
268
|
+
const heroBottom = mixHex(theme.canvas, theme.secondary, 0.06);
|
|
269
|
+
return {
|
|
270
|
+
"--primary": theme.primary,
|
|
271
|
+
"--secondary": theme.secondary,
|
|
272
|
+
"--tertiary": theme.tertiary,
|
|
273
|
+
"--surface": theme.canvas,
|
|
274
|
+
"--surface-low": theme.panelLow,
|
|
275
|
+
"--surface-panel": theme.panel,
|
|
276
|
+
"--surface-high": theme.panelHigh,
|
|
277
|
+
"--surface-glass": alpha(theme.canvas, 0.82),
|
|
278
|
+
"--surface-psyche": alpha(mixHex(theme.canvas, theme.secondary, 0.12), 0.94),
|
|
279
|
+
"--surface-psyche-high": alpha(mixHex(theme.panelHigh, theme.secondary, 0.1), 0.96),
|
|
280
|
+
"--hero-gradient": `linear-gradient(180deg, ${alpha(heroTop, 0.95)}, ${alpha(heroBottom, 0.95)})`,
|
|
281
|
+
"--card-gradient": `linear-gradient(180deg, ${alpha(cardTop, 0.96)}, ${alpha(theme.panelLow, 0.94)})`,
|
|
282
|
+
"--card-shadow": `0 24px 60px ${alpha(theme.canvas, 0.3)}`,
|
|
283
|
+
"--card-shadow-hover": `0 32px 80px ${alpha(theme.canvas, 0.38)}`,
|
|
284
|
+
"--forge-body-ambient-primary": alpha(theme.primary, 0.2),
|
|
285
|
+
"--forge-body-ambient-secondary": alpha(theme.secondary, 0.14),
|
|
286
|
+
"--forge-body-gradient-start": mixHex(theme.panel, theme.primary, 0.08),
|
|
287
|
+
"--forge-body-gradient-end": mixHex(theme.canvas, "#000000", 0.16),
|
|
288
|
+
"--forge-body-text": theme.ink
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
export function applyForgeThemeToDocument(preference, customTheme) {
|
|
292
|
+
if (typeof document === "undefined") {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
const prefersDark = typeof window !== "undefined" &&
|
|
296
|
+
typeof window.matchMedia === "function" &&
|
|
297
|
+
window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
298
|
+
const resolved = resolveForgeThemePreference(preference, prefersDark);
|
|
299
|
+
const body = document.body;
|
|
300
|
+
const root = document.documentElement;
|
|
301
|
+
body.classList.remove("theme-forge-dark", "theme-forge-light", "theme-forge-obsidian", "theme-forge-solar", "theme-forge-aurora", "theme-forge-ember", "theme-forge-paper", "theme-forge-dawn", "theme-forge-atelier", "theme-forge-custom");
|
|
302
|
+
if (resolved === "custom") {
|
|
303
|
+
const theme = customTheme ?? defaultCustomTheme;
|
|
304
|
+
const variables = buildForgeThemeVariables(theme);
|
|
305
|
+
body.classList.add("theme-forge-custom");
|
|
306
|
+
body.classList.add("theme-forge-dark");
|
|
307
|
+
for (const [name, value] of Object.entries(variables)) {
|
|
308
|
+
root.style.setProperty(name, value);
|
|
309
|
+
}
|
|
310
|
+
root.dataset.forgeTheme = theme.label;
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
for (const name of CUSTOM_THEME_STORAGE_KEYS) {
|
|
314
|
+
root.style.removeProperty(name);
|
|
315
|
+
}
|
|
316
|
+
delete root.dataset.forgeTheme;
|
|
317
|
+
body.classList.add(forgeThemeCatalog[resolved].mode === "light" ? "theme-forge-light" : "theme-forge-dark");
|
|
318
|
+
body.classList.add(`theme-forge-${resolved}`);
|
|
319
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { clsx } from "clsx";
|
|
2
|
+
import { twMerge } from "tailwind-merge";
|
|
3
|
+
export function cn(...inputs) {
|
|
4
|
+
return twMerge(clsx(inputs));
|
|
5
|
+
}
|
|
6
|
+
export function formatDateTime(value) {
|
|
7
|
+
return new Intl.DateTimeFormat(undefined, {
|
|
8
|
+
month: "short",
|
|
9
|
+
day: "numeric",
|
|
10
|
+
hour: "numeric",
|
|
11
|
+
minute: "2-digit"
|
|
12
|
+
}).format(new Date(value));
|
|
13
|
+
}
|
|
14
|
+
export function formatDate(value) {
|
|
15
|
+
if (!value) {
|
|
16
|
+
return "No date";
|
|
17
|
+
}
|
|
18
|
+
return new Intl.DateTimeFormat(undefined, {
|
|
19
|
+
month: "short",
|
|
20
|
+
day: "numeric"
|
|
21
|
+
}).format(new Date(`${value}T00:00:00.000Z`));
|
|
22
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { getWorkbenchNodeCatalog, getWorkbenchNodeDefinition, listWorkbenchNodeDefinitions } from "./registry.js";
|
|
2
|
+
export function listWorkbenchBoxDefinitions() {
|
|
3
|
+
return listWorkbenchNodeDefinitions();
|
|
4
|
+
}
|
|
5
|
+
export function getWorkbenchBoxDefinition(boxId) {
|
|
6
|
+
return getWorkbenchNodeDefinition(boxId);
|
|
7
|
+
}
|
|
8
|
+
export function getWorkbenchBoxDefinitionForSurfaceWidget(surfaceId, widgetId) {
|
|
9
|
+
return getWorkbenchBoxDefinition(`surface:${surfaceId}:${widgetId}`);
|
|
10
|
+
}
|
|
11
|
+
export function getWorkbenchBoxDefinitionForRouteMain(surfaceId) {
|
|
12
|
+
return getWorkbenchBoxDefinition(`surface:${surfaceId}:main`);
|
|
13
|
+
}
|
|
14
|
+
export function listWorkbenchBoxCatalogEntries() {
|
|
15
|
+
return getWorkbenchNodeCatalog();
|
|
16
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { getWorkbenchEntityPortShape, getWorkbenchModelPortShape, normalizeWorkbenchPortDefinition } from "./nodes.js";
|
|
2
|
+
function toPascalCase(value) {
|
|
3
|
+
return value
|
|
4
|
+
.split(/[^a-zA-Z0-9]+/)
|
|
5
|
+
.filter(Boolean)
|
|
6
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
7
|
+
.join("");
|
|
8
|
+
}
|
|
9
|
+
export function createOutputDefinition(input) {
|
|
10
|
+
const inferredEntityShape = input.itemKind
|
|
11
|
+
? getWorkbenchEntityPortShape(input.itemKind)
|
|
12
|
+
: [];
|
|
13
|
+
const inferredModelShape = input.modelName
|
|
14
|
+
? getWorkbenchModelPortShape(input.modelName)
|
|
15
|
+
: [];
|
|
16
|
+
return normalizeWorkbenchPortDefinition({
|
|
17
|
+
key: input.key,
|
|
18
|
+
label: input.label,
|
|
19
|
+
kind: input.kind,
|
|
20
|
+
description: input.description,
|
|
21
|
+
required: input.required ?? false,
|
|
22
|
+
modelName: input.modelName,
|
|
23
|
+
itemKind: input.itemKind,
|
|
24
|
+
shape: input.shape ??
|
|
25
|
+
(inferredEntityShape.length > 0 ? inferredEntityShape : inferredModelShape),
|
|
26
|
+
exampleValue: input.exampleValue
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export function createInputDefinition(input) {
|
|
30
|
+
const inferredEntityShape = input.itemKind
|
|
31
|
+
? getWorkbenchEntityPortShape(input.itemKind)
|
|
32
|
+
: [];
|
|
33
|
+
const inferredModelShape = input.modelName
|
|
34
|
+
? getWorkbenchModelPortShape(input.modelName)
|
|
35
|
+
: [];
|
|
36
|
+
return normalizeWorkbenchPortDefinition({
|
|
37
|
+
key: input.key,
|
|
38
|
+
label: input.label,
|
|
39
|
+
kind: input.kind,
|
|
40
|
+
description: input.description,
|
|
41
|
+
required: input.required ?? false,
|
|
42
|
+
modelName: input.modelName,
|
|
43
|
+
itemKind: input.itemKind,
|
|
44
|
+
shape: input.shape ??
|
|
45
|
+
(inferredEntityShape.length > 0 ? inferredEntityShape : inferredModelShape),
|
|
46
|
+
exampleValue: input.exampleValue
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export function createParamDefinition(input) {
|
|
50
|
+
return {
|
|
51
|
+
key: input.key,
|
|
52
|
+
label: input.label,
|
|
53
|
+
kind: input.kind,
|
|
54
|
+
description: input.description,
|
|
55
|
+
required: input.required ?? false,
|
|
56
|
+
options: input.options
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function createSummaryOutput(input) {
|
|
60
|
+
return createOutputDefinition({
|
|
61
|
+
key: "summary",
|
|
62
|
+
label: input?.label ?? "Summary",
|
|
63
|
+
kind: "summary",
|
|
64
|
+
description: input?.description ??
|
|
65
|
+
"Human-readable summary of what this node currently knows or produced.",
|
|
66
|
+
modelName: "WorkbenchSummary",
|
|
67
|
+
exampleValue: input?.exampleValue
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
export function createSearchOutputs(input) {
|
|
71
|
+
const modelStem = toPascalCase(input.itemKind);
|
|
72
|
+
return [
|
|
73
|
+
createSummaryOutput({
|
|
74
|
+
label: input.summaryLabel ?? "Search summary",
|
|
75
|
+
description: `Compact summary of the current ${input.itemLabel.toLowerCase()} search results.`
|
|
76
|
+
}),
|
|
77
|
+
createOutputDefinition({
|
|
78
|
+
key: input.collectionKey ?? "matches",
|
|
79
|
+
label: input.collectionLabel ?? `${input.itemLabel} matches`,
|
|
80
|
+
kind: "entity_list",
|
|
81
|
+
description: `Structured ${input.itemLabel.toLowerCase()} records returned by Forge search.`,
|
|
82
|
+
modelName: `${modelStem}SearchResults`,
|
|
83
|
+
itemKind: input.itemKind,
|
|
84
|
+
exampleValue: `[{"id":"...","title":"Example ${input.itemLabel}"}]`
|
|
85
|
+
}),
|
|
86
|
+
createOutputDefinition({
|
|
87
|
+
key: "matchCount",
|
|
88
|
+
label: "Match count",
|
|
89
|
+
kind: "number",
|
|
90
|
+
description: "Number of records returned by the search.",
|
|
91
|
+
modelName: `${modelStem}SearchCount`,
|
|
92
|
+
exampleValue: "12"
|
|
93
|
+
})
|
|
94
|
+
];
|
|
95
|
+
}
|
|
96
|
+
export function createSearchInputs(input) {
|
|
97
|
+
const modelStem = toPascalCase(input.itemKind);
|
|
98
|
+
return [
|
|
99
|
+
createInputDefinition({
|
|
100
|
+
key: "query",
|
|
101
|
+
label: "Query",
|
|
102
|
+
kind: "text",
|
|
103
|
+
description: `Search text for narrowing ${input.itemLabel.toLowerCase()} results.`,
|
|
104
|
+
modelName: `${modelStem}SearchQuery`,
|
|
105
|
+
exampleValue: "backlog"
|
|
106
|
+
}),
|
|
107
|
+
createInputDefinition({
|
|
108
|
+
key: "entityTypes",
|
|
109
|
+
label: "Entity types",
|
|
110
|
+
kind: "array",
|
|
111
|
+
description: "Entity types to include in the Forge search.",
|
|
112
|
+
modelName: `${modelStem}SearchEntityTypes`,
|
|
113
|
+
exampleValue: JSON.stringify(input.defaultEntityTypes ?? [input.itemKind])
|
|
114
|
+
}),
|
|
115
|
+
createInputDefinition({
|
|
116
|
+
key: "limit",
|
|
117
|
+
label: "Limit",
|
|
118
|
+
kind: "number",
|
|
119
|
+
description: "Maximum number of results to request.",
|
|
120
|
+
modelName: `${modelStem}SearchLimit`,
|
|
121
|
+
exampleValue: String(input.defaultLimit ?? 20)
|
|
122
|
+
})
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
export function createSearchParams(input) {
|
|
126
|
+
return [
|
|
127
|
+
createParamDefinition({
|
|
128
|
+
key: "query",
|
|
129
|
+
label: "Default query",
|
|
130
|
+
kind: "text",
|
|
131
|
+
description: "Used when no query input edge is connected."
|
|
132
|
+
}),
|
|
133
|
+
createParamDefinition({
|
|
134
|
+
key: "entityTypes",
|
|
135
|
+
label: "Default entity types",
|
|
136
|
+
kind: "array",
|
|
137
|
+
description: "Used when no entity types input edge is connected. Enter a JSON array or comma-separated values."
|
|
138
|
+
}),
|
|
139
|
+
createParamDefinition({
|
|
140
|
+
key: "limit",
|
|
141
|
+
label: "Default limit",
|
|
142
|
+
kind: "number",
|
|
143
|
+
description: "Used when no limit input edge is connected."
|
|
144
|
+
})
|
|
145
|
+
];
|
|
146
|
+
}
|
|
147
|
+
export function createContextOutput(input) {
|
|
148
|
+
return createOutputDefinition({
|
|
149
|
+
key: input.key,
|
|
150
|
+
label: input.label,
|
|
151
|
+
kind: "context",
|
|
152
|
+
description: input.description,
|
|
153
|
+
modelName: input.modelName,
|
|
154
|
+
shape: input.shape,
|
|
155
|
+
exampleValue: input.exampleValue
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
export function createRecordListOutput(input) {
|
|
159
|
+
return createOutputDefinition({
|
|
160
|
+
key: input.key,
|
|
161
|
+
label: input.label,
|
|
162
|
+
kind: "record_list",
|
|
163
|
+
description: input.description,
|
|
164
|
+
modelName: input.modelName,
|
|
165
|
+
itemKind: input.itemKind,
|
|
166
|
+
exampleValue: input.exampleValue
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
export function createSearchEntitiesTool(description) {
|
|
170
|
+
return {
|
|
171
|
+
key: "forge.search_entities",
|
|
172
|
+
label: "Search Forge entities",
|
|
173
|
+
description,
|
|
174
|
+
accessMode: "read",
|
|
175
|
+
argsSchema: {
|
|
176
|
+
type: "object",
|
|
177
|
+
properties: {
|
|
178
|
+
query: { type: "string", description: "Search text to match against Forge entities." },
|
|
179
|
+
entityTypes: {
|
|
180
|
+
type: "array",
|
|
181
|
+
items: { type: "string" },
|
|
182
|
+
description: "Optional entity types to narrow the search."
|
|
183
|
+
},
|
|
184
|
+
limit: {
|
|
185
|
+
type: "number",
|
|
186
|
+
description: "Maximum number of results to return."
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
export function createNoteTool(description) {
|
|
193
|
+
return {
|
|
194
|
+
key: "forge.create_note",
|
|
195
|
+
label: "Create note",
|
|
196
|
+
description,
|
|
197
|
+
accessMode: "write",
|
|
198
|
+
argsSchema: {
|
|
199
|
+
type: "object",
|
|
200
|
+
properties: {
|
|
201
|
+
title: { type: "string", description: "Title of the note to create." },
|
|
202
|
+
summary: { type: "string", description: "Optional short summary for the note." },
|
|
203
|
+
markdown: {
|
|
204
|
+
type: "string",
|
|
205
|
+
description: "Markdown content that should become the note body."
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
export function createTaskStatusTool(description) {
|
|
212
|
+
return {
|
|
213
|
+
key: "forge.update_task_status",
|
|
214
|
+
label: "Move task",
|
|
215
|
+
description,
|
|
216
|
+
accessMode: "write",
|
|
217
|
+
argsSchema: {
|
|
218
|
+
type: "object",
|
|
219
|
+
properties: {
|
|
220
|
+
taskId: { type: "string", description: "Task id to update." },
|
|
221
|
+
status: {
|
|
222
|
+
type: "string",
|
|
223
|
+
description: "New Forge task status.",
|
|
224
|
+
enum: ["backlog", "focus", "in_progress", "blocked", "done"]
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
}
|