@quantiya/codevibe-codex-plugin 2.0.116 → 2.0.118

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.
@@ -13,6 +13,16 @@ export declare function isSlashCommandInProgress(value: string): boolean;
13
13
  * dropdown). A bare `/` returns the whole list.
14
14
  */
15
15
  export declare function filterSlashSuggestions(value: string, commands: SlashCommandInfo[]): SlashCommandInfo[];
16
+ /**
17
+ * True when Enter should RUN the input instead of completing it: the value is
18
+ * already exactly the highlighted slash command (`/exit` with `/exit`
19
+ * highlighted). A partial (`/ex`) or a highlight the user moved to another
20
+ * command still completes (Hendry 2026-11-12: a fully typed command must not
21
+ * need a second Enter).
22
+ */
23
+ export declare function enterRunsTypedCommand(value: string, suggestions: ReadonlyArray<{
24
+ name: string;
25
+ }>, highlight: number): boolean;
16
26
  /**
17
27
  * Builds a single dropdown row as ONE physical line (≤ `maxCols`) so it can
18
28
  * never wrap and inflate the dropdown's row count on a narrow terminal
@@ -1,4 +1,5 @@
1
1
  import { SpawnConfinementUnavailable } from '../local-executor/types';
2
+ import { type SecretServiceResult } from './secret-service-client';
2
3
  /** The closed advisory-cell notice (closed set member 6; byte-identical in both apps). */
3
4
  export declare const AGY_SIGN_IN_NOTICE = "No answer \u2014 Antigravity isn't signed in. Run `agy` once in a terminal to sign in.";
4
5
  /** The task-halt / review-seat reason. */
@@ -16,9 +17,9 @@ export declare class AgentSignInUnavailable extends SpawnConfinementUnavailable
16
17
  readonly why: AgySignInWhy;
17
18
  constructor(why: AgySignInWhy);
18
19
  }
19
- export type AgySignInWhy = 'not-signed-in' | 'keychain-absent' | 'keychain-timeout' | 'keychain-error' | 'keychain-invalid';
20
+ export type AgySignInWhy = 'not-signed-in' | 'keychain-absent' | 'keychain-timeout' | 'keychain-error' | 'keychain-invalid' | 'keychain-locked';
20
21
  export type AgySignIn = {
21
- source: 'file' | 'keychain';
22
+ source: 'file' | 'keychain' | 'secret-service';
22
23
  data: Buffer;
23
24
  } | {
24
25
  source: 'none';
@@ -29,20 +30,29 @@ export interface AgySignInDeps {
29
30
  env?: NodeJS.ProcessEnv;
30
31
  securityBin?: string;
31
32
  timeoutMs?: number;
33
+ /** Linux: read one Secret Service item (default: secret-service-client.ts). */
34
+ secretService?: (attributes: Record<string, string>) => Promise<SecretServiceResult>;
35
+ /** Linux: running under WSL (default: /proc/version names Microsoft, as bwrap.ts does). */
36
+ isWsl?: boolean;
37
+ /** Linux: read /proc/version (test seam for the default WSL check). */
38
+ procVersion?: () => string;
32
39
  }
33
40
  /** The decoded sign-in JSON is usable when `token` holds non-empty string `access_token` and `refresh_token`. */
34
41
  export declare function validAgySignInJson(data: Buffer): boolean;
35
42
  /** go-keyring's stored form → the decoded JSON bytes, or null unless prefix, canonical base64 and JSON all check. */
36
43
  export declare function decodeKeychainValue(value: string): Buffer | null;
37
- /** The sign-in for an agy spawn: a valid token file, else (macOS) the Keychain item, else none. Never logs values. */
44
+ /**
45
+ * The sign-in for an agy spawn: a valid token file, else the macOS Keychain item or (native Linux) the unlocked Secret
46
+ * Service item, else none. Never logs values.
47
+ */
38
48
  export declare function readAgySignIn(hostAgyDir: string, deps?: AgySignInDeps): Promise<AgySignIn>;
39
49
  /**
40
- * Seed `<destAgyDir>/antigravity-oauth-token` for one spawn. macOS: exclusive, no-follow, 0600, re-hashed; throws
41
- * AgentSignInUnavailable when there is no usable sign-in. Elsewhere: the pre-FU-A copy (`legacyCopy`). Returns the source
42
- * and a short digest for the log, never the value.
50
+ * Seed `<destAgyDir>/antigravity-oauth-token` for one spawn. macOS and native Linux: exclusive, no-follow, 0600,
51
+ * re-hashed; throws AgentSignInUnavailable when there is no usable sign-in. Elsewhere: the pre-FU-A copy (`legacyCopy`).
52
+ * Returns the source and a short digest for the log, never the value.
43
53
  */
44
54
  export declare function seedAgySignIn(hostAgyDir: string, destAgyDir: string, deps?: AgySignInDeps): Promise<{
45
- source: 'file' | 'keychain' | 'legacy-copy' | 'none';
55
+ source: 'file' | 'keychain' | 'secret-service' | 'legacy-copy' | 'none';
46
56
  bytes: number;
47
57
  sha256: string;
48
58
  }>;
@@ -0,0 +1,78 @@
1
+ import * as net from 'node:net';
2
+ export type SecretServiceResult = {
3
+ kind: 'secret';
4
+ data: Buffer;
5
+ } | {
6
+ kind: 'none';
7
+ why: 'not-signed-in' | 'keychain-locked';
8
+ } | {
9
+ kind: 'error';
10
+ why: 'keychain-error' | 'keychain-timeout' | 'keychain-invalid';
11
+ };
12
+ export interface SecretServiceOptions {
13
+ env?: NodeJS.ProcessEnv;
14
+ uid?: number;
15
+ timeoutMs?: number;
16
+ /** Test seam: open the bus connection (default: net.createConnection on the parsed address). */
17
+ connect?: (socketPath: string) => net.Socket;
18
+ /** Test seam: is this a socket owned by `uid`? (default: lstat). */
19
+ isOwnSocket?: (p: string, uid: number) => boolean;
20
+ }
21
+ export declare const MAX_SECRET_BYTES = 65536;
22
+ /** The session bus socket path from DBUS_SESSION_BUS_ADDRESS (first unix: entry; abstract → '\0' + name), else null. */
23
+ export declare function sessionBusSocket(env: NodeJS.ProcessEnv, uid: number, isOwnSocket: (p: string, uid: number) => boolean): string | null;
24
+ export declare class DBusWriter {
25
+ private buf;
26
+ len: number;
27
+ private ensure;
28
+ align(n: number): void;
29
+ y(v: number): void;
30
+ u(v: number): void;
31
+ s(v: string): void;
32
+ o(v: string): void;
33
+ g(v: string): void;
34
+ /** An array whose elements align to `elemAlign`; the length excludes the padding before the first element. */
35
+ a(elemAlign: number, fill: () => void): void;
36
+ done(): Buffer;
37
+ }
38
+ export type DBusValue = number | boolean | string | Buffer | DBusValue[] | {
39
+ sig: string;
40
+ value: DBusValue;
41
+ };
42
+ /**
43
+ * Split a signature into its complete types. Strict, so every accepted type consumes bytes when read: no empty struct,
44
+ * a dict entry only directly inside an array, with exactly two members and a basic-type key.
45
+ */
46
+ export declare function splitSignature(sig: string): string[];
47
+ export declare class DBusReader {
48
+ private readonly b;
49
+ off: number;
50
+ private readonly le;
51
+ constructor(b: Buffer, off: number, le: boolean);
52
+ align(n: number): void;
53
+ private need;
54
+ u32(): number;
55
+ str(len: number): string;
56
+ read(t: string): DBusValue;
57
+ }
58
+ export interface DBusMessage {
59
+ type: number;
60
+ serial: number;
61
+ replySerial?: number;
62
+ errorName?: string;
63
+ member?: string;
64
+ signature: string;
65
+ body: DBusValue[];
66
+ }
67
+ /** One METHOD_CALL; `body` is written by `fill` after the header (aligned to 8). */
68
+ export declare function methodCall(serial: number, dest: string, path: string, iface: string, member: string, signature: string, fill?: (w: DBusWriter) => void): Buffer;
69
+ /**
70
+ * Parse one complete message at the start of `b`; null when more bytes are needed. Throws on malformed input. The body is
71
+ * parsed only when `wantBody(header)` says so (default: always) — unsolicited traffic is skipped by its declared size.
72
+ */
73
+ export declare function parseMessage(b: Buffer, wantBody?: (m: DBusMessage) => boolean): {
74
+ msg: DBusMessage;
75
+ size: number;
76
+ } | null;
77
+ /** The first unlocked item matching `attributes`, read through a plain session. Never calls Unlock or Prompt. */
78
+ export declare function readSecretServiceItem(attributes: Record<string, string>, opts?: SecretServiceOptions): Promise<SecretServiceResult>;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quantiya/codevibe-core",
3
- "version": "2.0.100",
3
+ "version": "2.0.102",
4
4
  "description": "Core library for CodeVibe plugins - shared keychain, crypto, AppSync, and auth functionality",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quantiya/codevibe-codex-plugin",
3
- "version": "2.0.116",
3
+ "version": "2.0.118",
4
4
  "description": "Control OpenAI Codex CLI from your iPhone and Android — real-time sync, approve file edits, send prompts by voice. Part of CodeVibe.",
5
5
  "main": "dist/server.js",
6
6
  "codevibe": {
@@ -47,7 +47,7 @@
47
47
  "node": ">=22.0.0"
48
48
  },
49
49
  "dependencies": {
50
- "@quantiya/codevibe-core": "^2.0.100",
50
+ "@quantiya/codevibe-core": "^2.0.102",
51
51
  "@quantiya/quorum-core": "^1.0.1",
52
52
  "chokidar": "^4.0.0",
53
53
  "dotenv": "^16.6.1",