@centillex/desk 0.3.0 → 1.0.0-beta.11
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.md +34 -37
- package/THIRD_PARTY_NOTICES.md +109 -0
- package/bin/desk.mjs +42 -0
- package/package.json +23 -31
- package/bin/desk +0 -4
- package/install.cjs +0 -47
package/README.md
CHANGED
|
@@ -1,52 +1,49 @@
|
|
|
1
1
|
# Centillex Desk
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Desk is a terminal coding-agent harness with signed agent self-registration,
|
|
4
|
+
OS-vault-protected installation keys, and browser owner approval through
|
|
5
|
+
https://desk.centillex.com.
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
between Claude, Codex, Qoder, and Bob.
|
|
7
|
+
## Install the harness beta
|
|
7
8
|
|
|
8
9
|
```sh
|
|
9
|
-
npm
|
|
10
|
-
desk
|
|
10
|
+
npm install -g @centillex/desk@beta
|
|
11
|
+
desk
|
|
11
12
|
```
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
Requires Node.js 22.19 or newer for the launcher. Supported releases are Linux
|
|
15
|
+
(glibc) x64/ARM64, macOS ARM64, and Windows x64. macOS Intel and Windows ARM64 are
|
|
16
|
+
not supported release targets. npm installs the matching native platform package,
|
|
17
|
+
including the Desk runtime, identity helper, static assets, documentation, and
|
|
18
|
+
third-party licenses. Go and Bun are **not** required on the user's machine.
|
|
19
|
+
There are no install scripts, first-run downloads, or PATH-based binary fallbacks.
|
|
20
|
+
Do not omit optional dependencies.
|
|
17
21
|
|
|
18
|
-
The
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
The `1.0.0-beta.*` line is the new agent harness, not a command-compatible upgrade
|
|
23
|
+
of the older `0.3.x` Desk CLI. Installing it replaces the global `desk` command.
|
|
24
|
+
Stable `latest` remains separate while the harness is in beta.
|
|
21
25
|
|
|
22
|
-
|
|
26
|
+
## Enrollment
|
|
23
27
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Desk 0.2.6 and later default to compact Git capture: the repository URL, exact
|
|
33
|
-
commit, and local changes. Use `--workspace-format=full` for non-Git directories
|
|
34
|
-
or full snapshots. `--workspace-format=auto` allows full fallback. npm 0.2.5 uses
|
|
35
|
-
full snapshots and does not have these flags. See the
|
|
36
|
-
[pack guide](https://docs.centillex.com/desk/commands/pack/) for requirements.
|
|
28
|
+
In Desk, run `/enroll agent@agent.centillex.com`, enter the owner email and confirm
|
|
29
|
+
consent. Approve the installation under **Agents → Approvals** in your browser.
|
|
30
|
+
The harness reports Connected only after activation and identity proof succeed.
|
|
31
|
+
Linux enrollment requires an unlocked Secret Service vault on the session D-Bus;
|
|
32
|
+
macOS uses Keychain and Windows uses Credential Manager. No plaintext fallback.
|
|
33
|
+
Enrollment is separate from model-provider login and resource authorization.
|
|
37
34
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
source path, preserving current files. All four targets use your normal HOME
|
|
41
|
-
and existing login. Extracted user and assistant messages are restored into
|
|
42
|
-
native session history, then opened with native resume.
|
|
43
|
-
Tool calls, approvals, and reasoning remain archived.
|
|
35
|
+
Use `/enroll status` for a live check and `/enroll cancel` to stop waiting.
|
|
36
|
+
The footer shows the last confirmed enrollment and its local expiry countdown.
|
|
44
37
|
|
|
45
|
-
|
|
38
|
+
## Update
|
|
46
39
|
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
```sh
|
|
41
|
+
npm install -g @centillex/desk@beta
|
|
42
|
+
```
|
|
49
43
|
|
|
50
|
-
|
|
44
|
+
The platform packages and launcher use exactly matching versions. If a platform
|
|
45
|
+
package is missing, reinstall with `--include=optional`. Offline installations
|
|
46
|
+
require the launcher and matching platform tarball from the same release.
|
|
51
47
|
|
|
52
|
-
|
|
48
|
+
First-party license metadata remains `UNLICENSED`, as with the existing Desk npm
|
|
49
|
+
package. Third-party notices and license texts are included in the platform bundle.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Go identity helper
|
|
2
|
+
|
|
3
|
+
The bundled `desk-identity` executable uses the Go runtime and the pinned modules
|
|
4
|
+
in `go.mod`, including go-oidc, go-jose, Cloudflare CIRCL, go-keyring,
|
|
5
|
+
wincred, godbus/dbus, shellescape, github.com/coder/websocket v1.8.14
|
|
6
|
+
(ISC; Copyright (c) 2025 Coder), and golang.org/x packages.
|
|
7
|
+
Their LICENSE/NOTICE files are included under `licenses/go` and
|
|
8
|
+
`licenses/go-modules` in standalone archives. The Desk identity packages are
|
|
9
|
+
first-party code extracted from Centillex Desk; see `identity/REUSE.md` in the source.
|
|
10
|
+
|
|
11
|
+
# pi-web-search
|
|
12
|
+
|
|
13
|
+
Desk bundles pi-web-search 1.6.0 by ttttmr:
|
|
14
|
+
https://github.com/ttttmr/pi-web-search
|
|
15
|
+
|
|
16
|
+
Pinned npm source gitHead: eb72d5553a47fc0803887c5c7e673a32e04fca57.
|
|
17
|
+
The package.json and README declare the MIT license. Neither the npm tarball nor
|
|
18
|
+
that source revision contains a standalone LICENSE/copyright notice; the author
|
|
19
|
+
attribution above and standard declared MIT terms below are retained here. Desk
|
|
20
|
+
transpiles the package at build time, supplies a module-local transport adapter,
|
|
21
|
+
and wraps tool registration. No Pi source is patched.
|
|
22
|
+
|
|
23
|
+
MIT License
|
|
24
|
+
|
|
25
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
26
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
27
|
+
in the Software without restriction, including without limitation the rights
|
|
28
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
29
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
30
|
+
furnished to do so, subject to the following conditions:
|
|
31
|
+
|
|
32
|
+
The above copyright notice and this permission notice shall be included in all
|
|
33
|
+
copies or substantial portions of the Software.
|
|
34
|
+
|
|
35
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
36
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
37
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
38
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
39
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
40
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
41
|
+
SOFTWARE.
|
|
42
|
+
|
|
43
|
+
# Goal and loop references
|
|
44
|
+
|
|
45
|
+
Desk's own goal/loop implementation was developed by studying and adapting
|
|
46
|
+
behavioral/state-machine designs from these MIT-licensed sources. Their packages
|
|
47
|
+
are not installed, imported or bundled. Source-informed work is not described as
|
|
48
|
+
clean-room; the author notices and permission terms are retained here.
|
|
49
|
+
|
|
50
|
+
- pi-codex-goal 0.6.0, fitchmultz/pi-codex-goal,
|
|
51
|
+
ea5b6e86c11ea0ab543953c7cc016837dcb416b7.
|
|
52
|
+
Copyright (c) 2026 Mitch Fultz
|
|
53
|
+
- pi-goal 0.1.7, Michaelliv/pi-goal,
|
|
54
|
+
3f100be5434454d3388755a119d01caca9127c16.
|
|
55
|
+
Copyright (c) 2026 Michael Livshits
|
|
56
|
+
- @narumitw/pi-goal 0.54.8, narumiruna/pi-extensions,
|
|
57
|
+
76f42aeaec16aabc98af2b50ae5261e62e1c7935.
|
|
58
|
+
Copyright (c) 2026 narumiruna
|
|
59
|
+
- @presmihaylov/pi-loop 0.1.0 (Git), presmihaylov/pi-loop,
|
|
60
|
+
48fefd088954b47031eca86a8f5f5d16ec19785e.
|
|
61
|
+
Copyright (c) 2026 Preslav Mihaylov
|
|
62
|
+
|
|
63
|
+
The following terms apply to each reference above:
|
|
64
|
+
|
|
65
|
+
MIT License
|
|
66
|
+
|
|
67
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
68
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
69
|
+
in the Software without restriction, including without limitation the rights
|
|
70
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
71
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
72
|
+
furnished to do so, subject to the following conditions:
|
|
73
|
+
|
|
74
|
+
The above copyright notice and this permission notice shall be included in all
|
|
75
|
+
copies or substantial portions of the Software.
|
|
76
|
+
|
|
77
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
78
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
79
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
80
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
81
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
82
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
83
|
+
SOFTWARE.
|
|
84
|
+
|
|
85
|
+
# Pi
|
|
86
|
+
|
|
87
|
+
Desk uses Pi packages from https://github.com/earendil-works/pi and redistributes their static assets. The upstream license is reproduced below. Other dependencies retain their own licenses in their packages.
|
|
88
|
+
|
|
89
|
+
MIT License
|
|
90
|
+
|
|
91
|
+
Copyright (c) 2025 Mario Zechner
|
|
92
|
+
|
|
93
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
94
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
95
|
+
in the Software without restriction, including without limitation the rights
|
|
96
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
97
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
98
|
+
furnished to do so, subject to the following conditions:
|
|
99
|
+
|
|
100
|
+
The above copyright notice and this permission notice shall be included in all
|
|
101
|
+
copies or substantial portions of the Software.
|
|
102
|
+
|
|
103
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
104
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
105
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
106
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
107
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
108
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
109
|
+
SOFTWARE.
|
package/bin/desk.mjs
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { readFileSync, statSync } from "node:fs";
|
|
4
|
+
import { createRequire } from "node:module";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
6
|
+
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const platform = `${process.platform}-${process.arch}`;
|
|
9
|
+
try {
|
|
10
|
+
const own = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
|
|
11
|
+
const supported = Object.keys(own.optionalDependencies ?? {}).map(name => name.replace(/^@centillex\/desk-/, ""));
|
|
12
|
+
if (!supported.includes(platform)) throw new Error(`Unsupported platform: ${platform}. Supported: ${supported.join(", ")}.`);
|
|
13
|
+
const name = `@centillex/desk-${platform}`;
|
|
14
|
+
let metadata;
|
|
15
|
+
try { metadata = require.resolve(`${name}/package.json`); }
|
|
16
|
+
catch { throw new Error(`Missing ${name}@${own.version}. Reinstall with npm install -g @centillex/desk@${own.version} --include=optional. Linux builds require glibc.`); }
|
|
17
|
+
const pkg = JSON.parse(readFileSync(metadata, "utf8"));
|
|
18
|
+
if (pkg.name !== name || pkg.version !== own.version || pkg.os?.[0] !== process.platform || pkg.cpu?.[0] !== process.arch) throw new Error("The Desk platform package does not match this launcher. Reinstall the matching version.");
|
|
19
|
+
const bundle = join(dirname(metadata), "bundle");
|
|
20
|
+
const build = JSON.parse(readFileSync(join(bundle, "BUILD.json"), "utf8"));
|
|
21
|
+
if (build.version !== own.version || build.platform !== platform.replace("win32-", "windows-") || build.identity?.version !== own.version || build.identity?.protocol !== 2) throw new Error("The Desk bundle and identity helper do not match this launcher.");
|
|
22
|
+
const suffix = process.platform === "win32" ? ".exe" : "";
|
|
23
|
+
const binary = join(bundle, `desk${suffix}`);
|
|
24
|
+
if (!statSync(binary).isFile() || !statSync(join(bundle, `desk-identity${suffix}`)).isFile()) throw new Error("The Desk installation is incomplete.");
|
|
25
|
+
const child = spawn(binary, process.argv.slice(2), { stdio: "inherit", shell: false });
|
|
26
|
+
const handlers = new Map();
|
|
27
|
+
for (const signal of ["SIGINT", "SIGTERM", ...(process.platform === "win32" ? [] : ["SIGHUP"])]) {
|
|
28
|
+
const handler = () => { if (child.exitCode === null && child.signalCode === null) child.kill(signal); };
|
|
29
|
+
handlers.set(signal, handler);
|
|
30
|
+
process.on(signal, handler);
|
|
31
|
+
}
|
|
32
|
+
const cleanup = () => { for (const [signal, handler] of handlers) process.removeListener(signal, handler); };
|
|
33
|
+
child.once("error", () => { cleanup(); console.error("Cannot start Desk. Reinstall the matching platform package; Linux builds require glibc."); process.exitCode = 1; });
|
|
34
|
+
child.once("exit", (code, signal) => {
|
|
35
|
+
cleanup();
|
|
36
|
+
if (signal && process.platform !== "win32") process.kill(process.pid, signal);
|
|
37
|
+
else process.exitCode = code ?? (signal === "SIGINT" ? 130 : 1);
|
|
38
|
+
});
|
|
39
|
+
} catch (error) {
|
|
40
|
+
console.error(`Desk: ${error.message}`);
|
|
41
|
+
process.exitCode = 1;
|
|
42
|
+
}
|
package/package.json
CHANGED
|
@@ -1,42 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@centillex/desk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.0-beta.11",
|
|
4
|
+
"description": "Centillex Desk coding-agent harness",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
|
-
"homepage": "https://
|
|
7
|
-
"
|
|
8
|
-
"
|
|
6
|
+
"homepage": "https://desk.centillex.com",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/centillex/desk-harness.git"
|
|
9
10
|
},
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"bin/desk",
|
|
15
|
-
"install.cjs",
|
|
16
|
-
"README.md"
|
|
17
|
-
],
|
|
18
|
-
"scripts": {
|
|
19
|
-
"postinstall": "node install.cjs"
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public",
|
|
13
|
+
"registry": "https://registry.npmjs.org/",
|
|
14
|
+
"tag": "beta"
|
|
20
15
|
},
|
|
16
|
+
"type": "module",
|
|
21
17
|
"engines": {
|
|
22
|
-
"node": ">=
|
|
18
|
+
"node": ">=22.19.0"
|
|
23
19
|
},
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
"
|
|
30
|
-
"
|
|
20
|
+
"bin": {
|
|
21
|
+
"desk": "bin/desk.mjs"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"bin/desk.mjs",
|
|
25
|
+
"README.md",
|
|
26
|
+
"THIRD_PARTY_NOTICES.md"
|
|
31
27
|
],
|
|
32
28
|
"optionalDependencies": {
|
|
33
|
-
"@centillex/desk-linux-x64": "0.
|
|
34
|
-
"@centillex/desk-linux-arm64": "0.
|
|
35
|
-
"@centillex/desk-darwin-
|
|
36
|
-
"@centillex/desk-
|
|
37
|
-
},
|
|
38
|
-
"publishConfig": {
|
|
39
|
-
"access": "public",
|
|
40
|
-
"registry": "https://registry.npmjs.org/"
|
|
29
|
+
"@centillex/desk-linux-x64": "1.0.0-beta.11",
|
|
30
|
+
"@centillex/desk-linux-arm64": "1.0.0-beta.11",
|
|
31
|
+
"@centillex/desk-darwin-arm64": "1.0.0-beta.11",
|
|
32
|
+
"@centillex/desk-win32-x64": "1.0.0-beta.11"
|
|
41
33
|
}
|
|
42
34
|
}
|
package/bin/desk
DELETED
package/install.cjs
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
const fs = require('node:fs');
|
|
3
|
-
const path = require('node:path');
|
|
4
|
-
const crypto = require('node:crypto');
|
|
5
|
-
const pkg = require('./package.json');
|
|
6
|
-
|
|
7
|
-
function install() {
|
|
8
|
-
const platform = `${process.platform}-${process.arch}`;
|
|
9
|
-
const name = `@centillex/desk-${platform}`;
|
|
10
|
-
if (!Object.hasOwn(pkg.optionalDependencies, name)) {
|
|
11
|
-
throw new Error(`Unsupported platform ${platform}. Use Linux or macOS on x64/ARM64. On Windows, install from a WSL Linux terminal using Linux Node.js and npm.`);
|
|
12
|
-
}
|
|
13
|
-
let manifestPath;
|
|
14
|
-
try {
|
|
15
|
-
manifestPath = require.resolve(`${name}/package.json`);
|
|
16
|
-
} catch {
|
|
17
|
-
throw new Error(`Missing ${name}@${pkg.version}. Reinstall @centillex/desk with optional dependencies enabled (npm install -g @centillex/desk --include=optional).`);
|
|
18
|
-
}
|
|
19
|
-
const native = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
20
|
-
if (native.name !== name || native.version !== pkg.version) {
|
|
21
|
-
throw new Error(`Expected ${name}@${pkg.version}; reinstall @centillex/desk.`);
|
|
22
|
-
}
|
|
23
|
-
const root = path.dirname(manifestPath);
|
|
24
|
-
const source = path.join(root, 'bin', 'desk');
|
|
25
|
-
const data = fs.readFileSync(source);
|
|
26
|
-
const expected = fs.readFileSync(path.join(root, 'desk.sha256'), 'utf8').trim();
|
|
27
|
-
const actual = crypto.createHash('sha256').update(data).digest('hex');
|
|
28
|
-
if (!/^[a-f0-9]{64}$/.test(expected) || expected !== actual) {
|
|
29
|
-
throw new Error(`Binary checksum mismatch for ${name}; reinstall @centillex/desk.`);
|
|
30
|
-
}
|
|
31
|
-
// Replace the installation stub with the real Go executable. No Node launcher
|
|
32
|
-
// or SQLite helper is needed when the user subsequently runs `desk`.
|
|
33
|
-
const destination = path.join(__dirname, 'bin', 'desk');
|
|
34
|
-
const temporary = `${destination}.${process.pid}.tmp`;
|
|
35
|
-
try {
|
|
36
|
-
fs.writeFileSync(temporary, data, { mode: 0o755, flag: 'wx' });
|
|
37
|
-
fs.renameSync(temporary, destination);
|
|
38
|
-
} finally {
|
|
39
|
-
fs.rmSync(temporary, { force: true });
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
try {
|
|
43
|
-
install();
|
|
44
|
-
} catch (error) {
|
|
45
|
-
console.error(`Desk installation failed: ${error.message}`);
|
|
46
|
-
process.exitCode = 1;
|
|
47
|
-
}
|