@agent-deck/shared 1.8.1 → 1.9.0

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.
@@ -6,6 +6,6 @@ export declare const AGENT_DECK_DASHBOARD_CLIENT = "dashboard";
6
6
  export declare const AGENT_DECK_AGENT_CLIENT = "agent";
7
7
  /** Workspace root for session grouping and display (agent clients). */
8
8
  export declare const AGENT_DECK_WORKSPACE_HEADER = "x-agent-deck-workspace";
9
- /** Session-bound deck id (agent clients). */
9
+ /** Launch-selected deck (NOT-105). */
10
10
  export declare const AGENT_DECK_DECK_ID_HEADER = "x-agent-deck-deck-id";
11
11
  //# sourceMappingURL=client-scope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-scope.d.ts","sourceRoot":"","sources":["../../src/constants/client-scope.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,wBAAwB,CAAC;AAE9D,mEAAmE;AACnE,eAAO,MAAM,2BAA2B,cAAc,CAAC;AAEvD,+EAA+E;AAC/E,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAE/C,uEAAuE;AACvE,eAAO,MAAM,2BAA2B,2BAA2B,CAAC;AAEpE,6CAA6C;AAC7C,eAAO,MAAM,yBAAyB,yBAAyB,CAAC"}
1
+ {"version":3,"file":"client-scope.d.ts","sourceRoot":"","sources":["../../src/constants/client-scope.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,wBAAwB,CAAC;AAE9D,mEAAmE;AACnE,eAAO,MAAM,2BAA2B,cAAc,CAAC;AAEvD,+EAA+E;AAC/E,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAE/C,uEAAuE;AACvE,eAAO,MAAM,2BAA2B,2BAA2B,CAAC;AAEpE,sCAAsC;AACtC,eAAO,MAAM,yBAAyB,yBAAyB,CAAC"}
@@ -9,6 +9,6 @@ exports.AGENT_DECK_DASHBOARD_CLIENT = 'dashboard';
9
9
  exports.AGENT_DECK_AGENT_CLIENT = 'agent';
10
10
  /** Workspace root for session grouping and display (agent clients). */
11
11
  exports.AGENT_DECK_WORKSPACE_HEADER = 'x-agent-deck-workspace';
12
- /** Session-bound deck id (agent clients). */
12
+ /** Launch-selected deck (NOT-105). */
13
13
  exports.AGENT_DECK_DECK_ID_HEADER = 'x-agent-deck-deck-id';
14
14
  //# sourceMappingURL=client-scope.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-scope.js","sourceRoot":"","sources":["../../src/constants/client-scope.ts"],"names":[],"mappings":";;;AAAA,8EAA8E;AACjE,QAAA,wBAAwB,GAAG,qBAAqB,CAAC;AAE9D,mEAAmE;AACtD,QAAA,2BAA2B,GAAG,WAAW,CAAC;AAEvD,+EAA+E;AAClE,QAAA,uBAAuB,GAAG,OAAO,CAAC;AAE/C,uEAAuE;AAC1D,QAAA,2BAA2B,GAAG,wBAAwB,CAAC;AAEpE,6CAA6C;AAChC,QAAA,yBAAyB,GAAG,sBAAsB,CAAC"}
1
+ {"version":3,"file":"client-scope.js","sourceRoot":"","sources":["../../src/constants/client-scope.ts"],"names":[],"mappings":";;;AAAA,8EAA8E;AACjE,QAAA,wBAAwB,GAAG,qBAAqB,CAAC;AAE9D,mEAAmE;AACtD,QAAA,2BAA2B,GAAG,WAAW,CAAC;AAEvD,+EAA+E;AAClE,QAAA,uBAAuB,GAAG,OAAO,CAAC;AAE/C,uEAAuE;AAC1D,QAAA,2BAA2B,GAAG,wBAAwB,CAAC;AAEpE,sCAAsC;AACzB,QAAA,yBAAyB,GAAG,sBAAsB,CAAC"}
@@ -1,12 +1,11 @@
1
1
  import { z } from 'zod';
2
2
  export declare const AgentSessionModeSchema: z.ZodEnum<["normal", "agent-admin"]>;
3
- export declare const TrustedSessionErrorCodeSchema: z.ZodEnum<["GRANT_REQUIRED", "SESSION_INVALID", "SESSION_REVOKED", "WORKSPACE_SCOPE_MISMATCH", "RESOURCE_OUT_OF_SCOPE", "ADMIN_REQUIRED", "DASHBOARD_REQUIRED", "ADMIN_CHALLENGE_EXPIRED", "INTERACTION_REQUIRED"]>;
3
+ export declare const TrustedSessionErrorCodeSchema: z.ZodEnum<["GRANT_REQUIRED", "SESSION_INVALID", "SESSION_REVOKED", "RESOURCE_OUT_OF_SCOPE", "ADMIN_REQUIRED", "DASHBOARD_REQUIRED", "ADMIN_CHALLENGE_EXPIRED", "DECK_FIXED"]>;
4
+ /** @deprecated Legacy v2 grant file shape — CLI reads for migration only (NOT-108). */
4
5
  export declare const WorkspaceGrantStatusSchema: z.ZodEnum<["pending", "active", "revoked"]>;
5
6
  export declare const RuntimeSessionSchema: z.ZodObject<{
6
7
  sessionId: z.ZodString;
7
8
  mcpSessionId: z.ZodOptional<z.ZodString>;
8
- workspaceKey: z.ZodString;
9
- workspaceGrantId: z.ZodString;
10
9
  deckId: z.ZodString;
11
10
  mode: z.ZodEnum<["normal", "agent-admin"]>;
12
11
  lastSeenAt: z.ZodString;
@@ -17,8 +16,6 @@ export declare const RuntimeSessionSchema: z.ZodObject<{
17
16
  expiresAt: string;
18
17
  mode: "normal" | "agent-admin";
19
18
  sessionId: string;
20
- workspaceKey: string;
21
- workspaceGrantId: string;
22
19
  lastSeenAt: string;
23
20
  adminExpiresAt: string | null;
24
21
  mcpSessionId?: string | undefined;
@@ -27,12 +24,11 @@ export declare const RuntimeSessionSchema: z.ZodObject<{
27
24
  expiresAt: string;
28
25
  mode: "normal" | "agent-admin";
29
26
  sessionId: string;
30
- workspaceKey: string;
31
- workspaceGrantId: string;
32
27
  lastSeenAt: string;
33
28
  adminExpiresAt: string | null;
34
29
  mcpSessionId?: string | undefined;
35
30
  }>;
31
+ /** Legacy v2 grant manifest — CLI assignment migration only. */
36
32
  export declare const WorkspaceGrantManifestSchema: z.ZodObject<{
37
33
  version: z.ZodLiteral<2>;
38
34
  workspaceKey: z.ZodString;
@@ -64,9 +60,25 @@ export declare const WorkspaceGrantManifestSchema: z.ZodObject<{
64
60
  mcpUrl?: string | undefined;
65
61
  store?: "file" | "keychain" | undefined;
66
62
  }>;
63
+ /** Plain folder→deck assignment (NOT-108). No secret. */
64
+ export declare const WorkspaceAssignmentSchema: z.ZodObject<{
65
+ version: z.ZodLiteral<3>;
66
+ deckId: z.ZodString;
67
+ deckName: z.ZodString;
68
+ mcpUrl: z.ZodOptional<z.ZodString>;
69
+ }, "strict", z.ZodTypeAny, {
70
+ deckId: string;
71
+ version: 3;
72
+ deckName: string;
73
+ mcpUrl?: string | undefined;
74
+ }, {
75
+ deckId: string;
76
+ version: 3;
77
+ deckName: string;
78
+ mcpUrl?: string | undefined;
79
+ }>;
67
80
  export declare const RedactedSessionBindingSchema: z.ZodObject<{
68
81
  sessionId: z.ZodString;
69
- workspaceKey: z.ZodString;
70
82
  deckId: z.ZodString;
71
83
  deckName: z.ZodOptional<z.ZodString>;
72
84
  mode: z.ZodEnum<["normal", "agent-admin"]>;
@@ -78,7 +90,6 @@ export declare const RedactedSessionBindingSchema: z.ZodObject<{
78
90
  expiresAt: string;
79
91
  mode: "normal" | "agent-admin";
80
92
  sessionId: string;
81
- workspaceKey: string;
82
93
  deckName?: string | undefined;
83
94
  adminExpiresAt?: string | null | undefined;
84
95
  display_summary?: string | undefined;
@@ -87,7 +98,6 @@ export declare const RedactedSessionBindingSchema: z.ZodObject<{
87
98
  expiresAt: string;
88
99
  mode: "normal" | "agent-admin";
89
100
  sessionId: string;
90
- workspaceKey: string;
91
101
  deckName?: string | undefined;
92
102
  adminExpiresAt?: string | null | undefined;
93
103
  display_summary?: string | undefined;
@@ -97,6 +107,7 @@ export type TrustedSessionErrorCode = z.infer<typeof TrustedSessionErrorCodeSche
97
107
  export type WorkspaceGrantStatus = z.infer<typeof WorkspaceGrantStatusSchema>;
98
108
  export type RuntimeSession = z.infer<typeof RuntimeSessionSchema>;
99
109
  export type WorkspaceGrantManifest = z.infer<typeof WorkspaceGrantManifestSchema>;
110
+ export type WorkspaceAssignment = z.infer<typeof WorkspaceAssignmentSchema>;
100
111
  export type RedactedSessionBinding = z.infer<typeof RedactedSessionBindingSchema>;
101
112
  export type TrustedSessionErrorBody = {
102
113
  success: false;
@@ -1 +1 @@
1
- {"version":3,"file":"trusted-session.d.ts","sourceRoot":"","sources":["../../src/schemas/trusted-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB,sCAAoC,CAAC;AAExE,eAAO,MAAM,6BAA6B,qNAWxC,CAAC;AAEH,eAAO,MAAM,0BAA0B,6CAA2C,CAAC;AAEnF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYtB,CAAC;AAEZ,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY9B,CAAC;AAEZ,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW9B,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAClF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,uBAAuB,CAAC;CACrC,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,uBAAuB,EAC7B,OAAO,EAAE,MAAM,GACd,uBAAuB,CAEzB;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CAiB/E"}
1
+ {"version":3,"file":"trusted-session.d.ts","sourceRoot":"","sources":["../../src/schemas/trusted-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB,sCAAoC,CAAC;AAExE,eAAO,MAAM,6BAA6B,+KAUxC,CAAC;AAEH,uFAAuF;AACvF,eAAO,MAAM,0BAA0B,6CAA2C,CAAC;AAEnF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;EAUtB,CAAC;AAEZ,gEAAgE;AAChE,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY9B,CAAC;AAEZ,yDAAyD;AACzD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;EAO3B,CAAC;AAEZ,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;EAU9B,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAClF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,uBAAuB,CAAC;CACrC,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,uBAAuB,EAC7B,OAAO,EAAE,MAAM,GACd,uBAAuB,CAEzB;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CAgB/E"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RedactedSessionBindingSchema = exports.WorkspaceGrantManifestSchema = exports.RuntimeSessionSchema = exports.WorkspaceGrantStatusSchema = exports.TrustedSessionErrorCodeSchema = exports.AgentSessionModeSchema = void 0;
3
+ exports.RedactedSessionBindingSchema = exports.WorkspaceAssignmentSchema = exports.WorkspaceGrantManifestSchema = exports.RuntimeSessionSchema = exports.WorkspaceGrantStatusSchema = exports.TrustedSessionErrorCodeSchema = exports.AgentSessionModeSchema = void 0;
4
4
  exports.trustedSessionError = trustedSessionError;
5
5
  exports.httpStatusForTrustedError = httpStatusForTrustedError;
6
6
  const zod_1 = require("zod");
@@ -9,21 +9,19 @@ exports.TrustedSessionErrorCodeSchema = zod_1.z.enum([
9
9
  'GRANT_REQUIRED',
10
10
  'SESSION_INVALID',
11
11
  'SESSION_REVOKED',
12
- 'WORKSPACE_SCOPE_MISMATCH',
13
12
  'RESOURCE_OUT_OF_SCOPE',
14
13
  'ADMIN_REQUIRED',
15
14
  'DASHBOARD_REQUIRED',
16
15
  'ADMIN_CHALLENGE_EXPIRED',
17
- /** Execution-authority principal hit control-plane / non-worker HTTP (NOT-86). */
18
- 'INTERACTION_REQUIRED',
16
+ /** Launch-selected deck cannot be changed by the agent (NOT-105). */
17
+ 'DECK_FIXED',
19
18
  ]);
19
+ /** @deprecated Legacy v2 grant file shape — CLI reads for migration only (NOT-108). */
20
20
  exports.WorkspaceGrantStatusSchema = zod_1.z.enum(['pending', 'active', 'revoked']);
21
21
  exports.RuntimeSessionSchema = zod_1.z
22
22
  .object({
23
23
  sessionId: zod_1.z.string(),
24
24
  mcpSessionId: zod_1.z.string().optional(),
25
- workspaceKey: zod_1.z.string(),
26
- workspaceGrantId: zod_1.z.string(),
27
25
  deckId: zod_1.z.string(),
28
26
  mode: exports.AgentSessionModeSchema,
29
27
  lastSeenAt: zod_1.z.string().datetime(),
@@ -31,6 +29,7 @@ exports.RuntimeSessionSchema = zod_1.z
31
29
  adminExpiresAt: zod_1.z.string().datetime().nullable(),
32
30
  })
33
31
  .strict();
32
+ /** Legacy v2 grant manifest — CLI assignment migration only. */
34
33
  exports.WorkspaceGrantManifestSchema = zod_1.z
35
34
  .object({
36
35
  version: zod_1.z.literal(2),
@@ -44,10 +43,18 @@ exports.WorkspaceGrantManifestSchema = zod_1.z
44
43
  updatedAt: zod_1.z.string().datetime(),
45
44
  })
46
45
  .strict();
46
+ /** Plain folder→deck assignment (NOT-108). No secret. */
47
+ exports.WorkspaceAssignmentSchema = zod_1.z
48
+ .object({
49
+ version: zod_1.z.literal(3),
50
+ deckId: zod_1.z.string().min(1),
51
+ deckName: zod_1.z.string().min(1),
52
+ mcpUrl: zod_1.z.string().url().optional(),
53
+ })
54
+ .strict();
47
55
  exports.RedactedSessionBindingSchema = zod_1.z
48
56
  .object({
49
57
  sessionId: zod_1.z.string(),
50
- workspaceKey: zod_1.z.string(),
51
58
  deckId: zod_1.z.string(),
52
59
  deckName: zod_1.z.string().optional(),
53
60
  mode: exports.AgentSessionModeSchema,
@@ -65,11 +72,10 @@ function httpStatusForTrustedError(code) {
65
72
  case 'SESSION_INVALID':
66
73
  case 'SESSION_REVOKED':
67
74
  return 401;
68
- case 'WORKSPACE_SCOPE_MISMATCH':
69
75
  case 'RESOURCE_OUT_OF_SCOPE':
70
76
  case 'ADMIN_REQUIRED':
71
77
  case 'DASHBOARD_REQUIRED':
72
- case 'INTERACTION_REQUIRED':
78
+ case 'DECK_FIXED':
73
79
  return 403;
74
80
  case 'ADMIN_CHALLENGE_EXPIRED':
75
81
  return 410;
@@ -1 +1 @@
1
- {"version":3,"file":"trusted-session.js","sourceRoot":"","sources":["../../src/schemas/trusted-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trusted-session.js","sourceRoot":"","sources":["../../src/schemas/trusted-session.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,24 @@
1
1
  /** Dev monorepo / tsx — separate data dir from production `agent-deck start`. */
2
2
  export declare function isAgentDeckDevMode(): boolean;
3
+ /** The user's real store root. Both this and its `dev/` subdir are real user data. */
4
+ export declare function realAgentDeckHome(): string;
5
+ /**
6
+ * Exported for tests: is `target` the store root at `root`, or inside it?
7
+ *
8
+ * Compares lexically first, then again through `realpathSync`, because this store root
9
+ * is routinely a symlink into a git-synced tree (and so are its children). A
10
+ * lexical-only check lets `AGENT_DECK_HOME=<realpath of ~/.agent-deck>`, or a link
11
+ * pointing back at it, write to the real store while looking isolated.
12
+ */
13
+ export declare function isUnderStoreRoot(target: string, root: string): boolean;
3
14
  /**
4
15
  * Agent Deck data root: SQLite, credential yaml metadata, dev secret files.
5
16
  * Production CLI → ~/.agent-deck
6
17
  * Monorepo dev (AGENT_DECK_DEV=1) → ~/.agent-deck/dev
18
+ *
19
+ * Under a test runner this throws rather than hand back the real store, so a test
20
+ * that forgets to isolate `AGENT_DECK_HOME` fails loudly instead of writing stray
21
+ * decks and services into the developer's (often git-synced) store.
7
22
  */
8
23
  export declare function resolveAgentDeckHome(): string;
9
24
  //# sourceMappingURL=agent-deck-home.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-deck-home.d.ts","sourceRoot":"","sources":["../../src/utils/agent-deck-home.ts"],"names":[],"mappings":"AAIA,iFAAiF;AACjF,wBAAgB,kBAAkB,IAAI,OAAO,CAS5C;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAO7C"}
1
+ {"version":3,"file":"agent-deck-home.d.ts","sourceRoot":"","sources":["../../src/utils/agent-deck-home.ts"],"names":[],"mappings":"AAUA,iFAAiF;AACjF,wBAAgB,kBAAkB,IAAI,OAAO,CAS5C;AAED,sFAAsF;AACtF,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAwBD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKtE;AAeD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAkB7C"}
@@ -4,9 +4,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.isAgentDeckDevMode = isAgentDeckDevMode;
7
+ exports.realAgentDeckHome = realAgentDeckHome;
8
+ exports.isUnderStoreRoot = isUnderStoreRoot;
7
9
  exports.resolveAgentDeckHome = resolveAgentDeckHome;
10
+ const node_fs_1 = __importDefault(require("node:fs"));
8
11
  const node_os_1 = __importDefault(require("node:os"));
9
12
  const node_path_1 = __importDefault(require("node:path"));
13
+ /**
14
+ * Escape hatch for the test guard below. Only for tests that assert default path
15
+ * resolution and never write — never for tests that touch the store.
16
+ */
17
+ const ALLOW_REAL_HOME_IN_TESTS_ENV = 'AGENT_DECK_ALLOW_REAL_HOME_IN_TESTS';
10
18
  /** Dev monorepo / tsx — separate data dir from production `agent-deck start`. */
11
19
  function isAgentDeckDevMode() {
12
20
  const flag = process.env.AGENT_DECK_DEV?.trim().toLowerCase();
@@ -18,16 +26,74 @@ function isAgentDeckDevMode() {
18
26
  }
19
27
  return process.env.NODE_ENV === 'development';
20
28
  }
29
+ /** The user's real store root. Both this and its `dev/` subdir are real user data. */
30
+ function realAgentDeckHome() {
31
+ return node_path_1.default.join(node_os_1.default.homedir(), '.agent-deck');
32
+ }
33
+ /** Vitest sets VITEST=true and NODE_ENV=test; either marks a test process. */
34
+ function isTestRunnerProcess() {
35
+ const vitest = process.env.VITEST?.trim().toLowerCase();
36
+ return vitest === '1' || vitest === 'true' || process.env.NODE_ENV === 'test';
37
+ }
38
+ function containsOrEquals(root, target) {
39
+ return target === root || target.startsWith(`${root}${node_path_1.default.sep}`);
40
+ }
41
+ /**
42
+ * `realpathSync` throws on a path that does not exist yet; the literal path is then
43
+ * all there is to compare, and the lexical pass has already used it.
44
+ */
45
+ function realpathOrSelf(target) {
46
+ try {
47
+ return node_fs_1.default.realpathSync(target);
48
+ }
49
+ catch {
50
+ return target;
51
+ }
52
+ }
53
+ /**
54
+ * Exported for tests: is `target` the store root at `root`, or inside it?
55
+ *
56
+ * Compares lexically first, then again through `realpathSync`, because this store root
57
+ * is routinely a symlink into a git-synced tree (and so are its children). A
58
+ * lexical-only check lets `AGENT_DECK_HOME=<realpath of ~/.agent-deck>`, or a link
59
+ * pointing back at it, write to the real store while looking isolated.
60
+ */
61
+ function isUnderStoreRoot(target, root) {
62
+ if (containsOrEquals(root, target)) {
63
+ return true;
64
+ }
65
+ return containsOrEquals(realpathOrSelf(root), realpathOrSelf(target));
66
+ }
67
+ function isRealAgentDeckHome(target) {
68
+ return isUnderStoreRoot(target, realAgentDeckHome());
69
+ }
70
+ function agentDeckHomeFromEnv() {
71
+ if (process.env.AGENT_DECK_HOME?.trim()) {
72
+ return node_path_1.default.resolve(process.env.AGENT_DECK_HOME.trim());
73
+ }
74
+ const base = realAgentDeckHome();
75
+ return isAgentDeckDevMode() ? node_path_1.default.join(base, 'dev') : base;
76
+ }
21
77
  /**
22
78
  * Agent Deck data root: SQLite, credential yaml metadata, dev secret files.
23
79
  * Production CLI → ~/.agent-deck
24
80
  * Monorepo dev (AGENT_DECK_DEV=1) → ~/.agent-deck/dev
81
+ *
82
+ * Under a test runner this throws rather than hand back the real store, so a test
83
+ * that forgets to isolate `AGENT_DECK_HOME` fails loudly instead of writing stray
84
+ * decks and services into the developer's (often git-synced) store.
25
85
  */
26
86
  function resolveAgentDeckHome() {
27
- if (process.env.AGENT_DECK_HOME?.trim()) {
28
- return node_path_1.default.resolve(process.env.AGENT_DECK_HOME.trim());
87
+ const home = agentDeckHomeFromEnv();
88
+ // Test-runner check first: production never pays for the realpath syscalls.
89
+ if (isTestRunnerProcess() &&
90
+ process.env[ALLOW_REAL_HOME_IN_TESTS_ENV]?.trim() !== '1' &&
91
+ isRealAgentDeckHome(home)) {
92
+ throw new Error(`Refusing to use the real Agent Deck store (${home}) from a test process. ` +
93
+ 'Set AGENT_DECK_HOME to a temp dir for this test — each package vitest config ' +
94
+ 'already points the whole run at one. If the test only asserts default path ' +
95
+ `resolution and writes nothing, set ${ALLOW_REAL_HOME_IN_TESTS_ENV}=1.`);
29
96
  }
30
- const base = node_path_1.default.join(node_os_1.default.homedir(), '.agent-deck');
31
- return isAgentDeckDevMode() ? node_path_1.default.join(base, 'dev') : base;
97
+ return home;
32
98
  }
33
99
  //# sourceMappingURL=agent-deck-home.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-deck-home.js","sourceRoot":"","sources":["../../src/utils/agent-deck-home.ts"],"names":[],"mappings":";;;;;AAKA,gDASC;AAOD,oDAOC;AA3BD,sDAAyB;AACzB,0DAA6B;AAE7B,iFAAiF;AACjF,SAAgB,kBAAkB;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9D,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,SAAgB,oBAAoB;IAClC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC;QACxC,OAAO,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,IAAI,GAAG,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;IACpD,OAAO,kBAAkB,EAAE,CAAC,CAAC,CAAC,mBAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"agent-deck-home.js","sourceRoot":"","sources":["../../src/utils/agent-deck-home.ts"],"names":[],"mappings":";;;;;AAWA,gDASC;AAGD,8CAEC;AAgCD,4CAKC;AAwBD,oDAkBC;AAxGD,sDAAyB;AACzB,sDAAyB;AACzB,0DAA6B;AAE7B;;;GAGG;AACH,MAAM,4BAA4B,GAAG,qCAAqC,CAAC;AAE3E,iFAAiF;AACjF,SAAgB,kBAAkB;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9D,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC;AAChD,CAAC;AAED,sFAAsF;AACtF,SAAgB,iBAAiB;IAC/B,OAAO,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,8EAA8E;AAC9E,SAAS,mBAAmB;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxD,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC;AAChF,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,MAAc;IACpD,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,mBAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,MAAc;IACpC,IAAI,CAAC;QACH,OAAO,iBAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,gBAAgB,CAAC,MAAc,EAAE,IAAY;IAC3D,IAAI,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACzC,OAAO,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC;QACxC,OAAO,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,OAAO,kBAAkB,EAAE,CAAC,CAAC,CAAC,mBAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,oBAAoB;IAClC,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IAEpC,4EAA4E;IAC5E,IACE,mBAAmB,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG;QACzD,mBAAmB,CAAC,IAAI,CAAC,EACzB,CAAC;QACD,MAAM,IAAI,KAAK,CACb,8CAA8C,IAAI,yBAAyB;YACzE,+EAA+E;YAC/E,6EAA6E;YAC7E,sCAAsC,4BAA4B,KAAK,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Default patterns that Agent Deck writes under a project folder. */
2
+ export declare const AGENT_DECK_GIT_EXCLUDE_PATTERNS: readonly ["/.agent-deck/", "/.cursor/rules/agent-deck-stubs/", "/.claude/skills/agent-deck-*/"];
3
+ /**
4
+ * Append patterns to the repo's `.git/info/exclude` (local only).
5
+ * No-op when `root` is not a git working tree. Idempotent.
6
+ */
7
+ export declare function ensureGitExcluded(root: string, patterns?: readonly string[]): void;
8
+ //# sourceMappingURL=git-exclude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-exclude.d.ts","sourceRoot":"","sources":["../../src/utils/git-exclude.ts"],"names":[],"mappings":"AAIA,sEAAsE;AACtE,eAAO,MAAM,+BAA+B,iGAIlC,CAAC;AAEX;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,SAAS,MAAM,EAAoC,GAC5D,IAAI,CA8CN"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AGENT_DECK_GIT_EXCLUDE_PATTERNS = void 0;
7
+ exports.ensureGitExcluded = ensureGitExcluded;
8
+ const node_child_process_1 = require("node:child_process");
9
+ const node_fs_1 = __importDefault(require("node:fs"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ /** Default patterns that Agent Deck writes under a project folder. */
12
+ exports.AGENT_DECK_GIT_EXCLUDE_PATTERNS = [
13
+ '/.agent-deck/',
14
+ '/.cursor/rules/agent-deck-stubs/',
15
+ '/.claude/skills/agent-deck-*/',
16
+ ];
17
+ /**
18
+ * Append patterns to the repo's `.git/info/exclude` (local only).
19
+ * No-op when `root` is not a git working tree. Idempotent.
20
+ */
21
+ function ensureGitExcluded(root, patterns = exports.AGENT_DECK_GIT_EXCLUDE_PATTERNS) {
22
+ if (patterns.length === 0) {
23
+ return;
24
+ }
25
+ let excludeRel;
26
+ try {
27
+ excludeRel = (0, node_child_process_1.execFileSync)('git', ['-C', root, 'rev-parse', '--git-path', 'info/exclude'], {
28
+ encoding: 'utf8',
29
+ stdio: ['ignore', 'pipe', 'ignore'],
30
+ }).trim();
31
+ }
32
+ catch {
33
+ return;
34
+ }
35
+ if (!excludeRel) {
36
+ return;
37
+ }
38
+ const excludePath = node_path_1.default.isAbsolute(excludeRel) ? excludeRel : node_path_1.default.resolve(root, excludeRel);
39
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(excludePath), { recursive: true });
40
+ let existing = '';
41
+ try {
42
+ existing = node_fs_1.default.readFileSync(excludePath, 'utf8');
43
+ }
44
+ catch (error) {
45
+ const nodeError = error;
46
+ if (nodeError.code !== 'ENOENT') {
47
+ throw error;
48
+ }
49
+ }
50
+ const present = new Set(existing
51
+ .split(/\r?\n/)
52
+ .map((line) => line.trim())
53
+ .filter((line) => line.length > 0 && !line.startsWith('#')));
54
+ const toAppend = patterns.filter((pattern) => !present.has(pattern));
55
+ if (toAppend.length === 0) {
56
+ return;
57
+ }
58
+ const prefix = existing.length === 0 || existing.endsWith('\n') ? '' : '\n';
59
+ node_fs_1.default.writeFileSync(excludePath, `${prefix}${toAppend.join('\n')}\n`, 'utf8');
60
+ }
61
+ //# sourceMappingURL=git-exclude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-exclude.js","sourceRoot":"","sources":["../../src/utils/git-exclude.ts"],"names":[],"mappings":";;;;;;AAeA,8CAiDC;AAhED,2DAAkD;AAClD,sDAAyB;AACzB,0DAA6B;AAE7B,sEAAsE;AACzD,QAAA,+BAA+B,GAAG;IAC7C,eAAe;IACf,kCAAkC;IAClC,+BAA+B;CACvB,CAAC;AAEX;;;GAGG;AACH,SAAgB,iBAAiB,CAC/B,IAAY,EACZ,WAA8B,uCAA+B;IAE7D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,IAAA,iCAAY,EAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,CAAC,EAAE;YACxF,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,mBAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,mBAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9F,iBAAE,CAAC,SAAS,CAAC,mBAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7D,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,iBAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,KAA8B,CAAC;QACjD,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,QAAQ;SACL,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAC9D,CAAC;IAEF,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,iBAAE,CAAC,aAAa,CAAC,WAAW,EAAE,GAAG,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7E,CAAC"}
@@ -10,4 +10,5 @@ export * from './local-mcp-manifest';
10
10
  export * from './agent-deck-home';
11
11
  export * from './trigger-hygiene';
12
12
  export * from './workspace-key';
13
+ export * from './git-exclude';
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
@@ -26,4 +26,5 @@ __exportStar(require("./local-mcp-manifest"), exports);
26
26
  __exportStar(require("./agent-deck-home"), exports);
27
27
  __exportStar(require("./trigger-hygiene"), exports);
28
28
  __exportStar(require("./workspace-key"), exports);
29
+ __exportStar(require("./git-exclude"), exports);
29
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uCAAqB;AACrB,+CAA6B;AAC7B,6CAA2B;AAC3B,+CAA6B;AAC7B,6CAA2B;AAC3B,0DAAwC;AACxC,wDAAsC;AACtC,kDAAgC;AAChC,uDAAqC;AACrC,oDAAkC;AAClC,oDAAkC;AAClC,kDAAgC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uCAAqB;AACrB,+CAA6B;AAC7B,6CAA2B;AAC3B,+CAA6B;AAC7B,6CAA2B;AAC3B,0DAAwC;AACxC,wDAAsC;AACtC,kDAAgC;AAChC,uDAAqC;AACrC,oDAAkC;AAClC,oDAAkC;AAClC,kDAAgC;AAChC,gDAA8B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-deck/shared",
3
- "version": "1.8.1",
3
+ "version": "1.9.0",
4
4
  "description": "Shared types, schemas, and utilities for Agent Deck",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,15 +0,0 @@
1
- import { z } from 'zod';
2
- /** Minimal repo manifest at `.agent-deck/deck.yaml` — links a workspace to a dashboard deck. */
3
- export declare const RepoDeckManifestSchema: z.ZodObject<{
4
- deck_id: z.ZodString;
5
- name: z.ZodOptional<z.ZodString>;
6
- }, "strip", z.ZodTypeAny, {
7
- deck_id: string;
8
- name?: string | undefined;
9
- }, {
10
- deck_id: string;
11
- name?: string | undefined;
12
- }>;
13
- export type RepoDeckManifest = z.infer<typeof RepoDeckManifestSchema>;
14
- export declare const REPO_DECK_MANIFEST_PATH = ".agent-deck/deck.yaml";
15
- //# sourceMappingURL=repo-deck.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repo-deck.d.ts","sourceRoot":"","sources":["../../src/schemas/repo-deck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gGAAgG;AAChG,eAAO,MAAM,sBAAsB;;;;;;;;;EAGjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,uBAAuB,0BAA0B,CAAC"}
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.REPO_DECK_MANIFEST_PATH = exports.RepoDeckManifestSchema = void 0;
4
- const zod_1 = require("zod");
5
- /** Minimal repo manifest at `.agent-deck/deck.yaml` — links a workspace to a dashboard deck. */
6
- exports.RepoDeckManifestSchema = zod_1.z.object({
7
- deck_id: zod_1.z.string().uuid('deck_id must be a valid Agent Deck UUID'),
8
- name: zod_1.z.string().min(1).optional(),
9
- });
10
- exports.REPO_DECK_MANIFEST_PATH = '.agent-deck/deck.yaml';
11
- //# sourceMappingURL=repo-deck.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repo-deck.js","sourceRoot":"","sources":["../../src/schemas/repo-deck.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,gGAAgG;AACnF,QAAA,sBAAsB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,yCAAyC,CAAC;IACnE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAIU,QAAA,uBAAuB,GAAG,uBAAuB,CAAC"}