@danypops/jittor 0.18.1 → 0.19.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.
package/package.json CHANGED
@@ -1,10 +1,15 @@
1
1
  {
2
2
  "name": "@danypops/jittor",
3
- "version": "0.18.1",
3
+ "version": "0.19.2",
4
4
  "description": "Just-in-Time Token Optimization Router for Pi -- token and context observability with optimization policies",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
7
7
  "types": "./src/index.ts",
8
+ "exports": {
9
+ ".": "./src/index.ts",
10
+ "./package.json": "./package.json"
11
+ },
12
+ "sideEffects": false,
8
13
  "keywords": ["llm-router", "token-budget"],
9
14
  "bin": {
10
15
  "jittor": "src/cli.ts"
@@ -27,9 +32,9 @@
27
32
  }
28
33
  },
29
34
  "dependencies": {
30
- "@danypops/vehicle-core": "^0.12.1",
31
- "@danypops/vehicle-server": "^0.17.0",
32
- "@danypops/vehicle-client": "^0.5.1",
35
+ "@danypops/vehicle-core": "^0.17.1",
36
+ "@danypops/vehicle-server": "^0.25.1",
37
+ "@danypops/vehicle-client": "^0.10.1",
33
38
  "google-auth-library": "^10.9.0",
34
39
  "gpt-tokenizer": "^3.4.0"
35
40
  },
package/src/daemon.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  import { join } from "node:path";
2
2
  import { type RunningDaemon, startDaemon as startDaemonKit } from "@danypops/vehicle-server/daemon";
3
+ import { openVehicleMetricsStore } from "@danypops/vehicle-server/metrics";
4
+ import { createVehicleMetricsMiddleware } from "@danypops/vehicle-server/metrics-middleware";
5
+ import { registerVehicleMetricsOperations } from "@danypops/vehicle-server/metrics-operations";
3
6
  import { ArtificialAnalysisDirectSource } from "./artificial-analysis/benchmark-source.ts";
4
7
  import { CodexTelemetrySource } from "./codex/source.ts";
5
8
  import { MAINTENANCE_INTERVAL_MS, TELEMETRY_POLL_INTERVAL_MS } from "./constants.ts";
@@ -117,6 +120,18 @@ export async function startDaemon(
117
120
  });
118
121
  const service = new JittorService(metrics, router, benchmarks, modelRanker, sessionIdentity, undefined, catalog, usageImporter, exporter);
119
122
 
123
+ // Records how often each real operation is invoked (server-side, every caller) plus, via
124
+ // vehicle_usage.recordClientEvent, client-observed Vehicle Shell meta-tool calls -- see
125
+ // @danypops/vehicle-server's own metrics README section. Wired directly onto the same registry
126
+ // every real jittor operation is already registered on, so it's discoverable through the exact
127
+ // same tools_list/tools_man path as any other operation. operationPrefix: "vehicle_usage", NOT
128
+ // the default "metrics" -- jittor's own domain already owns a real, extensive metrics.*
129
+ // namespace (metrics.query/metrics.record/metrics.usage_series/...), a completely different
130
+ // concept (LLM usage/cost observations) from this module's tool/operation usage metrics.
131
+ const vehicleMetrics = openVehicleMetricsStore(paths.metrics);
132
+ service.vehicleRegistry.useExecutionMiddleware(createVehicleMetricsMiddleware(vehicleMetrics, "jittor"));
133
+ registerVehicleMetricsOperations(service.vehicleRegistry, vehicleMetrics, "jittor", { operationPrefix: "vehicle_usage" });
134
+
120
135
  const daemon = await startDaemonKit({
121
136
  daemonLabel: "Jittor",
122
137
  handlePath: paths.handle,
@@ -155,6 +170,7 @@ export async function startDaemon(
155
170
  onShutdown: async () => {
156
171
  await exporter.shutdown();
157
172
  service.close();
173
+ vehicleMetrics.close();
158
174
  },
159
175
  });
160
176
 
package/src/index.ts CHANGED
@@ -6,7 +6,141 @@ export {
6
6
  parseAnthropicRateLimitHeaders,
7
7
  } from "./anthropic/rate-limits.ts";
8
8
  export { parseCodexRateLimitHeaders } from "./codex/telemetry.ts";
9
- export * from "./constants.ts";
9
+ export {
10
+ BENCHMARK_DEFAULT_QUERY_LIMIT,
11
+ BENCHMARK_IDENTITY_MAX_CHARACTERS,
12
+ BENCHMARK_MAX_MODELS_PER_SOURCE,
13
+ BENCHMARK_MAX_OBSERVATIONS_PER_SNAPSHOT,
14
+ BENCHMARK_MAX_QUERY_LIMIT,
15
+ BENCHMARK_MAX_TEXT_CHARACTERS,
16
+ BENCHMARK_REFRESH_INTERVAL_MS,
17
+ BENCHMARK_SOURCE_MAX_RESPONSE_BYTES,
18
+ BENCHMARK_SOURCE_MAX_TOTAL_RESPONSE_BYTES,
19
+ BENCHMARK_STORE_QUERY_LIMIT,
20
+ BENCHMARK_TUI_MAX_CANDIDATES,
21
+ BENCHMARK_TUI_MAX_PROVENANCE_PER_CANDIDATE,
22
+ CACHE_ECONOMICS_LOSS_CORRELATION_WINDOW_MS,
23
+ CACHE_ECONOMICS_MAX_MISSED_OPPORTUNITIES,
24
+ CACHE_ECONOMICS_MAX_MODEL_GROUPS,
25
+ CACHE_ECONOMICS_MAX_STABLE_PREFIX_POINTS,
26
+ CACHE_ECONOMICS_MAX_TASK_GROUPS,
27
+ CACHE_ECONOMICS_QUERY_LIMIT,
28
+ CATALOG_LONG_CONTEXT_THRESHOLD_TOKENS,
29
+ CATALOG_PRICE_TOKEN_UNIT,
30
+ CLI_AVAILABLE_ROUTES_MAX,
31
+ CLI_METRICS_HUMAN_MAX_ROWS,
32
+ CODEX_ERROR_MESSAGE_LIMIT,
33
+ CODEX_RECOVERY_ATTEMPT_WINDOW_MS,
34
+ CODEX_RECOVERY_BASE_DELAY_MS,
35
+ CODEX_RECOVERY_JITTER_RATIO,
36
+ CODEX_RECOVERY_MAX_ATTEMPTS,
37
+ CODEX_RECOVERY_MAX_DELAY_MS,
38
+ CODEX_RETRY_AFTER_MAX_MS,
39
+ COMPACTION_DURATION_ESTIMATE_MAX_SAMPLES,
40
+ COMPACTION_DURATION_ESTIMATE_MIN_SAMPLES,
41
+ CONTEXT_ASSESSMENT_DEFAULT_WINDOW_MS,
42
+ CONTEXT_ASSESSMENT_QUERY_LIMIT,
43
+ CONTEXT_DEFAULT_RESERVE_TOKENS,
44
+ CONTEXT_ESTIMATE_CHARACTERS_PER_TOKEN,
45
+ CONTEXT_EVENT_DEDUP_LIMIT,
46
+ CONTEXT_HUB_CONFIDENCE_TIERS,
47
+ CONTEXT_HUB_CONTRIBUTION_CHANNEL,
48
+ CONTEXT_HUB_CONTRIBUTION_DEDUP_LIMIT,
49
+ CONTEXT_HUB_CONTRIBUTION_MAX_AGE_MS,
50
+ CONTEXT_HUB_CONTRIBUTION_SCHEMA,
51
+ CONTEXT_HUB_ITEM_LABEL_MAX_CHARACTERS,
52
+ CONTEXT_HUB_MAX_ITEM_DEPTH,
53
+ CONTEXT_HUB_MAX_ITEMS_PER_SEGMENT,
54
+ CONTEXT_HUB_PRODUCER_NAME_MAX_CHARACTERS,
55
+ CONTEXT_HUB_SEGMENT_KEY_MAX_CHARACTERS,
56
+ CONTEXT_HUB_SEGMENT_LABEL_MAX_CHARACTERS,
57
+ CONTEXT_OBSERVATION_MAX_AGE_MS,
58
+ CONTEXT_OBSERVATION_MAX_CHARACTERS,
59
+ CONTEXT_TREE_MAX_NODES,
60
+ DATABASE_FILENAME,
61
+ DEFAULT_QUERY_LIMIT,
62
+ FOOTER_BAR_MAX_WIDTH,
63
+ FOOTER_BAR_MIN_WIDTH,
64
+ FOOTER_COMPACTION_BLINK_HALF_PERIOD_MS,
65
+ FOOTER_COMPACTION_RENDER_INTERVAL_MS,
66
+ FOOTER_CONTEXT_ACCENT_FRACTION,
67
+ FOOTER_CONTEXT_ERROR_FRACTION,
68
+ FOOTER_CONTEXT_WARNING_FRACTION,
69
+ FOOTER_WIDE_TERMINAL_WIDTH,
70
+ GOOGLE_ADC_TOKEN_REFRESH_SKEW_MS,
71
+ GOOGLE_VERTEX_BUDGET_CONFIDENCE,
72
+ GOOGLE_VERTEX_BUDGET_DISPLAY_NAME_MAX_CHARACTERS,
73
+ GOOGLE_VERTEX_BUDGET_MAX_MESSAGES_PER_PULL,
74
+ HANDLE_FILENAME,
75
+ HUMAN_STATUS_MAX_SOURCES,
76
+ HUMAN_TEXT_FIELD_MAX_CHARACTERS,
77
+ JITTOR_EXTENSION_SETTINGS_FILENAME,
78
+ JITTOR_STATE_DIRECTORY,
79
+ MAINTENANCE_INTERVAL_MS,
80
+ MAX_DYNAMIC_ROUTES,
81
+ MAX_QUERY_LIMIT,
82
+ MAX_USAGE_BUCKETS,
83
+ METRIC_ATTRIBUTES_MAX_DEPTH,
84
+ METRIC_ATTRIBUTES_MAX_SERIALIZED_CHARACTERS,
85
+ METRIC_BATCH_MAX_OBSERVATIONS,
86
+ METRIC_IDENTITY_MAX_CHARACTERS,
87
+ MILLISECONDS_PER_DAY,
88
+ MILLISECONDS_PER_HOUR,
89
+ MILLISECONDS_PER_MINUTE,
90
+ MILLISECONDS_PER_SECOND,
91
+ MODEL_AGGREGATE_MAX_GROUPS,
92
+ MODEL_AGGREGATE_MAX_ROWS,
93
+ MODEL_CATALOG_DEFAULT_QUERY_LIMIT,
94
+ MODEL_CATALOG_FRESHNESS_MS,
95
+ MODEL_CATALOG_MAX_ENTRIES,
96
+ MODEL_CATALOG_MAX_QUERY_LIMIT,
97
+ MODEL_CATALOG_MAX_RESPONSE_BYTES,
98
+ MODEL_CATALOG_REQUEST_TIMEOUT_MS,
99
+ MODEL_CATALOG_STORE_QUERY_LIMIT,
100
+ MODEL_OBSERVATION_FRESH_MS,
101
+ MODEL_OBSERVATION_IDENTITY_MAX_CHARACTERS,
102
+ MODEL_RANKING_DEFAULT_CONTEXT_WEIGHT,
103
+ MODEL_RANKING_DEFAULT_COST_WEIGHT,
104
+ MODEL_RANKING_DEFAULT_LATENCY_WEIGHT,
105
+ MODEL_RANKING_DEFAULT_QUALITY_WEIGHT,
106
+ MODEL_RANKING_DEFAULT_RELIABILITY_WEIGHT,
107
+ MODEL_RANKING_MAX_SOURCES,
108
+ OTLP_EXPORT_BATCH_SIZE,
109
+ OTLP_EXPORT_INTERVAL_MS,
110
+ OTLP_EXPORT_MAX_QUEUE_SIZE,
111
+ OTLP_EXPORT_MAX_RETRIES,
112
+ OTLP_EXPORT_TIMEOUT_MS,
113
+ PAPYRUS_CONTEXT_INJECTION_CHANNEL,
114
+ PAPYRUS_CONTEXT_INJECTION_SCHEMA,
115
+ PAPYRUS_TASK_FOCUS_CHANNEL,
116
+ PAPYRUS_TASK_FOCUS_SCHEMA,
117
+ PI_USAGE_IMPORT_MAX_DURATION_MS,
118
+ PI_USAGE_IMPORT_MAX_ENTRIES,
119
+ PI_USAGE_IMPORT_MAX_FILE_BYTES,
120
+ PI_USAGE_IMPORT_MAX_FILES,
121
+ PI_USAGE_IMPORT_MAX_RECORDS,
122
+ PI_USAGE_IMPORT_MAX_TOTAL_BYTES,
123
+ PRUNE_MIN_AGE_MS,
124
+ ROUTER_MAX_SESSION_SCOPES,
125
+ ROUTER_SESSION_ID_MAX_CHARACTERS,
126
+ SERVICE_MAX_BODY_BYTES,
127
+ SERVICE_MAX_RESPONSE_BYTES,
128
+ SESSION_IDENTITY_MAX_ROWS,
129
+ SQLITE_BUSY_TIMEOUT_MS,
130
+ SYSTEMD_UNIT_NAME,
131
+ TASK_COST_QUERY_LIMIT,
132
+ TASK_FOCUS_EVENT_MAX_AGE_MS,
133
+ TASK_FOCUS_ID_MAX_LENGTH,
134
+ TELEMETRY_POLL_INTERVAL_MS,
135
+ TELEMETRY_STALE_AFTER_MS,
136
+ TOKEN_FILENAME,
137
+ USAGE_AGGREGATE_MAX_ROWS,
138
+ USAGE_CHART_HEIGHT,
139
+ USAGE_MAX_DISTINCT_SCOPES,
140
+ USAGE_PER_SCOPE_QUERY_LIMIT,
141
+ USAGE_RENDER_MAX_SERIES,
142
+ USAGE_Y_AXIS_WIDTH,
143
+ } from "./constants.ts";
10
144
  export {
11
145
  classifyGoogleVertexFailure,
12
146
  type GoogleVertexFailure,
@@ -1,3 +1,51 @@
1
1
  /** One capability module's contribution to the operation dispatch table: a bounded set of operation names, each backed by a handler that only needs the collaborators its own factory was given. */
2
2
  export type OperationHandler = (input: Record<string, unknown>) => unknown | Promise<unknown>;
3
3
  export type OperationHandlerMap = Partial<Record<string, OperationHandler>>;
4
+
5
+ /**
6
+ * The full, exhaustive operation surface -- shared by service.ts (dispatch/typed execute) and
7
+ * registration.ts (Vehicle projection) so neither module needs to import the other for this type.
8
+ * Living here (not in either module) is what breaks the service.ts<->registration.ts circular
9
+ * dependency: previously registration.ts `import type`-ed OperationName back from service.ts,
10
+ * while service.ts value-imported registerJittorVehicleOperations from registration.ts.
11
+ */
12
+ export const EXPECTED_OPERATION_NAMES = [
13
+ "metrics.record",
14
+ "metrics.record_batch",
15
+ "metrics.query",
16
+ "metrics.distinct_scopes",
17
+ "metrics.usage_series",
18
+ "metrics.cost_by_task",
19
+ "metrics.prune",
20
+ "benchmark.refresh",
21
+ "benchmark.status",
22
+ "benchmark.query",
23
+ "catalog.refresh",
24
+ "catalog.status",
25
+ "catalog.query",
26
+ "usage.import",
27
+ "usage.import_status",
28
+ "usage.import_cancel",
29
+ "export.status",
30
+ "export.flush",
31
+ "session.register",
32
+ "session.release",
33
+ "models.rank",
34
+ "context.assess",
35
+ "context.delta",
36
+ "context.snapshot",
37
+ "compaction.estimate",
38
+ "service.checkpoint",
39
+ "telemetry.poll",
40
+ "router.status",
41
+ "router.decide",
42
+ "router.pause",
43
+ "router.resume",
44
+ "router.override",
45
+ "router.clear_override",
46
+ "router.current_route",
47
+ "router.available_routes",
48
+ "cache.economics",
49
+ ] as const;
50
+
51
+ export type OperationName = (typeof EXPECTED_OPERATION_NAMES)[number];
@@ -26,8 +26,7 @@ import type { VehicleEffect, VehicleIdempotency } from "@danypops/vehicle-core";
26
26
  import { bindVehicleOperation, defineErrorMapping, defineVehicleOperation, passthroughVehicleSchema } from "@danypops/vehicle-core";
27
27
  import type { VehicleRegistry } from "@danypops/vehicle-server";
28
28
  import { InvalidSessionSecretError } from "../sessions/identity.ts";
29
- import type { OperationHandlerMap } from "./operation-types.ts";
30
- import type { OperationName } from "./service.ts";
29
+ import type { OperationHandlerMap, OperationName } from "./operation-types.ts";
31
30
 
32
31
  /** Preserves the legacy route's 403 for invalid session credentials; every other rejection remains validation. */
33
32
  const withJittorErrorParity = defineErrorMapping([
@@ -34,52 +34,14 @@ import { contextOperations } from "./context-operations.ts";
34
34
  import { exportOperations } from "./export-operations.ts";
35
35
  import { metricsOperations } from "./metric-operations.ts";
36
36
  import { modelRankingOperations } from "./model-ranking-operations.ts";
37
- import type { OperationHandlerMap } from "./operation-types.ts";
37
+ import { EXPECTED_OPERATION_NAMES, type OperationHandlerMap, type OperationName } from "./operation-types.ts";
38
38
  import { registerJittorVehicleOperations } from "./registration.ts";
39
39
  import { routerOperations } from "./routing-operations.ts";
40
40
  import { sessionIdentityOperations } from "./session-operations.ts";
41
41
  import { usageImportOperations } from "./usage-import-operations.ts";
42
42
 
43
- export const EXPECTED_OPERATION_NAMES = [
44
- "metrics.record",
45
- "metrics.record_batch",
46
- "metrics.query",
47
- "metrics.distinct_scopes",
48
- "metrics.usage_series",
49
- "metrics.cost_by_task",
50
- "metrics.prune",
51
- "benchmark.refresh",
52
- "benchmark.status",
53
- "benchmark.query",
54
- "catalog.refresh",
55
- "catalog.status",
56
- "catalog.query",
57
- "usage.import",
58
- "usage.import_status",
59
- "usage.import_cancel",
60
- "export.status",
61
- "export.flush",
62
- "session.register",
63
- "session.release",
64
- "models.rank",
65
- "context.assess",
66
- "context.delta",
67
- "context.snapshot",
68
- "compaction.estimate",
69
- "service.checkpoint",
70
- "telemetry.poll",
71
- "router.status",
72
- "router.decide",
73
- "router.pause",
74
- "router.resume",
75
- "router.override",
76
- "router.clear_override",
77
- "router.current_route",
78
- "router.available_routes",
79
- "cache.economics",
80
- ] as const;
43
+ export { EXPECTED_OPERATION_NAMES, type OperationName };
81
44
 
82
- export type OperationName = (typeof EXPECTED_OPERATION_NAMES)[number];
83
45
  interface RouterScopeInput {
84
46
  session_id?: string;
85
47
  session_secret?: string;