@gapi/gcli 1.8.237 → 1.8.239
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/.agents/skills/changelog/SKILL.md +59 -0
- package/.agents/skills/cluster-targeting/SKILL.md +70 -0
- package/.agents/skills/gcli-command/SKILL.md +55 -0
- package/.agents/skills/local-ai-runners/SKILL.md +40 -0
- package/.claude/README.md +33 -0
- package/AGENTS.md +105 -0
- package/CLAUDE.md +20 -0
- package/README-CLI.md +385 -23
- package/README.md +40 -0
- package/docs/CHANGELOG.md +8 -0
- package/docs/changelog.d/2026-10-11-local-ai-runners-gcli-runner-commands-bridge-ollama-to-the-chat.md +25 -0
- package/docs/changelog.d/2026-10-11-local-ai-runners-gcli-runner-models-chooses-the-models-shown-in-chat.md +12 -0
- package/docs/changelog.d/2026-10-11-local-ai-runners-runner-reports-each-model-s-loaded-context-window.md +22 -0
- package/docs/changelog.d/2026-10-11-repo-ai-ready-package-setup-agents-md-skills-feature-changelog.md +18 -0
- package/docs/changelog.d/2026-10-11-repo-tests-workflow-runs-lint-and-tests-on-every-branch-push.md +18 -0
- package/docs/changelog.d/README.md +51 -0
- package/docs/features/README.md +33 -0
- package/docs/features/local-ai-runners.md +71 -0
- package/package.json +2 -1
- package/release/index.js +921 -92
- package/scripts/changelog.mjs +348 -0
package/README-CLI.md
CHANGED
|
@@ -14,6 +14,7 @@ Commands:
|
|
|
14
14
|
lambda:log [options] Get lambda log
|
|
15
15
|
lambda:build:log [options] Get build log
|
|
16
16
|
lambda:test [options] Test lambda
|
|
17
|
+
lambda:package [options]
|
|
17
18
|
project:list List of all projects
|
|
18
19
|
project:use <project> Adds default project to be used all around the
|
|
19
20
|
CLI
|
|
@@ -29,6 +30,38 @@ Commands:
|
|
|
29
30
|
mcp:start [options] Start mcp proxy server
|
|
30
31
|
start [options] Start bundle using esbuild
|
|
31
32
|
https://esbuild.github.io
|
|
33
|
+
cron:create [options] Create cron
|
|
34
|
+
cron:delete [options] Delete cron
|
|
35
|
+
cron:list [options] List of all cron jobs for project
|
|
36
|
+
cluster:create [options] Provision a private Talos cluster for a project
|
|
37
|
+
(runs in the background - takes several
|
|
38
|
+
minutes; use --wait to block)
|
|
39
|
+
cluster:list [options] List every private cluster this project has (it
|
|
40
|
+
may have several - dev/stage/prod, ...)
|
|
41
|
+
cluster:teardown [options] Tear down one of a project's clusters (runs in
|
|
42
|
+
the background - use --wait to block)
|
|
43
|
+
cluster:kubeconfig [options] Print (or save) a cluster's raw kubeconfig YAML
|
|
44
|
+
- only available once it's 'ready'
|
|
45
|
+
rabbitmq:create [options] Provision a RabbitMQ broker for a project (a
|
|
46
|
+
project may have several)
|
|
47
|
+
rabbitmq:list [options] List every RabbitMQ broker for a project
|
|
48
|
+
rabbitmq:delete [options] Delete a RabbitMQ broker
|
|
49
|
+
plugin:list List every plugin available in the marketplace
|
|
50
|
+
catalog
|
|
51
|
+
plugin:installed [options] List plugins installed for a project (may
|
|
52
|
+
include the same plugin on several clusters)
|
|
53
|
+
plugin:install [options] Install a marketplace plugin for a project
|
|
54
|
+
plugin:uninstall [options] Uninstall a plugin from a project (--cluster
|
|
55
|
+
picks which installation, if it's on several)
|
|
56
|
+
runner:start [options] Connect this machine's Ollama to the Lambforge
|
|
57
|
+
chat as a local AI runner (outbound connection
|
|
58
|
+
only - works behind NAT, Ollama is never
|
|
59
|
+
exposed)
|
|
60
|
+
runner:list List your local AI runners and the models they
|
|
61
|
+
serve
|
|
62
|
+
runner:models [options] Choose which of a runner's models appear in the
|
|
63
|
+
chat model picker (no flags: list them)
|
|
64
|
+
runner:delete [options] Delete a local AI runner and revoke its token
|
|
32
65
|
help [command] display help for command
|
|
33
66
|
[36m
|
|
34
67
|
--- Subcommand: login ---[0m
|
|
@@ -50,8 +83,16 @@ Usage: gcli lambda:list [options]
|
|
|
50
83
|
List of all lambdas for project
|
|
51
84
|
|
|
52
85
|
Options:
|
|
53
|
-
-p, --project <project>
|
|
54
|
-
|
|
86
|
+
-p, --project <project> Specify custom token generated from the
|
|
87
|
+
website
|
|
88
|
+
-cid, --clusterId <clusterId> Only lambdas whose environment targets this
|
|
89
|
+
cluster (empty string for
|
|
90
|
+
shared-cluster-only; omit for all)
|
|
91
|
+
-cn, --clusterName <clusterName> Same as --clusterId but by the cluster's
|
|
92
|
+
human-readable name (see cluster:list) -
|
|
93
|
+
resolved to its id before the request;
|
|
94
|
+
--clusterId wins if both are given
|
|
95
|
+
-h, --help display help for command
|
|
55
96
|
[36m
|
|
56
97
|
--- Subcommand: lambda:get ---[0m
|
|
57
98
|
Usage: gcli lambda:get [options]
|
|
@@ -59,11 +100,17 @@ Usage: gcli lambda:get [options]
|
|
|
59
100
|
Get lambda by id
|
|
60
101
|
|
|
61
102
|
Options:
|
|
62
|
-
-l, --lambda <lambda>
|
|
63
|
-
-n, --name <name>
|
|
64
|
-
-p, --project <project>
|
|
65
|
-
-p, --spec <spec>
|
|
66
|
-
-
|
|
103
|
+
-l, --lambda <lambda> get by lambda id
|
|
104
|
+
-n, --name <name> get by lambda name
|
|
105
|
+
-p, --project <project> get by lambda name
|
|
106
|
+
-p, --spec <spec> get by lambda name
|
|
107
|
+
-cid, --clusterId <clusterId> Disambiguates which lambda to fetch when
|
|
108
|
+
--name matches more than one across
|
|
109
|
+
different clusters
|
|
110
|
+
-cn, --clusterName <clusterName> Same as --clusterId but by the cluster's
|
|
111
|
+
human-readable name (see cluster:list);
|
|
112
|
+
--clusterId wins if both are given
|
|
113
|
+
-h, --help display help for command
|
|
67
114
|
[36m
|
|
68
115
|
--- Subcommand: lambda:create ---[0m
|
|
69
116
|
Usage: gcli lambda:create [options]
|
|
@@ -72,6 +119,8 @@ Options:
|
|
|
72
119
|
--name <name> Function name
|
|
73
120
|
--project <project> Project in which this lambda is defined
|
|
74
121
|
--env <env> Environment name for function can be NODEJS
|
|
122
|
+
--clusterId <clusterId> Disambiguation hint: which of the project's clusters --env lives on (see cluster:list); omit for the shared cluster. Only needed once a project has private clusters and a duplicate-named environment across them.
|
|
123
|
+
--clusterName <clusterName> Same as --clusterId but by the cluster's human-readable name (see cluster:list); --clusterId wins if both are given. Can also be set as `clusterName` in the lambforge.yaml spec's function block.
|
|
75
124
|
--method <method...> HTTP Methods: GET,POST,PUT,DELETE,HEAD. To mention single method
|
|
76
125
|
--spec <spec> Spec file yml or json path
|
|
77
126
|
--packageJson <packageJson> Define packageJson in string format
|
|
@@ -79,10 +128,18 @@ Options:
|
|
|
79
128
|
--buildBashScript <buildBashScript> Package build command for builder to run with
|
|
80
129
|
--script <script> Package build script path
|
|
81
130
|
--params <params> Array from strings which defines route params
|
|
131
|
+
--configs <configs...> List of kubernetes config names
|
|
132
|
+
--secrets <secrets...> List of kubernetes secret names
|
|
133
|
+
--envSecrets <envSecrets...> List of kubernetes secret names projected into process.env (graphql environment only)
|
|
82
134
|
--network <network> Can be private or public meaning exposed to the router or just for private available can be both also --network private --network public
|
|
83
135
|
--route <route> Lambda route in which will be accessible
|
|
84
136
|
--code <code> URL or local path for single file source code
|
|
85
137
|
--file <file> Main lambda file
|
|
138
|
+
--customUploadFileId <customUploadFileId> Id of a pre-uploaded archive to use as the lambda source
|
|
139
|
+
--federation Provision this lambda as a GraphQL Federation gateway instead of a regular function
|
|
140
|
+
--subgraphs <subgraphs...> Lambda names (within the project) to expose as subgraphs of the federation gateway
|
|
141
|
+
--mcp Provision this lambda as an Apollo MCP Server in front of a federation graph
|
|
142
|
+
--mcpGraph <mcpGraph> Federation gateway lambda name the MCP server connects to (operations/headers via spec yaml)
|
|
86
143
|
--executorType <executorType> Executor type for execution; one of 'poolmgr', 'newdeploy'
|
|
87
144
|
--maxCpu <maxCpu> Maximum CPU to be assigned to pod (In millicore, minimum 1)
|
|
88
145
|
--minCpu <minCpu> Minimum CPU to be assigned to pod (In millicore, minimum 1)
|
|
@@ -104,6 +161,8 @@ Options:
|
|
|
104
161
|
--name <name> Function name
|
|
105
162
|
--project <project> Project in which this lambda is defined
|
|
106
163
|
--env <env> Environment name for function can be NODEJS
|
|
164
|
+
--clusterId <clusterId> Disambiguation hint: which of the project's clusters --env lives on (see cluster:list); omit for the shared cluster. Only needed once a project has private clusters and a duplicate-named environment across them.
|
|
165
|
+
--clusterName <clusterName> Same as --clusterId but by the cluster's human-readable name (see cluster:list); --clusterId wins if both are given. Can also be set as `clusterName` in the lambforge.yaml spec's function block.
|
|
107
166
|
--method <method...> HTTP Methods: GET,POST,PUT,DELETE,HEAD. To mention single method
|
|
108
167
|
--spec <spec> Spec file yml or json path
|
|
109
168
|
--packageJson <packageJson> Define packageJson in string format
|
|
@@ -111,10 +170,18 @@ Options:
|
|
|
111
170
|
--buildBashScript <buildBashScript> Package build command for builder to run with
|
|
112
171
|
--script <script> Package build script path
|
|
113
172
|
--params <params> Array from strings which defines route params
|
|
173
|
+
--configs <configs...> List of kubernetes config names
|
|
174
|
+
--secrets <secrets...> List of kubernetes secret names
|
|
175
|
+
--envSecrets <envSecrets...> List of kubernetes secret names projected into process.env (graphql environment only)
|
|
114
176
|
--network <network> Can be private or public meaning exposed to the router or just for private available can be both also --network private --network public
|
|
115
177
|
--route <route> Lambda route in which will be accessible
|
|
116
178
|
--code <code> URL or local path for single file source code
|
|
117
179
|
--file <file> Main lambda file
|
|
180
|
+
--customUploadFileId <customUploadFileId> Id of a pre-uploaded archive to use as the lambda source
|
|
181
|
+
--federation Provision this lambda as a GraphQL Federation gateway instead of a regular function
|
|
182
|
+
--subgraphs <subgraphs...> Lambda names (within the project) to expose as subgraphs of the federation gateway
|
|
183
|
+
--mcp Provision this lambda as an Apollo MCP Server in front of a federation graph
|
|
184
|
+
--mcpGraph <mcpGraph> Federation gateway lambda name the MCP server connects to (operations/headers via spec yaml)
|
|
118
185
|
--executorType <executorType> Executor type for execution; one of 'poolmgr', 'newdeploy'
|
|
119
186
|
--maxCpu <maxCpu> Maximum CPU to be assigned to pod (In millicore, minimum 1)
|
|
120
187
|
--minCpu <minCpu> Minimum CPU to be assigned to pod (In millicore, minimum 1)
|
|
@@ -135,10 +202,19 @@ Usage: gcli lambda:delete [options]
|
|
|
135
202
|
Get lambda by id
|
|
136
203
|
|
|
137
204
|
Options:
|
|
138
|
-
-n, --name <name>
|
|
139
|
-
-p, --project <project>
|
|
140
|
-
-s, --spec <spec>
|
|
141
|
-
-
|
|
205
|
+
-n, --name <name> get by lambda name
|
|
206
|
+
-p, --project <project> get by lambda name
|
|
207
|
+
-s, --spec <spec> get by lambda name
|
|
208
|
+
-e, --env <env> disambiguates which lambda to delete when
|
|
209
|
+
--name matches more than one across
|
|
210
|
+
environments/clusters
|
|
211
|
+
-cid, --clusterId <clusterId> disambiguates which lambda to delete when
|
|
212
|
+
--name matches more than one across
|
|
213
|
+
different clusters
|
|
214
|
+
-cn, --clusterName <clusterName> Same as --clusterId but by the cluster's
|
|
215
|
+
human-readable name (see cluster:list);
|
|
216
|
+
--clusterId wins if both are given
|
|
217
|
+
-h, --help display help for command
|
|
142
218
|
[36m
|
|
143
219
|
--- Subcommand: lambda:log ---[0m
|
|
144
220
|
Usage: gcli lambda:log [options]
|
|
@@ -146,11 +222,17 @@ Usage: gcli lambda:log [options]
|
|
|
146
222
|
Get lambda log
|
|
147
223
|
|
|
148
224
|
Options:
|
|
149
|
-
-l, --lambda <lambda>
|
|
150
|
-
-n, --name <name>
|
|
151
|
-
-p, --project <project>
|
|
152
|
-
-s, --spec <spec>
|
|
153
|
-
-
|
|
225
|
+
-l, --lambda <lambda> get by lambda id
|
|
226
|
+
-n, --name <name> get by lambda name
|
|
227
|
+
-p, --project <project> get by lambda name
|
|
228
|
+
-s, --spec <spec> get by lambda name
|
|
229
|
+
-cid, --clusterId <clusterId> disambiguates which lambda to fetch logs
|
|
230
|
+
for when --name matches more than one
|
|
231
|
+
across different clusters
|
|
232
|
+
-cn, --clusterName <clusterName> Same as --clusterId but by the cluster's
|
|
233
|
+
human-readable name (see cluster:list);
|
|
234
|
+
--clusterId wins if both are given
|
|
235
|
+
-h, --help display help for command
|
|
154
236
|
[36m
|
|
155
237
|
--- Subcommand: lambda:build:log ---[0m
|
|
156
238
|
Usage: gcli lambda:build:log [options]
|
|
@@ -158,11 +240,17 @@ Usage: gcli lambda:build:log [options]
|
|
|
158
240
|
Get build log
|
|
159
241
|
|
|
160
242
|
Options:
|
|
161
|
-
-l, --lambda <lambda>
|
|
162
|
-
-n, --name <name>
|
|
163
|
-
-p, --project <project>
|
|
164
|
-
-s, --spec <spec>
|
|
165
|
-
-
|
|
243
|
+
-l, --lambda <lambda> get by lambda id
|
|
244
|
+
-n, --name <name> get by lambda name
|
|
245
|
+
-p, --project <project> get by lambda project
|
|
246
|
+
-s, --spec <spec> use configuration
|
|
247
|
+
-cid, --clusterId <clusterId> disambiguates which lambda to fetch build
|
|
248
|
+
logs for when --name matches more than one
|
|
249
|
+
across different clusters
|
|
250
|
+
-cn, --clusterName <clusterName> Same as --clusterId but by the cluster's
|
|
251
|
+
human-readable name (see cluster:list);
|
|
252
|
+
--clusterId wins if both are given
|
|
253
|
+
-h, --help display help for command
|
|
166
254
|
[36m
|
|
167
255
|
--- Subcommand: lambda:test ---[0m
|
|
168
256
|
Usage: gcli lambda:test [options]
|
|
@@ -177,8 +265,52 @@ Options:
|
|
|
177
265
|
-qp, --queryParams <queryParams> Adds query params to request
|
|
178
266
|
-pp, --pathParams <pathParams> Adds query params to request
|
|
179
267
|
-b, --body <body> Add body to request
|
|
268
|
+
-m, --method <method> HTTP Methods: GET,POST,PUT,DELETE,HEAD. To
|
|
269
|
+
mention single method
|
|
180
270
|
-h, --help display help for command
|
|
181
271
|
[36m
|
|
272
|
+
--- Subcommand: lambda:package ---[0m
|
|
273
|
+
Usage: gcli lambda:package [options]
|
|
274
|
+
|
|
275
|
+
Options:
|
|
276
|
+
--name <name> Function name
|
|
277
|
+
--project <project> Project in which this lambda is defined
|
|
278
|
+
--env <env> Environment name for function can be NODEJS
|
|
279
|
+
--clusterId <clusterId> Disambiguation hint: which of the project's clusters --env lives on (see cluster:list); omit for the shared cluster. Only needed once a project has private clusters and a duplicate-named environment across them.
|
|
280
|
+
--clusterName <clusterName> Same as --clusterId but by the cluster's human-readable name (see cluster:list); --clusterId wins if both are given. Can also be set as `clusterName` in the lambforge.yaml spec's function block.
|
|
281
|
+
--method <method...> HTTP Methods: GET,POST,PUT,DELETE,HEAD. To mention single method
|
|
282
|
+
--spec <spec> Spec file yml or json path
|
|
283
|
+
--packageJson <packageJson> Define packageJson in string format
|
|
284
|
+
--package <package> Path to package.json
|
|
285
|
+
--buildBashScript <buildBashScript> Package build command for builder to run with
|
|
286
|
+
--script <script> Package build script path
|
|
287
|
+
--params <params> Array from strings which defines route params
|
|
288
|
+
--configs <configs...> List of kubernetes config names
|
|
289
|
+
--secrets <secrets...> List of kubernetes secret names
|
|
290
|
+
--envSecrets <envSecrets...> List of kubernetes secret names projected into process.env (graphql environment only)
|
|
291
|
+
--network <network> Can be private or public meaning exposed to the router or just for private available can be both also --network private --network public
|
|
292
|
+
--route <route> Lambda route in which will be accessible
|
|
293
|
+
--code <code> URL or local path for single file source code
|
|
294
|
+
--file <file> Main lambda file
|
|
295
|
+
--customUploadFileId <customUploadFileId> Id of a pre-uploaded archive to use as the lambda source
|
|
296
|
+
--federation Provision this lambda as a GraphQL Federation gateway instead of a regular function
|
|
297
|
+
--subgraphs <subgraphs...> Lambda names (within the project) to expose as subgraphs of the federation gateway
|
|
298
|
+
--mcp Provision this lambda as an Apollo MCP Server in front of a federation graph
|
|
299
|
+
--mcpGraph <mcpGraph> Federation gateway lambda name the MCP server connects to (operations/headers via spec yaml)
|
|
300
|
+
--executorType <executorType> Executor type for execution; one of 'poolmgr', 'newdeploy'
|
|
301
|
+
--maxCpu <maxCpu> Maximum CPU to be assigned to pod (In millicore, minimum 1)
|
|
302
|
+
--minCpu <minCpu> Minimum CPU to be assigned to pod (In millicore, minimum 1)
|
|
303
|
+
--maxMemory <maxMemory> Maximum memory to be assigned to pod (In megabyte)
|
|
304
|
+
--minMemory <minMemory> Minimum memory to be assigned to pod (In megabyte)
|
|
305
|
+
--minScale <minScale> Minimum number of pods (Uses resource inputs to configure HPA)
|
|
306
|
+
--maxScale <maxScale> Maximum number of pods (Uses resource inputs to configure HPA)
|
|
307
|
+
--targetCpu <targetCpu> Target average CPU usage percentage across pods for scaling
|
|
308
|
+
--idleTimeout <idleTimeout> The length of time (in seconds) that a function is idle before pod(s) are eligible for recycling
|
|
309
|
+
--concurrency <concurrency> Maximum number of pods specialized concurrently to serve requests
|
|
310
|
+
--functionTimeout <functionTimeout> Maximum time for a request to wait for the response from the function
|
|
311
|
+
--specializationTimeout <specializationTimeout> Timeout for executor to wait for function pod creation
|
|
312
|
+
-h, --help display help for command
|
|
313
|
+
[36m
|
|
182
314
|
--- Subcommand: project:list ---[0m
|
|
183
315
|
Usage: gcli project:list [options]
|
|
184
316
|
|
|
@@ -245,6 +377,14 @@ Options:
|
|
|
245
377
|
-spec, --spec <spec>
|
|
246
378
|
-r, --region <region> Default region is eu-central 'DEFAULT' |
|
|
247
379
|
'EU_BALKANS' | 'EU_CENTRAL'
|
|
380
|
+
-cid, --clusterId <clusterId> Private cluster this environment should
|
|
381
|
+
run on (see cluster:list); omit for the
|
|
382
|
+
shared cluster. Immutable after
|
|
383
|
+
creation.
|
|
384
|
+
-cn, --clusterName <clusterName> Same as --clusterId but by the cluster's
|
|
385
|
+
human-readable name; --clusterId wins if
|
|
386
|
+
both are given. Can also be set as
|
|
387
|
+
`clusterName` in env.yaml.
|
|
248
388
|
-h, --help display help for command
|
|
249
389
|
[36m
|
|
250
390
|
--- Subcommand: environment:update ---[0m
|
|
@@ -265,6 +405,14 @@ Options:
|
|
|
265
405
|
-spec, --spec <spec>
|
|
266
406
|
-r, --region <region> Default region is eu-central 'DEFAULT' |
|
|
267
407
|
'EU_BALKANS' | 'EU_CENTRAL'
|
|
408
|
+
-cid, --clusterId <clusterId> Disambiguates which environment to
|
|
409
|
+
update when --name matches more than one
|
|
410
|
+
across different clusters (clusterId
|
|
411
|
+
itself is immutable and never changed by
|
|
412
|
+
this command).
|
|
413
|
+
-cn, --clusterName <clusterName> Same as --clusterId but by the cluster's
|
|
414
|
+
human-readable name; --clusterId wins if
|
|
415
|
+
both are given
|
|
268
416
|
-h, --help display help for command
|
|
269
417
|
[36m
|
|
270
418
|
--- Subcommand: environment:delete ---[0m
|
|
@@ -277,7 +425,13 @@ Options:
|
|
|
277
425
|
-n, --name <name>
|
|
278
426
|
-f, --force
|
|
279
427
|
-spec, --spec <spec>
|
|
280
|
-
-
|
|
428
|
+
-cid, --clusterId <clusterId> Disambiguates which environment to delete
|
|
429
|
+
when --name matches more than one across
|
|
430
|
+
different clusters
|
|
431
|
+
-cn, --clusterName <clusterName> Same as --clusterId but by the cluster's
|
|
432
|
+
human-readable name; --clusterId wins if
|
|
433
|
+
both are given
|
|
434
|
+
-h, --help display help for command
|
|
281
435
|
[36m
|
|
282
436
|
--- Subcommand: environment:get ---[0m
|
|
283
437
|
Usage: gcli environment:get [options]
|
|
@@ -287,7 +441,13 @@ Get environment for project
|
|
|
287
441
|
Options:
|
|
288
442
|
-p, --project <project>
|
|
289
443
|
-n, --name <name>
|
|
290
|
-
-
|
|
444
|
+
-cid, --clusterId <clusterId> Disambiguates which environment to fetch
|
|
445
|
+
when --name matches more than one across
|
|
446
|
+
different clusters
|
|
447
|
+
-cn, --clusterName <clusterName> Same as --clusterId but by the cluster's
|
|
448
|
+
human-readable name; --clusterId wins if
|
|
449
|
+
both are given
|
|
450
|
+
-h, --help display help for command
|
|
291
451
|
[36m
|
|
292
452
|
--- Subcommand: mcp:start ---[0m
|
|
293
453
|
Usage: gcli mcp:start [options]
|
|
@@ -310,5 +470,207 @@ Options:
|
|
|
310
470
|
-p, --platform <char> Platform (default: "node")
|
|
311
471
|
-t, --target <char> Target (default: "node14.4")
|
|
312
472
|
-o, --outfile <char> Outfile name
|
|
473
|
+
-i, --ignore <ignore...> Ignore folders from triggering restarts
|
|
313
474
|
-e, --external <external...> External libraries
|
|
314
475
|
-h, --help display help for command
|
|
476
|
+
[36m
|
|
477
|
+
--- Subcommand: cron:create ---[0m
|
|
478
|
+
Usage: gcli cron:create [options]
|
|
479
|
+
|
|
480
|
+
Create cron
|
|
481
|
+
|
|
482
|
+
Options:
|
|
483
|
+
-p, --project <project>
|
|
484
|
+
-l, --lambdaName <lambdaName>
|
|
485
|
+
-t, --triggerName <triggerName>
|
|
486
|
+
-c, --cron <cron>
|
|
487
|
+
-h, --help display help for command
|
|
488
|
+
[36m
|
|
489
|
+
--- Subcommand: cron:delete ---[0m
|
|
490
|
+
Usage: gcli cron:delete [options]
|
|
491
|
+
|
|
492
|
+
Delete cron
|
|
493
|
+
|
|
494
|
+
Options:
|
|
495
|
+
-p, --project <project>
|
|
496
|
+
-l, --lambdaName <lambdaName>
|
|
497
|
+
-h, --help display help for command
|
|
498
|
+
[36m
|
|
499
|
+
--- Subcommand: cron:list ---[0m
|
|
500
|
+
Usage: gcli cron:list [options]
|
|
501
|
+
|
|
502
|
+
List of all cron jobs for project
|
|
503
|
+
|
|
504
|
+
Options:
|
|
505
|
+
-p, --project <project>
|
|
506
|
+
-h, --help display help for command
|
|
507
|
+
[36m
|
|
508
|
+
--- Subcommand: cluster:create ---[0m
|
|
509
|
+
Usage: gcli cluster:create [options]
|
|
510
|
+
|
|
511
|
+
Provision a private Talos cluster for a project (runs in the background - takes several minutes; use --wait to block)
|
|
512
|
+
|
|
513
|
+
Options:
|
|
514
|
+
-p, --project <project>
|
|
515
|
+
-spec, --spec <spec>
|
|
516
|
+
-n, --name <name>
|
|
517
|
+
--imageId <imageId> hcloud Talos snapshot id
|
|
518
|
+
--serverType <serverType>
|
|
519
|
+
-l, --location <location>
|
|
520
|
+
--workers <workers> Worker count (ignored when --singleNode)
|
|
521
|
+
--singleNode Control plane carries the workload too
|
|
522
|
+
--wait Block until the cluster is ready (or errors)
|
|
523
|
+
-h, --help display help for command
|
|
524
|
+
[36m
|
|
525
|
+
--- Subcommand: cluster:list ---[0m
|
|
526
|
+
Usage: gcli cluster:list [options]
|
|
527
|
+
|
|
528
|
+
List every private cluster this project has (it may have several - dev/stage/prod, ...)
|
|
529
|
+
|
|
530
|
+
Options:
|
|
531
|
+
-p, --project <project>
|
|
532
|
+
-h, --help display help for command
|
|
533
|
+
[36m
|
|
534
|
+
--- Subcommand: cluster:teardown ---[0m
|
|
535
|
+
Usage: gcli cluster:teardown [options]
|
|
536
|
+
|
|
537
|
+
Tear down one of a project's clusters (runs in the background - use --wait to block)
|
|
538
|
+
|
|
539
|
+
Options:
|
|
540
|
+
-p, --project <project>
|
|
541
|
+
-c, --cluster <cluster> Cluster id (see cluster:list)
|
|
542
|
+
--wait Block until the cluster is gone (or errors)
|
|
543
|
+
-h, --help display help for command
|
|
544
|
+
[36m
|
|
545
|
+
--- Subcommand: cluster:kubeconfig ---[0m
|
|
546
|
+
Usage: gcli cluster:kubeconfig [options]
|
|
547
|
+
|
|
548
|
+
Print (or save) a cluster's raw kubeconfig YAML - only available once it's 'ready'
|
|
549
|
+
|
|
550
|
+
Options:
|
|
551
|
+
-p, --project <project>
|
|
552
|
+
-c, --cluster <cluster> Cluster id (see cluster:list)
|
|
553
|
+
-o, --output <output> Write to this file instead of stdout
|
|
554
|
+
-h, --help display help for command
|
|
555
|
+
[36m
|
|
556
|
+
--- Subcommand: rabbitmq:create ---[0m
|
|
557
|
+
Usage: gcli rabbitmq:create [options]
|
|
558
|
+
|
|
559
|
+
Provision a RabbitMQ broker for a project (a project may have several)
|
|
560
|
+
|
|
561
|
+
Options:
|
|
562
|
+
-p, --project <project>
|
|
563
|
+
-spec, --spec <spec>
|
|
564
|
+
-n, --name <name>
|
|
565
|
+
-d, --description <description>
|
|
566
|
+
-u, --user <user>
|
|
567
|
+
--password <password>
|
|
568
|
+
-r, --region <region> 'DEFAULT' | 'EU_BALKANS' | 'EU_CENTRAL'
|
|
569
|
+
-c, --cluster <cluster> Which private cluster to provision this
|
|
570
|
+
broker on; omit for the shared cluster
|
|
571
|
+
-h, --help display help for command
|
|
572
|
+
[36m
|
|
573
|
+
--- Subcommand: rabbitmq:list ---[0m
|
|
574
|
+
Usage: gcli rabbitmq:list [options]
|
|
575
|
+
|
|
576
|
+
List every RabbitMQ broker for a project
|
|
577
|
+
|
|
578
|
+
Options:
|
|
579
|
+
-p, --project <project>
|
|
580
|
+
-h, --help display help for command
|
|
581
|
+
[36m
|
|
582
|
+
--- Subcommand: rabbitmq:delete ---[0m
|
|
583
|
+
Usage: gcli rabbitmq:delete [options]
|
|
584
|
+
|
|
585
|
+
Delete a RabbitMQ broker
|
|
586
|
+
|
|
587
|
+
Options:
|
|
588
|
+
-p, --project <project>
|
|
589
|
+
--id <id> Broker id (see rabbitmq:list)
|
|
590
|
+
-h, --help display help for command
|
|
591
|
+
[36m
|
|
592
|
+
--- Subcommand: plugin:list ---[0m
|
|
593
|
+
Usage: gcli plugin:list [options]
|
|
594
|
+
|
|
595
|
+
List every plugin available in the marketplace catalog
|
|
596
|
+
|
|
597
|
+
Options:
|
|
598
|
+
-h, --help display help for command
|
|
599
|
+
[36m
|
|
600
|
+
--- Subcommand: plugin:installed ---[0m
|
|
601
|
+
Usage: gcli plugin:installed [options]
|
|
602
|
+
|
|
603
|
+
List plugins installed for a project (may include the same plugin on several clusters)
|
|
604
|
+
|
|
605
|
+
Options:
|
|
606
|
+
-p, --project <project>
|
|
607
|
+
-h, --help display help for command
|
|
608
|
+
[36m
|
|
609
|
+
--- Subcommand: plugin:install ---[0m
|
|
610
|
+
Usage: gcli plugin:install [options]
|
|
611
|
+
|
|
612
|
+
Install a marketplace plugin for a project
|
|
613
|
+
|
|
614
|
+
Options:
|
|
615
|
+
-p, --project <project>
|
|
616
|
+
-spec, --spec <spec>
|
|
617
|
+
-n, --name <name> Plugin name, e.g. redis-plugin
|
|
618
|
+
-c, --cluster <cluster> Which private cluster to install into; omit for the
|
|
619
|
+
shared cluster
|
|
620
|
+
-h, --help display help for command
|
|
621
|
+
[36m
|
|
622
|
+
--- Subcommand: plugin:uninstall ---[0m
|
|
623
|
+
Usage: gcli plugin:uninstall [options]
|
|
624
|
+
|
|
625
|
+
Uninstall a plugin from a project (--cluster picks which installation, if it's on several)
|
|
626
|
+
|
|
627
|
+
Options:
|
|
628
|
+
-p, --project <project>
|
|
629
|
+
-n, --name <name> Plugin name
|
|
630
|
+
-c, --cluster <cluster>
|
|
631
|
+
-h, --help display help for command
|
|
632
|
+
[36m
|
|
633
|
+
--- Subcommand: runner:start ---[0m
|
|
634
|
+
Usage: gcli runner:start [options]
|
|
635
|
+
|
|
636
|
+
Connect this machine's Ollama to the Lambforge chat as a local AI runner (outbound connection only - works behind NAT, Ollama is never exposed)
|
|
637
|
+
|
|
638
|
+
Options:
|
|
639
|
+
-n, --name <name> Runner name shown in the chat model picker (default:
|
|
640
|
+
hostname)
|
|
641
|
+
-t, --token <token> Runner token from Profile -> Local AI runners (instead
|
|
642
|
+
of `gcli login`)
|
|
643
|
+
--ollama <url> Ollama URL (default: $OLLAMA_HOST or
|
|
644
|
+
http://127.0.0.1:11434)
|
|
645
|
+
--wsUrl <url> Lambforge subscriptions endpoint override
|
|
646
|
+
--reset Forget the saved runner and register a new one
|
|
647
|
+
-h, --help display help for command
|
|
648
|
+
[36m
|
|
649
|
+
--- Subcommand: runner:list ---[0m
|
|
650
|
+
Usage: gcli runner:list [options]
|
|
651
|
+
|
|
652
|
+
List your local AI runners and the models they serve
|
|
653
|
+
|
|
654
|
+
Options:
|
|
655
|
+
-h, --help display help for command
|
|
656
|
+
[36m
|
|
657
|
+
--- Subcommand: runner:models ---[0m
|
|
658
|
+
Usage: gcli runner:models [options]
|
|
659
|
+
|
|
660
|
+
Choose which of a runner's models appear in the chat model picker (no flags: list them)
|
|
661
|
+
|
|
662
|
+
Options:
|
|
663
|
+
--id <id> Runner id (default: the runner saved on this machine)
|
|
664
|
+
--show <models> Comma-separated models to show (hides the rest)
|
|
665
|
+
--all Show every model again
|
|
666
|
+
--none Hide all models of this runner from the chat
|
|
667
|
+
-h, --help display help for command
|
|
668
|
+
[36m
|
|
669
|
+
--- Subcommand: runner:delete ---[0m
|
|
670
|
+
Usage: gcli runner:delete [options]
|
|
671
|
+
|
|
672
|
+
Delete a local AI runner and revoke its token
|
|
673
|
+
|
|
674
|
+
Options:
|
|
675
|
+
--id <id> Runner id (default: the runner saved on this machine)
|
|
676
|
+
-h, --help display help for command
|
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ Whether you are deploying scalable serverless functions, managing cloud environm
|
|
|
11
11
|
- [Managing Infrastructure](#managing-infrastructure)
|
|
12
12
|
- [Serverless Functions (Lambdas)](#serverless-functions-lambdas)
|
|
13
13
|
- [AI Integration (Model Context Protocol)](#ai-integration-model-context-protocol)
|
|
14
|
+
- [Local AI Models (Ollama runner)](#local-ai-models-ollama-runner)
|
|
14
15
|
- [Build System](#build-system)
|
|
15
16
|
- [Command Reference](#command-reference)
|
|
16
17
|
|
|
@@ -714,6 +715,45 @@ To use this with Claude Desktop or other MCP-compatible tools, add the following
|
|
|
714
715
|
}
|
|
715
716
|
```
|
|
716
717
|
|
|
718
|
+
## Local AI Models (Ollama runner)
|
|
719
|
+
|
|
720
|
+
Use models running on your own machine in the Lambforge chat - including
|
|
721
|
+
agent mode, spawned workers and MCP tools - exactly like the hosted models.
|
|
722
|
+
`gcli runner:start` connects your local [Ollama](https://ollama.com) to
|
|
723
|
+
Lambforge over an **outbound** WebSocket: it works behind NAT, nothing is
|
|
724
|
+
port-forwarded, and Ollama is never exposed to the internet. The platform
|
|
725
|
+
can only send chat completions to it (`POST /v1/chat/completions`).
|
|
726
|
+
|
|
727
|
+
```bash
|
|
728
|
+
# 1. Ollama with a model, and a context window big enough for agent mode
|
|
729
|
+
ollama pull qwen3:32b
|
|
730
|
+
OLLAMA_CONTEXT_LENGTH=32768 ollama serve
|
|
731
|
+
|
|
732
|
+
# 2. Logged-in gcli registers this machine as a runner and connects
|
|
733
|
+
gcli login
|
|
734
|
+
gcli runner:start # --name my-gpu-box (default: hostname)
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
Your models now appear in the chat model picker with a **Local** badge
|
|
738
|
+
(greyed out as **Offline** when the runner isn't running). The runner keeps
|
|
739
|
+
running until Ctrl+C and reconnects on its own.
|
|
740
|
+
|
|
741
|
+
| Command | Description |
|
|
742
|
+
|---|---|
|
|
743
|
+
| `gcli runner:start` | Connect this machine. First run registers a runner and saves it to `~/.graphql-server/runner.json`. Options: `--name`, `--token <runner token>` (headless machines without `gcli login` - create the token in Profile -> Local AI runners), `--ollama <url>` (default `$OLLAMA_HOST` or `http://127.0.0.1:11434`), `--wsUrl` (override the derived endpoint), `--reset` (forget the saved runner, register a new one) |
|
|
744
|
+
| `gcli runner:list` | Your runners: online status, last seen, models |
|
|
745
|
+
| `gcli runner:models` | List which models are shown in the chat; `--show a,b` shows only those, `--all` shows every model, `--none` hides them all; `--id` picks a runner (default: this machine's) |
|
|
746
|
+
| `gcli runner:delete` | Delete a runner and revoke its token (`--id`, default: this machine's) |
|
|
747
|
+
|
|
748
|
+
Notes:
|
|
749
|
+
|
|
750
|
+
- Models are only offered if Ollama reports them as chat-capable; a model
|
|
751
|
+
without the `tools` capability is used without platform tools.
|
|
752
|
+
- Local models don't count against your plan's AI token quota.
|
|
753
|
+
- Requires Node.js >= 22.
|
|
754
|
+
- Use Profile -> Local AI runners in the web app to see runners, choose
|
|
755
|
+
models with checkboxes, and create tokens.
|
|
756
|
+
|
|
717
757
|
## Build System & Local Development
|
|
718
758
|
|
|
719
759
|
`gcli` includes a high-performance bundler powered by **esbuild**.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Changelog (archive)
|
|
2
|
+
|
|
3
|
+
Compacted changelog fragments, newest first. **Never edit this file by
|
|
4
|
+
hand** - new entries go in `docs/changelog.d/` (`node scripts/changelog.mjs new`);
|
|
5
|
+
only `node scripts/changelog.mjs compact` writes here. See
|
|
6
|
+
`docs/changelog.d/README.md`.
|
|
7
|
+
|
|
8
|
+
---
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
## 2026-10-11 - local-ai-runners: gcli runner commands bridge a local Ollama to the chat
|
|
2
|
+
|
|
3
|
+
**Feature:** local-ai-runners · **Type:** feat
|
|
4
|
+
|
|
5
|
+
- `gcli runner:start` registers the machine with the `gcli login` session
|
|
6
|
+
(or uses `--token`), saves `~/.graphql-server/runner.json` (0600) and keeps
|
|
7
|
+
an outbound subscriptions-transport-ws connection (`RunnerConnection`):
|
|
8
|
+
`subscribeToRunnerRequests`, `runnerHeartbeat` every 30s (models from
|
|
9
|
+
Ollama `/api/tags` + `/api/show`, non-chat models dropped),
|
|
10
|
+
`runnerRespond` with `FrameSender` (seq, 50ms batches, chunks merged to
|
|
11
|
+
32KB), `ping` while Ollama queues, cancel -> abort, reconnect 1s -> 30s,
|
|
12
|
+
refused token -> exit 1 with a `--reset` hint.
|
|
13
|
+
- `runner:list`, `runner:delete`; `GraphqlClienAPI` runner calls.
|
|
14
|
+
- Only `POST /v1/chat/completions` is proxied (`ALLOWED_REQUESTS`).
|
|
15
|
+
- Endpoint derived from the login URL (dev :9004 -> ws :9000).
|
|
16
|
+
- Backend half: graphql-server `local-runner` module; UI in gql-fission.
|
|
17
|
+
- **Test:** `npx jest test/runner.spec.ts --coverage=false` (fake server
|
|
18
|
+
socket + fake streaming Ollama: auth, heartbeat models, ordered streaming
|
|
19
|
+
with split UTF-8, allow-list, cancel, ping, refused token, URL rules).
|
|
20
|
+
- **Debug:** runner log `->` / `<-` / `x` lines, `Heartbeat failed`,
|
|
21
|
+
`Cannot reach Ollama`, `Disconnected ... reconnecting`; backend side in
|
|
22
|
+
`graphql-server/docs/features/local-ai-runners.md#how-to-debug`.
|
|
23
|
+
- **Verification:** gcli suite green; `tsc` + eslint clean; live: runner
|
|
24
|
+
registered against the dev gateway, connected, 31 chat models reported,
|
|
25
|
+
reconnect reused the saved runner, chat answered by `qwen3.8:27b`.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
## 2026-10-11 - local-ai-runners: gcli runner:models chooses the models shown in chat
|
|
2
|
+
|
|
3
|
+
**Feature:** local-ai-runners · **Type:** feat
|
|
4
|
+
|
|
5
|
+
- `gcli runner:models [--id] [--show a,b | --all | --none]` ->
|
|
6
|
+
`setLocalRunnerModels`; no flag lists models with a `shown` column. Warns
|
|
7
|
+
about names the runner doesn't report (kept anyway).
|
|
8
|
+
- **Test:** `npx jest test/runner.spec.ts --coverage=false`
|
|
9
|
+
(`parseSelection` flag mapping and conflicts).
|
|
10
|
+
- **Debug:** "Runner ... not found" = wrong `--id` or not your runner; an
|
|
11
|
+
error naming `setLocalRunnerModels` = backend older than this feature.
|
|
12
|
+
- **Verification:** gcli suite 27/27; `tsc` + eslint clean.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
## 2026-10-11 - local-ai-runners: runner reports each model's loaded context window
|
|
2
|
+
|
|
3
|
+
**Feature:** local-ai-runners · **Type:** fix
|
|
4
|
+
|
|
5
|
+
- Heartbeat models now carry `runtimeContextLength` from Ollama `/api/ps`
|
|
6
|
+
(the window a loaded model really runs with, e.g. 32,768 for qwen3.8:27b
|
|
7
|
+
whose max is 262,144). The backend fits every request to it - fixes
|
|
8
|
+
`500 no user query found in messages` in long chats, caused by Ollama
|
|
9
|
+
silently truncating oversized prompts (backend half: graphql-server
|
|
10
|
+
`fix(local-ai-runners): fit requests to the model's real context window`).
|
|
11
|
+
- Models `/api/show` answers 404/410 for (a retired `glm-5.1:cloud` was
|
|
12
|
+
still listed by `/api/tags`) are no longer offered, and the answer is
|
|
13
|
+
cached instead of re-asked every heartbeat.
|
|
14
|
+
- **Test:** `npx jest test/runner.spec.ts --coverage=false` (fake Ollama
|
|
15
|
+
answers `/api/ps` with a loaded model at 65536 and 410 for a retired
|
|
16
|
+
cloud model; the heartbeat must carry the window and omit that model).
|
|
17
|
+
- **Debug:** `ollama ps` shows the live window the runner reports;
|
|
18
|
+
`db["local-runners"]` -> `models[].runtimeContextLength` on the backend.
|
|
19
|
+
An unloaded model reports nothing - the backend keeps its last value.
|
|
20
|
+
- **Verification:** gcli 27/27, tsc + eslint clean; live: runner reported
|
|
21
|
+
30 models (retired cloud model gone) and the dev backend stored
|
|
22
|
+
qwen3.8:27b runtimeContextLength 32768.
|