@centillex/desk 0.3.0 → 1.0.0-beta.10

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 CHANGED
@@ -1,52 +1,49 @@
1
1
  # Centillex Desk
2
2
 
3
- Pack. Move. Work.
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
- Pack your workspace, supported settings, and sessions, then move your work
6
- between Claude, Codex, Qoder, and Bob.
7
+ ## Install the harness beta
7
8
 
8
9
  ```sh
9
- npm i -g @centillex/desk
10
- desk --version
10
+ npm install -g @centillex/desk@beta
11
+ desk
11
12
  ```
12
13
 
13
- Supports Linux and macOS on x64 and ARM64. On Windows, install inside WSL using
14
- Linux Node.js and npm. There is no native Windows executable in this release.
15
- Node.js 20 or newer is needed for npm installation. Leave optional dependencies
16
- and install scripts enabled so npm can select and install the native executable.
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 installed `desk` command is a Go binary built with `CGO_ENABLED=0`. SQLite is
19
- embedded using `modernc.org/sqlite`. Running Desk needs no Node.js, external SQLite
20
- library, SQLite CLI, or C toolchain. Install the target AI agent separately.
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
- After stopping your source agent and other project writers:
26
+ ## Enrollment
23
27
 
24
- ```sh
25
- cd /path/to/project
26
- desk pack --from=claude
27
- desk move --to=codex
28
- desk ls
29
- desk ps
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
- Without a pack ID, `move` uses the newest saved pack for the current directory.
39
- Local moves keep the existing project directory when it matches the pack’s
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
- Packs default to `~/.desk/store`; set `DESK_HOME` to use `$DESK_HOME/store`.
38
+ ## Update
46
39
 
47
- Read the [documentation](https://docs.centillex.com/desk/) for supported agents,
48
- capture limits, storage, and native session continuation.
40
+ ```sh
41
+ npm install -g @centillex/desk@beta
42
+ ```
49
43
 
50
- Report bugs and request features in the [public issue tracker](https://github.com/centillex/desk/issues).
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
- Copyright 2026 Centillex Co., Ltd. All rights reserved.
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.3.0",
4
- "description": "Pack your workspace and move work between AI agents.",
3
+ "version": "1.0.0-beta.10",
4
+ "description": "Centillex Desk coding-agent harness",
5
5
  "license": "UNLICENSED",
6
- "homepage": "https://docs.centillex.com/desk/",
7
- "bugs": {
8
- "url": "https://github.com/centillex/desk/issues"
6
+ "homepage": "https://desk.centillex.com",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/centillex/desk-harness.git"
9
10
  },
10
- "bin": {
11
- "desk": "bin/desk"
12
- },
13
- "files": [
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": ">=20"
18
+ "node": ">=22.19.0"
23
19
  },
24
- "os": [
25
- "linux",
26
- "darwin"
27
- ],
28
- "cpu": [
29
- "x64",
30
- "arm64"
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.3.0",
34
- "@centillex/desk-linux-arm64": "0.3.0",
35
- "@centillex/desk-darwin-x64": "0.3.0",
36
- "@centillex/desk-darwin-arm64": "0.3.0"
37
- },
38
- "publishConfig": {
39
- "access": "public",
40
- "registry": "https://registry.npmjs.org/"
29
+ "@centillex/desk-linux-x64": "1.0.0-beta.10",
30
+ "@centillex/desk-linux-arm64": "1.0.0-beta.10",
31
+ "@centillex/desk-darwin-arm64": "1.0.0-beta.10",
32
+ "@centillex/desk-win32-x64": "1.0.0-beta.10"
41
33
  }
42
34
  }
package/bin/desk DELETED
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
- console.error('Desk native binary has not been installed. Enable install scripts and run: npm rebuild -g @centillex/desk');
4
- process.exitCode = 1;
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
- }