@the-40-thieves/obsidian-tc-shared 0.0.1 → 1.0.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.schema.d.ts","sourceRoot":"","sources":["../src/config.schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,208 @@
1
+ import { z } from "zod";
2
+ import { isLoopbackHost } from "./net-host";
3
+ // Per-vault plugin-bridge timeouts (M4 / THE-180, G2.2 §3.1 + §6). Inner fields
4
+ // carry defaults; the whole block is optional so a vault that predates M4
5
+ // validates unchanged (consumers read `vault.bridges?.x ?? <default>`).
6
+ export const VaultBridgesConfigSchema = z.object({
7
+ timeoutMs: z.number().int().positive().default(5000),
8
+ probeTimeoutMs: z.number().int().positive().default(500),
9
+ ocrTimeoutMs: z.number().int().positive().default(30000),
10
+ templaterTimeoutMs: z.number().int().positive().default(30000),
11
+ });
12
+ // Per-vault probe overrides (M4 / THE-180, G2.2 §6). force_enabled/disabled treat
13
+ // a plugin as installed/missing regardless of the probe; probe_skip skips the
14
+ // startup probe entirely (force_enabled is then the source of truth) — the seam
15
+ // CI uses to assert tool behavior without a live Obsidian.
16
+ export const VaultPluginsConfigSchema = z.object({
17
+ forceEnabled: z.array(z.string()).default([]),
18
+ forceDisabled: z.array(z.string()).default([]),
19
+ probeSkip: z.boolean().default(false),
20
+ });
21
+ // Per-vault command-palette execution policy (M4 / THE-180, G2.1 Domain 26).
22
+ // Deny-by-default: execute_command is disabled unless `enabled` is explicitly true,
23
+ // and even then only ids in `allowlist` may be fired (and only with a HITL token —
24
+ // execute:command is a scope floor). Arbitrary command execution is never silent.
25
+ export const VaultCommandsConfigSchema = z.object({
26
+ enabled: z.boolean().default(false),
27
+ allowlist: z.array(z.string()).default([]),
28
+ });
29
+ // Per-vault memory-entity materialization config (M5 / THE-181, G2.1 Domain 22).
30
+ // Optional + back-compat: a vault predating M5 validates unchanged (consumers read
31
+ // `vault.memory?.folder ?? "memory"`). `folder` is where create_entity(materialize)
32
+ // writes the regenerable .md projection — a normal vault folder so the [[link]]
33
+ // graph resolves in Obsidian. SQLite stays the source of truth.
34
+ export const VaultMemoryConfigSchema = z.object({
35
+ folder: z.string().min(1).default("memory"),
36
+ });
37
+ // Per-vault workspace-session trace config (M5 / THE-181, G2.1 Domain 23). Session
38
+ // traces are append-only JSONL written vault-relative (path-safe via resolveVaultPath
39
+ // + ACL-checked via enforcePathAcl) under this folder; default a dot-folder so they
40
+ // stay out of Obsidian's graph view. (G2.3 sketched cache_dir; THE-181's DoD requires
41
+ // ACL-checked, hence vault-relative.)
42
+ export const VaultWorkspaceConfigSchema = z.object({
43
+ traceFolder: z.string().min(1).default(".obsidian-tc/traces"),
44
+ });
45
+ export const VaultConfigSchema = z.object({
46
+ id: z.string().min(1),
47
+ name: z.string().min(1).optional(),
48
+ path: z.string().min(1),
49
+ restApiUrl: z.string().url().optional(),
50
+ restApiKey: z.string().optional(),
51
+ bridges: VaultBridgesConfigSchema.optional(),
52
+ plugins: VaultPluginsConfigSchema.optional(),
53
+ commands: VaultCommandsConfigSchema.optional(),
54
+ memory: VaultMemoryConfigSchema.optional(),
55
+ workspace: VaultWorkspaceConfigSchema.optional(),
56
+ });
57
+ export const AuthConfigSchema = z
58
+ .object({
59
+ mode: z.enum(["none", "jwt"]).default("none"),
60
+ jwtSecret: z.string().min(32).optional(),
61
+ tokenTtlSeconds: z.number().int().positive().default(86400),
62
+ })
63
+ .refine((c) => c.mode !== "jwt" || !!c.jwtSecret, {
64
+ message: "jwtSecret (>=32 chars) is required when auth.mode is 'jwt'",
65
+ path: ["jwtSecret"],
66
+ });
67
+ export const AclRuleSchema = z.object({
68
+ glob: z.string().min(1),
69
+ scopes: z.array(z.string()).default([]),
70
+ });
71
+ export const AclConfigSchema = z.object({
72
+ readOnly: z.boolean().default(false),
73
+ defaultScopes: z.array(z.string()).default([]),
74
+ rules: z.array(AclRuleSchema).default([]),
75
+ // Per-path operation ACL (G2.2 section 5 / G2.4). Optional and back-compatible:
76
+ // when a field is omitted that operation kind is unrestricted (M0 behavior);
77
+ // when present it is a glob whitelist — a path must match at least one entry.
78
+ // camelCase mirrors the rest of the config (readOnly, defaultScopes).
79
+ readPaths: z.array(z.string()).optional(),
80
+ writePaths: z.array(z.string()).optional(),
81
+ deletePaths: z.array(z.string()).optional(),
82
+ });
83
+ export const EmbeddingsConfigSchema = z.object({
84
+ provider: z.enum(["ollama", "openai", "voyage", "cohere"]).default("ollama"),
85
+ model: z.string().default("nomic-embed-text"),
86
+ dimensions: z.number().int().positive().default(768),
87
+ baseUrl: z.string().url().optional(),
88
+ apiKey: z.string().optional(),
89
+ });
90
+ export const HttpConfigSchema = z.object({
91
+ enabled: z.boolean().default(false),
92
+ host: z.string().default("127.0.0.1"),
93
+ port: z.number().int().min(1).max(65535).default(8765),
94
+ });
95
+ export const TransportsConfigSchema = z.object({
96
+ stdio: z.boolean().default(true),
97
+ http: HttpConfigSchema.default({}),
98
+ });
99
+ export const GovernorConfigSchema = z.object({
100
+ maxResponseBytes: z.number().int().positive().default(1_000_000),
101
+ });
102
+ // Per-scope-class throttle tiers + write-concurrency ceiling (THE-182 / M6, G2.4
103
+ // §Rate limits). Additive + fully defaulted, so a config predating M6 validates
104
+ // unchanged. The M6 bulk tools enforce the `bulk` tier (10/min, burst 3); the
105
+ // other tiers are reported by get_server_config and reserved for the M7
106
+ // dispatch-wide rate-limit gate. get_server_config surfaces these as its `limits`
107
+ // block (non-secret).
108
+ const throttleTier = (perMinute, burst) => z
109
+ .object({
110
+ perMinute: z.number().int().positive().default(perMinute),
111
+ burst: z.number().int().positive().default(burst),
112
+ })
113
+ .default({});
114
+ export const ThrottleConfigSchema = z
115
+ .object({
116
+ enabled: z.boolean().default(true),
117
+ tiers: z
118
+ .object({
119
+ read: throttleTier(600, 100),
120
+ write: throttleTier(60, 20),
121
+ bulk: throttleTier(10, 3),
122
+ execute: throttleTier(5, 1),
123
+ admin: throttleTier(5, 1),
124
+ })
125
+ .default({}),
126
+ maxConcurrentWritesPerVault: z.number().int().positive().default(16),
127
+ })
128
+ .default({});
129
+ // Observability config (G2.4 §Observability — finalized in M7/THE-183). Three opt-in
130
+ // export streams plus retention, all fully defaulted so a config predating M7 validates
131
+ // unchanged. OTEL is a no-op unless `otel.endpoint` is set; the Prometheus `/metrics`
132
+ // endpoint stays disabled until `prometheus.enabled`; MORGIANA spools CloudEvents JSONL
133
+ // by default and HTTP-pushes only when `morgiana.httpEndpoint` is set. camelCase mirrors
134
+ // the rest of the config. (M6 shipped a placeholder `otel: boolean` / `morgiana: {mode}`
135
+ // shape; M7 finalizes it to the G2.4 shape before the v1.0 additive-only freeze.)
136
+ export const ObservabilityConfigSchema = z.object({
137
+ traceDetail: z.enum(["standard", "verbose"]).default("standard"),
138
+ tracesSampleRate: z.number().min(0).max(1).default(1),
139
+ otel: z
140
+ .object({
141
+ endpoint: z.string().url().optional(),
142
+ headers: z.record(z.string()).default({}),
143
+ })
144
+ .default({}),
145
+ prometheus: z
146
+ .object({
147
+ enabled: z.boolean().default(false),
148
+ port: z.number().int().min(0).max(65535).default(9464),
149
+ bind: z.string().default("127.0.0.1"),
150
+ })
151
+ .default({}),
152
+ morgiana: z
153
+ .object({
154
+ spool: z.boolean().default(true),
155
+ httpEndpoint: z.string().url().optional(),
156
+ httpHeaders: z.record(z.string()).default({}),
157
+ })
158
+ .default({}),
159
+ retention: z
160
+ .object({
161
+ morgianaEventsDays: z.number().int().positive().default(90),
162
+ tracesDays: z.number().int().positive().default(90),
163
+ eventLogDays: z.number().int().positive().default(30),
164
+ })
165
+ .default({}),
166
+ });
167
+ // plur read-API proxy config (M5 / THE-181, G2.1 Domain 24). GLOBAL, not per-vault:
168
+ // the plur engram store is global and the plur tools take no `vault` argument, so
169
+ // this lives at the server root. endpoint/apiKey come from config or the
170
+ // OBSIDIAN_TC_PLUR_ENDPOINT / OBSIDIAN_TC_PLUR_TOKEN env vars (resolved in
171
+ // config/load.ts); the bearer is placed solely in the Authorization header by the
172
+ // bridge transport — never logged, never in an error/audit payload. Optional with
173
+ // inner defaults: when `endpoint` is absent the plur tools degrade to plugin_missing
174
+ // with NO network call.
175
+ export const PlurConfigSchema = z.object({
176
+ endpoint: z.string().url().optional(),
177
+ apiKey: z.string().optional(),
178
+ apiPrefix: z.string().default(""),
179
+ timeoutMs: z.number().int().positive().default(5000),
180
+ });
181
+ const ServerConfigObject = z.object({
182
+ cacheDir: z.string().default(".obsidian-tc"),
183
+ vaults: z.array(VaultConfigSchema).min(1),
184
+ plur: PlurConfigSchema.optional(),
185
+ auth: AuthConfigSchema.default({ mode: "none" }),
186
+ acl: AclConfigSchema.default({}),
187
+ embeddings: EmbeddingsConfigSchema.default({}),
188
+ transports: TransportsConfigSchema.default({}),
189
+ governor: GovernorConfigSchema.default({}),
190
+ throttle: ThrottleConfigSchema,
191
+ observability: ObservabilityConfigSchema.default({}),
192
+ idempotencyTtlSeconds: z.number().int().positive().default(86400),
193
+ elicitTtlSeconds: z.number().int().positive().default(300),
194
+ });
195
+ // F2 fail-closed interlock: never run an unauthenticated server on a routable host. When the
196
+ // HTTP transport is enabled on a non-loopback host with auth.mode "none", every request would
197
+ // resolve to full wildcard scopes (see transports/http.ts resolveAuth) — refuse the config.
198
+ export const ServerConfigSchema = ServerConfigObject.superRefine((cfg, ctx) => {
199
+ const http = cfg.transports.http;
200
+ if (http.enabled && cfg.auth.mode === "none" && !isLoopbackHost(http.host)) {
201
+ ctx.addIssue({
202
+ code: z.ZodIssueCode.custom,
203
+ path: ["transports", "http", "host"],
204
+ message: `refusing to expose an unauthenticated server: transports.http.enabled is true with host "${http.host}" (non-loopback) while auth.mode is "none". Set auth.mode to "jwt" (with jwtSecret) or bind transports.http.host to a loopback address (127.0.0.1, ::1, localhost).`,
205
+ });
206
+ }
207
+ });
208
+ //# sourceMappingURL=config.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.schema.js","sourceRoot":"","sources":["../src/config.schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export type ErrorCode = "unauthorized" | "forbidden" | "validation_error" | "not_found" | "vault_not_found" | "conflict" | "idempotency_key_mismatch" | "idempotency_in_flight" | "elicit_required" | "elicit_invalid" | "overflow" | "throttled" | "read_only" | "plugin_unavailable" | "internal" | "note_not_found" | "path_invalid" | "path_ambiguous" | "acl_denied" | "read_only_mode" | "note_exists" | "concurrent_modification" | "invalid_input" | "internal_error" | "embedding_provider_error" | "operation_timeout" | "dql_error" | "jsonlogic_error" | "plugin_missing" | "plugin_unreachable" | "bases_syntax_error" | "execute_command_disabled" | "command_not_allowlisted";
2
+ export interface ErrorJSON {
3
+ code: ErrorCode;
4
+ message: string;
5
+ retryable: boolean;
6
+ details?: Record<string, unknown>;
7
+ }
8
+ export declare class ObsidianTcError extends Error {
9
+ readonly code: ErrorCode;
10
+ readonly details?: Record<string, unknown>;
11
+ readonly retryable: boolean;
12
+ constructor(code: ErrorCode, message: string, details?: Record<string, unknown>);
13
+ toJSON(): ErrorJSON;
14
+ }
15
+ type Mk = (message?: string, details?: Record<string, unknown>) => ObsidianTcError;
16
+ export declare const err: {
17
+ readonly unauthorized: Mk;
18
+ readonly forbidden: Mk;
19
+ readonly validation: Mk;
20
+ readonly notFound: Mk;
21
+ readonly vaultNotFound: Mk;
22
+ readonly conflict: Mk;
23
+ readonly elicitRequired: Mk;
24
+ readonly elicitInvalid: Mk;
25
+ readonly overflow: Mk;
26
+ readonly throttled: Mk;
27
+ readonly readOnly: Mk;
28
+ readonly internal: Mk;
29
+ readonly noteNotFound: Mk;
30
+ readonly pathInvalid: Mk;
31
+ readonly pathAmbiguous: Mk;
32
+ readonly aclDenied: Mk;
33
+ readonly readOnlyMode: Mk;
34
+ readonly noteExists: Mk;
35
+ readonly concurrentModification: Mk;
36
+ readonly invalidInput: Mk;
37
+ readonly internalError: Mk;
38
+ readonly embeddingProviderError: Mk;
39
+ readonly operationTimeout: Mk;
40
+ readonly dqlError: Mk;
41
+ readonly jsonlogicError: Mk;
42
+ readonly pluginMissing: Mk;
43
+ readonly pluginUnreachable: Mk;
44
+ readonly basesSyntaxError: Mk;
45
+ readonly executeCommandDisabled: Mk;
46
+ readonly commandNotAllowlisted: Mk;
47
+ };
48
+ export {};
49
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAEjB,cAAc,GACd,WAAW,GACX,kBAAkB,GAClB,WAAW,GACX,iBAAiB,GACjB,UAAU,GACV,0BAA0B,GAC1B,uBAAuB,GACvB,iBAAiB,GACjB,gBAAgB,GAChB,UAAU,GACV,WAAW,GACX,WAAW,GACX,oBAAoB,GACpB,UAAU,GAEV,gBAAgB,GAChB,cAAc,GACd,gBAAgB,GAChB,YAAY,GACZ,gBAAgB,GAChB,aAAa,GACb,yBAAyB,GACzB,eAAe,GACf,gBAAgB,GAEhB,0BAA0B,GAC1B,mBAAmB,GACnB,WAAW,GACX,iBAAiB,GACjB,gBAAgB,GAChB,oBAAoB,GAEpB,oBAAoB,GAEpB,0BAA0B,GAC1B,yBAAyB,CAAC;AAe9B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAEhB,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAS/E,MAAM,IAAI,SAAS;CAQpB;AAED,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,eAAe,CAAC;AAMnF,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCN,CAAC"}
package/dist/errors.js ADDED
@@ -0,0 +1,72 @@
1
+ const RETRYABLE = new Set([
2
+ "idempotency_in_flight",
3
+ "throttled",
4
+ "internal",
5
+ "internal_error",
6
+ // G2.1: a CAS miss is retryable after the caller re-reads the note.
7
+ "concurrent_modification",
8
+ // M2: transient embedding-backend, timeout, and plugin-unreachable failures are retryable.
9
+ "embedding_provider_error",
10
+ "operation_timeout",
11
+ "plugin_unreachable",
12
+ ]);
13
+ export class ObsidianTcError extends Error {
14
+ code;
15
+ details;
16
+ retryable;
17
+ constructor(code, message, details) {
18
+ super(message);
19
+ this.name = "ObsidianTcError";
20
+ this.code = code;
21
+ this.details = details;
22
+ this.retryable = RETRYABLE.has(code);
23
+ Object.setPrototypeOf(this, ObsidianTcError.prototype);
24
+ }
25
+ toJSON() {
26
+ return {
27
+ code: this.code,
28
+ message: this.message,
29
+ retryable: this.retryable,
30
+ ...(this.details ? { details: this.details } : {}),
31
+ };
32
+ }
33
+ }
34
+ const mk = (code, fallback) => (message = fallback, details) => new ObsidianTcError(code, message, details);
35
+ export const err = {
36
+ // M0
37
+ unauthorized: mk("unauthorized", "authentication required"),
38
+ forbidden: mk("forbidden", "scope or ACL denied"),
39
+ validation: mk("validation_error", "input validation failed"),
40
+ notFound: mk("not_found", "not found"),
41
+ vaultNotFound: mk("vault_not_found", "vault not found"),
42
+ conflict: mk("conflict", "conflict"),
43
+ elicitRequired: mk("elicit_required", "human confirmation required"),
44
+ elicitInvalid: mk("elicit_invalid", "elicit token invalid or expired"),
45
+ overflow: mk("overflow", "response exceeds byte budget"),
46
+ throttled: mk("throttled", "rate limit exceeded"),
47
+ readOnly: mk("read_only", "server is in read-only mode"),
48
+ internal: mk("internal", "internal error"),
49
+ // M1
50
+ noteNotFound: mk("note_not_found", "note not found"),
51
+ pathInvalid: mk("path_invalid", "path is invalid"),
52
+ pathAmbiguous: mk("path_ambiguous", "path resolves to multiple notes"),
53
+ aclDenied: mk("acl_denied", "path denied by folder ACL"),
54
+ readOnlyMode: mk("read_only_mode", "vault is in read-only mode"),
55
+ noteExists: mk("note_exists", "note already exists"),
56
+ concurrentModification: mk("concurrent_modification", "note changed since it was read"),
57
+ invalidInput: mk("invalid_input", "invalid input"),
58
+ internalError: mk("internal_error", "internal error"),
59
+ // M2 — G2.1 Domain 6 search + retrieval substrate.
60
+ embeddingProviderError: mk("embedding_provider_error", "embedding provider failed"),
61
+ operationTimeout: mk("operation_timeout", "operation timed out"),
62
+ dqlError: mk("dql_error", "Dataview DQL error"),
63
+ jsonlogicError: mk("jsonlogic_error", "JSONLogic expression invalid"),
64
+ pluginMissing: mk("plugin_missing", "required Obsidian plugin not detected"),
65
+ pluginUnreachable: mk("plugin_unreachable", "plugin detected but REST endpoint failed"),
66
+ // M3 — G2.1 structured-format domains (Bases).
67
+ basesSyntaxError: mk("bases_syntax_error", "invalid .base YAML or filter syntax"),
68
+ // M4 — G2.1 Domain 26 command palette (deny-by-default command execution).
69
+ executeCommandDisabled: mk("execute_command_disabled", "command execution is disabled for this vault"),
70
+ commandNotAllowlisted: mk("command_not_allowlisted", "command is not in the vault allowlist"),
71
+ };
72
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from "./errors";
2
+ export * from "./scopes";
3
+ export * from "./result";
4
+ export * from "./config.schema";
5
+ export * from "./net-host";
6
+ export * from "./morgiana.schema";
7
+ export * from "./schemas/primitives";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export * from "./errors";
2
+ export * from "./scopes";
3
+ export * from "./result";
4
+ export * from "./config.schema";
5
+ export * from "./net-host";
6
+ export * from "./morgiana.schema";
7
+ export * from "./schemas/primitives";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,180 @@
1
+ import { z } from "zod";
2
+ /** The nine CloudEvents `type` values MORGIANA recognizes (G2.4 §Event types). */
3
+ export declare const MORGIANA_EVENT_TYPES: readonly ["tc.tool.call.completed", "tc.acl.denied", "tc.elicit.requested", "tc.elicit.consumed", "tc.rate_limit.hit", "tc.governor.overflow", "tc.vault.cache_reset", "tc.server.start", "tc.server.shutdown"];
4
+ export declare const MorgianaEventType: z.ZodEnum<["tc.tool.call.completed", "tc.acl.denied", "tc.elicit.requested", "tc.elicit.consumed", "tc.rate_limit.hit", "tc.governor.overflow", "tc.vault.cache_reset", "tc.server.start", "tc.server.shutdown"]>;
5
+ export type MorgianaEventType = z.infer<typeof MorgianaEventType>;
6
+ /**
7
+ * The CloudEvents `data` payload (G2.4 §Data shape). One uniform shape across all event types:
8
+ * tool-call events fill the rich fields; lifecycle/admin events fill only what applies. Bulk
9
+ * operations emit ONE event per batch with `count` set (no per-row emission in hot loops).
10
+ */
11
+ export declare const MorgianaEventDataSchema: z.ZodObject<{
12
+ vault_id: z.ZodString;
13
+ tool: z.ZodDefault<z.ZodNullable<z.ZodString>>;
14
+ caller_hash: z.ZodDefault<z.ZodString>;
15
+ scopes_required: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
16
+ status: z.ZodDefault<z.ZodNullable<z.ZodEnum<["ok", "denied", "error"]>>>;
17
+ duration_ms: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
18
+ elicit_token: z.ZodDefault<z.ZodNullable<z.ZodString>>;
19
+ idempotency_key: z.ZodDefault<z.ZodNullable<z.ZodString>>;
20
+ result_size: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
21
+ overflow_bytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
22
+ error: z.ZodDefault<z.ZodNullable<z.ZodObject<{
23
+ code: z.ZodString;
24
+ message: z.ZodString;
25
+ }, "strip", z.ZodTypeAny, {
26
+ code: string;
27
+ message: string;
28
+ }, {
29
+ code: string;
30
+ message: string;
31
+ }>>>;
32
+ count: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
33
+ }, "strip", z.ZodTypeAny, {
34
+ status: "ok" | "denied" | "error" | null;
35
+ vault_id: string;
36
+ tool: string | null;
37
+ caller_hash: string;
38
+ scopes_required: string[];
39
+ error: {
40
+ code: string;
41
+ message: string;
42
+ } | null;
43
+ duration_ms: number | null;
44
+ elicit_token: string | null;
45
+ idempotency_key: string | null;
46
+ result_size: number | null;
47
+ overflow_bytes: number | null;
48
+ count: number | null;
49
+ }, {
50
+ vault_id: string;
51
+ status?: "ok" | "denied" | "error" | null | undefined;
52
+ tool?: string | null | undefined;
53
+ caller_hash?: string | undefined;
54
+ scopes_required?: string[] | undefined;
55
+ error?: {
56
+ code: string;
57
+ message: string;
58
+ } | null | undefined;
59
+ duration_ms?: number | null | undefined;
60
+ elicit_token?: string | null | undefined;
61
+ idempotency_key?: string | null | undefined;
62
+ result_size?: number | null | undefined;
63
+ overflow_bytes?: number | null | undefined;
64
+ count?: number | null | undefined;
65
+ }>;
66
+ export type MorgianaEventData = z.infer<typeof MorgianaEventDataSchema>;
67
+ /** CloudEvents 1.0 envelope (G2.4 §Envelope). `source` is `obsidian-tc/<vault_id>`. */
68
+ export declare const CloudEventSchema: z.ZodObject<{
69
+ specversion: z.ZodLiteral<"1.0">;
70
+ id: z.ZodString;
71
+ source: z.ZodString;
72
+ type: z.ZodEnum<["tc.tool.call.completed", "tc.acl.denied", "tc.elicit.requested", "tc.elicit.consumed", "tc.rate_limit.hit", "tc.governor.overflow", "tc.vault.cache_reset", "tc.server.start", "tc.server.shutdown"]>;
73
+ datacontenttype: z.ZodDefault<z.ZodLiteral<"application/json">>;
74
+ time: z.ZodString;
75
+ data: z.ZodObject<{
76
+ vault_id: z.ZodString;
77
+ tool: z.ZodDefault<z.ZodNullable<z.ZodString>>;
78
+ caller_hash: z.ZodDefault<z.ZodString>;
79
+ scopes_required: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
80
+ status: z.ZodDefault<z.ZodNullable<z.ZodEnum<["ok", "denied", "error"]>>>;
81
+ duration_ms: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
82
+ elicit_token: z.ZodDefault<z.ZodNullable<z.ZodString>>;
83
+ idempotency_key: z.ZodDefault<z.ZodNullable<z.ZodString>>;
84
+ result_size: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
85
+ overflow_bytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
86
+ error: z.ZodDefault<z.ZodNullable<z.ZodObject<{
87
+ code: z.ZodString;
88
+ message: z.ZodString;
89
+ }, "strip", z.ZodTypeAny, {
90
+ code: string;
91
+ message: string;
92
+ }, {
93
+ code: string;
94
+ message: string;
95
+ }>>>;
96
+ count: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
97
+ }, "strip", z.ZodTypeAny, {
98
+ status: "ok" | "denied" | "error" | null;
99
+ vault_id: string;
100
+ tool: string | null;
101
+ caller_hash: string;
102
+ scopes_required: string[];
103
+ error: {
104
+ code: string;
105
+ message: string;
106
+ } | null;
107
+ duration_ms: number | null;
108
+ elicit_token: string | null;
109
+ idempotency_key: string | null;
110
+ result_size: number | null;
111
+ overflow_bytes: number | null;
112
+ count: number | null;
113
+ }, {
114
+ vault_id: string;
115
+ status?: "ok" | "denied" | "error" | null | undefined;
116
+ tool?: string | null | undefined;
117
+ caller_hash?: string | undefined;
118
+ scopes_required?: string[] | undefined;
119
+ error?: {
120
+ code: string;
121
+ message: string;
122
+ } | null | undefined;
123
+ duration_ms?: number | null | undefined;
124
+ elicit_token?: string | null | undefined;
125
+ idempotency_key?: string | null | undefined;
126
+ result_size?: number | null | undefined;
127
+ overflow_bytes?: number | null | undefined;
128
+ count?: number | null | undefined;
129
+ }>;
130
+ }, "strip", z.ZodTypeAny, {
131
+ type: "tc.tool.call.completed" | "tc.acl.denied" | "tc.elicit.requested" | "tc.elicit.consumed" | "tc.rate_limit.hit" | "tc.governor.overflow" | "tc.vault.cache_reset" | "tc.server.start" | "tc.server.shutdown";
132
+ time: string;
133
+ id: string;
134
+ specversion: "1.0";
135
+ source: string;
136
+ datacontenttype: "application/json";
137
+ data: {
138
+ status: "ok" | "denied" | "error" | null;
139
+ vault_id: string;
140
+ tool: string | null;
141
+ caller_hash: string;
142
+ scopes_required: string[];
143
+ error: {
144
+ code: string;
145
+ message: string;
146
+ } | null;
147
+ duration_ms: number | null;
148
+ elicit_token: string | null;
149
+ idempotency_key: string | null;
150
+ result_size: number | null;
151
+ overflow_bytes: number | null;
152
+ count: number | null;
153
+ };
154
+ }, {
155
+ type: "tc.tool.call.completed" | "tc.acl.denied" | "tc.elicit.requested" | "tc.elicit.consumed" | "tc.rate_limit.hit" | "tc.governor.overflow" | "tc.vault.cache_reset" | "tc.server.start" | "tc.server.shutdown";
156
+ time: string;
157
+ id: string;
158
+ specversion: "1.0";
159
+ source: string;
160
+ data: {
161
+ vault_id: string;
162
+ status?: "ok" | "denied" | "error" | null | undefined;
163
+ tool?: string | null | undefined;
164
+ caller_hash?: string | undefined;
165
+ scopes_required?: string[] | undefined;
166
+ error?: {
167
+ code: string;
168
+ message: string;
169
+ } | null | undefined;
170
+ duration_ms?: number | null | undefined;
171
+ elicit_token?: string | null | undefined;
172
+ idempotency_key?: string | null | undefined;
173
+ result_size?: number | null | undefined;
174
+ overflow_bytes?: number | null | undefined;
175
+ count?: number | null | undefined;
176
+ };
177
+ datacontenttype?: "application/json" | undefined;
178
+ }>;
179
+ export type CloudEvent = z.infer<typeof CloudEventSchema>;
180
+ //# sourceMappingURL=morgiana.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"morgiana.schema.d.ts","sourceRoot":"","sources":["../src/morgiana.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,iNAUvB,CAAC;AAEX,eAAO,MAAM,iBAAiB,mNAA+B,CAAC;AAC9D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAalC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,uFAAuF;AACvF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQ3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { z } from "zod";
2
+ // MORGIANA event schema (G2.4 §MORGIANA events — THE-183). CloudEvents 1.0 envelope plus the
3
+ // shared data shape. Lives in @the-40-thieves/obsidian-tc-shared so the server emitter AND MORGIANA itself
4
+ // validate against one source of truth; the `specversion` field is the schema version, so a
5
+ // breaking change bumps it. Spool/HTTP transport + emission live server-side (src/morgiana/).
6
+ /** The nine CloudEvents `type` values MORGIANA recognizes (G2.4 §Event types). */
7
+ export const MORGIANA_EVENT_TYPES = [
8
+ "tc.tool.call.completed",
9
+ "tc.acl.denied",
10
+ "tc.elicit.requested",
11
+ "tc.elicit.consumed",
12
+ "tc.rate_limit.hit",
13
+ "tc.governor.overflow",
14
+ "tc.vault.cache_reset",
15
+ "tc.server.start",
16
+ "tc.server.shutdown",
17
+ ];
18
+ export const MorgianaEventType = z.enum(MORGIANA_EVENT_TYPES);
19
+ /**
20
+ * The CloudEvents `data` payload (G2.4 §Data shape). One uniform shape across all event types:
21
+ * tool-call events fill the rich fields; lifecycle/admin events fill only what applies. Bulk
22
+ * operations emit ONE event per batch with `count` set (no per-row emission in hot loops).
23
+ */
24
+ export const MorgianaEventDataSchema = z.object({
25
+ vault_id: z.string(),
26
+ tool: z.string().nullable().default(null),
27
+ caller_hash: z.string().default("system"),
28
+ scopes_required: z.array(z.string()).default([]),
29
+ status: z.enum(["ok", "denied", "error"]).nullable().default(null),
30
+ duration_ms: z.number().nullable().default(null),
31
+ elicit_token: z.string().nullable().default(null),
32
+ idempotency_key: z.string().nullable().default(null),
33
+ result_size: z.number().nullable().default(null),
34
+ overflow_bytes: z.number().nullable().default(null),
35
+ error: z.object({ code: z.string(), message: z.string() }).nullable().default(null),
36
+ count: z.number().nullable().default(null),
37
+ });
38
+ /** CloudEvents 1.0 envelope (G2.4 §Envelope). `source` is `obsidian-tc/<vault_id>`. */
39
+ export const CloudEventSchema = z.object({
40
+ specversion: z.literal("1.0"),
41
+ id: z.string().min(1),
42
+ source: z.string().min(1),
43
+ type: MorgianaEventType,
44
+ datacontenttype: z.literal("application/json").default("application/json"),
45
+ time: z.string().min(1),
46
+ data: MorgianaEventDataSchema,
47
+ });
48
+ //# sourceMappingURL=morgiana.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"morgiana.schema.js","sourceRoot":"","sources":["../src/morgiana.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,6FAA6F;AAC7F,2GAA2G;AAC3G,4FAA4F;AAC5F,8FAA8F;AAE9F,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,wBAAwB;IACxB,eAAe;IACf,qBAAqB;IACrB,oBAAoB;IACpB,mBAAmB;IACnB,sBAAsB;IACtB,sBAAsB;IACtB,iBAAiB;IACjB,oBAAoB;CACZ,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAG9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACzC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;IACzC,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAChD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACjD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACpD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAChD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACnD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACnF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAC3C,CAAC,CAAC;AAGH,uFAAuF;AACvF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,IAAI,EAAE,iBAAiB;IACvB,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;IAC1E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,uBAAuB;CAC9B,CAAC,CAAC"}