agl 22.0.1 → 22.0.2
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/changelog.md +10 -0
- package/dist_serve/bundle.js +1 -1
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.cli.d.ts +4 -2
- package/dist_ts/classes.cli.js +161 -68
- package/dist_ts/classes.controller.js +23 -10
- package/dist_ts/classes.upgradecoordinator.d.ts +39 -1
- package/dist_ts/classes.upgradecoordinator.js +740 -74
- package/dist_ts/classes.upgradetransaction.d.ts +68 -1
- package/dist_ts/classes.upgradetransaction.js +383 -223
- package/package.json +1 -1
- package/readme.md +255 -378
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.cli.ts +184 -83
- package/ts/classes.controller.ts +25 -7
- package/ts/classes.upgradecoordinator.ts +876 -74
- package/ts/classes.upgradetransaction.ts +574 -250
- package/ts_web/00_commitinfo_data.ts +1 -1
package/readme.md
CHANGED
|
@@ -1,547 +1,424 @@
|
|
|
1
|
-
# AGL
|
|
1
|
+
# AGL
|
|
2
2
|
|
|
3
|
-
AGL
|
|
3
|
+
AGL is a self-hosted workspace for working with OpenCode and FlexHarness from one secure browser interface. It runs both agent runtimes behind a local controller, keeps conversations organized by project, and adds durable resources, model management, permission handling, workspace history, and safe lifecycle management.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
The default setup is local-first: AGL listens only on `127.0.0.1`, opens no agent runtime directly to the network, and protects the browser with a passkey. A trusted TLS reverse proxy can provide remote access when needed.
|
|
6
6
|
|
|
7
7
|
## Issue Reporting and Security
|
|
8
8
|
|
|
9
9
|
For reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/](https://community.foss.global/). This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull Requests directly.
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## What AGL Provides
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
- One browser workspace for OpenCode and FlexHarness conversations.
|
|
14
|
+
- Explicit projects backed by existing directories on disk.
|
|
15
|
+
- Live text, reasoning, tool activity, todos, permissions, and questions.
|
|
16
|
+
- OpenCode and Flex model selection, including per-conversation choices.
|
|
17
|
+
- Conversation groups, ordering, search, rename, archive, and deletion.
|
|
18
|
+
- Synchronized drafts, file attachments, scratchpads, tasks, and goals.
|
|
19
|
+
- Native slash commands with transcript and Git-aware undo/redo.
|
|
20
|
+
- Optional detached Git worktrees owned and validated by the controller.
|
|
21
|
+
- Durable terminal resources that survive browser reloads.
|
|
22
|
+
- Durable browser resources for human use and permission-gated agent automation.
|
|
23
|
+
- Read-only Session Intelligence for questions about a conversation and related sessions.
|
|
24
|
+
- Passkey authentication, temporary CLI passwords, and bounded audit records.
|
|
25
|
+
- Detached start, verified stop, health status, and coordinated in-place upgrades.
|
|
14
26
|
|
|
15
|
-
|
|
27
|
+
AGL does not replace either harness. OpenCode remains the owner of OpenCode sessions, FlexHarness remains the owner of Flex sessions, and every mutation is sent to the runtime that owns the conversation.
|
|
16
28
|
|
|
17
|
-
##
|
|
29
|
+
## How It Works
|
|
18
30
|
|
|
19
31
|
```text
|
|
20
32
|
Browser
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
│ └─ authenticated OpenCode server (127.0.0.1:<opencode-port>)
|
|
29
|
-
└─ private framed IPC
|
|
30
|
-
└─ isolated FlexHarness child
|
|
31
|
-
├─ filesystem and shell tools
|
|
32
|
-
├─ ephemeral read-only Session Intelligence workers
|
|
33
|
-
├─ provider adapters
|
|
34
|
-
└─ kernel-keyed sealed provider credentials
|
|
33
|
+
-> AGL controller and authenticated TypedSocket API
|
|
34
|
+
-> official OpenCode SDK
|
|
35
|
+
-> private OpenCode server on 127.0.0.1
|
|
36
|
+
-> private framed IPC
|
|
37
|
+
-> isolated FlexHarness child
|
|
38
|
+
-> controller-owned terminals, browsers, uploads, and Git state
|
|
39
|
+
-> SmartData persistence and audit records
|
|
35
40
|
```
|
|
36
41
|
|
|
37
|
-
|
|
42
|
+
OpenCode and FlexHarness are supervised independently. Flex can restart without taking down OpenCode, and an unsupported Flex runtime does not prevent OpenCode sessions or controller-owned terminals from working.
|
|
38
43
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
FlexHarness private state is persisted in separate SmartData domains for scope metadata, public message projections, remembered permissions, canonical Agent events and archives, and background tool jobs. A fenced per-project writer lease excludes overlapping Flex children, while the parent reads a separately committed bounded public projection. Lease heartbeats and writes share one serialized transition boundary; an expired lease still held by the same controller recovers with a fresh owner token and incremented epoch before work continues. Hidden terminal staging and private canonical events never enter that browser-readable projection; a visible Flex save is acknowledged only after the corresponding bounded view is durable.
|
|
42
|
-
|
|
43
|
-
Flex runtime implementation classes and child internals are private. Supported package surfaces include the `agl` CLI, protocol-v22 controller DTO and request contracts, the root-exported AGL home path helpers, and the root-exported controller-owned Git reversion types and engine.
|
|
44
|
+
The browser receives normalized AGL data. It never receives the OpenCode server password, provider credentials, private database descriptors, raw provider responses, or Flex private snapshots.
|
|
44
45
|
|
|
45
46
|
## Requirements
|
|
46
47
|
|
|
47
|
-
- Node.js 24 or newer
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
- Native `node-pty` support.
|
|
53
|
-
|
|
54
|
-
No database server is required: the controller ships an embedded engine
|
|
55
|
-
(`@push.rocks/smartdb`) by default. An external MongoDB-compatible server can
|
|
56
|
-
be configured instead.
|
|
57
|
-
|
|
58
|
-
The package pins `@opencode-ai/sdk` and the official OS/architecture-specific OpenCode binary packages to the same tested version. It resolves the lockfile-installed platform executable directly, without a wrapper postinstall or unrelated global binary. This release is tested against OpenCode `1.18.15`.
|
|
59
|
-
|
|
60
|
-
The OpenCode child, Flex child, and controller-owned terminal shells receive only ordinary runtime path, user, locale, temporary-directory, XDG, proxy, and CA environment variables by default. `AGL_HOME` is the deliberate controller-owned path exception; controller/database variables and unrelated parent secrets are not inherited. Explicitly delegate additional environment variables when needed:
|
|
61
|
-
|
|
62
|
-
```sh
|
|
63
|
-
export HARNESS_CONTROLLER_FORWARD_ENV='ANTHROPIC_API_KEY,OPENAI_API_KEY'
|
|
64
|
-
```
|
|
48
|
+
- Node.js 24 or newer.
|
|
49
|
+
- pnpm 11 or newer.
|
|
50
|
+
- Git 2.43 or newer for workspace history and managed worktrees.
|
|
51
|
+
- A WebAuthn-capable browser.
|
|
52
|
+
- Linux or macOS for detached `start`, `stop`, and managed upgrades.
|
|
53
|
+
- Native `node-pty` support.
|
|
65
54
|
|
|
66
|
-
|
|
55
|
+
When a prebuilt `node-pty` binary is unavailable, installation also needs Python 3, `make`, and a C/C++ toolchain.
|
|
67
56
|
|
|
68
|
-
|
|
57
|
+
FlexHarness currently runs on Linux x64 with Node.js 24 or 25. Other supported controller platforms still provide OpenCode and terminal functionality.
|
|
69
58
|
|
|
70
|
-
|
|
59
|
+
AGL includes an embedded SmartDB engine, so a separate database server is optional. It also pins the official OpenCode SDK and platform binary packages to one tested version.
|
|
71
60
|
|
|
72
|
-
|
|
61
|
+
## Install
|
|
73
62
|
|
|
74
|
-
|
|
63
|
+
Install the public package and allow its native terminal dependencies to build:
|
|
75
64
|
|
|
76
65
|
```sh
|
|
77
|
-
pnpm
|
|
78
|
-
|
|
79
|
-
|
|
66
|
+
pnpm add --global agl \
|
|
67
|
+
--allow-build=node-pty \
|
|
68
|
+
--allow-build=fs-ext-extra-prebuilt
|
|
80
69
|
```
|
|
81
70
|
|
|
82
|
-
|
|
71
|
+
To install from a specific registry, use pnpm's normal registry option:
|
|
83
72
|
|
|
84
73
|
```sh
|
|
85
74
|
pnpm add --global agl \
|
|
75
|
+
--registry=https://registry.npmjs.org \
|
|
86
76
|
--allow-build=node-pty \
|
|
87
77
|
--allow-build=fs-ext-extra-prebuilt
|
|
88
|
-
agl help
|
|
89
78
|
```
|
|
90
79
|
|
|
91
|
-
|
|
80
|
+
Confirm the installation:
|
|
92
81
|
|
|
93
82
|
```sh
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
node cli.js help
|
|
83
|
+
agl --version
|
|
84
|
+
agl help
|
|
97
85
|
```
|
|
98
86
|
|
|
99
|
-
|
|
87
|
+
## Quick Start
|
|
100
88
|
|
|
101
|
-
|
|
102
|
-
Starting from `@modelprofile.com/harness-controller@20.0.2`, run
|
|
103
|
-
the active `hcon` command twice and wait for each command to finish:
|
|
89
|
+
Start AGL without creating an implicit project:
|
|
104
90
|
|
|
105
91
|
```sh
|
|
106
|
-
|
|
107
|
-
hcon upgrade --port 4097
|
|
92
|
+
agl start
|
|
108
93
|
```
|
|
109
94
|
|
|
110
|
-
The first
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
target is available, resolves and validates `agl@21.0.0` before controller
|
|
114
|
-
preparation or package mutation, then performs the format-3 cross-package
|
|
115
|
-
transition. After that invocation succeeds, `hcon` is replaced and all further
|
|
116
|
-
management commands use `agl`:
|
|
95
|
+
The first start prints a local URL and a one-time setup code. Open the URL, enter the code, and create the controller's passkey.
|
|
96
|
+
|
|
97
|
+
To register one existing directory during startup:
|
|
117
98
|
|
|
118
99
|
```sh
|
|
119
|
-
agl
|
|
100
|
+
agl start --directory /absolute/path/to/project
|
|
120
101
|
```
|
|
121
102
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
command (`start`, `foreground`, `upgrade`, or `temp-password`) from an AGL
|
|
126
|
-
version with `AGL_HOME` support subsequently moves that retained state into the
|
|
127
|
-
canonical AGL home described below without changing persisted
|
|
128
|
-
controller, authentication, project, session, Flex, or Git identities.
|
|
129
|
-
|
|
130
|
-
### Upgrade behavior
|
|
131
|
-
|
|
132
|
-
AGL uses upgrade management version 2.
|
|
133
|
-
|
|
134
|
-
Each invocation launches a detached worker with a private log and follows it to
|
|
135
|
-
a terminal result. The same-package invocation compares the installed semantic
|
|
136
|
-
version with the old package's npm `latest` tag and never downgrades; the exact
|
|
137
|
-
20.0.3 bridge invocation instead resolves the fixed AGL target described above.
|
|
138
|
-
If the controller is running, it authorizes the worker through a one-time local
|
|
139
|
-
grant, asks the controller to accept preparation through a bounded management
|
|
140
|
-
request, and polls the private durable transaction while the controller
|
|
141
|
-
gracefully pauses the exact active-session cohort. Only preparation completed
|
|
142
|
-
within the absolute grace deadline and durably committed to the transaction lets
|
|
143
|
-
the worker stop the exact verified process, change the package installation, and
|
|
144
|
-
restart the controller with its existing environment and stored configuration.
|
|
145
|
-
If the controller is stopped, it remains stopped. The public management
|
|
146
|
-
transport exposes versioned launch, prepare-begin, legacy prepare-completion,
|
|
147
|
-
and finalize methods, but every fresh state-changing handler accepts only a
|
|
148
|
-
locally created, single-use 256-bit grant bound to the exact controller process
|
|
149
|
-
and package installation.
|
|
150
|
-
|
|
151
|
-
In normal progress mode, the command prints the worker PID and log path before
|
|
152
|
-
allowing the worker to stop anything; `--json` records those values durably
|
|
153
|
-
before admission and emits them only in its terminal document. Concurrent
|
|
154
|
-
upgrades and pnpm-global controller starts are serialized. A same-package
|
|
155
|
-
failure before target startup restores the previous version when safe. During
|
|
156
|
-
the format-3 package transition, failures before the durable target-commit
|
|
157
|
-
boundary restore exact bridge-only ownership; from that boundary onward,
|
|
158
|
-
recovery converges only to exact `agl@21.0.0` and never restores the bridge.
|
|
159
|
-
Session compensation is attempted where rollback remains safe, but any session
|
|
160
|
-
whose pause cleanup cannot be proven settled remains fail-closed instead of
|
|
161
|
-
receiving an overlapping continuation. Once the new controller has been
|
|
162
|
-
invoked, automatic rollback is intentionally disabled because startup may have
|
|
163
|
-
applied forward migrations. A retained target process keeps its transaction
|
|
164
|
-
token and session barrier and remains fail-closed until exact recovery can
|
|
165
|
-
complete; inspect its retained log and correct the reported problem rather than
|
|
166
|
-
spawning another controller or reinstalling the previous package. A
|
|
167
|
-
stopped-controller upgrade has no inherited cohort and leaves the target
|
|
168
|
-
stopped. The worker also refuses an upgrade when another pnpm-global controller
|
|
169
|
-
instance exists outside the exact authorized process.
|
|
170
|
-
|
|
171
|
-
New coordination transactions live under `$AGL_HOME/upgrade`. A target invoked
|
|
172
|
-
by an already-released 21.0.2 worker recognizes that token-bound worker's legacy
|
|
173
|
-
`/tmp/harness-controller-upgrade-*` directory only until the inherited
|
|
174
|
-
transaction reaches its terminal cleanup; unrelated or unbound legacy paths are
|
|
175
|
-
never used as fallback coordination.
|
|
176
|
-
|
|
177
|
-
`hcon upgrade` must be run from the active pnpm-global installation and is currently supported on Linux and macOS. Before starting the AGL transition, if a prior manual same-package upgrade replaced the management CLI while an older controller remained running, restore that exact older package first so its process identity can be stopped safely:
|
|
103
|
+
AGL never derives a project from the shell's current directory and never creates project directories. Additional projects can be registered from the browser.
|
|
104
|
+
|
|
105
|
+
Check controller and harness health:
|
|
178
106
|
|
|
179
107
|
```sh
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
pnpm add --global @modelprofile.com/harness-controller@latest
|
|
183
|
-
hcon start --port 4097
|
|
108
|
+
agl status
|
|
109
|
+
agl status --json
|
|
184
110
|
```
|
|
185
111
|
|
|
186
|
-
|
|
112
|
+
The default ports are:
|
|
187
113
|
|
|
188
|
-
|
|
114
|
+
- Browser URL and default WebAuthn origin: `http://localhost:4097`.
|
|
115
|
+
- Controller bind endpoint: `127.0.0.1:4097`.
|
|
116
|
+
- Private OpenCode server: `127.0.0.1:4098`.
|
|
189
117
|
|
|
190
|
-
|
|
191
|
-
in-progress home migration also uses a transient sibling lock beside that root;
|
|
192
|
-
it is not normal persisted state. Installed packages default to
|
|
193
|
-
`$XDG_CONFIG_HOME/agl` (normally `~/.config/agl`); repository checkouts default to
|
|
194
|
-
`<checkout>/.nogit/agl`. `AGL_HOME`, when supplied, must be an absolute normalized
|
|
195
|
-
non-root path whose direct parent already exists; this parent requirement also
|
|
196
|
-
applies to the selected default root. AGL owns
|
|
197
|
-
these namespaces:
|
|
118
|
+
## Everyday Workflows
|
|
198
119
|
|
|
199
|
-
|
|
200
|
-
- `credentials` for sealed Flex provider credentials;
|
|
201
|
-
- `git-reversion` for captures and controller-owned worktrees;
|
|
202
|
-
- `logs` for controller and upgrade logs;
|
|
203
|
-
- `upgrade` for durable upgrade coordination;
|
|
204
|
-
- `cache` for AGL-owned caches;
|
|
205
|
-
- `runtime/browser`, `runtime/uploads`, `runtime/sockets`, and
|
|
206
|
-
`runtime/opencode` for private runtime state;
|
|
207
|
-
- `migration` for the current journal and verified retained migration records.
|
|
120
|
+
### Projects
|
|
208
121
|
|
|
209
|
-
|
|
210
|
-
into a child environment without deriving paths from the child's CWD:
|
|
122
|
+
A project is an explicitly registered existing directory. Every conversation, durable resource, and workspace operation is scoped to one project. Conversation model overrides are project/session scoped, while harness default models are controller-wide settings.
|
|
211
123
|
|
|
212
|
-
|
|
213
|
-
import { bindAGLHomeEnvironment, resolveAGLHomePaths } from 'agl';
|
|
124
|
+
The browser accepts absolute paths and paths relative to the configured projects root. It suggests matching directories while typing, rejects dot navigation, and reports unavailable paths instead of creating them.
|
|
214
125
|
|
|
215
|
-
|
|
216
|
-
const childEnvironment = bindAGLHomeEnvironment(process.env, paths);
|
|
217
|
-
```
|
|
126
|
+
AGL records the complete filesystem ancestry for each project and revalidates it before path-sensitive work. Durable terminal and browser resources must be retired before project removal. Removal then cleans session state, Flex state, Git captures and managed worktrees, and project metadata through a resumable process; it never deletes files in the registered working tree.
|
|
218
127
|
|
|
219
|
-
|
|
220
|
-
`credentials`, `gitReversion`, `logs`, `legacyLogs`, `upgrade`, `cache`,
|
|
221
|
-
`runtime`, `browserRuntime`, `uploads`, `sockets`, `openCodeRuntime`, and
|
|
222
|
-
`migration`. `bindAGLHomeEnvironment()` returns a copy of the supplied
|
|
223
|
-
environment with `AGL_HOME` bound to `paths.root`.
|
|
224
|
-
|
|
225
|
-
The package installation itself, user-selected project directories, an explicit
|
|
226
|
-
`HARNESS_CONTROLLER_DB_DIR` (including one that names a recognized legacy
|
|
227
|
-
SmartDB path), an external MongoDB server, and OpenCode's own user-wide
|
|
228
|
-
configuration are not AGL-owned state and remain outside this root.
|
|
229
|
-
`AGL_HOME` is bound into controller, upgrade, Flex, and OpenCode process
|
|
230
|
-
boundaries so a detached process never derives ownership from its launch CWD.
|
|
231
|
-
|
|
232
|
-
The one-time v23 home migration runs before database model access from `start`,
|
|
233
|
-
`foreground`, `upgrade`, or `temp-password`. It first
|
|
234
|
-
normalizes the prior `harness-controller` to `hcon` migration when necessary,
|
|
235
|
-
then uses SmartDB and SmartSecret relocation APIs for the active database and
|
|
236
|
-
sealed credentials. Git state, browser state, logs, and verified legacy records
|
|
237
|
-
move under the same journal. The migration is same-filesystem only, checks
|
|
238
|
-
private ownership, exact source inventories, live writers, sockets, symlinks,
|
|
239
|
-
target collisions, and source identities before mutation, and safely reconciles
|
|
240
|
-
an interruption. Active controller-owned Git worktree state blocks migration
|
|
241
|
-
because Git's linked-worktree metadata contains absolute paths. Unknown or
|
|
242
|
-
ambiguous state fails closed. Verified historical database material is retained
|
|
243
|
-
under `$AGL_HOME/migration`; committed legacy roots are removed only when their
|
|
244
|
-
known entries are empty. Never move these directories or edit their journals by
|
|
245
|
-
hand.
|
|
246
|
-
|
|
247
|
-
An explicit non-default `AGL_HOME` in a development checkout starts as an
|
|
248
|
-
isolated fresh home and does not consume that checkout's shared legacy
|
|
249
|
-
`.nogit` state.
|
|
250
|
-
|
|
251
|
-
## Database configuration
|
|
252
|
-
|
|
253
|
-
Structured application state is stored exclusively through SmartData. There is no PID, configuration, authentication, or JSON persistence fallback on the filesystem.
|
|
254
|
-
|
|
255
|
-
By default the controller runs an embedded `@push.rocks/smartdb` engine — no
|
|
256
|
-
external database server. Storage lives under
|
|
257
|
-
`$AGL_HOME/database`. Override the directory with
|
|
258
|
-
`HARNESS_CONTROLLER_DB_DIR` (absolute path). Explicit database paths and
|
|
259
|
-
external MongoDB configurations are never moved. The engine listens on a
|
|
260
|
-
deterministic Unix socket under `$AGL_HOME/runtime/sockets`, and a second controller
|
|
261
|
-
process on the same machine (for example `agl temp-password`) attaches to the
|
|
262
|
-
running daemon's engine instead of opening the storage files again. The complete
|
|
263
|
-
embedded Unix socket path must be no longer than 100 UTF-8 bytes; a second
|
|
264
|
-
controller must use the same `AGL_HOME` and database directory to attach.
|
|
265
|
-
During the one-time home migration only, AGL also probes the published legacy
|
|
266
|
-
`/tmp/harness-controller-<16-hex>.sock` name to prove that the old embedded
|
|
267
|
-
engine is stopped. New runtime sockets are never created at that legacy path.
|
|
268
|
-
|
|
269
|
-
When upgrading from a controller release backed by FlexHarness 2, the new Flex child migrates each active project's legacy snapshot during initialization, before admitting runtime work. Migration preflights every destination, writes per-session domains before publishing scope discovery, repairs crash-interrupted streaming messages as cancelled, and safely reruns after partial completion. A durable completion marker prevents the retained source from being reapplied after live FlexHarness 3 state evolves. The legacy private snapshot remains retained as a non-authoritative recovery source until that project is removed; startup also repairs any bounded public projection whose prior save was not acknowledged.
|
|
270
|
-
|
|
271
|
-
To use an external MongoDB-compatible server instead, set:
|
|
128
|
+
### Conversations
|
|
272
129
|
|
|
273
|
-
|
|
274
|
-
export HARNESS_CONTROLLER_MONGO_URL='mongodb://user:password@127.0.0.1:27017'
|
|
275
|
-
export HARNESS_CONTROLLER_MONGO_DB='opencode_controller'
|
|
276
|
-
```
|
|
130
|
+
Use **New conversation** for OpenCode or choose Flex from the New menu. A new conversation remains a browser draft until its first message is submitted, so abandoning it does not leave an empty harness session.
|
|
277
131
|
|
|
278
|
-
|
|
132
|
+
Conversation features include:
|
|
279
133
|
|
|
280
|
-
|
|
134
|
+
- Tip-first transcript loading with older-history pagination.
|
|
135
|
+
- Live Assistant text, reasoning, tool state, todos, and subagent cards.
|
|
136
|
+
- Inline permission requests and questions in transcript order.
|
|
137
|
+
- Synchronized drafts and private temporary attachments.
|
|
138
|
+
- Durable model choices and scratchpads.
|
|
139
|
+
- Rename, archive, delete, abort, and session-specific Ask/Yolo controls.
|
|
140
|
+
- Token and context metrics when the harness can prove them from complete history.
|
|
281
141
|
|
|
282
|
-
|
|
283
|
-
gitzone services start mongo
|
|
284
|
-
gitzone services status
|
|
285
|
-
```
|
|
142
|
+
Archived conversations are hidden from the normal list and available in the archived-conversations dialog. Archive is admitted only after active prompts, permissions, commands, and Session Intelligence work have settled.
|
|
286
143
|
|
|
287
|
-
|
|
144
|
+
### Groups And Ordering
|
|
288
145
|
|
|
289
|
-
|
|
146
|
+
Conversations can be grouped and reordered per project. Drag a conversation into a group, reorder it within or between groups, or use a group's context menu to rename or remove the group.
|
|
290
147
|
|
|
291
|
-
|
|
148
|
+
Removing a group does not remove its conversations. The conversations return to the ungrouped section in their existing order. Confirmed layouts are revisioned, synchronized across browsers, and preserved if a later layout request fails.
|
|
292
149
|
|
|
293
|
-
|
|
294
|
-
agl start
|
|
295
|
-
```
|
|
150
|
+
### Models And Provider Accounts
|
|
296
151
|
|
|
297
|
-
|
|
152
|
+
AGL stores an independent default model for OpenCode and FlexHarness. A conversation can override its harness default without changing other conversations.
|
|
298
153
|
|
|
299
|
-
|
|
300
|
-
agl start --directory /absolute/path/to/project
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
The detached process first reserves the controller listener (`127.0.0.1:4097` in local mode; `0.0.0.0:4097` only with `--behind-tls-proxy`), spawns the isolated Flex child, starts the official OpenCode server in headless server mode on `127.0.0.1:4098`, and validates local PTY support. On an unsupported runtime the spawned Flex child reports `unsupported`; Flex startup is isolated and does not block OpenCode readiness. Before the first enrollment only, the terminal prints a one-time setup code — a random 32-byte value by default, or the operator's own value when `--setup-code` is passed.
|
|
154
|
+
Flex provider accounts are connected from Settings through the provider's supported login flow. Credentials remain in a Flex-owned sealed store and never enter SmartData or the browser. Account model catalogs, quota windows, and runtime availability are exposed as bounded normalized metadata.
|
|
304
155
|
|
|
305
|
-
|
|
156
|
+
An active Flex OpenAI account can also be selected for the controller-owned OpenCode runtime. AGL pauses the exact active OpenCode cohort, replaces the private OpenCode runtime, verifies health, and reopens admission only after the transition is settled.
|
|
306
157
|
|
|
307
|
-
|
|
158
|
+
### Commands And Workspace History
|
|
308
159
|
|
|
309
|
-
|
|
160
|
+
The composer exposes one harness-aware slash-command catalog. OpenCode templates and built-ins remain OpenCode-owned; Flex commands are listed and executed through FlexHarness.
|
|
310
161
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
## CLI
|
|
162
|
+
Flex `/undo` and `/redo` move transcript and workspace history together. For Git-backed projects, AGL captures tracked state and non-ignored untracked paths in controller-private storage without adding controller refs or generated objects to the source repository. Unsupported or ambiguous repository states fail closed or become explicit non-revertible barriers.
|
|
314
163
|
|
|
315
|
-
|
|
316
|
-
agl start [options]
|
|
317
|
-
agl status [--port 4097] [--json]
|
|
318
|
-
agl stop [--port 4097]
|
|
319
|
-
agl upgrade [--port 4097] [--grace-period-seconds 300] [--continue-sessions] [--json]
|
|
320
|
-
agl foreground [options]
|
|
321
|
-
agl temp-password [--port 4097] [--ttl-hours 24]
|
|
322
|
-
agl help
|
|
323
|
-
agl --version
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
Initial runtime options:
|
|
164
|
+
Flex also supports explicit managed worktrees:
|
|
327
165
|
|
|
328
166
|
```text
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
omitted means no implicit project
|
|
333
|
-
--projects-root <path> default base directory: relative project paths and
|
|
334
|
-
initial suggestions resolve here; explicitly typed
|
|
335
|
-
absolute projects may be outside it; fresh installs
|
|
336
|
-
default to the user home and it is immutable afterward
|
|
337
|
-
--public-origin <origin> exact browser WebAuthn origin
|
|
338
|
-
--rp-id <hostname> WebAuthn RP ID
|
|
339
|
-
--behind-tls-proxy declare trusted TLS termination upstream
|
|
340
|
-
--setup-code <code> operator-chosen setup code (see the warning above)
|
|
167
|
+
/worktree create
|
|
168
|
+
/worktree list
|
|
169
|
+
/worktree remove <worktreeId>
|
|
341
170
|
```
|
|
342
171
|
|
|
343
|
-
|
|
172
|
+
Worktrees are never created automatically. Removal refuses a worktree with tracked, untracked, or ignored changes.
|
|
344
173
|
|
|
345
|
-
|
|
174
|
+
### Tasks, Goals, Scratchpads, And Delegation
|
|
346
175
|
|
|
347
|
-
|
|
176
|
+
Flex conversations include session-local tools for structured tasks, the current goal, and durable scratchpad context. These records are generation-fenced so deleted and recreated sessions cannot inherit stale state.
|
|
348
177
|
|
|
349
|
-
|
|
178
|
+
Flex can delegate one level to a general subagent. Child permissions remain visible in the parent conversation, while active and retained child transcripts are available through bounded task cards and a read-only drill-in.
|
|
350
179
|
|
|
351
|
-
###
|
|
180
|
+
### Session Intelligence
|
|
352
181
|
|
|
353
|
-
|
|
182
|
+
Session Intelligence can answer a question about one conversation and, after reading it successfully, inspect related sessions in the same project. It runs in an ephemeral, read-only FlexHarness session with no filesystem, shell, browser, mutation, or delegation tools.
|
|
354
183
|
|
|
355
|
-
|
|
184
|
+
Answers and scratchpad suggestions are bounded and revision-aware. At most four analyses run controller-wide and one per source conversation.
|
|
356
185
|
|
|
357
|
-
##
|
|
186
|
+
## Resources
|
|
358
187
|
|
|
359
|
-
|
|
360
|
-
empty, and only an explicit `--directory` registers an initial project. The
|
|
361
|
-
supervised OpenCode server runs from
|
|
362
|
-
`$AGL_HOME/runtime/opencode/<controller-hash>`, never from a project or the
|
|
363
|
-
invoking shell's CWD for its implicit runtime state. Relative `--directory` and
|
|
364
|
-
`--projects-root` values are resolved against the invoking shell before the
|
|
365
|
-
detached process starts. A stored `projectsRoot` is validated lexically during
|
|
366
|
-
startup and resolved only when a relative project operation needs it, so a
|
|
367
|
-
temporarily unavailable root does not stop the controller. This v23 persisted
|
|
368
|
-
document/home migration revision supersedes the historical v2 automatic-workspace
|
|
369
|
-
registration; the wire protocol remains v22.
|
|
188
|
+
Resources are durable project-scoped capabilities separate from conversations.
|
|
370
189
|
|
|
371
|
-
|
|
190
|
+
### Terminals
|
|
372
191
|
|
|
373
|
-
|
|
192
|
+
A terminal resource runs a real shell in the project directory through the controller's shell-free node-pty integration.
|
|
374
193
|
|
|
375
|
-
|
|
194
|
+
- Closing or reloading the browser does not stop the terminal.
|
|
195
|
+
- Reattaching replays bounded in-memory scrollback.
|
|
196
|
+
- Terminal title, attachment, stopped state, and last exit code are durable.
|
|
197
|
+
- Terminal input, output, and scrollback are never persisted.
|
|
198
|
+
- A terminal can be renamed, stopped, restarted, detached, or retired.
|
|
376
199
|
|
|
377
|
-
|
|
200
|
+
AGL allows at most eight running terminals per project and 32 controller-wide.
|
|
378
201
|
|
|
379
|
-
|
|
202
|
+
### Browsers
|
|
380
203
|
|
|
381
|
-
|
|
204
|
+
A browser resource provides tabs, navigation, viewport control, mouse, keyboard, and text input through a human canvas. Frames use finite authenticated binary streams rather than public URLs or base64 JSON payloads.
|
|
382
205
|
|
|
383
|
-
|
|
206
|
+
When attached to a Flex conversation, the resource can provide permission-gated `navigate`, `snapshot`, `screenshot`, `click`, `fill`, and `press` actions to that exact run. Every channel is bound to the project, resource revision, session, run, actor, and current Flex generation.
|
|
384
207
|
|
|
385
|
-
|
|
208
|
+
## Authentication
|
|
386
209
|
|
|
387
|
-
|
|
210
|
+
AGL creates exactly one passkey credential per controller database. Enrollment is first-wins and there is no weaker online passkey-reset path.
|
|
388
211
|
|
|
389
|
-
|
|
212
|
+
The one-time setup code expires after 30 minutes. Omitting `--setup-code` uses a random 32-byte code. A custom setup code is visible in shell history and weak codes are recoverable by anyone who can read the database, so prefer the generated value.
|
|
390
213
|
|
|
391
|
-
|
|
214
|
+
For temporary or scripted browser access, mint a CLI password:
|
|
392
215
|
|
|
393
|
-
|
|
216
|
+
```sh
|
|
217
|
+
agl temp-password --ttl-hours 2
|
|
218
|
+
```
|
|
394
219
|
|
|
395
|
-
|
|
220
|
+
Temporary passwords expire after at most 24 hours. Only their SHA-256 hashes are stored, and at most eight can be active.
|
|
396
221
|
|
|
397
|
-
|
|
222
|
+
Authentication belongs to one physical TypedSocket connection. Resume tokens are single-use, rotate on resume, remain only in browser session storage, and are invalidated by controller restart.
|
|
398
223
|
|
|
399
|
-
|
|
224
|
+
## CLI
|
|
400
225
|
|
|
401
226
|
```sh
|
|
402
|
-
|
|
403
|
-
agl
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
227
|
+
agl start [options]
|
|
228
|
+
agl status [--port 4097] [--json]
|
|
229
|
+
agl stop [--port 4097]
|
|
230
|
+
agl upgrade [--port 4097] [--registry <url>] [--grace-period-seconds 300] [--continue-sessions] [--json]
|
|
231
|
+
agl foreground [options]
|
|
232
|
+
agl temp-password [--port 4097] [--ttl-hours 24]
|
|
233
|
+
agl help
|
|
234
|
+
agl --version
|
|
407
235
|
```
|
|
408
236
|
|
|
409
|
-
|
|
237
|
+
Important startup options:
|
|
410
238
|
|
|
411
|
-
|
|
239
|
+
```text
|
|
240
|
+
--port <port> Controller port; default 4097
|
|
241
|
+
--opencode-port <port> Private OpenCode port; default 4098
|
|
242
|
+
--directory <path> Register one existing project on this start
|
|
243
|
+
--projects-root <path> Base for relative project paths and suggestions
|
|
244
|
+
--public-origin <origin> Exact browser WebAuthn origin
|
|
245
|
+
--rp-id <hostname> WebAuthn relying-party ID
|
|
246
|
+
--behind-tls-proxy Declare trusted TLS termination upstream
|
|
247
|
+
--setup-code <code> Supply an operator-chosen initial setup code
|
|
248
|
+
```
|
|
412
249
|
|
|
413
|
-
|
|
250
|
+
Runtime configuration is durable and immutable per controller port. Later management commands must use the same `--port`. The `--directory` option is transient and can register another project during a later stopped start.
|
|
414
251
|
|
|
415
|
-
|
|
252
|
+
`stop` verifies the exact package CLI, process, process group, command, port, and process-start fingerprint before signaling anything. AGL never kills processes by name.
|
|
416
253
|
|
|
417
|
-
##
|
|
254
|
+
## Upgrades
|
|
418
255
|
|
|
419
|
-
|
|
256
|
+
Use the active global installation:
|
|
420
257
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
- follow bounded live OpenCode agent-shell output while a tool is running;
|
|
425
|
-
- inspect session-level token metrics when the complete harness history makes them provable;
|
|
426
|
-
- maintain a revisioned session scratchpad and ask Session Intelligence questions when `openai/gpt-5.6-luna` is connected;
|
|
427
|
-
- send text prompts and abort a busy session;
|
|
428
|
-
- display OpenCode and Flex permission requests as first-class UI state;
|
|
429
|
-
- explicitly allow a permission once or reject it;
|
|
430
|
-
- answer OpenCode questions with the advertised options (single- or multi-select) or a free-text answer where the question allows one.
|
|
258
|
+
```sh
|
|
259
|
+
agl upgrade --port 4097
|
|
260
|
+
```
|
|
431
261
|
|
|
432
|
-
|
|
262
|
+
By default, upgrade package commands use pnpm's effective registry configuration. Override it for one durable upgrade transaction when needed:
|
|
433
263
|
|
|
434
|
-
|
|
264
|
+
```sh
|
|
265
|
+
agl upgrade --port 4097 --registry=https://registry.npmjs.org
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
Registry URLs must use HTTPS, except that HTTP is accepted for `localhost`, `127.0.0.1`, and `[::1]`. They cannot contain credentials, query parameters, or fragments. Keep authentication in pnpm configuration rather than command arguments.
|
|
269
|
+
|
|
270
|
+
The upgrade worker:
|
|
435
271
|
|
|
436
|
-
|
|
272
|
+
- Resolves the registry's `latest` version and never downgrades.
|
|
273
|
+
- Pauses the exact active-session cohort before stopping a running controller.
|
|
274
|
+
- Waits for admitted operations and data writers to drain.
|
|
275
|
+
- Installs with the required native build allowances.
|
|
276
|
+
- If the controller was running, restarts the exact target and reopens prompt admission.
|
|
277
|
+
- Preserves its transaction across worker or controller failure.
|
|
437
278
|
|
|
438
|
-
|
|
279
|
+
Use `--continue-sessions` to submit the continuation message to sessions paused for the upgrade. Without it, AGL reopens admission without sending another message.
|
|
439
280
|
|
|
440
|
-
|
|
281
|
+
If a forward-only upgrade worker is lost after target startup or package commit begins, a later fixed AGL installation can adopt exactly one stalled transaction during an explicit `agl upgrade`. Adoption requires a free port, no live worker, controller, Flex child, temporary-password writer, or token-bound metadata, and a compatible installed version. It preserves the original preparation timeline and paused cohort. Do not delete upgrade files, copy transactions between roots, downgrade the package, or bypass recovery with `agl start`.
|
|
441
282
|
|
|
442
|
-
|
|
283
|
+
Upgrade coordination lives under `$AGL_HOME/upgrade`. Private logs live under `$AGL_HOME/logs`.
|
|
443
284
|
|
|
444
|
-
|
|
285
|
+
### Migrating From `hcon`
|
|
445
286
|
|
|
446
|
-
|
|
287
|
+
Starting from `@modelprofile.com/harness-controller@20.0.2`, run the active command twice:
|
|
447
288
|
|
|
448
|
-
|
|
289
|
+
```sh
|
|
290
|
+
hcon upgrade --port 4097
|
|
291
|
+
hcon upgrade --port 4097
|
|
292
|
+
```
|
|
449
293
|
|
|
450
|
-
|
|
294
|
+
The first invocation installs the same-package bridge. The second performs the exact package transition to AGL. Wait for each command to finish and use the controller's configured port. Afterward, use `agl` for all management commands.
|
|
451
295
|
|
|
452
|
-
The
|
|
296
|
+
The historical `hcon` transition uses pnpm's configured registry and does not support `--registry`. Configure pnpm before starting that migration when a specific registry is required.
|
|
453
297
|
|
|
454
|
-
|
|
298
|
+
## AGL Home And Persistence
|
|
455
299
|
|
|
456
|
-
|
|
300
|
+
AGL owns one private root:
|
|
457
301
|
|
|
458
|
-
|
|
302
|
+
- Global installations: `$XDG_CONFIG_HOME/agl`, normally `~/.config/agl`.
|
|
303
|
+
- Repository checkouts: `<checkout>/.nogit/agl`.
|
|
304
|
+
- Explicit override: absolute normalized `AGL_HOME` whose parent already exists.
|
|
459
305
|
|
|
460
|
-
|
|
306
|
+
Important directories include:
|
|
461
307
|
|
|
462
|
-
|
|
308
|
+
- `database` for embedded SmartDB data.
|
|
309
|
+
- `credentials` for sealed Flex provider credentials.
|
|
310
|
+
- `git-reversion` for private captures and managed worktrees.
|
|
311
|
+
- `logs` for controller and upgrade diagnostics.
|
|
312
|
+
- `upgrade` for durable upgrade coordination.
|
|
313
|
+
- `runtime` for private browser, upload, socket, and OpenCode state.
|
|
314
|
+
- `migration` for verified migration journals and retained source records.
|
|
463
315
|
|
|
464
|
-
|
|
316
|
+
Do not move these directories or edit migration and upgrade journals by hand.
|
|
465
317
|
|
|
466
|
-
|
|
318
|
+
SmartData stores runtime configuration, passkey metadata, projects, layouts, model choices, scratchpads, tasks, goals, resources, Flex public projections, provider metadata, and bounded audit events. Prompt text is not written to audit records.
|
|
467
319
|
|
|
468
|
-
|
|
320
|
+
Terminal I/O, active browser views, frame streams, composer drafts and their pending attachment state, active capability leases, and running processes remain memory-only. Once a prompt is submitted, attachment files exist only in private operation directories for the lifetime of that exact harness operation.
|
|
469
321
|
|
|
470
|
-
|
|
322
|
+
Library consumers can resolve the same home contract:
|
|
471
323
|
|
|
472
|
-
|
|
324
|
+
```ts
|
|
325
|
+
import { bindAGLHomeEnvironment, resolveAGLHomePaths } from 'agl';
|
|
473
326
|
|
|
474
|
-
|
|
327
|
+
const paths = resolveAGLHomePaths();
|
|
328
|
+
const childEnvironment = bindAGLHomeEnvironment(process.env, paths);
|
|
329
|
+
```
|
|
475
330
|
|
|
476
|
-
|
|
331
|
+
## Database Configuration
|
|
477
332
|
|
|
478
|
-
|
|
333
|
+
The embedded database requires no separate service. Override its directory with an absolute path:
|
|
479
334
|
|
|
480
|
-
|
|
335
|
+
```sh
|
|
336
|
+
export HARNESS_CONTROLLER_DB_DIR='/private/absolute/path'
|
|
337
|
+
```
|
|
481
338
|
|
|
482
|
-
|
|
339
|
+
To use an external MongoDB-compatible server:
|
|
483
340
|
|
|
484
|
-
|
|
341
|
+
```sh
|
|
342
|
+
export HARNESS_CONTROLLER_MONGO_URL='mongodb://user:password@127.0.0.1:27017'
|
|
343
|
+
export HARNESS_CONTROLLER_MONGO_DB='opencode_controller'
|
|
344
|
+
```
|
|
485
345
|
|
|
486
|
-
|
|
346
|
+
`HARNESS_CONTROLLER_MONGO_DB` defaults to `opencode_controller`.
|
|
487
347
|
|
|
488
|
-
|
|
348
|
+
## Runtime Environment
|
|
489
349
|
|
|
490
|
-
|
|
350
|
+
OpenCode, FlexHarness, and terminal shells receive a minimal allowlisted environment. Controller and database variables, unrelated parent secrets, and generated OpenCode credentials are not inherited. `AGL_HOME` is the intentional exception: AGL forwards its canonical value so controller-owned child processes resolve the same private root.
|
|
491
351
|
|
|
492
|
-
|
|
352
|
+
Delegate additional non-controller variables explicitly when required:
|
|
493
353
|
|
|
494
|
-
|
|
354
|
+
```sh
|
|
355
|
+
export HARNESS_CONTROLLER_FORWARD_ENV='MY_TOOL_CONFIG,MY_CA_FILE'
|
|
356
|
+
```
|
|
495
357
|
|
|
496
|
-
|
|
358
|
+
Flex provider credentials do not use this mechanism. They stay in the sealed provider store. `OPENCODE_AUTH_CONTENT` is always rejected; AGL never reads or edits OpenCode's user-wide `auth.json`.
|
|
497
359
|
|
|
498
|
-
|
|
360
|
+
Credential-free `HTTP_PROXY` and `HTTPS_PROXY` values are forwarded. Proxy URLs containing credentials are not forwarded automatically.
|
|
499
361
|
|
|
500
|
-
|
|
362
|
+
## Remote Browser Access
|
|
501
363
|
|
|
502
|
-
|
|
364
|
+
Remote WebAuthn requires HTTPS. Start AGL behind a trusted TLS reverse proxy:
|
|
503
365
|
|
|
504
|
-
|
|
366
|
+
```sh
|
|
367
|
+
export HARNESS_CONTROLLER_TRUSTED_PROXY_SECRET="$(node -e "console.log(require('node:crypto').randomBytes(32).toString('base64url'))")"
|
|
505
368
|
|
|
506
|
-
|
|
369
|
+
agl start \
|
|
370
|
+
--public-origin https://controller.example.com \
|
|
371
|
+
--rp-id controller.example.com \
|
|
372
|
+
--behind-tls-proxy
|
|
373
|
+
```
|
|
507
374
|
|
|
508
|
-
|
|
375
|
+
The proxy must:
|
|
509
376
|
|
|
510
|
-
|
|
377
|
+
- Remove client-supplied copies of AGL transport headers.
|
|
378
|
+
- Inject the configured secret as `X-Harness-Controller-Proxy-Secret`.
|
|
379
|
+
- Set `X-Forwarded-Proto: https` on WebSocket upgrades.
|
|
380
|
+
- Preserve the exact public Host and Origin.
|
|
381
|
+
- Forward WebSocket upgrades.
|
|
382
|
+
- Restrict direct access to the backend listener.
|
|
511
383
|
|
|
512
|
-
- the
|
|
513
|
-
- setup authority hashes and generations;
|
|
514
|
-
- passkey credentials and compare-and-swap counters;
|
|
515
|
-
- single-use WebAuthn ceremony records with expiry;
|
|
516
|
-
- project-scoped session-only layouts and controller/project/qualified-session model choices, scratchpads, bounded intelligence exchanges, exact Flex project-management records, revisions, and content-clearing tombstones;
|
|
517
|
-
- durable project terminal and browser resources, attachment authorities and revisions, pending transitions, lifecycle state, and terminal stopped metadata;
|
|
518
|
-
- Flex session snapshots, bounded public session/message projections, provider connection metadata, and selected-model metadata;
|
|
519
|
-
- the opaque provider connection selected for the controller-owned OpenCode runtime;
|
|
520
|
-
- bounded, correlated audit events for controller, setup completion, authentication, session, terminal, permission, question, and semantic browser actions. Periodic maintenance prunes toward seven-day and 2,000-record targets, with a 90-day database TTL fallback. Audited operations first persist an `attempted` record before any state transition or managed side effect, then append the terminal outcome. BrowserRuntime supplies the correlated operation identity for navigation, tab, and agent actions; frame acknowledgement, viewport updates, raw input, checkpoints, and transport acceptance do not create audit rows.
|
|
384
|
+
Backend isolation is mandatory. Proxy mode binds the controller to all interfaces, while origin-less loopback CLI management remains intentionally available. Never expose the plain backend port directly.
|
|
521
385
|
|
|
522
|
-
|
|
386
|
+
## Security Boundaries
|
|
523
387
|
|
|
524
|
-
|
|
388
|
+
- Local mode binds the controller to loopback only.
|
|
389
|
+
- The private OpenCode server always remains on loopback and uses a generated per-process password.
|
|
390
|
+
- Application RPC starts only after the exact TypedSocket package-major handshake.
|
|
391
|
+
- Client-managed connection tags are disabled; authentication and routing use server-owned peer state.
|
|
392
|
+
- Setup attempts are globally rate limited before enrollment.
|
|
393
|
+
- Permission auto-accept is an explicit server policy, never an assumption based on an open browser.
|
|
394
|
+
- Questions are never auto-answered.
|
|
395
|
+
- Unknown, malformed, concurrent, or unverifiable lifecycle state fails closed.
|
|
525
396
|
|
|
526
|
-
|
|
397
|
+
The global **auto-accept permissions (yolo)** setting replies once to pending permissions across registered projects and writes those replies to the audit log. Each conversation also has a run-local Ask/Yolo switch. Neither mode creates persistent broad provider grants.
|
|
527
398
|
|
|
528
399
|
## Development
|
|
529
400
|
|
|
401
|
+
Install dependencies and run the project checks:
|
|
402
|
+
|
|
530
403
|
```sh
|
|
531
|
-
pnpm
|
|
404
|
+
pnpm install
|
|
405
|
+
pnpm run build
|
|
532
406
|
pnpm run check:test
|
|
533
407
|
pnpm test
|
|
534
408
|
```
|
|
535
409
|
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
410
|
+
Run the CLI from source:
|
|
411
|
+
|
|
412
|
+
```sh
|
|
413
|
+
node cli.js help
|
|
414
|
+
node cli.js foreground --port 4097
|
|
415
|
+
```
|
|
539
416
|
|
|
540
|
-
The
|
|
417
|
+
The default test suite uses disposable embedded databases. Set `HARNESS_CONTROLLER_TEST_MONGO_URL` to include the external MongoDB integration test.
|
|
541
418
|
|
|
542
419
|
## License and Legal Information
|
|
543
420
|
|
|
544
|
-
This repository contains open-source code licensed under the MIT License. A copy of the license can be found in
|
|
421
|
+
This repository contains open-source code licensed under the MIT License. A copy of the license can be found in [`license.md`](./license.md).
|
|
545
422
|
|
|
546
423
|
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
|
|
547
424
|
|
|
@@ -553,7 +430,7 @@ Use of these trademarks must comply with Task Venture Capital GmbH's Trademark G
|
|
|
553
430
|
|
|
554
431
|
### Company Information
|
|
555
432
|
|
|
556
|
-
Task Venture Capital GmbH
|
|
433
|
+
Task Venture Capital GmbH<br>
|
|
557
434
|
Registered at District Court Bremen HRB 35230 HB, Germany
|
|
558
435
|
|
|
559
436
|
For any legal inquiries or further information, please contact us via email at hello@task.vc.
|