@quantiya/codevibe-claude-plugin 2.0.101 → 2.0.103

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.
Files changed (31) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/dist/server.js +18 -18
  3. package/node_modules/@quantiya/codevibe-core/dist/appsync/sync-mobile-echo.d.ts +12 -12
  4. package/node_modules/@quantiya/codevibe-core/dist/appsync/sync-shell-source.d.ts +14 -14
  5. package/node_modules/@quantiya/codevibe-core/dist/index.d.ts +1 -0
  6. package/node_modules/@quantiya/codevibe-core/dist/index.js +676 -653
  7. package/node_modules/@quantiya/codevibe-core/dist/local-executor/binary-classifier.d.ts +8 -0
  8. package/node_modules/@quantiya/codevibe-core/dist/local-executor/blob-store.d.ts +5 -0
  9. package/node_modules/@quantiya/codevibe-core/dist/local-executor/change-manifest.d.ts +5 -0
  10. package/node_modules/@quantiya/codevibe-core/dist/local-executor/local-executor-impl.d.ts +3 -0
  11. package/node_modules/@quantiya/codevibe-core/dist/local-executor/media-metadata.d.ts +16 -0
  12. package/node_modules/@quantiya/codevibe-core/dist/local-executor/shadow-protocol.d.ts +22 -0
  13. package/node_modules/@quantiya/codevibe-core/dist/local-executor/shadow-slice3-cleanups.d.ts +15 -0
  14. package/node_modules/@quantiya/codevibe-core/dist/local-executor/snapshot-merge.d.ts +4 -0
  15. package/node_modules/@quantiya/codevibe-core/dist/local-executor/task-group-types.d.ts +3 -1
  16. package/node_modules/@quantiya/codevibe-core/dist/local-executor/team-media-approval.d.ts +78 -0
  17. package/node_modules/@quantiya/codevibe-core/dist/local-executor/withheld-media.d.ts +14 -0
  18. package/node_modules/@quantiya/codevibe-core/dist/local-executor/workspace-shadow.d.ts +11 -6
  19. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/agent-turn-degrade.d.ts +14 -0
  20. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/binary-retry-brief.d.ts +8 -0
  21. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/brainstorm-quorum.d.ts +3 -1
  22. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/cli.js +4779 -2122
  23. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/engine-projection.d.ts +9 -0
  24. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/media-approval.d.ts +112 -0
  25. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/quorum-loop.d.ts +3 -0
  26. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/review-bundle.d.ts +40 -0
  27. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/review-receipts.d.ts +22 -1
  28. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/types.d.ts +6 -0
  29. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/types.d.ts +12 -12
  30. package/node_modules/@quantiya/codevibe-core/package.json +1 -1
  31. package/package.json +2 -2
@@ -1,3 +1,4 @@
1
+ import type { StoredFileClass } from '../local-executor/binary-classifier';
1
2
  import { type ShadowChangeKind } from '../local-executor/shadow-protocol';
2
3
  export declare const PROJECTION_BUDGET_BYTES: number;
3
4
  export declare const PROJECTION_INLINE_MAX_BYTES: number;
@@ -22,7 +23,14 @@ export interface ProjectionFile {
22
23
  * SHA-256 names, so a file listed by its identity line alone is never read or diffed.
23
24
  */
24
25
  readExcerpt(maxBytes: number): Promise<string>;
26
+ /**
27
+ * P63 Slice 3 (§8.6): a binary new version's class label. Such a file is sent as its identity line alone —
28
+ * `[codevibe-blob v1] <class>; <size> bytes; sha256 <hex>; review bundle: after/<path>` — and never read.
29
+ */
30
+ blobClass?: string;
25
31
  }
32
+ /** The INDEX's class column and the blob identity line's `<class>` (§10.1). */
33
+ export declare function classLabel(cls: StoredFileClass | undefined): string;
26
34
  export interface ProjectedFile {
27
35
  path: string;
28
36
  change_kind: ShadowChangeKind;
@@ -86,6 +94,7 @@ export declare function projectionFileFromCapture(file: {
86
94
  blob: string;
87
95
  size: number;
88
96
  };
97
+ file_class?: StoredFileClass;
89
98
  },
90
99
  /** The pre-task text when the real file still matches its recorded base hash; null otherwise (S2-5). */
91
100
  readBase: () => Promise<string | null>,
@@ -0,0 +1,112 @@
1
+ import type { ShadowDiffFile } from '../local-executor/shadow-protocol';
2
+ import type { WithheldMediaChange } from '../local-executor/withheld-media';
3
+ import type { OrchestrationAction, OrchestrationState } from './types';
4
+ import type { WorkspaceOutcomeSink } from './workspace-terminal-coordinator';
5
+ /** The pending kind: the media question for one subject (a task id, or `group:<taskGroupId>`). */
6
+ export interface MediaApprovalState {
7
+ taskId: string;
8
+ }
9
+ /** At most this many files are named in the question; the rest are counted (S1R1-N5). */
10
+ export declare const MEDIA_QUESTION_MAX_FILES = 5;
11
+ /** "320 KB", "312 MB", "1.4 GB" (decimal units, as the phone and Finder show them). */
12
+ export declare function humanBytes(bytes: number): string;
13
+ /**
14
+ * The question asked before a reviewed change with media is applied, e.g. "Task #2 changes 2 media files: `intro.mp4`
15
+ * (video, 312 MB, 1:04), `clip.m4a` (audio, 320 KB, 0:45). Apply all changes? Reply yes to apply or no to keep your
16
+ * originals." Beyond `MEDIA_QUESTION_MAX_FILES` files the rest are counted with their total size. A team's question
17
+ * names the team ("Team #2 changes …"), matching its decline notice.
18
+ */
19
+ export declare function mediaApprovalQuestion(taskLabel: string, files: ReadonlyArray<{
20
+ path: string;
21
+ change_kind: string;
22
+ label: string;
23
+ size: number | null;
24
+ duration: string | null;
25
+ }>, subject?: 'Task' | 'Team'): string;
26
+ /** The question for a list of withheld changes. */
27
+ export declare function questionFor(label: string, withheld: readonly WithheldMediaChange[], subject?: 'Task' | 'Team'): string;
28
+ /** What the gate needs from its loop. */
29
+ export interface MediaApprovalHost {
30
+ /** The reviewed change (the durable record first, S1R1-N2). */
31
+ reviewed(taskId: string): Promise<readonly ShadowDiffFile[] | undefined>;
32
+ shadow(taskId: string): {
33
+ withheldMediaChanges(files: readonly ShadowDiffFile[]): Promise<WithheldMediaChange[]>;
34
+ } | undefined;
35
+ /** A team track: its bundle is published at once; the group asks before the merged result is applied. */
36
+ isTeamTrack(taskId: string): boolean;
37
+ label(taskId: string): string;
38
+ /** A team's label (its tracks' shared prefix, e.g. "#2" for "#2.1"), or a short id. */
39
+ groupLabel(taskGroupId: string): string;
40
+ promote(taskId: string): Promise<void>;
41
+ discard(taskId: string): Promise<void>;
42
+ halt(text: string): void;
43
+ /** The workspace-outcome record of a task authorized through a user decision (S1R1-F3); read at answer time. */
44
+ outcomeSink(): Pick<WorkspaceOutcomeSink, 'hasTaskResolution' | 'reserveTask' | 'completeTask'> | undefined;
45
+ }
46
+ export declare class MediaApprovalGate {
47
+ private readonly host;
48
+ private asker?;
49
+ private readonly phase;
50
+ private readonly onAnswer;
51
+ constructor(host: MediaApprovalHost);
52
+ /** Install the shell's question asker (it shows the question on the desktop and sends it to the phone, SF-7). */
53
+ setAsker(asker: ((subject: string, question: string) => void) | undefined): void;
54
+ /** The question for `subject` is open (asked and not yet answered). */
55
+ isAsked(subject: string): boolean;
56
+ /** Open a question; `false` when no surface can ask it (the caller fails closed). */
57
+ private open;
58
+ /**
59
+ * The TaskAuthorized promotion. A reviewed change with media is not applied until the user answers; nothing waits on
60
+ * the answer (it arrives as a reply). An interrupted apply replayed at start is not asked again: its apply had begun.
61
+ */
62
+ promoteOnTaskAuthorized(taskId: string): Promise<void>;
63
+ /** A notice about a team's media question, shown like the gate's own messages (desktop terminal and phone). */
64
+ notice(text: string): void;
65
+ /**
66
+ * A team group's question, asked once before its merged result is applied. Resolves `true` only on "yes"; `false` on
67
+ * any other answer, or at once when no surface can ask (the merge then applies nothing).
68
+ */
69
+ askForGroup(taskGroupId: string, label: string, withheld: readonly WithheldMediaChange[]): Promise<boolean>;
70
+ /** The local executor's team question: label it, and say so when the answer keeps the user's originals. */
71
+ askForTeam(taskGroupId: string, withheld: readonly WithheldMediaChange[]): Promise<boolean>;
72
+ /** The answer: yes applies the whole reviewed change; anything else applies nothing. A closed question does nothing. */
73
+ resolve(subject: string, approved: boolean): Promise<void>;
74
+ }
75
+ /** The gate of one loop, made on first use (the loop holds no field for it). */
76
+ /** "#2.1" → "#2": a team is labelled by its tracks' shared prefix. */
77
+ /** A team's label (`#N`) from the briefs of its member tasks; the group id's prefix when none is active. */
78
+ export declare function groupLabelFor(briefs: ReadonlyMap<string, {
79
+ taskGroupId: string;
80
+ }>, labelFor: (taskId: string) => string, taskGroupId: string): string;
81
+ export declare function teamLabelFrom(trackLabel: string): string;
82
+ export declare function mediaApprovalGateFor(owner: object, host: () => MediaApprovalHost): MediaApprovalGate;
83
+ /** The shell store as the asker uses it. */
84
+ export interface MediaQuestionStore {
85
+ getState(): Pick<OrchestrationState, 'pendingClarification'>;
86
+ dispatch(action: OrchestrationAction): void;
87
+ subscribe(listener: (state: OrchestrationState) => void): () => void;
88
+ }
89
+ /**
90
+ * S1R2-F1 — a mention turn (`@agent …`, `@all`) that arrives while the media question holds the pending slot is a fresh
91
+ * request, not an answer: the question is set aside BEFORE the turn's attachment ingest and routing (so the turn sees no
92
+ * pending, no seeded images), and is asked again only when the turn has finished (call the returned release in the
93
+ * turn's `finally`). Returns null when there is nothing to set aside.
94
+ */
95
+ export declare function setMediaQuestionAside(store: MediaQuestionStore, text: string): (() => void) | null;
96
+ /**
97
+ * Shows one media question at a time in the shell's pending slot. The question is raised outside any user turn, so the
98
+ * turn mirror never carries it to the phone (SF-7): `toPhone` sends it there each time it is shown — not while it
99
+ * waits behind another question, when a reply would answer that other question instead.
100
+ */
101
+ export declare function installMediaApprovalAsker(gate: MediaApprovalGate | undefined, store: MediaQuestionStore, toPhone?: (text: string) => void): () => void;
102
+ /**
103
+ * The shell side: the reply never reaches the planner; an affirmative reply applies, anything else applies nothing.
104
+ * The answer is taken (the subject leaves `asked`) BEFORE the pending slot is cleared, so the asker never mistakes an
105
+ * answered question for a lost one.
106
+ */
107
+ export declare function handleMediaApprovalReply(args: {
108
+ gate: Pick<MediaApprovalGate, 'resolve'> | undefined;
109
+ taskId: string;
110
+ affirmative: boolean;
111
+ dispatch: (action: OrchestrationAction) => void;
112
+ }): Promise<void>;
@@ -7,6 +7,7 @@ import type { LocalExecutor } from '../local-executor';
7
7
  import type { ClassBInbound, QueuedWorkEndedPayload } from '../local-executor/types';
8
8
  import type { ImageAttachment } from './types';
9
9
  import { type TaskAuditSummaryModel, type ReviewHistorySnapshot, type UserDecisionRecord } from './audit-summary';
10
+ import { type MediaApprovalGate } from './media-approval';
10
11
  import type { DecryptedReviewSummaryInput } from './gate-prompts';
11
12
  import type { ShellEventEmit, ShellEventEmitResult } from './emit-shell-event';
12
13
  import { type ImplementorMode } from '../local-executor/implementor-argv';
@@ -1645,6 +1646,8 @@ export declare class QuorumLoop {
1645
1646
  setTaskOrdinalSink(sink: TaskOrdinalSink | undefined): void;
1646
1647
  /** P46a C3 — install the desktop-local apply-conflict menu sink. */
1647
1648
  setApplyConflictSink(sink: ((menu: ApplyConflictMenu) => void) | undefined): void;
1649
+ /** P63 Slice 3 §9.5 — this loop's media-approval gate (media-approval.ts): TaskAuthorized promotes through it. */
1650
+ mediaApproval(): MediaApprovalGate;
1648
1651
  /** P46a C2 — install the retry-started notifier (the shell records the lifecycle row). */
1649
1652
  setRetryStartedSink(sink: ((info: {
1650
1653
  taskId: string;
@@ -1,6 +1,9 @@
1
1
  import { type BlobStore } from '../local-executor/blob-store';
2
+ import type { StoredFileClass } from '../local-executor/binary-classifier';
2
3
  import type { BlobRef } from '../local-executor/change-manifest';
3
4
  import { type ShadowChangeKind } from '../local-executor/shadow-protocol';
5
+ import { classLabel } from './engine-projection';
6
+ export { classLabel };
4
7
  export interface ReviewBundleFile {
5
8
  path: string;
6
9
  change_kind: ShadowChangeKind;
@@ -28,6 +31,30 @@ export interface ReviewBundleFile {
28
31
  size: number | null;
29
32
  changed: boolean;
30
33
  };
34
+ /** Slice 3 (§10.1): the new version's class when it is not text (absent: text). */
35
+ afterClass?: StoredFileClass;
36
+ /** Slice 3 (§10.1): the user's version's class when it is not text (absent: text). */
37
+ beforeClass?: StoredFileClass;
38
+ }
39
+ /** How the bundle presented a change (§10.1): text diffed, Office extracted, a file to open, or withheld. */
40
+ export type ReviewEntryKind = 'text' | 'office' | 'view' | 'withheld';
41
+ export interface ReviewBundleEntry {
42
+ path: string;
43
+ change_kind: ShadowChangeKind;
44
+ kind: ReviewEntryKind;
45
+ /** Withheld (§8.1, §9.5): what the INDEX and the phone question say about it; its bytes are not in the bundle. */
46
+ withheld?: {
47
+ label: string;
48
+ size: number;
49
+ sha256: string;
50
+ container: string;
51
+ durationSeconds: number | null;
52
+ };
53
+ /** Office (§8.4): whether the extracted text changed, and the changed parts marked "no text change". */
54
+ office?: {
55
+ textChanged: boolean;
56
+ noTextParts: string[];
57
+ };
31
58
  }
32
59
  /** §5.7 / §7.4 — what the INDEX lists besides the changed files (R1-F6). */
33
60
  export interface ReviewIndexContext {
@@ -55,7 +82,20 @@ export interface ReviewBundleRecord {
55
82
  sha256: string;
56
83
  size: number;
57
84
  }>;
85
+ /** Slice 3: how each change was presented (receipts and the media question read this). */
86
+ entries?: ReviewBundleEntry[];
58
87
  }
88
+ /**
89
+ * §8.2 (S2R1-F1) — the masked-original grant for a macOS reviewer: the original folder with a literal deny for every changed
90
+ * file whose bytes the bundle withholds, whatever its name. Fails closed to the bundle only (no original) when the record
91
+ * does not say how each change was presented or when the withheld files exceed the literal cap.
92
+ */
93
+ export declare function maskedOriginalGrant(record: ReviewBundleRecord, dir: string): {
94
+ maskedOriginal: {
95
+ dir: string;
96
+ changedWithheld: readonly string[];
97
+ };
98
+ } | Record<string, never>;
59
99
  /** Build the bundle. `bundleDir` must not exist; its parent must. Returns the hash record to re-check on return. */
60
100
  export declare function buildReviewBundle(input: {
61
101
  bundleDir: string;
@@ -19,10 +19,31 @@ export interface ReceiptFile {
19
19
  sha256: string;
20
20
  hasAfter: boolean;
21
21
  hasBefore: boolean;
22
+ /** Slice 3 (§8.4): how the bundle presented the change (absent: text). */
23
+ entryKind?: 'text' | 'office' | 'view' | 'withheld';
24
+ /** Office: whether the extracted text changed, and the changed parts marked "no text change". */
25
+ office?: {
26
+ textChanged: boolean;
27
+ noTextParts: readonly string[];
28
+ };
22
29
  }
30
+ /** Slice 3 (§8.4): a receipt file's entry kind and Office facts, from the bundle record's entry for `filePath`. */
31
+ export declare function receiptEntryFields(entries: ReadonlyArray<{
32
+ path: string;
33
+ kind: NonNullable<ReceiptFile['entryKind']>;
34
+ office?: {
35
+ textChanged: boolean;
36
+ noTextParts: string[];
37
+ };
38
+ }> | undefined, filePath: string): Pick<ReceiptFile, 'entryKind' | 'office'>;
23
39
  export interface ReceiptRequest {
24
40
  id: string;
25
- kind: 'line' | 'index';
41
+ /**
42
+ * line: a changed line, exact (whitespace-normalised); index: the INDEX row's SHA-256 prefix; parts (Slice 3, Office):
43
+ * every changed part marked "no text change", each named; describe (Slice 3, image/PDF): a one-line description,
44
+ * presence only — not machine-checkable (§8.4).
45
+ */
46
+ kind: 'line' | 'index' | 'parts' | 'describe';
26
47
  /** Bundle-relative file the request names (`after/<p>`, `before/<p>` or `INDEX.md`). */
27
48
  file: string;
28
49
  /** 1-based line number (kind `line`). */
@@ -485,6 +485,9 @@ export interface TaskStartConfirmationState {
485
485
  singleFallbackBrief?: string;
486
486
  };
487
487
  }
488
+ /** P63 Slice 3 §9.5 — the media question's pending kind (media-approval.ts). */
489
+ import type { MediaApprovalState } from './media-approval';
490
+ export type { MediaApprovalState };
488
491
  /**
489
492
  * P63 §6.4 — a START refused because its implementor cannot be confined on this machine. The question offers to run
490
493
  * it unconfined THIS ONCE; only an affirmative reply re-issues exactly these start arguments with `allowUnconfined`.
@@ -537,6 +540,8 @@ export interface PendingClarification {
537
540
  startConfirmation?: TaskStartConfirmationState;
538
541
  /** P63 §6.4 — its own pending kind beside `startConfirmation`: the "run it unconfined this once?" question. */
539
542
  confinementOptIn?: ConfinementOptInState;
543
+ /** P63 Slice 3 §9.5 — its own pending kind: apply a reviewed change that includes media files? */
544
+ mediaApproval?: MediaApprovalState;
540
545
  }
541
546
  /**
542
547
  * A1a #3/#4 — one numbered choice in a `PendingPlannerOffer`. Contract-ready
@@ -1047,6 +1052,7 @@ export type OrchestrationAction = {
1047
1052
  brainstorm?: BrainstormContextMetadata;
1048
1053
  startConfirmation?: TaskStartConfirmationState;
1049
1054
  confinementOptIn?: ConfinementOptInState;
1055
+ mediaApproval?: MediaApprovalState;
1050
1056
  } | {
1051
1057
  type: 'EVENT_RECEIVED';
1052
1058
  event: EventStreamEntry;
@@ -71,11 +71,11 @@ export declare const ToolActivityGroupSchema: z.ZodObject<{
71
71
  id: string;
72
72
  ts: string;
73
73
  }[];
74
+ target?: string | undefined;
74
75
  detail?: {
75
76
  i: number;
76
77
  digest: string;
77
78
  }[] | undefined;
78
- target?: string | undefined;
79
79
  }, {
80
80
  count: number;
81
81
  tool: string;
@@ -83,11 +83,11 @@ export declare const ToolActivityGroupSchema: z.ZodObject<{
83
83
  id: string;
84
84
  ts: string;
85
85
  }[];
86
+ target?: string | undefined;
86
87
  detail?: {
87
88
  i: number;
88
89
  digest: string;
89
90
  }[] | undefined;
90
- target?: string | undefined;
91
91
  }>;
92
92
  export type ToolActivityGroup = z.infer<typeof ToolActivityGroupSchema>;
93
93
  /**
@@ -135,11 +135,11 @@ export declare const ToolActivityManifestSchema: z.ZodObject<{
135
135
  id: string;
136
136
  ts: string;
137
137
  }[];
138
+ target?: string | undefined;
138
139
  detail?: {
139
140
  i: number;
140
141
  digest: string;
141
142
  }[] | undefined;
142
- target?: string | undefined;
143
143
  }, {
144
144
  count: number;
145
145
  tool: string;
@@ -147,11 +147,11 @@ export declare const ToolActivityManifestSchema: z.ZodObject<{
147
147
  id: string;
148
148
  ts: string;
149
149
  }[];
150
+ target?: string | undefined;
150
151
  detail?: {
151
152
  i: number;
152
153
  digest: string;
153
154
  }[] | undefined;
154
- target?: string | undefined;
155
155
  }>, "many">;
156
156
  continues: z.ZodOptional<z.ZodBoolean>;
157
157
  }, "strip", z.ZodTypeAny, {
@@ -162,11 +162,11 @@ export declare const ToolActivityManifestSchema: z.ZodObject<{
162
162
  id: string;
163
163
  ts: string;
164
164
  }[];
165
+ target?: string | undefined;
165
166
  detail?: {
166
167
  i: number;
167
168
  digest: string;
168
169
  }[] | undefined;
169
- target?: string | undefined;
170
170
  }[];
171
171
  windowStart?: string | undefined;
172
172
  windowEnd?: string | undefined;
@@ -181,11 +181,11 @@ export declare const ToolActivityManifestSchema: z.ZodObject<{
181
181
  id: string;
182
182
  ts: string;
183
183
  }[];
184
+ target?: string | undefined;
184
185
  detail?: {
185
186
  i: number;
186
187
  digest: string;
187
188
  }[] | undefined;
188
- target?: string | undefined;
189
189
  }[];
190
190
  windowStart?: string | undefined;
191
191
  windowEnd?: string | undefined;
@@ -254,11 +254,11 @@ export declare const ToolActivityOutboxEnvelopeSchema: z.ZodObject<{
254
254
  id: string;
255
255
  ts: string;
256
256
  }[];
257
+ target?: string | undefined;
257
258
  detail?: {
258
259
  i: number;
259
260
  digest: string;
260
261
  }[] | undefined;
261
- target?: string | undefined;
262
262
  }, {
263
263
  count: number;
264
264
  tool: string;
@@ -266,11 +266,11 @@ export declare const ToolActivityOutboxEnvelopeSchema: z.ZodObject<{
266
266
  id: string;
267
267
  ts: string;
268
268
  }[];
269
+ target?: string | undefined;
269
270
  detail?: {
270
271
  i: number;
271
272
  digest: string;
272
273
  }[] | undefined;
273
- target?: string | undefined;
274
274
  }>, "many">;
275
275
  continues: z.ZodOptional<z.ZodBoolean>;
276
276
  }, "strip", z.ZodTypeAny, {
@@ -281,11 +281,11 @@ export declare const ToolActivityOutboxEnvelopeSchema: z.ZodObject<{
281
281
  id: string;
282
282
  ts: string;
283
283
  }[];
284
+ target?: string | undefined;
284
285
  detail?: {
285
286
  i: number;
286
287
  digest: string;
287
288
  }[] | undefined;
288
- target?: string | undefined;
289
289
  }[];
290
290
  windowStart?: string | undefined;
291
291
  windowEnd?: string | undefined;
@@ -300,11 +300,11 @@ export declare const ToolActivityOutboxEnvelopeSchema: z.ZodObject<{
300
300
  id: string;
301
301
  ts: string;
302
302
  }[];
303
+ target?: string | undefined;
303
304
  detail?: {
304
305
  i: number;
305
306
  digest: string;
306
307
  }[] | undefined;
307
- target?: string | undefined;
308
308
  }[];
309
309
  windowStart?: string | undefined;
310
310
  windowEnd?: string | undefined;
@@ -327,11 +327,11 @@ export declare const ToolActivityOutboxEnvelopeSchema: z.ZodObject<{
327
327
  id: string;
328
328
  ts: string;
329
329
  }[];
330
+ target?: string | undefined;
330
331
  detail?: {
331
332
  i: number;
332
333
  digest: string;
333
334
  }[] | undefined;
334
- target?: string | undefined;
335
335
  }[];
336
336
  windowStart?: string | undefined;
337
337
  windowEnd?: string | undefined;
@@ -354,11 +354,11 @@ export declare const ToolActivityOutboxEnvelopeSchema: z.ZodObject<{
354
354
  id: string;
355
355
  ts: string;
356
356
  }[];
357
+ target?: string | undefined;
357
358
  detail?: {
358
359
  i: number;
359
360
  digest: string;
360
361
  }[] | undefined;
361
- target?: string | undefined;
362
362
  }[];
363
363
  windowStart?: string | undefined;
364
364
  windowEnd?: string | undefined;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quantiya/codevibe-core",
3
- "version": "2.0.94",
3
+ "version": "2.0.95",
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-claude-plugin",
3
- "version": "2.0.101",
3
+ "version": "2.0.103",
4
4
  "description": "Control Claude Code 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": {
@@ -48,7 +48,7 @@
48
48
  "node": ">=22.0.0"
49
49
  },
50
50
  "dependencies": {
51
- "@quantiya/codevibe-core": "^2.0.94",
51
+ "@quantiya/codevibe-core": "^2.0.95",
52
52
  "@quantiya/quorum-core": "^1.0.1",
53
53
  "dotenv": "^16.6.1",
54
54
  "express": "^5.1.0",