@tanvir1971/core 1.0.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.
Files changed (46) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +47 -0
  3. package/dist/config.d.ts +91 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +78 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/crypto.d.ts +21 -0
  8. package/dist/crypto.d.ts.map +1 -0
  9. package/dist/crypto.js +76 -0
  10. package/dist/crypto.js.map +1 -0
  11. package/dist/errors.d.ts +49 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +94 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/index.d.ts +10 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +10 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/metrics.d.ts +60 -0
  20. package/dist/metrics.d.ts.map +1 -0
  21. package/dist/metrics.js +249 -0
  22. package/dist/metrics.js.map +1 -0
  23. package/dist/secrets.d.ts +37 -0
  24. package/dist/secrets.d.ts.map +1 -0
  25. package/dist/secrets.js +113 -0
  26. package/dist/secrets.js.map +1 -0
  27. package/dist/telemetry.d.ts +76 -0
  28. package/dist/telemetry.d.ts.map +1 -0
  29. package/dist/telemetry.js +155 -0
  30. package/dist/telemetry.js.map +1 -0
  31. package/dist/tokens.d.ts +7 -0
  32. package/dist/tokens.d.ts.map +1 -0
  33. package/dist/tokens.js +15 -0
  34. package/dist/tokens.js.map +1 -0
  35. package/dist/types.d.ts +130 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +7 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/version.d.ts +2 -0
  40. package/dist/version.d.ts.map +1 -0
  41. package/dist/version.js +2 -0
  42. package/dist/version.js.map +1 -0
  43. package/package.json +61 -0
  44. package/proto/axiom/v1/gateway.proto +84 -0
  45. package/proto/axiom/v1/knowledge.proto +62 -0
  46. package/proto/axiom/v1/telemetry.proto +46 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * OpenTelemetry bootstrap shared by all TypeScript services.
3
+ * Exports OTLP/HTTP when OTEL_EXPORTER_OTLP_ENDPOINT is configured;
4
+ * otherwise tracing stays inert so local dev and tests stay quiet.
5
+ */
6
+ import { type Span, type Tracer, type ContextAPI } from "@opentelemetry/api";
7
+ export type { Tracer };
8
+ export interface TelemetryOptions {
9
+ serviceName: string;
10
+ serviceVersion: string;
11
+ otlpEndpoint?: string;
12
+ }
13
+ export interface TelemetryHandle {
14
+ tracer: Tracer;
15
+ shutdown: () => Promise<void>;
16
+ }
17
+ export declare function initTelemetry(options: TelemetryOptions): TelemetryHandle;
18
+ /** Test/dev helper: logs spans to stdout. Never enable in production. */
19
+ export declare function initConsoleTelemetry(options: TelemetryOptions): TelemetryHandle;
20
+ /**
21
+ * Wraps an async operation in a span with error status recording.
22
+ * Keeps services free of manual span boilerplate.
23
+ */
24
+ export declare function withSpan<T>(tracer: Tracer, name: string, attributes: Record<string, string | number | boolean>, fn: (span: Span) => Promise<T>): Promise<T>;
25
+ /**
26
+ * Gen-AI + Axiom semantic-convention attribute names (O1). Every LLM call in
27
+ * every service uses these exact keys so the ops plane can reconstruct a
28
+ * request journey (tokens, cost, cache outcome) from ClickHouse traces.
29
+ */
30
+ export declare const llmAttr: {
31
+ readonly system: "gen_ai.system";
32
+ readonly requestModel: "gen_ai.request.model";
33
+ readonly responseModel: "gen_ai.response.model";
34
+ readonly inputTokens: "gen_ai.usage.input_tokens";
35
+ readonly outputTokens: "gen_ai.usage.output_tokens";
36
+ readonly totalTokens: "gen_ai.usage.total_tokens";
37
+ readonly temperature: "gen_ai.request.temperature";
38
+ readonly maxTokens: "gen_ai.request.max_tokens";
39
+ readonly finishReason: "gen_ai.response.finish_reason";
40
+ };
41
+ export declare const axiomAttr: {
42
+ readonly tenantId: "axiom.tenant.id";
43
+ readonly projectId: "axiom.project.id";
44
+ readonly requestId: "axiom.request.id";
45
+ readonly costUsd: "axiom.cost.usd";
46
+ readonly cacheHit: "axiom.cache.hit";
47
+ readonly experimentId: "axiom.experiment.id";
48
+ readonly experimentVariant: "axiom.experiment.variant";
49
+ };
50
+ export type SpanAttributeValue = string | number | boolean;
51
+ export interface LlmCallOutcome {
52
+ usage?: {
53
+ inputTokens?: number;
54
+ outputTokens?: number;
55
+ totalTokens?: number;
56
+ };
57
+ responseModel?: string;
58
+ finishReason?: string;
59
+ costUsd?: number;
60
+ }
61
+ /**
62
+ * Wraps an LLM call in a span carrying Gen-AI attributes; usage/cost
63
+ * recorded on the same span once the call resolves.
64
+ */
65
+ export declare function withLlmSpan<T>(tracer: Tracer, name: string, attributes: Record<string, SpanAttributeValue>, fn: (span: Span) => Promise<{
66
+ value: T;
67
+ outcome?: LlmCallOutcome;
68
+ }>): Promise<T>;
69
+ /** Re-exported so services do not take direct OTel API dependencies. */
70
+ export declare const otel: {
71
+ trace: import("@opentelemetry/api").TraceAPI;
72
+ context: ContextAPI;
73
+ propagation: import("@opentelemetry/api").PropagationAPI;
74
+ };
75
+ export type { ContextAPI };
76
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,IAAI,EAAyB,KAAK,MAAM,EAAW,KAAK,UAAU,EAAe,MAAM,oBAAoB,CAAC;AAE1H,YAAY,EAAE,MAAM,EAAE,CAAC;AAWvB,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAID,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CAuCxE;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CAW/E;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EACrD,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC,CAiBZ;AAED;;;;GAIG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;CAUV,CAAC;AAEX,eAAO,MAAM,SAAS;;;;;;;;CAQZ,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC9C,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,cAAc,CAAA;CAAE,CAAC,GAClE,OAAO,CAAC,CAAC,CAAC,CAqCZ;AAED,wEAAwE;AACxE,eAAO,MAAM,IAAI;;;;CAAkC,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * OpenTelemetry bootstrap shared by all TypeScript services.
3
+ * Exports OTLP/HTTP when OTEL_EXPORTER_OTLP_ENDPOINT is configured;
4
+ * otherwise tracing stays inert so local dev and tests stay quiet.
5
+ */
6
+ import { SpanStatusCode, trace, context, propagation } from "@opentelemetry/api";
7
+ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
8
+ import { W3CTraceContextPropagator } from "@opentelemetry/core";
9
+ import { Resource } from "@opentelemetry/resources";
10
+ import { BasicTracerProvider, BatchSpanProcessor, ConsoleSpanExporter, } from "@opentelemetry/sdk-trace-base";
11
+ import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from "@opentelemetry/semantic-conventions";
12
+ const handles = new Map();
13
+ export function initTelemetry(options) {
14
+ const existing = handles.get(options.serviceName);
15
+ if (existing) {
16
+ return existing;
17
+ }
18
+ const resource = new Resource({
19
+ [ATTR_SERVICE_NAME]: options.serviceName,
20
+ [ATTR_SERVICE_VERSION]: options.serviceVersion,
21
+ });
22
+ const exporter = options.otlpEndpoint !== undefined
23
+ ? new OTLPTraceExporter({ url: `${options.otlpEndpoint.replace(/\/$/, "")}/v1/traces` })
24
+ : undefined;
25
+ const provider = new BasicTracerProvider({ resource });
26
+ if (exporter) {
27
+ provider.addSpanProcessor(new BatchSpanProcessor(exporter));
28
+ }
29
+ provider.register({
30
+ // W3C trace-context propagation is required for O6 cross-service
31
+ // correlation: without a registered propagator the OTel API defaults to
32
+ // NoopTextMapPropagator and traceparent headers are never injected or
33
+ // extracted.
34
+ propagator: new W3CTraceContextPropagator(),
35
+ });
36
+ const tracer = trace.getTracer(options.serviceName, options.serviceVersion);
37
+ const handle = {
38
+ tracer,
39
+ shutdown: async () => {
40
+ await provider.shutdown();
41
+ handles.delete(options.serviceName);
42
+ },
43
+ };
44
+ handles.set(options.serviceName, handle);
45
+ return handle;
46
+ }
47
+ /** Test/dev helper: logs spans to stdout. Never enable in production. */
48
+ export function initConsoleTelemetry(options) {
49
+ const provider = new BasicTracerProvider({
50
+ resource: new Resource({
51
+ [ATTR_SERVICE_NAME]: options.serviceName,
52
+ [ATTR_SERVICE_VERSION]: options.serviceVersion,
53
+ }),
54
+ });
55
+ provider.addSpanProcessor(new BatchSpanProcessor(new ConsoleSpanExporter()));
56
+ provider.register();
57
+ const tracer = trace.getTracer(options.serviceName, options.serviceVersion);
58
+ return { tracer, shutdown: () => provider.shutdown() };
59
+ }
60
+ /**
61
+ * Wraps an async operation in a span with error status recording.
62
+ * Keeps services free of manual span boilerplate.
63
+ */
64
+ export async function withSpan(tracer, name, attributes, fn) {
65
+ return tracer.startActiveSpan(name, { attributes }, async (span) => {
66
+ try {
67
+ const result = await fn(span);
68
+ span.setStatus({ code: SpanStatusCode.OK });
69
+ return result;
70
+ }
71
+ catch (error) {
72
+ span.recordException(error);
73
+ span.setStatus({
74
+ code: SpanStatusCode.ERROR,
75
+ message: error instanceof Error ? error.message : String(error),
76
+ });
77
+ throw error;
78
+ }
79
+ finally {
80
+ span.end();
81
+ }
82
+ });
83
+ }
84
+ /**
85
+ * Gen-AI + Axiom semantic-convention attribute names (O1). Every LLM call in
86
+ * every service uses these exact keys so the ops plane can reconstruct a
87
+ * request journey (tokens, cost, cache outcome) from ClickHouse traces.
88
+ */
89
+ export const llmAttr = {
90
+ system: "gen_ai.system",
91
+ requestModel: "gen_ai.request.model",
92
+ responseModel: "gen_ai.response.model",
93
+ inputTokens: "gen_ai.usage.input_tokens",
94
+ outputTokens: "gen_ai.usage.output_tokens",
95
+ totalTokens: "gen_ai.usage.total_tokens",
96
+ temperature: "gen_ai.request.temperature",
97
+ maxTokens: "gen_ai.request.max_tokens",
98
+ finishReason: "gen_ai.response.finish_reason",
99
+ };
100
+ export const axiomAttr = {
101
+ tenantId: "axiom.tenant.id",
102
+ projectId: "axiom.project.id",
103
+ requestId: "axiom.request.id",
104
+ costUsd: "axiom.cost.usd",
105
+ cacheHit: "axiom.cache.hit",
106
+ experimentId: "axiom.experiment.id",
107
+ experimentVariant: "axiom.experiment.variant",
108
+ };
109
+ /**
110
+ * Wraps an LLM call in a span carrying Gen-AI attributes; usage/cost
111
+ * recorded on the same span once the call resolves.
112
+ */
113
+ export async function withLlmSpan(tracer, name, attributes, fn) {
114
+ return tracer.startActiveSpan(name, { attributes }, async (span) => {
115
+ try {
116
+ const { value, outcome } = await fn(span);
117
+ if (outcome !== undefined) {
118
+ if (outcome.usage?.inputTokens !== undefined) {
119
+ span.setAttribute(llmAttr.inputTokens, outcome.usage.inputTokens);
120
+ }
121
+ if (outcome.usage?.outputTokens !== undefined) {
122
+ span.setAttribute(llmAttr.outputTokens, outcome.usage.outputTokens);
123
+ }
124
+ if (outcome.usage?.totalTokens !== undefined) {
125
+ span.setAttribute(llmAttr.totalTokens, outcome.usage.totalTokens);
126
+ }
127
+ if (outcome.responseModel !== undefined) {
128
+ span.setAttribute(llmAttr.responseModel, outcome.responseModel);
129
+ }
130
+ if (outcome.finishReason !== undefined) {
131
+ span.setAttribute(llmAttr.finishReason, outcome.finishReason);
132
+ }
133
+ if (outcome.costUsd !== undefined) {
134
+ span.setAttribute(axiomAttr.costUsd, outcome.costUsd);
135
+ }
136
+ }
137
+ span.setStatus({ code: SpanStatusCode.OK });
138
+ return value;
139
+ }
140
+ catch (error) {
141
+ span.recordException(error);
142
+ span.setStatus({
143
+ code: SpanStatusCode.ERROR,
144
+ message: error instanceof Error ? error.message : String(error),
145
+ });
146
+ throw error;
147
+ }
148
+ finally {
149
+ span.end();
150
+ }
151
+ });
152
+ }
153
+ /** Re-exported so services do not take direct OTel API dependencies. */
154
+ export const otel = { trace, context, propagation };
155
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Token estimation shared across services (o200k BPE via tiktoken ranks).
3
+ * Used for pre-flight budgeting where provider-reported usage does not
4
+ * exist yet.
5
+ */
6
+ export declare function estimateTokens(text: string): number;
7
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKnD"}
package/dist/tokens.js ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Token estimation shared across services (o200k BPE via tiktoken ranks).
3
+ * Used for pre-flight budgeting where provider-reported usage does not
4
+ * exist yet.
5
+ */
6
+ import { Tiktoken } from "js-tiktoken/lite";
7
+ import o200k_base from "js-tiktoken/ranks/o200k_base";
8
+ const ENCODER = new Tiktoken(o200k_base);
9
+ export function estimateTokens(text) {
10
+ if (text.length === 0) {
11
+ return 0;
12
+ }
13
+ return ENCODER.encode(text).length;
14
+ }
15
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,UAAU,MAAM,8BAA8B,CAAC;AAEtD,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;AAEzC,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AACrC,CAAC"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Canonical domain types shared across every Axiom AI service.
3
+ * These are the single source of truth for wire shapes; REST handlers,
4
+ * gRPC messages (proto/axiom/v1), and internal events all map to them.
5
+ */
6
+ export declare const AXIOM_PROTOCOL_VERSION: "v1";
7
+ export type ChatRole = "system" | "user" | "assistant" | "tool";
8
+ export interface ChatMessage {
9
+ role: ChatRole;
10
+ content: string;
11
+ /** Present when role === "tool": the tool invocation this message responds to. */
12
+ toolCallId?: string;
13
+ name?: string;
14
+ /**
15
+ * Prompt-cache marker (Anthropic semantics). The gateway translates this
16
+ * into `cache_control: {"type":"ephemeral"}` content blocks for Anthropic;
17
+ * OpenAI-family providers cache automatically and ignore it.
18
+ */
19
+ cacheControl?: "ephemeral";
20
+ }
21
+ export interface ChatToolDefinition {
22
+ name: string;
23
+ description?: string;
24
+ /** JSON Schema for the tool arguments. */
25
+ parametersJsonSchema?: Record<string, unknown>;
26
+ }
27
+ export interface ChatCompletionRequest {
28
+ model: string;
29
+ messages: ChatMessage[];
30
+ tools?: ChatToolDefinition[];
31
+ temperature?: number;
32
+ topP?: number;
33
+ maxTokens?: number;
34
+ stopSequences?: string[];
35
+ stream?: boolean;
36
+ /** Opaque caller identifier propagated into traces. */
37
+ requestId?: string;
38
+ /**
39
+ * OpenAI prompt-cache routing hint (`prompt_cache_key`). Forwarded only
40
+ * to providers that support it (currently `openai`).
41
+ */
42
+ promptCacheKey?: string;
43
+ }
44
+ export interface TokenUsage {
45
+ promptTokens: number;
46
+ completionTokens: number;
47
+ totalTokens: number;
48
+ /**
49
+ * Prompt-cache accounting (provider-native caching):
50
+ * - cachedInputTokens: OpenAI `prompt_tokens_details.cached_tokens`
51
+ * - cacheWriteTokens: Anthropic `cache_creation_input_tokens`
52
+ * - cacheReadTokens: Anthropic `cache_read_input_tokens`
53
+ */
54
+ cachedInputTokens?: number;
55
+ cacheWriteTokens?: number;
56
+ cacheReadTokens?: number;
57
+ }
58
+ export interface ChatCompletionResponse {
59
+ id: string;
60
+ model: string;
61
+ created: number;
62
+ message: ChatMessage;
63
+ usage: TokenUsage;
64
+ finishReason: "stop" | "length" | "tool_calls" | "content_filter";
65
+ }
66
+ /** One increment of a streamed completion. */
67
+ export interface ChatCompletionChunk {
68
+ id: string;
69
+ model: string;
70
+ created: number;
71
+ delta: {
72
+ role?: ChatRole;
73
+ content?: string;
74
+ toolCallId?: string;
75
+ toolName?: string;
76
+ toolArgumentsDelta?: string;
77
+ };
78
+ finishReason?: ChatCompletionResponse["finishReason"];
79
+ usage?: TokenUsage;
80
+ }
81
+ export interface ModelCapabilities {
82
+ contextWindowTokens: number;
83
+ maxOutputTokens: number;
84
+ supportsStreaming: boolean;
85
+ supportsTools: boolean;
86
+ modalities: Array<"text" | "image" | "audio">;
87
+ }
88
+ export interface ModelInfo extends ModelCapabilities {
89
+ id: string;
90
+ provider: ProviderId;
91
+ /** USD per 1M tokens; used by metering for pre-flight cost estimates. */
92
+ inputCostPerMillion?: number;
93
+ outputCostPerMillion?: number;
94
+ }
95
+ export type ProviderId = "openai" | "anthropic" | "gemini" | "groq" | "mistral" | "siliconflow" | "nvidia-nim";
96
+ export interface TenantContext {
97
+ tenantId: string;
98
+ projectId: string;
99
+ /** Entitlements resolved from the API key record. */
100
+ allowedModels: readonly string[];
101
+ rateLimitTier: "free" | "pro" | "enterprise";
102
+ }
103
+ /**
104
+ * Tenant scoping is structural: services derive this from verified JWT
105
+ * claims. User-supplied filters can never override it (ADR 0004).
106
+ */
107
+ export interface TenantVectorScope {
108
+ collection: string;
109
+ tenantId: string;
110
+ }
111
+ export interface RetrievedChunk {
112
+ chunkId: string;
113
+ documentId: string;
114
+ score: number;
115
+ text: string;
116
+ sourceSpan?: {
117
+ startOffset: number;
118
+ endOffset: number;
119
+ };
120
+ metadata: Record<string, string | number | boolean>;
121
+ }
122
+ export type AxiomWebhookEventType = "agent.run.started" | "agent.run.step" | "agent.run.completed" | "agent.run.failed" | "ingestion.document.completed" | "ingestion.document.failed";
123
+ export interface AxiomWebhookEvent<T = unknown> {
124
+ id: string;
125
+ type: AxiomWebhookEventType;
126
+ createdAt: string;
127
+ tenantId: string;
128
+ data: T;
129
+ }
130
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Canonical domain types shared across every Axiom AI service.
3
+ * These are the single source of truth for wire shapes; REST handlers,
4
+ * gRPC messages (proto/axiom/v1), and internal events all map to them.
5
+ */
6
+ export const AXIOM_PROTOCOL_VERSION = "v1";
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const CORE_VERSION = "0.2.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const CORE_VERSION = "0.2.0";
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@tanvir1971/core",
3
+ "version": "1.0.0",
4
+ "description": "Shared contracts for Axiom AI: canonical types, configuration schemas, crypto signing, error taxonomy, and Protobuf definitions.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "proto",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "scripts": {
25
+ "build": "tsc -p tsconfig.json",
26
+ "lint": "eslint src test",
27
+ "format": "prettier --write src test proto",
28
+ "typecheck": "tsc -p tsconfig.json --noEmit",
29
+ "test": "vitest run"
30
+ },
31
+ "dependencies": {
32
+ "@opentelemetry/api": "^1.9.0",
33
+ "@opentelemetry/core": "^1.30.1",
34
+ "@opentelemetry/exporter-trace-otlp-http": "^0.57.1",
35
+ "@opentelemetry/resources": "^1.30.1",
36
+ "@opentelemetry/sdk-trace-base": "^1.30.1",
37
+ "@opentelemetry/semantic-conventions": "^1.28.0",
38
+ "@types/pg": "^8.23.1",
39
+ "pg": "^8.23.0",
40
+ "zod": "^3.24.1"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^22.10.5",
44
+ "typescript": "^5.7.3",
45
+ "vitest": "^3.0.5"
46
+ },
47
+ "engines": {
48
+ "node": ">=24"
49
+ },
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "git+https://github.com/axiom-ai/axiom-core-shared.git"
53
+ },
54
+ "keywords": [
55
+ "llm",
56
+ "gateway",
57
+ "rag",
58
+ "ai",
59
+ "infrastructure"
60
+ ]
61
+ }
@@ -0,0 +1,84 @@
1
+ syntax = "proto3";
2
+
3
+ package axiom.v1;
4
+
5
+ // LLM gateway contract. REST/SSE remains the public surface; this proto is the
6
+ // internal service-to-service contract (spec section 3).
7
+
8
+ message ChatMessage {
9
+ string role = 1;
10
+ string content = 2;
11
+ optional string tool_call_id = 3;
12
+ optional string name = 4;
13
+ }
14
+
15
+ message ToolDefinition {
16
+ string name = 1;
17
+ optional string description = 2;
18
+ bytes parameters_json_schema = 3; // serialized JSON Schema
19
+ }
20
+
21
+ message ChatCompletionRequest {
22
+ string model = 1;
23
+ repeated ChatMessage messages = 2;
24
+ repeated ToolDefinition tools = 3;
25
+ optional double temperature = 4;
26
+ optional double top_p = 5;
27
+ optional uint32 max_tokens = 6;
28
+ repeated string stop_sequences = 7;
29
+ bool stream = 8;
30
+ string request_id = 9;
31
+ // Verified tenant context; never accepted from callers.
32
+ TenantContext tenant = 20;
33
+ }
34
+
35
+ message Usage {
36
+ uint32 prompt_tokens = 1;
37
+ uint32 completion_tokens = 2;
38
+ uint32 total_tokens = 3;
39
+ }
40
+
41
+ message ChatCompletionResponse {
42
+ string id = 1;
43
+ string model = 2;
44
+ int64 created = 3;
45
+ ChatMessage message = 4;
46
+ Usage usage = 5;
47
+ string finish_reason = 6;
48
+ }
49
+
50
+ message StreamChunk {
51
+ string id = 1;
52
+ string model = 2;
53
+ int64 created = 3;
54
+ string delta_role = 4;
55
+ string delta_content = 5;
56
+ optional string finish_reason = 6;
57
+ optional Usage usage = 7;
58
+ }
59
+
60
+ message ListModelsRequest {}
61
+
62
+ message ModelInfo {
63
+ string id = 1;
64
+ string provider = 2;
65
+ uint32 context_window_tokens = 3;
66
+ uint32 max_output_tokens = 4;
67
+ bool supports_streaming = 5;
68
+ bool supports_tools = 6;
69
+ }
70
+
71
+ message ListModelsResponse {
72
+ repeated ModelInfo models = 1;
73
+ }
74
+
75
+ message TenantContext {
76
+ string tenant_id = 1;
77
+ string project_id = 2;
78
+ }
79
+
80
+ service GatewayService {
81
+ rpc ChatCompletion(ChatCompletionRequest) returns (ChatCompletionResponse);
82
+ rpc ChatCompletionStream(ChatCompletionRequest) returns (stream StreamChunk);
83
+ rpc ListModels(ListModelsRequest) returns (ListModelsResponse);
84
+ }
@@ -0,0 +1,62 @@
1
+ syntax = "proto3";
2
+
3
+ package axiom.v1;
4
+
5
+ // Knowledge pipeline contract for ingestion and retrieval.
6
+
7
+ message DocumentSource {
8
+ oneof source {
9
+ bytes inline_content = 1; // small documents
10
+ string uri = 2; // s3:// or https:// location resolved server-side
11
+ }
12
+ string content_type = 3;
13
+ string filename = 4;
14
+ }
15
+
16
+ message IngestDocumentRequest {
17
+ DocumentSource source = 1;
18
+ string tenant_id = 2; // must match verified JWT claims
19
+ string project_id = 3;
20
+ map<string, string> metadata = 4;
21
+ ChunkingOptions chunking = 5;
22
+ }
23
+
24
+ message ChunkingOptions {
25
+ string strategy = 1; // "fixed" | "recursive" | "sentence_window" | "layout"
26
+ uint32 target_chunk_tokens = 2;
27
+ uint32 overlap_tokens = 3;
28
+ }
29
+
30
+ message IngestStatus {
31
+ string document_id = 1;
32
+ string state = 2; // "queued" | "parsing" | "chunking" | "embedding" | "indexed" | "failed"
33
+ uint32 chunks_indexed = 3;
34
+ optional string error_message = 4;
35
+ }
36
+
37
+ message RetrieveRequest {
38
+ string query = 1;
39
+ string tenant_id = 2;
40
+ string project_id = 3;
41
+ uint32 top_k = 4;
42
+ optional float score_threshold = 5;
43
+ bool use_cache = 6;
44
+ }
45
+
46
+ message RetrievedChunk {
47
+ string chunk_id = 1;
48
+ string document_id = 2;
49
+ float score = 3;
50
+ string text = 4;
51
+ map<string, string> metadata = 5;
52
+ }
53
+
54
+ message RetrieveResponse {
55
+ repeated RetrievedChunk chunks = 1;
56
+ bool served_from_cache = 2;
57
+ }
58
+
59
+ service KnowledgeService {
60
+ rpc IngestDocument(IngestDocumentRequest) returns (stream IngestStatus);
61
+ rpc Retrieve(RetrieveRequest) returns (RetrieveResponse);
62
+ }