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 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.11 (native bundle 0.1.11) supports **Windows x64 and Linux x64**
7
- (glibc 2.28+). It opens the familiar TypeScript Work Stack UI by default, which
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 CLI remains a raw
13
- native provider in opted-in Rooms (you approve its trust; its lifecycle/resume
14
- is not verified yet). The unified Rust UI stays
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 in the **unreleased source** add `workbite status [--json]`,
71
- `workbite doctor [--json]` and `workbite recover --dry-run [--json]`. Check your
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 };
@@ -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) : {}) }, home);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workbite",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "WorkBite (Work Stack + StackBite) verified native suite installer and launcher",
5
5
  "license": "UNLICENSED",
6
6
  "engines": {
package/release.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
- "launcherVersion": "0.1.13",
2
+ "launcherVersion": "0.1.15",
3
3
  "platforms": {
4
4
  "windows-x64": {
5
- "asset": "workbite-0.1.13-windows-x64.zip",
6
- "bundleSha256": "61886b62c848d3342580b27eb6ca76acac4bd2c608b67684139434893602d7d1",
7
- "sha256": "061fb2b08470c9f39afc5d109abb2521e4ba137455aaebd75a7b2b1b8ccc36f5",
8
- "size": 97782408,
9
- "url": "https://github.com/Shinick-Han/WorkBite-releases/releases/download/v0.1.13/workbite-0.1.13-windows-x64.zip"
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.13",
16
- "version": "0.1.13"
15
+ "tag": "v0.1.15",
16
+ "version": "0.1.15"
17
17
  }