farmon 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +163 -0
  3. package/dist/bin/farmon.js +12 -0
  4. package/dist/bin/farmon.js.map +1 -0
  5. package/dist/execute/agents/index.js +19 -0
  6. package/dist/execute/agents/index.js.map +1 -0
  7. package/dist/execute/agents/instruction-classifier-agent.js +16 -0
  8. package/dist/execute/agents/instruction-classifier-agent.js.map +1 -0
  9. package/dist/execute/agents/mutation-agent.js +272 -0
  10. package/dist/execute/agents/mutation-agent.js.map +1 -0
  11. package/dist/execute/agents/query-agent.js +118 -0
  12. package/dist/execute/agents/query-agent.js.map +1 -0
  13. package/dist/execute/helpers/analyzers.js +8 -0
  14. package/dist/execute/helpers/analyzers.js.map +1 -0
  15. package/dist/execute/helpers/ensurers.js +1053 -0
  16. package/dist/execute/helpers/ensurers.js.map +1 -0
  17. package/dist/execute/helpers/finders.js +1454 -0
  18. package/dist/execute/helpers/finders.js.map +1 -0
  19. package/dist/execute/helpers/general.js +3736 -0
  20. package/dist/execute/helpers/general.js.map +1 -0
  21. package/dist/execute/helpers/import-helpers.js +183 -0
  22. package/dist/execute/helpers/import-helpers.js.map +1 -0
  23. package/dist/execute/helpers/parsers.js +840 -0
  24. package/dist/execute/helpers/parsers.js.map +1 -0
  25. package/dist/execute/helpers/prompt-maker.js +1163 -0
  26. package/dist/execute/helpers/prompt-maker.js.map +1 -0
  27. package/dist/execute/helpers/validators.js +40 -0
  28. package/dist/execute/helpers/validators.js.map +1 -0
  29. package/dist/execute/history/history-manager.js +1030 -0
  30. package/dist/execute/history/history-manager.js.map +1 -0
  31. package/dist/execute/history/rollback-handlers.js +2524 -0
  32. package/dist/execute/history/rollback-handlers.js.map +1 -0
  33. package/dist/execute/index.js +44 -0
  34. package/dist/execute/index.js.map +1 -0
  35. package/dist/execute/llm/call.js +103 -0
  36. package/dist/execute/llm/call.js.map +1 -0
  37. package/dist/execute/tasks/ast.js +3819 -0
  38. package/dist/execute/tasks/ast.js.map +1 -0
  39. package/dist/execute/tasks/generators.js +96 -0
  40. package/dist/execute/tasks/generators.js.map +1 -0
  41. package/dist/execute/tasks/index.js +7 -0
  42. package/dist/execute/tasks/index.js.map +1 -0
  43. package/dist/execute/tasks/mutations.js +8139 -0
  44. package/dist/execute/tasks/mutations.js.map +1 -0
  45. package/dist/execute/tasks/query.js +248 -0
  46. package/dist/execute/tasks/query.js.map +1 -0
  47. package/dist/index.js +6 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/providers/index.js +15 -0
  50. package/dist/providers/index.js.map +1 -0
  51. package/dist/providers/ollama.js +40 -0
  52. package/dist/providers/ollama.js.map +1 -0
  53. package/dist/providers/openai-compatible.js +52 -0
  54. package/dist/providers/openai-compatible.js.map +1 -0
  55. package/dist/runtime/inject.js +250 -0
  56. package/dist/runtime/inject.js.map +1 -0
  57. package/dist/schemas/agent/action.schema.js +935 -0
  58. package/dist/schemas/agent/action.schema.js.map +1 -0
  59. package/dist/schemas/agent/index.js +4 -0
  60. package/dist/schemas/agent/index.js.map +1 -0
  61. package/dist/schemas/agent/llm.schema.js +16 -0
  62. package/dist/schemas/agent/llm.schema.js.map +1 -0
  63. package/dist/schemas/agent/planner.schema.js +17 -0
  64. package/dist/schemas/agent/planner.schema.js.map +1 -0
  65. package/dist/schemas/index.js +7 -0
  66. package/dist/schemas/index.js.map +1 -0
  67. package/dist/schemas/project/context.schema.js +2 -0
  68. package/dist/schemas/project/context.schema.js.map +1 -0
  69. package/dist/schemas/project/index.js +2 -0
  70. package/dist/schemas/project/index.js.map +1 -0
  71. package/dist/schemas/runtime/index.js +4 -0
  72. package/dist/schemas/runtime/index.js.map +1 -0
  73. package/dist/schemas/runtime/injector.schema.js +11 -0
  74. package/dist/schemas/runtime/injector.schema.js.map +1 -0
  75. package/dist/schemas/runtime/runtime.schema.js +73 -0
  76. package/dist/schemas/runtime/runtime.schema.js.map +1 -0
  77. package/dist/schemas/runtime/sse.schema.js +15 -0
  78. package/dist/schemas/runtime/sse.schema.js.map +1 -0
  79. package/dist/schemas/system/index.js +2 -0
  80. package/dist/schemas/system/index.js.map +1 -0
  81. package/dist/schemas/system/logger.schema.js +56 -0
  82. package/dist/schemas/system/logger.schema.js.map +1 -0
  83. package/dist/schemas/task/index.js +9 -0
  84. package/dist/schemas/task/index.js.map +1 -0
  85. package/dist/server/app-context.js +254 -0
  86. package/dist/server/app-context.js.map +1 -0
  87. package/dist/server/config.js +22 -0
  88. package/dist/server/config.js.map +1 -0
  89. package/dist/server/error.js +22 -0
  90. package/dist/server/error.js.map +1 -0
  91. package/dist/server/event-bus.js +60 -0
  92. package/dist/server/event-bus.js.map +1 -0
  93. package/dist/server/logger.js +57 -0
  94. package/dist/server/logger.js.map +1 -0
  95. package/dist/server/run.js +265 -0
  96. package/dist/server/run.js.map +1 -0
  97. package/dist/server/sse.js +143 -0
  98. package/dist/server/sse.js.map +1 -0
  99. package/dist/ui/assets/index-C4ydQSAw.css +2 -0
  100. package/dist/ui/assets/index-Dzo7S5xs.js +85 -0
  101. package/dist/ui/favicon.svg +1 -0
  102. package/dist/ui/icons.svg +24 -0
  103. package/dist/ui/index.html +14 -0
  104. package/dist/workers/prettier.js +11 -0
  105. package/dist/workers/prettier.js.map +1 -0
  106. package/package.json +114 -0
@@ -0,0 +1,250 @@
1
+ /*
2
+
3
+ If I were designing Looma, I would have:
4
+
5
+ inject.js
6
+ ├── MutationObserver
7
+ ├── History observer
8
+ ├── Resize observer
9
+ ├── Selection mode
10
+ ├── Runtime snapshot store
11
+ └── Message bus
12
+
13
+
14
+ I would organize it like this:
15
+
16
+ inject.js
17
+ ├── iframe manager
18
+ ├── message bus
19
+ ├── selection mode
20
+ ├── mutation observer
21
+ ├── history observer
22
+ ├── resize observer
23
+ ├── runtime snapshot store
24
+ └── error observer
25
+
26
+ injector is instentenious
27
+
28
+
29
+ */
30
+ console.log("========LOOMA STARTED================");
31
+ import { INJECTOR_EVENTS } from "../schemas/runtime/injector.schema.js";
32
+ import { createMutationObserver, startMutationObserver, } from "./observers/mutationObserver.js";
33
+ import { createResizeObserver } from "./observers/resizeObserver.js";
34
+ import { createHistoryObserver } from "./observers/historyObserver.js";
35
+ import { refreshRuntimeSnapshot } from "./store/runtimeSnapshotStore.js";
36
+ import { createErrorObserver } from "./observers/errorObserver.js";
37
+ import { setRuntimeError } from "./store/runtimeErrorStore.js";
38
+ import { mountIframe, expandIframe, collapseIframe, postMessageToLoomaPanel, } from "./iframe/iframeManager.js";
39
+ let componentId = null;
40
+ export function inject(options = {}) {
41
+ const config = {
42
+ serverUrl: "http://localhost:3001",
43
+ ...options,
44
+ };
45
+ // check if farmon server is running then only mount iframe
46
+ // otherwise show floating button saying "Start farmon server"
47
+ mountIframe(config.serverUrl);
48
+ // addObservers()
49
+ // addEventListeners()
50
+ const errorObserver = createErrorObserver({
51
+ onError(error) {
52
+ setRuntimeError(error);
53
+ console.error("Runtime error captured:", error);
54
+ },
55
+ });
56
+ const historyObserver = createHistoryObserver({
57
+ onRouteChange() {
58
+ refreshRuntimeSnapshot();
59
+ console.log("Route changed");
60
+ },
61
+ });
62
+ const observer = createMutationObserver({
63
+ onChange() {
64
+ // runtimeSnapshotStore.refresh();
65
+ refreshRuntimeSnapshot();
66
+ console.log("DOM changed");
67
+ },
68
+ });
69
+ const resizeObserver = createResizeObserver({
70
+ onResize() {
71
+ refreshRuntimeSnapshot();
72
+ console.log("Viewport resized");
73
+ },
74
+ });
75
+ historyObserver.start();
76
+ resizeObserver.start();
77
+ startMutationObserver(observer);
78
+ errorObserver.start();
79
+ window.addEventListener("message", (event) => {
80
+ switch (event.data.type) {
81
+ case INJECTOR_EVENTS.LOOMA_EXPAND:
82
+ expandIframe();
83
+ break;
84
+ case INJECTOR_EVENTS.LOOMA_COLLAPSE:
85
+ collapseIframe();
86
+ break;
87
+ case INJECTOR_EVENTS.START_COMPONENT_SELECTION:
88
+ selector.activateSelectionMode();
89
+ break;
90
+ }
91
+ });
92
+ const selector = createComponentSelectionSystem({
93
+ onSelect({ compId, element }) {
94
+ console.log("Selected:", compId);
95
+ componentId = compId;
96
+ console.log(element);
97
+ console.log(componentId);
98
+ postMessageToLoomaPanel({
99
+ type: INJECTOR_EVENTS.COMPONENT_SELECTED,
100
+ message: componentId,
101
+ });
102
+ // notifySnapshotChanged();
103
+ // addStatusLine(`Selected: ${componentId}`);
104
+ },
105
+ });
106
+ function createComponentSelectionSystem({ onSelect }) {
107
+ let isSelectionModeActive = false;
108
+ let currentlyHoveredElement = null;
109
+ let selectedElement = null;
110
+ // ----------------------------------------------------------
111
+ // HOVER OVERLAY
112
+ // ----------------------------------------------------------
113
+ const hoverOverlay = document.createElement("div");
114
+ hoverOverlay.style.position = "fixed";
115
+ hoverOverlay.style.pointerEvents = "none";
116
+ hoverOverlay.style.zIndex = "999999";
117
+ hoverOverlay.style.border = "2px solid #3b82f6";
118
+ hoverOverlay.style.background = "rgba(59, 130, 246, 0.08)";
119
+ hoverOverlay.style.display = "none";
120
+ hoverOverlay.style.boxSizing = "border-box";
121
+ document.body.appendChild(hoverOverlay);
122
+ // ----------------------------------------------------------
123
+ // SELECTED OVERLAY
124
+ // ----------------------------------------------------------
125
+ const selectedOverlay = document.createElement("div");
126
+ selectedOverlay.style.position = "fixed";
127
+ selectedOverlay.style.pointerEvents = "none";
128
+ selectedOverlay.style.zIndex = "999998";
129
+ selectedOverlay.style.border = "2px solid #22c55e";
130
+ selectedOverlay.style.background = "rgba(34, 197, 94, 0.08)";
131
+ selectedOverlay.style.display = "none";
132
+ selectedOverlay.style.boxSizing = "border-box";
133
+ document.body.appendChild(selectedOverlay);
134
+ // ----------------------------------------------------------
135
+ // UPDATE OVERLAY POSITION
136
+ // ----------------------------------------------------------
137
+ function updateOverlay(overlay, element) {
138
+ const rect = element.getBoundingClientRect();
139
+ overlay.style.display = "block";
140
+ overlay.style.top = `${rect.top}px`;
141
+ overlay.style.left = `${rect.left}px`;
142
+ overlay.style.width = `${rect.width}px`;
143
+ overlay.style.height = `${rect.height}px`;
144
+ }
145
+ // ----------------------------------------------------------
146
+ // HIDE OVERLAY
147
+ // ----------------------------------------------------------
148
+ function hideOverlay(overlay) {
149
+ overlay.style.display = "none";
150
+ }
151
+ // ----------------------------------------------------------
152
+ // FIND COMPONENT ELEMENT
153
+ // ----------------------------------------------------------
154
+ function findComponentElement(target) {
155
+ return target.closest("[data-farmon-id]");
156
+ }
157
+ // ----------------------------------------------------------
158
+ // MOUSE MOVE
159
+ // ----------------------------------------------------------
160
+ function handleMouseMove(event) {
161
+ if (!isSelectionModeActive) {
162
+ return;
163
+ }
164
+ const componentElement = findComponentElement(event.target);
165
+ if (!componentElement) {
166
+ hideOverlay(hoverOverlay);
167
+ currentlyHoveredElement = null;
168
+ return;
169
+ }
170
+ if (currentlyHoveredElement === componentElement) {
171
+ return;
172
+ }
173
+ currentlyHoveredElement = componentElement;
174
+ updateOverlay(hoverOverlay, componentElement);
175
+ }
176
+ // ----------------------------------------------------------
177
+ // CLICK HANDLER
178
+ // ----------------------------------------------------------
179
+ function handleClick(event) {
180
+ if (!isSelectionModeActive) {
181
+ return;
182
+ }
183
+ event.preventDefault();
184
+ event.stopPropagation();
185
+ const componentElement = findComponentElement(event.target);
186
+ if (!componentElement) {
187
+ return;
188
+ }
189
+ const componentId = componentElement.getAttribute("data-farmon-id");
190
+ // --------------------------------------------------------
191
+ // STORE SELECTED ELEMENT
192
+ // --------------------------------------------------------
193
+ selectedElement = componentElement;
194
+ // --------------------------------------------------------
195
+ // SHOW PERSISTENT OVERLAY
196
+ // --------------------------------------------------------
197
+ updateOverlay(selectedOverlay, componentElement);
198
+ onSelect?.({
199
+ compId: componentId,
200
+ element: componentElement,
201
+ });
202
+ deactivateSelectionMode();
203
+ }
204
+ // ----------------------------------------------------------
205
+ // ACTIVATE
206
+ // ----------------------------------------------------------
207
+ function activateSelectionMode() {
208
+ if (isSelectionModeActive) {
209
+ return;
210
+ }
211
+ isSelectionModeActive = true;
212
+ document.addEventListener("mousemove", handleMouseMove, true);
213
+ document.addEventListener("click", handleClick, true);
214
+ document.body.style.cursor = "crosshair";
215
+ }
216
+ // ----------------------------------------------------------
217
+ // DEACTIVATE
218
+ // ----------------------------------------------------------
219
+ function deactivateSelectionMode() {
220
+ isSelectionModeActive = false;
221
+ currentlyHoveredElement = null;
222
+ hideOverlay(hoverOverlay);
223
+ document.removeEventListener("mousemove", handleMouseMove, true);
224
+ document.removeEventListener("click", handleClick, true);
225
+ document.body.style.cursor = "";
226
+ }
227
+ // ----------------------------------------------------------
228
+ // CLEAR SELECTED COMPONENT
229
+ // ----------------------------------------------------------
230
+ function clearSelection() {
231
+ selectedElement = null;
232
+ hideOverlay(selectedOverlay);
233
+ }
234
+ // ----------------------------------------------------------
235
+ // DESTROY
236
+ // ----------------------------------------------------------
237
+ function destroy() {
238
+ deactivateSelectionMode();
239
+ hoverOverlay.remove();
240
+ selectedOverlay.remove();
241
+ }
242
+ return {
243
+ activateSelectionMode,
244
+ deactivateSelectionMode,
245
+ clearSelection,
246
+ destroy,
247
+ };
248
+ }
249
+ }
250
+ //# sourceMappingURL=inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject.js","sourceRoot":"","sources":["../../runtime/inject.ts"],"names":[],"mappings":"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"}