workbite 0.1.13 → 0.1.15
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 +27 -9
- package/lib/cli.js +2 -1
- package/lib/diagnostics.js +4 -0
- package/lib/install.js +5 -0
- package/lib/runtime.js +22 -3
- package/package.json +1 -1
- package/release.json +8 -8
package/README.md
CHANGED
|
@@ -3,15 +3,20 @@
|
|
|
3
3
|
WorkBite installs and opens **Work Stack** (organizes the work) and
|
|
4
4
|
**StackBite** (gets it moving) as one native suite.
|
|
5
5
|
|
|
6
|
-
Launcher 0.1.
|
|
7
|
-
|
|
6
|
+
Launcher 0.1.15 pins the verified **Windows x64** native bundle. Install it
|
|
7
|
+
with `npm install -g workbite@0.1.15` or use the `windows` dist-tag. The
|
|
8
|
+
`latest` tag remains at 0.1.12 for its earlier Windows/Linux x64 (glibc 2.28+)
|
|
9
|
+
artifacts; no 0.1.15 Linux binary is included. Archive size, SHA-256 and the
|
|
10
|
+
bundle digest are sealed in `release.json` and checked before execution.
|
|
11
|
+
See the [release notes](https://github.com/Shinick-Han/WorkBite-releases/releases/tag/v0.1.15).
|
|
12
|
+
It opens the familiar TypeScript Work Stack UI by default, which
|
|
8
13
|
has one Tasks workbench: switch Focus/Table/Board without losing your selected
|
|
9
14
|
Task, deploy its agent, and control the native terminal beside or below the Tasks.
|
|
10
15
|
Use F6 to move focus, Ctrl+B to hide the sidebar, Alt+Shift+L to switch layouts,
|
|
11
16
|
Alt+Shift+arrows to resize, and Alt+Shift+Z to expand the active pane. Existing
|
|
12
|
-
Runs and Seats remain available while navigating. Cursor
|
|
13
|
-
native
|
|
14
|
-
|
|
17
|
+
Runs and Seats remain available while navigating. Cursor and Grok remain raw
|
|
18
|
+
native providers in opted-in Rooms (you approve their trust; native lifecycle,
|
|
19
|
+
completion and resume remain unsupported/unqualified). The unified Rust UI stays
|
|
15
20
|
an explicit alternative per open: `workbite open --frontend rust` (or bare
|
|
16
21
|
`workbite --frontend rust`). Either frontend reuses the same owner and
|
|
17
22
|
StackBite backend; the choice is not saved. Leaving the view or closing the UI
|
|
@@ -24,7 +29,7 @@ operator handover of existing backend processes; the launcher does not stop
|
|
|
24
29
|
them or clear startup records automatically.
|
|
25
30
|
|
|
26
31
|
```sh
|
|
27
|
-
npm install -g workbite
|
|
32
|
+
npm install -g workbite@0.1.15 # Windows x64
|
|
28
33
|
workbite install
|
|
29
34
|
workbite open --workspace /abs/path/new-folder --init # first time, once
|
|
30
35
|
workbite # afterwards (TypeScript UI)
|
|
@@ -67,9 +72,8 @@ with absolute `WORKBITE_HOME` / `WORKBITE_STATE_DIR`) and never touches
|
|
|
67
72
|
separately installed Work Stack or StackBite apps, their state or ports. It
|
|
68
73
|
never approves provider trust or starts paid agents by itself.
|
|
69
74
|
|
|
70
|
-
Startup diagnostics
|
|
71
|
-
`workbite doctor [--json]` and `workbite recover --dry-run [--json]`.
|
|
72
|
-
installed launcher's `--help` before using them. They inspect evidence and plan
|
|
75
|
+
Startup diagnostics include `workbite status [--json]`,
|
|
76
|
+
`workbite doctor [--json]` and `workbite recover --dry-run [--json]`. They inspect evidence and plan
|
|
73
77
|
only: no process starts/stops, record reset, native intent repair or migration.
|
|
74
78
|
`open --no-ui` does start/reuse the backend stack (including native selection for
|
|
75
79
|
v2) and prints JSON, but never launches or validates the foreground UI. Startup
|
|
@@ -103,5 +107,19 @@ it starts. The `workbite-native` agent skill shipped in this package
|
|
|
103
107
|
(`skills/workbite-native/`) describes the commands, packets and recovery
|
|
104
108
|
rules.
|
|
105
109
|
|
|
110
|
+
Windows 0.1.15 retains the read-only phone companion pilot from 0.1.14.
|
|
111
|
+
Phone actions preserve their selected target during status reads, show pending
|
|
112
|
+
work and reuse the managed Windows helper within actions. Pairing links retain
|
|
113
|
+
their complete URL; QR opening has an explicit Edge alternative. A successful
|
|
114
|
+
system handoff does not establish that a browser or viewer rendered the target. Open Settings
|
|
115
|
+
with `,`, select Phone, enable it, then pair using the expiring QR and compare
|
|
116
|
+
the complete fingerprint before approving on the PC. Remembered browsers can
|
|
117
|
+
reconnect; devices can be revoked. Initial PC enrollment requires an operator
|
|
118
|
+
invitation through the supported embedding/bootstrap surface; this release
|
|
119
|
+
does not include a public invitation-entry UI. The hosted relay needs no user
|
|
120
|
+
domain or Cloudflare client. CurrentUser DPAPI on local NTFS is required.
|
|
121
|
+
Mobile Task writes, deployment, terminal input, replies, notifications and
|
|
122
|
+
background connectivity are not supported. The PC must remain online.
|
|
123
|
+
|
|
106
124
|
This package is `UNLICENSED` (all rights reserved). Third-party licenses ship
|
|
107
125
|
in each bundle's `licenses/` folder.
|
package/lib/cli.js
CHANGED
|
@@ -317,7 +317,8 @@ async function main(argv = process.argv.slice(2), options = {}) {
|
|
|
317
317
|
return { code: 0, signal: null };
|
|
318
318
|
}
|
|
319
319
|
return openSuite({ installed, commands: options.commands, workspace: parsed.workspace, init: parsed.init, ui: parsed.ui,
|
|
320
|
-
frontend: parsed.frontend, stateRoot, environment, spawnImpl: options.spawnImpl, execImpl: options.execImpl, stdout, stderr, timeouts: options.timeouts
|
|
320
|
+
frontend: parsed.frontend, stateRoot, environment, spawnImpl: options.spawnImpl, execImpl: options.execImpl, stdout, stderr, timeouts: options.timeouts,
|
|
321
|
+
mobileBootstrap: options.mobileBootstrap });
|
|
321
322
|
}
|
|
322
323
|
|
|
323
324
|
module.exports = { main, parseArguments, HELP };
|
package/lib/diagnostics.js
CHANGED
|
@@ -200,6 +200,10 @@ async function inspectStartup(options = {}) {
|
|
|
200
200
|
'Install presence is not integrity verification; use workbite check for the existing integrity check.',
|
|
201
201
|
],
|
|
202
202
|
guidance: [NO_DELETE, 'workbite open --no-ui starts or reuses backends only; it does not prove that a terminal UI can open.',
|
|
203
|
+
'doctor/status inspect saved startup records passively. inspection-required means provenance needs review; it is not an authenticated agent admission failure.',
|
|
204
|
+
'workbite agent status ready means authenticated workspace command admission at that observation, not provider readiness, turn completion or Task completion.',
|
|
205
|
+
'To check workspace admission, explicitly run workbite agent status in the intended workspace. To inspect an assigned execution seat, refresh stackbite-room context; compare its current generation and runtime evidence.',
|
|
206
|
+
'Configured provider labels, installed binaries and saved ready records do not verify the running provider or its lifecycle hooks. A Taskless standalone Room is normal; an unassigned seat must wait for assignment.',
|
|
203
207
|
'Inspect the selected record paths and private logs locally with credentials redacted; do not publish raw files.',
|
|
204
208
|
'For native daemon logs, consult log_file and stderr_log_file in the retained native intent locally; untrusted saved paths are not followed here.',
|
|
205
209
|
'For foreign-host records, inspect the recorded host. If ownership remains unknown, retain the state and seek operator review.',
|
package/lib/install.js
CHANGED
|
@@ -105,6 +105,11 @@ async function validateBundle(directory, spec) {
|
|
|
105
105
|
try { bundle = JSON.parse(bundleBytes.toString('utf8')); } catch { fail('bundle.json is not valid JSON'); }
|
|
106
106
|
if (!plainObject(bundle) || !Object.hasOwn(ROSTERS, bundle.schema)) fail('bundle.json identity or executable layout mismatch');
|
|
107
107
|
const executables = expectedExecutables(spec, bundle.schema);
|
|
108
|
+
// Optional reviewed Windows mobile assembly. Older v1/v2 bundles keep their exact roster.
|
|
109
|
+
// A mobile entry is accepted only at this fixed path and receives the same full hash/magic proof.
|
|
110
|
+
if (bundle.schema === BUNDLE_V2 && spec.platform === 'win32' && Object.hasOwn(bundle.executables || {}, 'workbite_mobile')) {
|
|
111
|
+
executables.workbite_mobile = 'workstack/workbite-mobile.exe';
|
|
112
|
+
}
|
|
108
113
|
if (bundle.product !== 'WorkBite'
|
|
109
114
|
|| bundle.version !== spec.version || bundle.target !== spec.target || !plainObject(bundle.components)
|
|
110
115
|
|| !sameKeys(bundle.executables, Object.keys(executables))
|
package/lib/runtime.js
CHANGED
|
@@ -605,14 +605,16 @@ function typescriptExecutionEnvironment(layout, bridge) {
|
|
|
605
605
|
}
|
|
606
606
|
const verifiedPath = value => typeof value === 'string' && path.isAbsolute(value) && !/[\x00-\x1f]/.test(value);
|
|
607
607
|
|
|
608
|
-
function uiEnvironment(base, { executables, layout, endpoint, uid, backendId, execution = null, bridge = null }) {
|
|
608
|
+
function uiEnvironment(base, { executables, layout, endpoint, uid, backendId, execution = null, bridge = null, mobile = null }) {
|
|
609
609
|
const home = path.dirname(executables.stackbite);
|
|
610
610
|
return withPath({ ...base, WORKSTACK_TRANSPORT: 'native', WORKSTACK_NATIVE_CLIENT: executables.workstack_client,
|
|
611
611
|
WORKSTACK_ENDPOINT: endpoint, WORKSTACK_WORKSPACE_UID: uid, WORKSTACK_STATE_DIR: layout.tuiState,
|
|
612
612
|
WORKSTACK_EXECUTION_DOCK_CONFIG: layout.dock, WORKSTACK_EXECUTION_DOCK_BACKEND_ID: backendId,
|
|
613
613
|
WORKSTACK_DEPLOY_JOURNAL_DIR: layout.journal, WORKSTACK_STACKBITE_EXECUTABLE: executables.stackbite,
|
|
614
614
|
...(execution ? { WORKSTACK_TUI_STATE: layout.tuiIntent, WORKSTACK_TUI_SETTINGS: layout.tuiSettings } : {}),
|
|
615
|
-
...(bridge ? typescriptExecutionEnvironment(layout, bridge) : {})
|
|
615
|
+
...(bridge ? typescriptExecutionEnvironment(layout, bridge) : {}),
|
|
616
|
+
...(mobile ? { WORKBITE_MOBILE_EXECUTABLE: executables.workbite_mobile,
|
|
617
|
+
WORKBITE_MOBILE_HOST: JSON.stringify(mobile) } : {}) }, home);
|
|
616
618
|
}
|
|
617
619
|
|
|
618
620
|
function runForeground(command, args, environment, { spawnImpl = spawn, signalSource = process,
|
|
@@ -646,7 +648,7 @@ function runForeground(command, args, environment, { spawnImpl = spawn, signalSo
|
|
|
646
648
|
// commands maps each bundle executable to its argv prefix; tests substitute fixtures.
|
|
647
649
|
async function openSuite({ installed, commands, workspace, init = false, stateRoot, environment = process.env,
|
|
648
650
|
ui = true, frontend = 'typescript', spawnImpl = spawn, execImpl = execFile, platform = process.platform,
|
|
649
|
-
stdout = process.stdout, stderr = process.stderr, timeouts = {}, bootImpl = bootIdentity }) {
|
|
651
|
+
stdout = process.stdout, stderr = process.stderr, timeouts = {}, bootImpl = bootIdentity, mobileBootstrap = undefined }) {
|
|
650
652
|
if (!FRONTENDS.includes(frontend)) fail(`--frontend must be one of: ${FRONTENDS.join(', ')}`);
|
|
651
653
|
if (workspace !== undefined) workspace = checkedWorkspace(workspace);
|
|
652
654
|
else if (init) fail('--init needs --workspace ABS naming the new or empty folder');
|
|
@@ -738,6 +740,23 @@ async function openSuite({ installed, commands, workspace, init = false, stateRo
|
|
|
738
740
|
const environmentForUi = uiEnvironment(base, { executables: installed.executables, layout, endpoint: session.engine.endpoint,
|
|
739
741
|
uid: session.uid, backendId: session.backendId, execution: frontend === 'rust' ? execution : null,
|
|
740
742
|
bridge: bridge && ['enabled', 'initialized'].includes(session.executionUi) ? bridge : null });
|
|
743
|
+
if (frontend === 'typescript' && platform === 'win32' && verifiedPath(installed.executables?.workbite_mobile)) {
|
|
744
|
+
const mobileRoot = path.join(layout.root, 'mobile');
|
|
745
|
+
await stage('private phone state', async () => {
|
|
746
|
+
await safeDirectory(mobileRoot);
|
|
747
|
+
await protectPrivateDirectories([mobileRoot], { platform, environment: base, execImpl: startupExec,
|
|
748
|
+
timeout: finiteTimeout(timeouts.privateState, 60000) });
|
|
749
|
+
});
|
|
750
|
+
environmentForUi.WORKBITE_MOBILE_EXECUTABLE = installed.executables.workbite_mobile;
|
|
751
|
+
environmentForUi.WORKBITE_MOBILE_HOST = JSON.stringify({
|
|
752
|
+
directory: path.join(mobileRoot, workspaceKey(workspace)), executable: installed.executables.workbite_mobile,
|
|
753
|
+
scope: { host_id: session.backendId, workspace_uid: session.uid },
|
|
754
|
+
native: { executable: installed.executables.workstack_client, cwd: workspace, endpoint: session.engine.endpoint,
|
|
755
|
+
workspaceUid: session.uid, deployment: { connection: layout.dock, backendId: session.backendId, journalDir: layout.journal } },
|
|
756
|
+
// Embedding hosts may supply the private operator invitation at first setup; never a token.
|
|
757
|
+
...(mobileBootstrap ? { initialInput: mobileBootstrap } : {}),
|
|
758
|
+
});
|
|
759
|
+
}
|
|
741
760
|
// Exactly one foreground child in this terminal (inherited stdio, never detached or a new console).
|
|
742
761
|
// The TypeScript UI gets the v1 environment (keeping its own familiar settings file) plus, when the
|
|
743
762
|
// v2 opt-in is enabled, only the WORKBITE_EXECUTION_* names above.
|
package/package.json
CHANGED
package/release.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"launcherVersion": "0.1.
|
|
2
|
+
"launcherVersion": "0.1.15",
|
|
3
3
|
"platforms": {
|
|
4
4
|
"windows-x64": {
|
|
5
|
-
"asset": "workbite-0.1.
|
|
6
|
-
"bundleSha256": "
|
|
7
|
-
"sha256": "
|
|
8
|
-
"size":
|
|
9
|
-
"url": "https://github.com/Shinick-Han/WorkBite-releases/releases/download/v0.1.
|
|
5
|
+
"asset": "workbite-0.1.15-windows-x64.zip",
|
|
6
|
+
"bundleSha256": "339663c540f456010a52e47d808528e44e8d5976e278fa8fc8a44b725f9db134",
|
|
7
|
+
"sha256": "e34c3f3cca30b448cdefa0cb567ffb856c0ca058ff46175fdf8140a432a5262e",
|
|
8
|
+
"size": 136162431,
|
|
9
|
+
"url": "https://github.com/Shinick-Han/WorkBite-releases/releases/download/v0.1.15/workbite-0.1.15-windows-x64.zip"
|
|
10
10
|
}
|
|
11
11
|
},
|
|
12
12
|
"product": "WorkBite",
|
|
13
13
|
"repository": "Shinick-Han/WorkBite-releases",
|
|
14
14
|
"schema": "workbite.release.v1",
|
|
15
|
-
"tag": "v0.1.
|
|
16
|
-
"version": "0.1.
|
|
15
|
+
"tag": "v0.1.15",
|
|
16
|
+
"version": "0.1.15"
|
|
17
17
|
}
|