loopable-cli 0.2.0 → 0.2.1
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/.output/nitro.json +1 -1
- package/.output/public/assets/_connectorId-CkygNLny.js +1 -0
- package/.output/public/assets/_loopId-Cshlc5Ja.js +1 -0
- package/.output/public/assets/_taskId-BKDIJ_Fg.js +1 -0
- package/.output/public/assets/connector-icon-BUoK6Cru.js +1 -0
- package/.output/public/assets/connectors-CeLBtEtg.js +1 -0
- package/.output/public/assets/gaps-BtFoD7mF.js +1 -0
- package/.output/public/assets/{inbox-CLEXUXCI.js → inbox-BYNjkNDJ.js} +1 -1
- package/.output/public/assets/index-0yP3Jn_G.js +18 -0
- package/.output/public/assets/loop-form-DnSJNc1k.js +1 -0
- package/.output/public/assets/loops-1CvbqO6m.js +1 -0
- package/.output/public/assets/{new-DPEaXKAY.js → new-m5NlqYQT.js} +1 -1
- package/.output/public/assets/refresh-cw-C3xBnKfy.js +1 -0
- package/.output/public/assets/{runners-BVBggS5B.js → runners-D8QVl-Y6.js} +1 -1
- package/.output/public/assets/{setting-fields-BT1naVJX.js → setting-fields-bJ_gTG7Q.js} +1 -1
- package/.output/public/assets/styles-ClTGaXU0.css +2 -0
- package/.output/public/assets/{task-list-CrptnI1N.js → task-list-BAxjcVgr.js} +1 -1
- package/.output/server/{_connectorId-DcSnoRjk.mjs → _connectorId-C9yydJrC.mjs} +90 -9
- package/.output/server/{_loopId-G_TAkYtS.mjs → _loopId-B0VG-eBC.mjs} +42 -13
- package/.output/server/_ssr/{callback-D20cVD2w.mjs → access-DTttr563.mjs} +37 -20
- package/.output/server/_ssr/{agents-Dms_6TBF.mjs → agents-C7B6RJ6-.mjs} +3 -3
- package/.output/server/_ssr/{agents-CrUmIQpi.mjs → agents-DG643yoJ.mjs} +2 -2
- package/.output/server/_ssr/alert-DQvzE7bu.mjs +1 -1
- package/.output/server/_ssr/connection-status-BZr3Y-IC.mjs +1 -1
- package/.output/server/_ssr/{connections-ypex3qUd.mjs → connections-Df-aDpfJ.mjs} +814 -15
- package/.output/server/_ssr/connector-icon-WvxwZ5TF.mjs +56 -0
- package/.output/server/_ssr/{connectors-4yzKb0KG.mjs → connectors-BU0IiRge.mjs} +6 -5
- package/.output/server/_ssr/{connectors-BZly0yGF.mjs → connectors-e0mf2pMs.mjs} +14 -3
- package/.output/server/_ssr/{gaps-D2Zh8sEo.mjs → gaps-Cz76ZicM.mjs} +6 -6
- package/.output/server/_ssr/{inbox-C2VBGLa5.mjs → inbox-CAUBa1I3.mjs} +3 -3
- package/.output/server/_ssr/{loop-form-D-U-kU4k.mjs → loop-form-FqSaXiHl.mjs} +5 -5
- package/.output/server/_ssr/{loops-Og_G3KyZ.mjs → loops-D8WuK7Ke.mjs} +199 -6
- package/.output/server/_ssr/{loops-D0XJ8eBb.mjs → loops-Dqoebe8q.mjs} +6 -6
- package/.output/server/_ssr/{new-CajvgIog.mjs → new-bBsVaWD6.mjs} +5 -5
- package/.output/server/_ssr/{router-BbrBz36P.mjs → router-54IDWTVz.mjs} +24 -19
- package/.output/server/_ssr/{runners-B_WuF8UJ.mjs → runners-Cj6z9Mqh.mjs} +26 -3
- package/.output/server/_ssr/{runners-D-0_lfiq.mjs → runners-D2UAdLyj.mjs} +1 -1
- package/.output/server/_ssr/{runners-zqF_zbEc.mjs → runners-DGWaVvWi.mjs} +2 -2
- package/.output/server/_ssr/{setting-fields-mpXfGftI.mjs → setting-fields-DzBlslan.mjs} +2 -2
- package/.output/server/_ssr/ssr.mjs +42 -34
- package/.output/server/_ssr/{start-BgTj-h_C.mjs → start-Vq3Oan3v.mjs} +2 -3
- package/.output/server/_ssr/switch-1pnd_bPJ.mjs +1 -1
- package/.output/server/_ssr/{task-list-BnQJ94Dk.mjs → task-list-_qgBS9LU.mjs} +5 -5
- package/.output/server/_ssr/{tasks-B_QmDFVs.mjs → tasks-BDqznm57.mjs} +16 -5
- package/.output/server/_ssr/{tasks-LIi-W4cy.mjs → tasks-Qtml5TlK.mjs} +3 -3
- package/.output/server/_ssr/textarea-CHJTKtsJ.mjs +1 -1
- package/.output/server/{_tanstack-start-manifest_v-BCHAazE8.mjs → _tanstack-start-manifest_v-CvheE7ZF.mjs} +25 -23
- package/.output/server/{_taskId-CIv0ajIx.mjs → _taskId-V4QLBO2N.mjs} +4 -4
- package/.output/server/index.mjs +139 -132
- package/README.md +24 -19
- package/dist/cli.mjs +24 -59
- package/dist/dispatcher.mjs +811 -31
- package/package.json +21 -17
- package/.output/public/assets/_connectorId-m67WbiJ8.js +0 -1
- package/.output/public/assets/_loopId-Bf4K5sdd.js +0 -1
- package/.output/public/assets/_taskId-eCKkcVOx.js +0 -1
- package/.output/public/assets/connector-icon-qGpNsPgH.js +0 -1
- package/.output/public/assets/connectors-DxXlc9zF.js +0 -1
- package/.output/public/assets/gaps-CoTA-PzA.js +0 -1
- package/.output/public/assets/index-Cndsw84p.js +0 -16
- package/.output/public/assets/loop-form-BvizlZdR.js +0 -1
- package/.output/public/assets/loops-Dbe_mf5T.js +0 -1
- package/.output/public/assets/styles-D3sonCfX.css +0 -2
- package/.output/server/_ssr/access-B7TcOZ7F.mjs +0 -42
- package/.output/server/_ssr/connector-icon-CFrrHjzR.mjs +0 -37
package/.output/server/index.mjs
CHANGED
|
@@ -14,252 +14,259 @@ var public_assets_data_default = {
|
|
|
14
14
|
"/apple-touch-icon.png": {
|
|
15
15
|
"type": "image/png",
|
|
16
16
|
"etag": "\"6e2-DpcPkINR92ffme+04R4KBRmf4jE\"",
|
|
17
|
-
"mtime": "2026-09-
|
|
17
|
+
"mtime": "2026-09-18T06:00:41.671Z",
|
|
18
18
|
"size": 1762,
|
|
19
19
|
"path": "../public/apple-touch-icon.png"
|
|
20
20
|
},
|
|
21
21
|
"/favicon.svg": {
|
|
22
22
|
"type": "image/svg+xml",
|
|
23
23
|
"etag": "\"1b3-uNgdb2Q4nmFEpsmW/cpMJbfKeng\"",
|
|
24
|
-
"mtime": "2026-09-
|
|
24
|
+
"mtime": "2026-09-18T06:00:41.671Z",
|
|
25
25
|
"size": 435,
|
|
26
26
|
"path": "../public/favicon.svg"
|
|
27
27
|
},
|
|
28
|
-
"/assets/
|
|
28
|
+
"/assets/_connectorId-CkygNLny.js": {
|
|
29
29
|
"type": "text/javascript; charset=utf-8",
|
|
30
|
-
"etag": "\"
|
|
31
|
-
"mtime": "2026-09-
|
|
32
|
-
"size":
|
|
33
|
-
"path": "../public/assets/
|
|
34
|
-
},
|
|
35
|
-
"/assets/_connectorId-m67WbiJ8.js": {
|
|
36
|
-
"type": "text/javascript; charset=utf-8",
|
|
37
|
-
"etag": "\"3038-B0yGvA3w6xDB3cBG5OwpqN6owIE\"",
|
|
38
|
-
"mtime": "2026-09-18T01:57:04.911Z",
|
|
39
|
-
"size": 12344,
|
|
40
|
-
"path": "../public/assets/_connectorId-m67WbiJ8.js"
|
|
30
|
+
"etag": "\"352c-zFynWi8xF9nWUk+DQMFFE4tIwr0\"",
|
|
31
|
+
"mtime": "2026-09-18T06:00:41.319Z",
|
|
32
|
+
"size": 13612,
|
|
33
|
+
"path": "../public/assets/_connectorId-CkygNLny.js"
|
|
41
34
|
},
|
|
42
35
|
"/assets/alert-BT2EVMJP.js": {
|
|
43
36
|
"type": "text/javascript; charset=utf-8",
|
|
44
37
|
"etag": "\"518-O5UdHKN5UMK7ObJJfTGdkF6Ce2Y\"",
|
|
45
|
-
"mtime": "2026-09-
|
|
38
|
+
"mtime": "2026-09-18T06:00:41.320Z",
|
|
46
39
|
"size": 1304,
|
|
47
40
|
"path": "../public/assets/alert-BT2EVMJP.js"
|
|
48
41
|
},
|
|
49
42
|
"/assets/arrow-left-CWUZt6k2.js": {
|
|
50
43
|
"type": "text/javascript; charset=utf-8",
|
|
51
44
|
"etag": "\"a3-m5hDdztvA9zAbs7sHlKigsZ1zhI\"",
|
|
52
|
-
"mtime": "2026-09-
|
|
45
|
+
"mtime": "2026-09-18T06:00:41.320Z",
|
|
53
46
|
"size": 163,
|
|
54
47
|
"path": "../public/assets/arrow-left-CWUZt6k2.js"
|
|
55
48
|
},
|
|
56
|
-
"/assets/
|
|
49
|
+
"/assets/_loopId-Cshlc5Ja.js": {
|
|
57
50
|
"type": "text/javascript; charset=utf-8",
|
|
58
|
-
"etag": "\"
|
|
59
|
-
"mtime": "2026-09-
|
|
60
|
-
"size":
|
|
61
|
-
"path": "../public/assets/
|
|
51
|
+
"etag": "\"4c7f-vl0h8RZxNI2m547/Ul6ryBDNvnw\"",
|
|
52
|
+
"mtime": "2026-09-18T06:00:41.319Z",
|
|
53
|
+
"size": 19583,
|
|
54
|
+
"path": "../public/assets/_loopId-Cshlc5Ja.js"
|
|
55
|
+
},
|
|
56
|
+
"/assets/_taskId-BKDIJ_Fg.js": {
|
|
57
|
+
"type": "text/javascript; charset=utf-8",
|
|
58
|
+
"etag": "\"19f6-bk4pwe6A6IGpoc9WlvluE3UtWEE\"",
|
|
59
|
+
"mtime": "2026-09-18T06:00:41.319Z",
|
|
60
|
+
"size": 6646,
|
|
61
|
+
"path": "../public/assets/_taskId-BKDIJ_Fg.js"
|
|
62
62
|
},
|
|
63
63
|
"/assets/connection-status-DCqqmY_6.js": {
|
|
64
64
|
"type": "text/javascript; charset=utf-8",
|
|
65
65
|
"etag": "\"17c-sqOdQ5h8t+NrtNGo4gNUn47RJ5U\"",
|
|
66
|
-
"mtime": "2026-09-
|
|
66
|
+
"mtime": "2026-09-18T06:00:41.320Z",
|
|
67
67
|
"size": 380,
|
|
68
68
|
"path": "../public/assets/connection-status-DCqqmY_6.js"
|
|
69
69
|
},
|
|
70
|
-
"/assets/
|
|
70
|
+
"/assets/arrow-right-dy_oOg_c.js": {
|
|
71
71
|
"type": "text/javascript; charset=utf-8",
|
|
72
|
-
"etag": "\"
|
|
73
|
-
"mtime": "2026-09-
|
|
74
|
-
"size":
|
|
75
|
-
"path": "../public/assets/
|
|
72
|
+
"etag": "\"a3-7KoKsSsK6/3kMyHB+xQq/+3ZuYI\"",
|
|
73
|
+
"mtime": "2026-09-18T06:00:41.320Z",
|
|
74
|
+
"size": 163,
|
|
75
|
+
"path": "../public/assets/arrow-right-dy_oOg_c.js"
|
|
76
76
|
},
|
|
77
|
-
"/assets/
|
|
77
|
+
"/assets/connector-icon-BUoK6Cru.js": {
|
|
78
78
|
"type": "text/javascript; charset=utf-8",
|
|
79
|
-
"etag": "\"
|
|
80
|
-
"mtime": "2026-09-
|
|
81
|
-
"size":
|
|
82
|
-
"path": "../public/assets/
|
|
79
|
+
"etag": "\"266c-r9XAEg0at7HpSKzgEFAqgNewEJw\"",
|
|
80
|
+
"mtime": "2026-09-18T06:00:41.320Z",
|
|
81
|
+
"size": 9836,
|
|
82
|
+
"path": "../public/assets/connector-icon-BUoK6Cru.js"
|
|
83
83
|
},
|
|
84
|
-
"/assets/
|
|
84
|
+
"/assets/connectors-CeLBtEtg.js": {
|
|
85
85
|
"type": "text/javascript; charset=utf-8",
|
|
86
|
-
"etag": "\"
|
|
87
|
-
"mtime": "2026-09-
|
|
88
|
-
"size":
|
|
89
|
-
"path": "../public/assets/
|
|
86
|
+
"etag": "\"954-fD1AFysaAcDpkRyyJo+exIQCOtI\"",
|
|
87
|
+
"mtime": "2026-09-18T06:00:41.320Z",
|
|
88
|
+
"size": 2388,
|
|
89
|
+
"path": "../public/assets/connectors-CeLBtEtg.js"
|
|
90
90
|
},
|
|
91
|
-
"/assets/
|
|
91
|
+
"/assets/gaps-BtFoD7mF.js": {
|
|
92
92
|
"type": "text/javascript; charset=utf-8",
|
|
93
|
-
"etag": "\"
|
|
94
|
-
"mtime": "2026-09-
|
|
95
|
-
"size":
|
|
96
|
-
"path": "../public/assets/
|
|
93
|
+
"etag": "\"5ad-2XESYTVUINlJ6ulDlIg9Jz2qx40\"",
|
|
94
|
+
"mtime": "2026-09-18T06:00:41.320Z",
|
|
95
|
+
"size": 1453,
|
|
96
|
+
"path": "../public/assets/gaps-BtFoD7mF.js"
|
|
97
97
|
},
|
|
98
|
-
"/assets/
|
|
98
|
+
"/assets/external-link-DC11orFA.js": {
|
|
99
99
|
"type": "text/javascript; charset=utf-8",
|
|
100
|
-
"etag": "\"
|
|
101
|
-
"mtime": "2026-09-
|
|
102
|
-
"size":
|
|
103
|
-
"path": "../public/assets/
|
|
100
|
+
"etag": "\"f9-Hk5Mt6w6TLri3QHcB8yNexVi7wU\"",
|
|
101
|
+
"mtime": "2026-09-18T06:00:41.320Z",
|
|
102
|
+
"size": 249,
|
|
103
|
+
"path": "../public/assets/external-link-DC11orFA.js"
|
|
104
|
+
},
|
|
105
|
+
"/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2": {
|
|
106
|
+
"type": "font/woff2",
|
|
107
|
+
"etag": "\"3aec-5kpQSZEtAzzU5kdiuro3Zr2YR54\"",
|
|
108
|
+
"mtime": "2026-09-18T06:00:41.322Z",
|
|
109
|
+
"size": 15084,
|
|
110
|
+
"path": "../public/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2"
|
|
111
|
+
},
|
|
112
|
+
"/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2": {
|
|
113
|
+
"type": "font/woff2",
|
|
114
|
+
"etag": "\"4080-mZu3Z7sOWqglha+kefNbUA9Pp+Q\"",
|
|
115
|
+
"mtime": "2026-09-18T06:00:41.322Z",
|
|
116
|
+
"size": 16512,
|
|
117
|
+
"path": "../public/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2"
|
|
104
118
|
},
|
|
105
119
|
"/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2": {
|
|
106
120
|
"type": "font/woff2",
|
|
107
121
|
"etag": "\"1cfc-yYSDXNlt/tTRaj6rJo8ZMqvY7pQ\"",
|
|
108
|
-
"mtime": "2026-09-
|
|
122
|
+
"mtime": "2026-09-18T06:00:41.322Z",
|
|
109
123
|
"size": 7420,
|
|
110
124
|
"path": "../public/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2"
|
|
111
125
|
},
|
|
112
|
-
"/assets/geist-
|
|
126
|
+
"/assets/geist-latin-wght-normal-BgDaEnEv.woff2": {
|
|
113
127
|
"type": "font/woff2",
|
|
114
|
-
"etag": "\"
|
|
115
|
-
"mtime": "2026-09-
|
|
116
|
-
"size":
|
|
117
|
-
"path": "../public/assets/geist-
|
|
128
|
+
"etag": "\"72d8-9J+D7/6th5UzRxIgoFX9awJv47A\"",
|
|
129
|
+
"mtime": "2026-09-18T06:00:41.322Z",
|
|
130
|
+
"size": 29400,
|
|
131
|
+
"path": "../public/assets/geist-latin-wght-normal-BgDaEnEv.woff2"
|
|
118
132
|
},
|
|
119
133
|
"/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2": {
|
|
120
134
|
"type": "font/woff2",
|
|
121
135
|
"etag": "\"1f44-6MZ7/PEEOeDVF0eHI650KpwKQV8\"",
|
|
122
|
-
"mtime": "2026-09-
|
|
136
|
+
"mtime": "2026-09-18T06:00:41.322Z",
|
|
123
137
|
"size": 8004,
|
|
124
138
|
"path": "../public/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2"
|
|
125
139
|
},
|
|
126
|
-
"/assets/
|
|
127
|
-
"type": "
|
|
128
|
-
"etag": "\"
|
|
129
|
-
"mtime": "2026-09-
|
|
130
|
-
"size":
|
|
131
|
-
"path": "../public/assets/
|
|
140
|
+
"/assets/inbox-BYNjkNDJ.js": {
|
|
141
|
+
"type": "text/javascript; charset=utf-8",
|
|
142
|
+
"etag": "\"af6-MTB/xkyur8KgiPetiOnxbQbYs6M\"",
|
|
143
|
+
"mtime": "2026-09-18T06:00:41.320Z",
|
|
144
|
+
"size": 2806,
|
|
145
|
+
"path": "../public/assets/inbox-BYNjkNDJ.js"
|
|
132
146
|
},
|
|
133
147
|
"/assets/loader-B4Epchm_.js": {
|
|
134
148
|
"type": "text/javascript; charset=utf-8",
|
|
135
149
|
"etag": "\"199-3kmluGVUQQj/qxW5n5mcbXA3Z/0\"",
|
|
136
|
-
"mtime": "2026-09-
|
|
150
|
+
"mtime": "2026-09-18T06:00:41.320Z",
|
|
137
151
|
"size": 409,
|
|
138
152
|
"path": "../public/assets/loader-B4Epchm_.js"
|
|
139
153
|
},
|
|
140
|
-
"/assets/
|
|
154
|
+
"/assets/loops-1CvbqO6m.js": {
|
|
141
155
|
"type": "text/javascript; charset=utf-8",
|
|
142
|
-
"etag": "\"
|
|
143
|
-
"mtime": "2026-09-
|
|
144
|
-
"size":
|
|
145
|
-
"path": "../public/assets/
|
|
156
|
+
"etag": "\"13a7-cm8GZK27hxhqmzsWZMI5QH2US4c\"",
|
|
157
|
+
"mtime": "2026-09-18T06:00:41.320Z",
|
|
158
|
+
"size": 5031,
|
|
159
|
+
"path": "../public/assets/loops-1CvbqO6m.js"
|
|
146
160
|
},
|
|
147
|
-
"/assets/
|
|
161
|
+
"/assets/index-0yP3Jn_G.js": {
|
|
148
162
|
"type": "text/javascript; charset=utf-8",
|
|
149
|
-
"etag": "\"
|
|
150
|
-
"mtime": "2026-09-
|
|
151
|
-
"size":
|
|
152
|
-
"path": "../public/assets/
|
|
163
|
+
"etag": "\"50659-m9Q2/jKlnvBcUKitIphuane0WM8\"",
|
|
164
|
+
"mtime": "2026-09-18T06:00:41.319Z",
|
|
165
|
+
"size": 329305,
|
|
166
|
+
"path": "../public/assets/index-0yP3Jn_G.js"
|
|
153
167
|
},
|
|
154
|
-
"/assets/
|
|
155
|
-
"type": "font/woff2",
|
|
156
|
-
"etag": "\"72d8-9J+D7/6th5UzRxIgoFX9awJv47A\"",
|
|
157
|
-
"mtime": "2026-09-18T01:57:04.914Z",
|
|
158
|
-
"size": 29400,
|
|
159
|
-
"path": "../public/assets/geist-latin-wght-normal-BgDaEnEv.woff2"
|
|
160
|
-
},
|
|
161
|
-
"/assets/index-Cndsw84p.js": {
|
|
162
|
-
"type": "text/javascript; charset=utf-8",
|
|
163
|
-
"etag": "\"4f15c-FwR8sodSOPSkc8JjlnY8zhtEYwg\"",
|
|
164
|
-
"mtime": "2026-09-18T01:57:04.911Z",
|
|
165
|
-
"size": 323932,
|
|
166
|
-
"path": "../public/assets/index-Cndsw84p.js"
|
|
167
|
-
},
|
|
168
|
-
"/assets/loops-Dbe_mf5T.js": {
|
|
169
|
-
"type": "text/javascript; charset=utf-8",
|
|
170
|
-
"etag": "\"13a2-sLRxrcCS5txEO/d9gR66iYDY9sA\"",
|
|
171
|
-
"mtime": "2026-09-18T01:57:04.912Z",
|
|
172
|
-
"size": 5026,
|
|
173
|
-
"path": "../public/assets/loops-Dbe_mf5T.js"
|
|
174
|
-
},
|
|
175
|
-
"/assets/new-DPEaXKAY.js": {
|
|
168
|
+
"/assets/new-m5NlqYQT.js": {
|
|
176
169
|
"type": "text/javascript; charset=utf-8",
|
|
177
|
-
"etag": "\"ca3-
|
|
178
|
-
"mtime": "2026-09-
|
|
170
|
+
"etag": "\"ca3-6Xz/VexiTbfexiPEUQtUJV5c/pc\"",
|
|
171
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
179
172
|
"size": 3235,
|
|
180
|
-
"path": "../public/assets/new-
|
|
173
|
+
"path": "../public/assets/new-m5NlqYQT.js"
|
|
181
174
|
},
|
|
182
175
|
"/assets/play-DD4xQgvi.js": {
|
|
183
176
|
"type": "text/javascript; charset=utf-8",
|
|
184
177
|
"etag": "\"bc-alsbjWPSyChVi7eXGM6zPUOzF28\"",
|
|
185
|
-
"mtime": "2026-09-
|
|
178
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
186
179
|
"size": 188,
|
|
187
180
|
"path": "../public/assets/play-DD4xQgvi.js"
|
|
188
181
|
},
|
|
189
|
-
"/assets/
|
|
182
|
+
"/assets/loop-form-DnSJNc1k.js": {
|
|
190
183
|
"type": "text/javascript; charset=utf-8",
|
|
191
|
-
"etag": "\"
|
|
192
|
-
"mtime": "2026-09-
|
|
193
|
-
"size":
|
|
194
|
-
"path": "../public/assets/
|
|
184
|
+
"etag": "\"2a42-94+05ar0+LKjXi8noetvd0Nurn0\"",
|
|
185
|
+
"mtime": "2026-09-18T06:00:41.320Z",
|
|
186
|
+
"size": 10818,
|
|
187
|
+
"path": "../public/assets/loop-form-DnSJNc1k.js"
|
|
188
|
+
},
|
|
189
|
+
"/assets/refresh-cw-C3xBnKfy.js": {
|
|
190
|
+
"type": "text/javascript; charset=utf-8",
|
|
191
|
+
"etag": "\"13f-KJk+UjZqybh/n0vhbr9wwM57LJo\"",
|
|
192
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
193
|
+
"size": 319,
|
|
194
|
+
"path": "../public/assets/refresh-cw-C3xBnKfy.js"
|
|
195
195
|
},
|
|
196
196
|
"/assets/rolldown-runtime-CbXtAM7H.js": {
|
|
197
197
|
"type": "text/javascript; charset=utf-8",
|
|
198
198
|
"etag": "\"24d-+aXgvbJ1Wwcp2A8AXKIBByksYC8\"",
|
|
199
|
-
"mtime": "2026-09-
|
|
199
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
200
200
|
"size": 589,
|
|
201
201
|
"path": "../public/assets/rolldown-runtime-CbXtAM7H.js"
|
|
202
202
|
},
|
|
203
|
-
"/assets/
|
|
203
|
+
"/assets/preload-helper-CfdAYKD7.js": {
|
|
204
204
|
"type": "text/javascript; charset=utf-8",
|
|
205
|
-
"etag": "\"
|
|
206
|
-
"mtime": "2026-09-
|
|
207
|
-
"size":
|
|
208
|
-
"path": "../public/assets/
|
|
205
|
+
"etag": "\"25e66-CtN8yTaaHYxIKlY6y6/HKCvmwm0\"",
|
|
206
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
207
|
+
"size": 155238,
|
|
208
|
+
"path": "../public/assets/preload-helper-CfdAYKD7.js"
|
|
209
209
|
},
|
|
210
|
-
"/assets/
|
|
210
|
+
"/assets/runners-D8QVl-Y6.js": {
|
|
211
211
|
"type": "text/javascript; charset=utf-8",
|
|
212
|
-
"etag": "\"
|
|
213
|
-
"mtime": "2026-09-
|
|
214
|
-
"size":
|
|
215
|
-
"path": "../public/assets/
|
|
212
|
+
"etag": "\"af4-OC+GxgY5UDW9zPbdNUX7ntntR4Q\"",
|
|
213
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
214
|
+
"size": 2804,
|
|
215
|
+
"path": "../public/assets/runners-D8QVl-Y6.js"
|
|
216
216
|
},
|
|
217
|
-
"/assets/setting-fields-
|
|
217
|
+
"/assets/setting-fields-bJ_gTG7Q.js": {
|
|
218
218
|
"type": "text/javascript; charset=utf-8",
|
|
219
|
-
"etag": "\"749-
|
|
220
|
-
"mtime": "2026-09-
|
|
219
|
+
"etag": "\"749-LzR3qNTHmp9E39HhyA1rWQx3gCk\"",
|
|
220
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
221
221
|
"size": 1865,
|
|
222
|
-
"path": "../public/assets/setting-fields-
|
|
223
|
-
},
|
|
224
|
-
"/assets/styles-D3sonCfX.css": {
|
|
225
|
-
"type": "text/css; charset=utf-8",
|
|
226
|
-
"etag": "\"14d2a-lZ7x63AXhmJmu8JxOKzNT0a9hrg\"",
|
|
227
|
-
"mtime": "2026-09-18T01:57:04.914Z",
|
|
228
|
-
"size": 85290,
|
|
229
|
-
"path": "../public/assets/styles-D3sonCfX.css"
|
|
222
|
+
"path": "../public/assets/setting-fields-bJ_gTG7Q.js"
|
|
230
223
|
},
|
|
231
224
|
"/assets/switch-hRIbNGOj.js": {
|
|
232
225
|
"type": "text/javascript; charset=utf-8",
|
|
233
226
|
"etag": "\"1143-+VR0qSRiJugwgpkRWB7lzVYpJVY\"",
|
|
234
|
-
"mtime": "2026-09-
|
|
227
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
235
228
|
"size": 4419,
|
|
236
229
|
"path": "../public/assets/switch-hRIbNGOj.js"
|
|
237
230
|
},
|
|
238
|
-
"/assets/task-list-
|
|
231
|
+
"/assets/task-list-BAxjcVgr.js": {
|
|
239
232
|
"type": "text/javascript; charset=utf-8",
|
|
240
|
-
"etag": "\"1074-
|
|
241
|
-
"mtime": "2026-09-
|
|
233
|
+
"etag": "\"1074-5XugvUBT/qv6nPfGfSQ9Qt/7hGw\"",
|
|
234
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
242
235
|
"size": 4212,
|
|
243
|
-
"path": "../public/assets/task-list-
|
|
236
|
+
"path": "../public/assets/task-list-BAxjcVgr.js"
|
|
237
|
+
},
|
|
238
|
+
"/assets/styles-ClTGaXU0.css": {
|
|
239
|
+
"type": "text/css; charset=utf-8",
|
|
240
|
+
"etag": "\"14da9-b2Qt40ffRWPdYuZrfm/4MJhYLXE\"",
|
|
241
|
+
"mtime": "2026-09-18T06:00:41.323Z",
|
|
242
|
+
"size": 85417,
|
|
243
|
+
"path": "../public/assets/styles-ClTGaXU0.css"
|
|
244
244
|
},
|
|
245
245
|
"/assets/textarea-Fyuzi6Vp.js": {
|
|
246
246
|
"type": "text/javascript; charset=utf-8",
|
|
247
247
|
"etag": "\"306-vcm/L91/XPEkHVNl2yk2Lp05ZG8\"",
|
|
248
|
-
"mtime": "2026-09-
|
|
248
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
249
249
|
"size": 774,
|
|
250
250
|
"path": "../public/assets/textarea-Fyuzi6Vp.js"
|
|
251
251
|
},
|
|
252
|
+
"/assets/select-Cppu-hti.js": {
|
|
253
|
+
"type": "text/javascript; charset=utf-8",
|
|
254
|
+
"etag": "\"1b2f4-3YBJAy4lzk0epih6EODEaDeMaE4\"",
|
|
255
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
256
|
+
"size": 111348,
|
|
257
|
+
"path": "../public/assets/select-Cppu-hti.js"
|
|
258
|
+
},
|
|
252
259
|
"/assets/trash-2-BXZzBsoV.js": {
|
|
253
260
|
"type": "text/javascript; charset=utf-8",
|
|
254
261
|
"etag": "\"146-hW/6t3H21wnW0twJKNkEJlNp/Gk\"",
|
|
255
|
-
"mtime": "2026-09-
|
|
262
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
256
263
|
"size": 326,
|
|
257
264
|
"path": "../public/assets/trash-2-BXZzBsoV.js"
|
|
258
265
|
},
|
|
259
266
|
"/assets/useValueChanged-VVyq4hb9.js": {
|
|
260
267
|
"type": "text/javascript; charset=utf-8",
|
|
261
268
|
"etag": "\"dd8-Te7VI1t9EEvBsgN9Wq88UqStSY4\"",
|
|
262
|
-
"mtime": "2026-09-
|
|
269
|
+
"mtime": "2026-09-18T06:00:41.321Z",
|
|
263
270
|
"size": 3544,
|
|
264
271
|
"path": "../public/assets/useValueChanged-VVyq4hb9.js"
|
|
265
272
|
}
|
package/README.md
CHANGED
|
@@ -1,45 +1,48 @@
|
|
|
1
1
|
# Loopable
|
|
2
2
|
|
|
3
|
-
Loopable
|
|
3
|
+
Loopable is the team’s always-on agent for shared-knowledge work — review, cases, monitors. A lot of work should not depend on one person. People assign work in Slack, GitHub, and on a schedule. Codex and Claude finish it on a shared computer.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
It picks up a signal, does what the loop says, and writes the result back. Loops run on their own. Every run is recorded in the inbox.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Connect GitHub, a Slack bot, a Feishu / Lark bot, Gmail, or WeChat. Write a loop. Leave the machine on. Pull requests get reviewed, assigned issues get a draft, a scheduled job runs at 9am. The team does not have to open Codex.
|
|
8
|
+
|
|
9
|
+
The story is in [docs/narrative.md](docs/narrative.md). The words for the parts — loop, workflow, runner, and the rest — are in [docs/concepts.md](docs/concepts.md).
|
|
8
10
|
|
|
9
11
|
## Architecture
|
|
10
12
|
|
|
11
13
|
Three processes. The agent always runs on a Runner, never on the App or Dispatcher.
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
```
|
|
15
|
+
<p align="center">
|
|
16
|
+
<img src="docs/architecture.svg" alt="Slack bot, GitHub, and Lark bot into Loopable. A runner pulls the job. Loopable writes back to the same three." width="920" />
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
Slack bot, GitHub, and Lark bot send work in. Loopable watches, matches a loop, and queues the job. A Runner pulls it, runs Codex or Claude, and Loopable writes the result back.
|
|
19
20
|
|
|
20
21
|
```text
|
|
21
|
-
Loopable ──HTTP── Runner ── Agent CLI
|
|
22
|
+
Loopable ──HTTP pull── Runner ── Agent CLI
|
|
22
23
|
(App + Dispatcher)
|
|
23
24
|
```
|
|
24
25
|
|
|
25
26
|
| Process | Does |
|
|
26
27
|
| --- | --- |
|
|
27
28
|
| **App** | UI, HTTP API, OAuth, the interface runners pull from |
|
|
28
|
-
| **Dispatcher** | Watches for signals,
|
|
29
|
-
| **Runner** |
|
|
29
|
+
| **Dispatcher** | Watches for signals, matches loops, queues jobs, writes back |
|
|
30
|
+
| **Runner** | Pulls a job over HTTP, runs the agent CLI |
|
|
30
31
|
|
|
31
|
-
App and Dispatcher share one database and stay on the same host. Only one Dispatcher may run against that database. Runners join over HTTP
|
|
32
|
+
App and Dispatcher share one database and stay on the same host. Only one Dispatcher may run against that database. Runners join over HTTP from that host or other machines. Extra runners are in [docs/deploy.md](docs/deploy.md).
|
|
32
33
|
|
|
33
|
-
##
|
|
34
|
+
## Run it
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
The usual setup is one computer that stays on — a Mac in the office is enough. App, Dispatcher, and a Runner all live there. It looks like a spare machine on a desk. For a small team, that is the product.
|
|
37
|
+
|
|
38
|
+
You need Node 22+ and an agent CLI signed in on that machine (Codex or Cursor Agent / Claude).
|
|
36
39
|
|
|
37
40
|
```bash
|
|
38
41
|
npm install -g loopable-cli
|
|
39
42
|
loopable start # App + Dispatcher, bound on all interfaces
|
|
40
43
|
```
|
|
41
44
|
|
|
42
|
-
|
|
45
|
+
On the same computer, open `http://127.0.0.1:4321`. Connect GitHub from that address. Write a loop. On Runners, copy the join command and start a runner (this machine is fine):
|
|
43
46
|
|
|
44
47
|
```bash
|
|
45
48
|
loopable runner --url http://<LAN-IP>:4321 --token <from Runners>
|
|
@@ -47,13 +50,13 @@ loopable runner --url http://<LAN-IP>:4321 --token <from Runners>
|
|
|
47
50
|
|
|
48
51
|
If the dispatcher is not running, the app says so. If no runner has joined, tasks wait.
|
|
49
52
|
|
|
50
|
-
Connect GitHub from `http://127.0.0.1:4321` on this machine. Extra runners on other machines are in [docs/deploy.md](docs/deploy.md).
|
|
51
|
-
|
|
52
53
|
State lives in `~/.loopable/`. Credentials stay in the OS keychain.
|
|
53
54
|
|
|
55
|
+
Another always-on runner, or opening the UI from a second computer, is in [docs/deploy.md](docs/deploy.md). A company VM is optional later, only if this box is not enough.
|
|
56
|
+
|
|
54
57
|
## Develop
|
|
55
58
|
|
|
56
|
-
This section is only for working on the code. Running Loopable as a product is the CLI above, not pnpm. Dev uses `~/.loopable-dev/` and a separate keychain namespace, so it does not touch the
|
|
59
|
+
This section is only for working on the code. Running Loopable as a product is the CLI above, not pnpm. Dev uses `~/.loopable-dev/` and a separate keychain namespace, so it does not touch the team database.
|
|
57
60
|
|
|
58
61
|
TanStack Start (React + Vite), SQLite, Tailwind. Tests are Vitest.
|
|
59
62
|
|
|
@@ -68,6 +71,8 @@ pnpm db:studio
|
|
|
68
71
|
|
|
69
72
|
`pnpm runner` is only for a second machine while `pnpm dev` is already running.
|
|
70
73
|
|
|
74
|
+
The public site is `site/` (static HTML, Vite). `pnpm site:dev` to preview. `pnpm site:build` writes `site/dist` for a Cloudflare Worker with assets only. `pnpm site:deploy` when you are ready to publish it.
|
|
75
|
+
|
|
71
76
|
| Path | Contents |
|
|
72
77
|
| --- | --- |
|
|
73
78
|
| `src/connectors/` | One folder per connector: `manifest.ts` (browser-safe) and `runtime.ts` (server) |
|
package/dist/cli.mjs
CHANGED
|
@@ -14,68 +14,17 @@ var __export = (target, all) => {
|
|
|
14
14
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
15
15
|
};
|
|
16
16
|
|
|
17
|
-
// src/lib/
|
|
18
|
-
var
|
|
19
|
-
__export(
|
|
20
|
-
appOrigin: () => appOrigin,
|
|
21
|
-
callbackUrl: () => callbackUrl,
|
|
22
|
-
isLoopbackHost: () => isLoopbackHost,
|
|
17
|
+
// src/lib/lan.ts
|
|
18
|
+
var lan_exports = {};
|
|
19
|
+
__export(lan_exports, {
|
|
23
20
|
lanIPv4: () => lanIPv4,
|
|
24
|
-
loopableOrigin: () => loopableOrigin
|
|
25
|
-
registrableCallbackUrl: () => registrableCallbackUrl
|
|
21
|
+
loopableOrigin: () => loopableOrigin
|
|
26
22
|
});
|
|
27
23
|
import { networkInterfaces } from "node:os";
|
|
28
24
|
function configuredOrigin() {
|
|
29
25
|
const base = process.env.LOOPABLE_BASE_URL?.replace(/\/$/, "");
|
|
30
26
|
return base || null;
|
|
31
27
|
}
|
|
32
|
-
function isLoopbackHost(hostname) {
|
|
33
|
-
return hostname === "127.0.0.1" || hostname === "localhost" || hostname === "::1";
|
|
34
|
-
}
|
|
35
|
-
function isPrivateHostname(hostname) {
|
|
36
|
-
if (isLoopbackHost(hostname)) return true;
|
|
37
|
-
const v4 = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(hostname);
|
|
38
|
-
if (v4) {
|
|
39
|
-
const a = Number(v4[1]);
|
|
40
|
-
const b = Number(v4[2]);
|
|
41
|
-
if (a === 10) return true;
|
|
42
|
-
if (a === 127) return true;
|
|
43
|
-
if (a === 192 && b === 168) return true;
|
|
44
|
-
if (a === 172 && b >= 16 && b <= 31) return true;
|
|
45
|
-
if (a === 169 && b === 254) return true;
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
const host = hostname.toLowerCase();
|
|
49
|
-
if (host.includes(":")) {
|
|
50
|
-
if (host.startsWith("fe80:") || host.startsWith("fc") || host.startsWith("fd")) return true;
|
|
51
|
-
}
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
function publicConfiguredOrigin() {
|
|
55
|
-
const base = configuredOrigin();
|
|
56
|
-
if (!base) return null;
|
|
57
|
-
try {
|
|
58
|
-
const url = new URL(base);
|
|
59
|
-
if (isPrivateHostname(url.hostname)) return null;
|
|
60
|
-
return base;
|
|
61
|
-
} catch {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
function appOrigin(requestUrl) {
|
|
66
|
-
const hosted = publicConfiguredOrigin();
|
|
67
|
-
if (hosted) return hosted;
|
|
68
|
-
const url = new URL(requestUrl);
|
|
69
|
-
return `http://127.0.0.1${url.port ? `:${url.port}` : ""}`;
|
|
70
|
-
}
|
|
71
|
-
function callbackUrl(requestUrl, connectorId) {
|
|
72
|
-
return `${appOrigin(requestUrl)}/api/connectors/${connectorId}/callback`;
|
|
73
|
-
}
|
|
74
|
-
function registrableCallbackUrl(connectorId) {
|
|
75
|
-
const hosted = publicConfiguredOrigin();
|
|
76
|
-
if (hosted) return `${hosted}/api/connectors/${connectorId}/callback`;
|
|
77
|
-
return `http://127.0.0.1/api/connectors/${connectorId}/callback`;
|
|
78
|
-
}
|
|
79
28
|
function lanIPv4(nics = networkInterfaces()) {
|
|
80
29
|
const found = [];
|
|
81
30
|
for (const addrs of Object.values(nics)) {
|
|
@@ -96,8 +45,8 @@ function loopableOrigin(nics = networkInterfaces()) {
|
|
|
96
45
|
const port = process.env.PORT ?? process.env.NITRO_PORT ?? "4321";
|
|
97
46
|
return `http://${lanIPv4(nics) ?? "127.0.0.1"}:${port}`;
|
|
98
47
|
}
|
|
99
|
-
var
|
|
100
|
-
"src/lib/
|
|
48
|
+
var init_lan = __esm({
|
|
49
|
+
"src/lib/lan.ts"() {
|
|
101
50
|
"use strict";
|
|
102
51
|
}
|
|
103
52
|
});
|
|
@@ -7122,7 +7071,7 @@ var init_runners = __esm({
|
|
|
7122
7071
|
|
|
7123
7072
|
// src/cli.ts
|
|
7124
7073
|
import { spawn } from "node:child_process";
|
|
7125
|
-
import { existsSync as existsSync2 } from "node:fs";
|
|
7074
|
+
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "node:fs";
|
|
7126
7075
|
import { dirname, join as join3 } from "node:path";
|
|
7127
7076
|
import { createInterface } from "node:readline";
|
|
7128
7077
|
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
@@ -7141,8 +7090,18 @@ function usage() {
|
|
|
7141
7090
|
|
|
7142
7091
|
loopable dispatcher
|
|
7143
7092
|
Dispatcher only.
|
|
7093
|
+
|
|
7094
|
+
loopable --version
|
|
7144
7095
|
`;
|
|
7145
7096
|
}
|
|
7097
|
+
function cliVersion() {
|
|
7098
|
+
try {
|
|
7099
|
+
const pkg = JSON.parse(readFileSync2(join3(root, "package.json"), "utf8"));
|
|
7100
|
+
return pkg.version;
|
|
7101
|
+
} catch {
|
|
7102
|
+
return "unknown";
|
|
7103
|
+
}
|
|
7104
|
+
}
|
|
7146
7105
|
function fail(message) {
|
|
7147
7106
|
process.stderr.write(`${message}
|
|
7148
7107
|
`);
|
|
@@ -7162,6 +7121,7 @@ function parse(argv) {
|
|
|
7162
7121
|
return value;
|
|
7163
7122
|
};
|
|
7164
7123
|
if (arg === "-h" || arg === "--help") return { command: "help", flags };
|
|
7124
|
+
if (arg === "-v" || arg === "--version") return { command: "version", flags };
|
|
7165
7125
|
if (arg === "--host") flags.host = next();
|
|
7166
7126
|
else if (arg === "--port") flags.port = next();
|
|
7167
7127
|
else if (arg === "--url") flags.url = next();
|
|
@@ -7248,7 +7208,7 @@ async function waitForApp(port) {
|
|
|
7248
7208
|
}
|
|
7249
7209
|
async function printRunnerHint(flags) {
|
|
7250
7210
|
await waitForApp(flags.port);
|
|
7251
|
-
const { lanIPv4: lanIPv42 } = await Promise.resolve().then(() => (
|
|
7211
|
+
const { lanIPv4: lanIPv42 } = await Promise.resolve().then(() => (init_lan(), lan_exports));
|
|
7252
7212
|
const { getJoinToken: getJoinToken2 } = await Promise.resolve().then(() => (init_runners(), runners_exports));
|
|
7253
7213
|
const ip = lanIPv42() ?? "127.0.0.1";
|
|
7254
7214
|
const url = `http://${ip}:${flags.port}`;
|
|
@@ -7279,6 +7239,11 @@ async function main() {
|
|
|
7279
7239
|
process.stdout.write(usage());
|
|
7280
7240
|
return;
|
|
7281
7241
|
}
|
|
7242
|
+
if (command === "version") {
|
|
7243
|
+
process.stdout.write(`${cliVersion()}
|
|
7244
|
+
`);
|
|
7245
|
+
return;
|
|
7246
|
+
}
|
|
7282
7247
|
if (command === "runner") {
|
|
7283
7248
|
if (flags.url) process.env.LOOPABLE_URL = flags.url;
|
|
7284
7249
|
if (flags.token) process.env.LOOPABLE_RUNNER_TOKEN = flags.token;
|