You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(cli): wire runtime, security, ux, protocol and plugin surfaces (#39)
* feat(cli): wire runtime, security, ux, protocol and plugin surfaces
Implement the capability lots from the feature audit across seven areas,
then wire them together so declared surfaces reach a real executor.
Runtime and protocols: server-owned tool results are never re-executed
locally, incomplete streams and unsuccessful terminal events never report
success, sessions are origin-bound with persistent multi-turn JSON-RPC and
event-independent deadlines. MCP gains async stdio plus Streamable HTTP with
OAuth keyring reuse; the app server shares one live-session registry with
independent WebSocket and SSE subscribers and returns 501 for unsupported
compatibility endpoints.
Execution security: one authorization gate covers direct, Batch, child and
plugin paths with exact single-use approvals, workspace confinement,
traversal and symlink checks, final environment filtering, bounded capture
and controlled process-group cancellation. Interactive sessions now honor
--sandbox, --ask-for-approval, --full-auto, --dangerously-bypass and
--add-dir instead of ignoring them, and the TUI and agent executors build an
explicit authorized context. Policy evaluation and process-group termination
run in-process; the Linux sandbox wrapper is the binary itself when no
sibling helper is installed, and an unregistered host still fails closed.
UX and sessions: a shared local store backs persisted new, resume and fork,
durable rename, favorite and protection, JSON and YAML export and import,
and conversation-scoped undo and redo, with unified dispatch across CLI and
TUI. Plugins gain an explicit ABI, activation and packaging contract with a
Node runtime. Platform work aligns the opentelemetry family, corrects release
asset names, and makes installers validate URLs, architecture, checksums and
bounds with staging and rollback.
Config overrides for sandbox mode and writable roots are now applied,
shutdown no longer deletes other sessions' files, and --debug writes a
content-free local journal instead of a full trace dump.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
* ci: provision node for plugin tests and fix bsd version parsing
The distribution matrix added macOS runners, where BSD sed does not accept
the GNU `\s` class, so the workspace version was captured as the whole
`version = "0.1.8"` line and never matched VERSION_CLI. Use a POSIX
character class instead.
Node plugin tests launch a real `node` worker; the test and coverage jobs
had no Node, so eight tests failed on a missing runtime rather than on
behavior. Provision Node 22 in both jobs and in the dev container, and state
the prerequisite in the development guide, instead of skipping the tests.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
* fix(install): install on case-insensitive volumes and drop gnu-only stat
On macOS and Windows the filesystem folds case, so the alias path "cortex"
resolves to the destination "Cortex" itself. The installer read that as a
foreign command already occupying the name and refused to install at all.
Skip alias names that are the destination file, and keep refusing a real
unrelated binary, now covered by a regression test that runs on a
case-insensitive volume plus one that always runs.
The release metadata fixture also used GNU `stat -c%s`, which BSD stat
rejects; `wc -c` is portable.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
* fix(plugins): resolve node before clearing the worker environment
Keep the resolved executable for cleanup and cover custom PATH execution
with a real Node child. Verify installer aliases on case-folding filesystems.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
* fix(tests): resolve node consistently in cli plugin fixtures
Use the runtime resolver when detecting supported Node installations so
custom-PATH builds are not incorrectly expected to fail.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
---------
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Copy file name to clipboardExpand all lines: .github/workflows/publish-r2.yml
+14-7Lines changed: 14 additions & 7 deletions
Original file line number
Diff line number
Diff line change
@@ -129,6 +129,8 @@ jobs:
129
129
EXPECTED_ARTIFACTS=(
130
130
"cortex-cli-linux-x64"
131
131
"cortex-cli-linux-arm64"
132
+
"cortex-cli-linux-x64-static"
133
+
"cortex-cli-linux-arm64-static"
132
134
"cortex-cli-macos-x64"
133
135
"cortex-cli-macos-arm64"
134
136
"cortex-cli-windows-x64"
@@ -152,11 +154,11 @@ jobs:
152
154
run: |
153
155
mkdir -p dist
154
156
155
-
for mapping in linux-x86_64:cortex-cli-linux-x64 linux-aarch64:cortex-cli-linux-arm64 darwin-x86_64:cortex-cli-macos-x64 darwin-aarch64:cortex-cli-macos-arm64; do
157
+
for mapping in linux-x86_64:cortex-cli-linux-x64 linux-aarch64:cortex-cli-linux-arm64 linux-x86_64-musl:cortex-cli-linux-x64-static linux-aarch64-musl:cortex-cli-linux-arm64-static darwin-x86_64:cortex-cli-macos-x64 darwin-aarch64:cortex-cli-macos-arm64; do
156
158
IFS=':' read -r platform artifact <<< "$mapping"
157
159
158
-
ARCHIVE=$(find "artifacts/$artifact" -name "*.tar.gz" | head -1)
159
-
if [ -z "$ARCHIVE" ]; then
160
+
ARCHIVE="artifacts/$artifact/$artifact.tar.gz"
161
+
if [ ! -f "$ARCHIVE" ]; then
160
162
echo "ERROR: No .tar.gz found in artifacts/$artifact"
161
163
ls -la "artifacts/$artifact/"
162
164
exit 1
@@ -171,8 +173,8 @@ jobs:
171
173
for mapping in windows-x86_64:cortex-cli-windows-x64; do
172
174
IFS=':' read -r platform artifact <<< "$mapping"
173
175
174
-
ARCHIVE=$(find "artifacts/$artifact" -name "*.zip" | head -1)
175
-
if [ -z "$ARCHIVE" ]; then
176
+
ARCHIVE="artifacts/$artifact/$artifact.zip"
177
+
if [ ! -f "$ARCHIVE" ]; then
176
178
echo "ERROR: No .zip found in artifacts/$artifact"
0 commit comments