@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/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
  
34
67
  --- Subcommand: login ---
@@ -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> Specify custom token generated from the website
54
- -h, --help display help for command
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
  
56
97
  --- Subcommand: lambda:get ---
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> get by lambda id
63
- -n, --name <name> get by lambda name
64
- -p, --project <project> get by lambda name
65
- -p, --spec <spec> get by lambda name
66
- -h, --help display help for command
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
  
68
115
  --- Subcommand: lambda:create ---
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> get by lambda name
139
- -p, --project <project> get by lambda name
140
- -s, --spec <spec> get by lambda name
141
- -h, --help display help for command
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
  
143
219
  --- Subcommand: lambda:log ---
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> get by lambda id
150
- -n, --name <name> get by lambda name
151
- -p, --project <project> get by lambda name
152
- -s, --spec <spec> get by lambda name
153
- -h, --help display help for command
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
  
155
237
  --- Subcommand: lambda:build:log ---
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> get by lambda id
162
- -n, --name <name> get by lambda name
163
- -p, --project <project> get by lambda project
164
- -s, --spec <spec> use configuration
165
- -h, --help display help for command
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
  
167
255
  --- Subcommand: lambda:test ---
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
  
272
+ --- Subcommand: lambda:package ---
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
+ 
182
314
  --- Subcommand: project:list ---
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
  
250
390
  --- Subcommand: environment:update ---
@@ -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
  
270
418
  --- Subcommand: environment:delete ---
@@ -277,7 +425,13 @@ Options:
277
425
  -n, --name <name>
278
426
  -f, --force
279
427
  -spec, --spec <spec>
280
- -h, --help display help for command
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
  
282
436
  --- Subcommand: environment:get ---
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
- -h, --help display help for command
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
  
292
452
  --- Subcommand: mcp:start ---
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
+ 
477
+ --- Subcommand: cron:create ---
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
+ 
489
+ --- Subcommand: cron:delete ---
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
+ 
499
+ --- Subcommand: cron:list ---
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
+ 
508
+ --- Subcommand: cluster:create ---
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
+ 
525
+ --- Subcommand: cluster:list ---
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
+ 
534
+ --- Subcommand: cluster:teardown ---
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
+ 
545
+ --- Subcommand: cluster:kubeconfig ---
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
+ 
556
+ --- Subcommand: rabbitmq:create ---
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
+ 
573
+ --- Subcommand: rabbitmq:list ---
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
+ 
582
+ --- Subcommand: rabbitmq:delete ---
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
+ 
592
+ --- Subcommand: plugin:list ---
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
+ 
600
+ --- Subcommand: plugin:installed ---
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
+ 
609
+ --- Subcommand: plugin:install ---
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
+ 
622
+ --- Subcommand: plugin:uninstall ---
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
+ 
633
+ --- Subcommand: runner:start ---
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
+ 
649
+ --- Subcommand: runner:list ---
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
+ 
657
+ --- Subcommand: runner:models ---
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
+ 
669
+ --- Subcommand: runner:delete ---
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.