@humain/humain-code-contracts 0.4.7 → 0.4.8
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/CHANGELOG.md +6 -0
- package/dist/flow-events.d.ts +22 -1
- package/dist/flow-events.d.ts.map +1 -1
- package/dist/flow-events.js +8 -0
- package/dist/flow-events.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/flow-events.d.ts
CHANGED
|
@@ -6,8 +6,11 @@ export { FlowProfileRefSchema, type FlowProfileRefV1 } from "./flow-common.ts";
|
|
|
6
6
|
* semantic content, though: a path-like string can match an Id or model pattern. Producers must put only catalog
|
|
7
7
|
* provider/model identifiers in those fields (see docs/flow-contracts.md, trust boundaries).
|
|
8
8
|
*/
|
|
9
|
-
export declare const FLOW_EVENT_KINDS: readonly ["run_started", "size_decided", "escalated", "route_bound", "fallback", "attempt", "request_usage", "verdict", "budget", "control", "message", "run_settled"];
|
|
9
|
+
export declare const FLOW_EVENT_KINDS: readonly ["run_started", "size_decided", "escalated", "route_bound", "fallback", "attempt", "request_usage", "verdict", "budget", "control", "message", "run_settled", "warning"];
|
|
10
10
|
export type FlowEventKind = (typeof FLOW_EVENT_KINDS)[number];
|
|
11
|
+
/** Content-free warning reasons. `preexisting_check_failures`: checks already failed identically before the run changed anything. */
|
|
12
|
+
export declare const FLOW_WARNING_REASONS: readonly ["preexisting_check_failures"];
|
|
13
|
+
export type FlowWarningReason = (typeof FLOW_WARNING_REASONS)[number];
|
|
11
14
|
export declare const FlowEventV1Schema: Type.TUnion<[Type.TObject<{
|
|
12
15
|
readonly schema: Type.TLiteral<"humain-flow-event">;
|
|
13
16
|
readonly schemaVersion: Type.TLiteral<1>;
|
|
@@ -338,6 +341,24 @@ export declare const FlowEventV1Schema: Type.TUnion<[Type.TObject<{
|
|
|
338
341
|
}>>;
|
|
339
342
|
}>;
|
|
340
343
|
}>;
|
|
344
|
+
}>, Type.TObject<{
|
|
345
|
+
readonly schema: Type.TLiteral<"humain-flow-event">;
|
|
346
|
+
readonly schemaVersion: Type.TLiteral<1>;
|
|
347
|
+
readonly eventId: Type.TString;
|
|
348
|
+
readonly runId: Type.TString;
|
|
349
|
+
readonly seq: Type.TInteger;
|
|
350
|
+
readonly ts: Type.TRefine<Type.TString>;
|
|
351
|
+
readonly profile: Type.TObject<{
|
|
352
|
+
readonly id: Type.TString;
|
|
353
|
+
readonly version: Type.TInteger;
|
|
354
|
+
readonly digest: Type.TString;
|
|
355
|
+
}>;
|
|
356
|
+
readonly causes: Type.TArray<Type.TString>;
|
|
357
|
+
readonly kind: Type.TLiteral<"warning">;
|
|
358
|
+
readonly payload: Type.TObject<{
|
|
359
|
+
readonly reason: Type.TUnion<[Type.TLiteral<"preexisting_check_failures">]>;
|
|
360
|
+
readonly checkIds: Type.TArray<Type.TString>;
|
|
361
|
+
}>;
|
|
341
362
|
}>]>;
|
|
342
363
|
export type FlowEventV1 = Static<typeof FlowEventV1Schema>;
|
|
343
364
|
/** Validates a plain-data snapshot of `input` and returns the snapshot (never the caller's object). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-events.d.ts","sourceRoot":"","sources":["../src/flow-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,IAAI,EAAE,MAAM,SAAS,CAAC;AAqB1D,OAAO,EAAE,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE/E;;;;;GAKG;AAEH,eAAO,MAAM,gBAAgB,YAC5B,aAAa,EACb,cAAc,EACd,WAAW,EACX,aAAa,EACb,UAAU,EACV,SAAS,EACT,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,EACT,aAAa,
|
|
1
|
+
{"version":3,"file":"flow-events.d.ts","sourceRoot":"","sources":["../src/flow-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,IAAI,EAAE,MAAM,SAAS,CAAC;AAqB1D,OAAO,EAAE,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE/E;;;;;GAKG;AAEH,eAAO,MAAM,gBAAgB,YAC5B,aAAa,EACb,cAAc,EACd,WAAW,EACX,aAAa,EACb,UAAU,EACV,SAAS,EACT,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,EACT,aAAa,EACb,SAAS,CACA,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,qIAAqI;AACrI,eAAO,MAAM,oBAAoB,YAAI,4BAA4B,CAAU,CAAC;AAC5E,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AA2BtE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgI5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAe3D,uGAAuG;AACvG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAE5D"}
|
package/dist/flow-events.js
CHANGED
|
@@ -20,7 +20,10 @@ export const FLOW_EVENT_KINDS = [
|
|
|
20
20
|
"control",
|
|
21
21
|
"message",
|
|
22
22
|
"run_settled",
|
|
23
|
+
"warning",
|
|
23
24
|
];
|
|
25
|
+
/** Content-free warning reasons. `preexisting_check_failures`: checks already failed identically before the run changed anything. */
|
|
26
|
+
export const FLOW_WARNING_REASONS = ["preexisting_check_failures"];
|
|
24
27
|
const Mode = lit("auto", "direct");
|
|
25
28
|
const Effort = lit("low", "medium", "high");
|
|
26
29
|
const EventModelRefSchema = StrictObject({ provider: FlowIdSchema, model: Type.String({ pattern: FLOW_ID_PATTERN }) });
|
|
@@ -129,6 +132,11 @@ export const FlowEventV1Schema = Type.Union([
|
|
|
129
132
|
retryOffer: Type.Array(lit("flow", "direct"), { maxItems: 2, uniqueItems: true }),
|
|
130
133
|
totals: partialByRole(RoleTotals),
|
|
131
134
|
})),
|
|
135
|
+
event("warning", StrictObject({
|
|
136
|
+
reason: lit(...FLOW_WARNING_REASONS),
|
|
137
|
+
// Opaque check ids (the same ids `verdict.checkId` uses), never check names or commands.
|
|
138
|
+
checkIds: Type.Array(FlowIdSchema, { minItems: 1, maxItems: 16, uniqueItems: true }),
|
|
139
|
+
})),
|
|
132
140
|
]);
|
|
133
141
|
const Validator = compileFlow(FlowEventV1Schema);
|
|
134
142
|
/** `request_usage.costMicrousd` is null exactly when `costBasis` is "unknown"; never 0 for unknown. */
|
package/dist/flow-events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-events.js","sourceRoot":"","sources":["../src/flow-events.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, type TSchema, Type } from \"typebox\";\nimport {\n\tcompileFlow,\n\tFLOW_ID_PATTERN,\n\tFlowCountSchema,\n\tFlowDigestSchema,\n\tFlowFailureClassSchema,\n\tFlowIdSchema,\n\tFlowMicrousdSchema,\n\tFlowPositiveIntSchema,\n\tFlowProfileRefSchema,\n\tFlowReasonClassSchema,\n\tFlowRoleSchema,\n\tFlowSizeSchema,\n\tFlowTimestampSchema,\n\tlit,\n\tparseFlowData,\n\tpartialByRole,\n\tStrictObject,\n} from \"./flow-common.ts\";\n\nexport { FlowProfileRefSchema, type FlowProfileRefV1 } from \"./flow-common.ts\";\n\n/**\n * Privacy rule: every string in an event is an Id, a Digest, an enum literal, or an ISO timestamp.\n * There is no free-text field, so prompts, messages and model output have no place to go. Syntax checks cannot tell\n * semantic content, though: a path-like string can match an Id or model pattern. Producers must put only catalog\n * provider/model identifiers in those fields (see docs/flow-contracts.md, trust boundaries).\n */\n\nexport const FLOW_EVENT_KINDS = [\n\t\"run_started\",\n\t\"size_decided\",\n\t\"escalated\",\n\t\"route_bound\",\n\t\"fallback\",\n\t\"attempt\",\n\t\"request_usage\",\n\t\"verdict\",\n\t\"budget\",\n\t\"control\",\n\t\"message\",\n\t\"run_settled\",\n] as const;\nexport type FlowEventKind = (typeof FLOW_EVENT_KINDS)[number];\n\nconst Mode = lit(\"auto\", \"direct\");\nconst Effort = lit(\"low\", \"medium\", \"high\");\nconst EventModelRefSchema = StrictObject({ provider: FlowIdSchema, model: Type.String({ pattern: FLOW_ID_PATTERN }) });\n\nconst event = <const K extends string, P extends TSchema>(kind: K, payload: P) =>\n\tStrictObject({\n\t\tschema: Type.Literal(\"humain-flow-event\"),\n\t\tschemaVersion: Type.Literal(1),\n\t\teventId: FlowIdSchema,\n\t\trunId: FlowIdSchema,\n\t\tseq: FlowPositiveIntSchema,\n\t\tts: FlowTimestampSchema,\n\t\tprofile: FlowProfileRefSchema,\n\t\tcauses: Type.Array(FlowIdSchema, { maxItems: 16 }),\n\t\tkind: Type.Literal(kind),\n\t\tpayload,\n\t});\n\nconst RoleTotals = StrictObject({\n\ttokens: FlowCountSchema,\n\tcostMicrousd: FlowMicrousdSchema,\n\tdurationMs: FlowCountSchema,\n\trequests: FlowCountSchema,\n});\n\nexport const FlowEventV1Schema = Type.Union([\n\tevent(\n\t\t\"run_started\",\n\t\tStrictObject({\n\t\t\tmode: Mode,\n\t\t\tsurface: lit(\"cli\", \"web\"),\n\t\t\tadmissionDigest: FlowDigestSchema,\n\t\t\tinputsCount: FlowCountSchema,\n\t\t\tgoalSha256: FlowDigestSchema,\n\t\t}),\n\t),\n\tevent(\n\t\t\"size_decided\",\n\t\tStrictObject({\n\t\t\tsize: FlowSizeSchema,\n\t\t\tsource: lit(\"rules\", \"triage\", \"override\"),\n\t\t\truleScore: Type.Number({ minimum: 0, maximum: 1_000_000 }),\n\t\t\tthresholds: StrictObject({\n\t\t\t\tmediumAt: Type.Number({ minimum: 0, maximum: 1_000_000 }),\n\t\t\t\tlargeAt: Type.Number({ minimum: 0, maximum: 1_000_000 }),\n\t\t\t}),\n\t\t}),\n\t),\n\tevent(\"escalated\", StrictObject({ from: FlowSizeSchema, to: FlowSizeSchema, reasonClass: FlowReasonClassSchema })),\n\tevent(\n\t\t\"route_bound\",\n\t\tStrictObject({\n\t\t\ttaskId: FlowIdSchema,\n\t\t\trole: FlowRoleSchema,\n\t\t\tmodel: EventModelRefSchema,\n\t\t\teffort: Effort,\n\t\t\tbinding: lit(\"primary\", \"backup\", \"lead_selected\"),\n\t\t\tbackupIndex: Type.Integer({ minimum: 0, maximum: 7 }),\n\t\t}),\n\t),\n\tevent(\n\t\t\"fallback\",\n\t\tStrictObject({\n\t\t\ttaskId: FlowIdSchema,\n\t\t\trole: FlowRoleSchema,\n\t\t\tfrom: EventModelRefSchema,\n\t\t\tto: EventModelRefSchema,\n\t\t\treasonClass: FlowReasonClassSchema,\n\t\t}),\n\t),\n\tevent(\n\t\t\"attempt\",\n\t\tStrictObject({\n\t\t\ttaskId: FlowIdSchema,\n\t\t\trole: FlowRoleSchema,\n\t\t\tattempt: FlowPositiveIntSchema,\n\t\t\tstate: lit(\"started\", \"succeeded\", \"failed\", \"retried\", \"cancelled\"),\n\t\t\tfailureClass: Type.Optional(FlowFailureClassSchema),\n\t\t}),\n\t),\n\tevent(\n\t\t\"request_usage\",\n\t\tStrictObject({\n\t\t\trequestId: FlowIdSchema,\n\t\t\ttaskId: FlowIdSchema,\n\t\t\trole: FlowRoleSchema,\n\t\t\tmodel: EventModelRefSchema,\n\t\t\tinputTokens: FlowCountSchema,\n\t\t\toutputTokens: FlowCountSchema,\n\t\t\tcacheReadTokens: FlowCountSchema,\n\t\t\tcacheWriteTokens: FlowCountSchema,\n\t\t\tcostMicrousd: Type.Union([FlowMicrousdSchema, Type.Null()]),\n\t\t\tcostBasis: lit(\"reported\", \"estimated\", \"unknown\"),\n\t\t\tdurationMs: FlowCountSchema,\n\t\t}),\n\t),\n\tevent(\n\t\t\"verdict\",\n\t\tStrictObject({\n\t\t\tstage: lit(\"check\", \"review\", \"qa\"),\n\t\t\ttaskId: FlowIdSchema,\n\t\t\tverdict: lit(\"pass\", \"fail\", \"blocked\"),\n\t\t\tfindingsCount: FlowCountSchema,\n\t\t\tcheckId: Type.Optional(FlowIdSchema),\n\t\t}),\n\t),\n\tevent(\n\t\t\"budget\",\n\t\tStrictObject({\n\t\t\tspentMicrousd: FlowMicrousdSchema,\n\t\t\tcapMicrousd: FlowMicrousdSchema,\n\t\t\tpct: Type.Number({ minimum: 0, maximum: 100 }),\n\t\t\tstate: lit(\"ok\", \"warn\", \"stop\"),\n\t\t}),\n\t),\n\tevent(\n\t\t\"control\",\n\t\tStrictObject({\n\t\t\taction: lit(\"pause\", \"resume\", \"cancel\", \"message\", \"status\"),\n\t\t\tcommandId: FlowIdSchema,\n\t\t\tstate: lit(\"accepted\", \"applied\", \"rejected\"),\n\t\t\tlatencyMs: FlowCountSchema,\n\t\t}),\n\t),\n\tevent(\n\t\t\"message\",\n\t\tStrictObject({\n\t\t\tmessageId: FlowIdSchema,\n\t\t\tdisposition: lit(\"live\", \"queued\", \"rejected\"),\n\t\t\ttargetRole: FlowRoleSchema,\n\t\t\ttextSha256: FlowDigestSchema,\n\t\t\ttextLength: Type.Integer({ minimum: 1, maximum: 16_000 }),\n\t\t}),\n\t),\n\tevent(\n\t\t\"run_settled\",\n\t\tStrictObject({\n\t\t\toutcome: lit(\"succeeded\", \"failed\", \"cancelled\", \"budget_stopped\", \"interrupted\"),\n\t\t\tfailureClass: Type.Optional(FlowFailureClassSchema),\n\t\t\tsettledCleanly: Type.Boolean(),\n\t\t\t// Subset of the two retry modes offered to the user; unique, order-free (full offer = both).\n\t\t\tretryOffer: Type.Array(lit(\"flow\", \"direct\"), { maxItems: 2, uniqueItems: true }),\n\t\t\ttotals: partialByRole(RoleTotals),\n\t\t}),\n\t),\n]);\nexport type FlowEventV1 = Static<typeof FlowEventV1Schema>;\n\nconst Validator = compileFlow(FlowEventV1Schema);\n\n/** `request_usage.costMicrousd` is null exactly when `costBasis` is \"unknown\"; never 0 for unknown. */\nfunction crossFieldsValid(doc: FlowEventV1): boolean {\n\tif (doc.kind === \"request_usage\")\n\t\treturn (doc.payload.costMicrousd === null) === (doc.payload.costBasis === \"unknown\");\n\treturn true;\n}\n\nfunction isEvent(value: unknown): value is FlowEventV1 {\n\treturn Validator.Check(value) && crossFieldsValid(value);\n}\n\n/** Validates a plain-data snapshot of `input` and returns the snapshot (never the caller's object). */\nexport function parseFlowEventV1(input: unknown): FlowEventV1 {\n\treturn parseFlowData(\"event_invalid\", input, isEvent);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"flow-events.js","sourceRoot":"","sources":["../src/flow-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,IAAI,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EACN,WAAW,EACX,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,GAAG,EACH,aAAa,EACb,aAAa,EACb,YAAY,GACZ,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAyB,MAAM,kBAAkB,CAAC;AAE/E;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC/B,aAAa;IACb,cAAc;IACd,WAAW;IACX,aAAa;IACb,UAAU;IACV,SAAS;IACT,eAAe;IACf,SAAS;IACT,QAAQ;IACR,SAAS;IACT,SAAS;IACT,aAAa;IACb,SAAS;CACA,CAAC;AAGX,qIAAqI;AACrI,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,4BAA4B,CAAU,CAAC;AAG5E,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACnC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC5C,MAAM,mBAAmB,GAAG,YAAY,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;AAEvH,MAAM,KAAK,GAAG,CAA4C,IAAO,EAAE,OAAU,EAAE,EAAE,CAChF,YAAY,CAAC;IACZ,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACzC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9B,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,YAAY;IACnB,GAAG,EAAE,qBAAqB;IAC1B,EAAE,EAAE,mBAAmB;IACvB,OAAO,EAAE,oBAAoB;IAC7B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAClD,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IACxB,OAAO;CACP,CAAC,CAAC;AAEJ,MAAM,UAAU,GAAG,YAAY,CAAC;IAC/B,MAAM,EAAE,eAAe;IACvB,YAAY,EAAE,kBAAkB;IAChC,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAE,eAAe;CACzB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC;IAC3C,KAAK,CACJ,aAAa,EACb,YAAY,CAAC;QACZ,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAC1B,eAAe,EAAE,gBAAgB;QACjC,WAAW,EAAE,eAAe;QAC5B,UAAU,EAAE,gBAAgB;KAC5B,CAAC,CACF;IACD,KAAK,CACJ,cAAc,EACd,YAAY,CAAC;QACZ,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC1C,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAC1D,UAAU,EAAE,YAAY,CAAC;YACxB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YACzD,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;SACxD,CAAC;KACF,CAAC,CACF;IACD,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAClH,KAAK,CACJ,aAAa,EACb,YAAY,CAAC;QACZ,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,eAAe,CAAC;QAClD,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;KACrD,CAAC,CACF;IACD,KAAK,CACJ,UAAU,EACV,YAAY,CAAC;QACZ,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,mBAAmB;QACzB,EAAE,EAAE,mBAAmB;QACvB,WAAW,EAAE,qBAAqB;KAClC,CAAC,CACF;IACD,KAAK,CACJ,SAAS,EACT,YAAY,CAAC;QACZ,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,qBAAqB;QAC9B,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC;QACpE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACnD,CAAC,CACF;IACD,KAAK,CACJ,eAAe,EACf,YAAY,CAAC;QACZ,SAAS,EAAE,YAAY;QACvB,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,eAAe;QAC5B,YAAY,EAAE,eAAe;QAC7B,eAAe,EAAE,eAAe;QAChC,gBAAgB,EAAE,eAAe;QACjC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC;QAClD,UAAU,EAAE,eAAe;KAC3B,CAAC,CACF;IACD,KAAK,CACJ,SAAS,EACT,YAAY,CAAC;QACZ,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;QACnC,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;QACvC,aAAa,EAAE,eAAe;QAC9B,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;KACpC,CAAC,CACF;IACD,KAAK,CACJ,QAAQ,EACR,YAAY,CAAC;QACZ,aAAa,EAAE,kBAAkB;QACjC,WAAW,EAAE,kBAAkB;QAC/B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC9C,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;KAChC,CAAC,CACF;IACD,KAAK,CACJ,SAAS,EACT,YAAY,CAAC;QACZ,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC7D,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC;QAC7C,SAAS,EAAE,eAAe;KAC1B,CAAC,CACF;IACD,KAAK,CACJ,SAAS,EACT,YAAY,CAAC;QACZ,SAAS,EAAE,YAAY;QACvB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC9C,UAAU,EAAE,cAAc;QAC1B,UAAU,EAAE,gBAAgB;QAC5B,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;KACzD,CAAC,CACF;IACD,KAAK,CACJ,aAAa,EACb,YAAY,CAAC;QACZ,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,CAAC;QACjF,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACnD,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE;QAC9B,6FAA6F;QAC7F,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACjF,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC;KACjC,CAAC,CACF;IACD,KAAK,CACJ,SAAS,EACT,YAAY,CAAC;QACZ,MAAM,EAAE,GAAG,CAAC,GAAG,oBAAoB,CAAC;QACpC,yFAAyF;QACzF,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;KACpF,CAAC,CACF;CACD,CAAC,CAAC;AAGH,MAAM,SAAS,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;AAEjD,uGAAuG;AACvG,SAAS,gBAAgB,CAAC,GAAgB;IACzC,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe;QAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IACtF,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC9B,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC9C,OAAO,aAAa,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC","sourcesContent":["import { type Static, type TSchema, Type } from \"typebox\";\nimport {\n\tcompileFlow,\n\tFLOW_ID_PATTERN,\n\tFlowCountSchema,\n\tFlowDigestSchema,\n\tFlowFailureClassSchema,\n\tFlowIdSchema,\n\tFlowMicrousdSchema,\n\tFlowPositiveIntSchema,\n\tFlowProfileRefSchema,\n\tFlowReasonClassSchema,\n\tFlowRoleSchema,\n\tFlowSizeSchema,\n\tFlowTimestampSchema,\n\tlit,\n\tparseFlowData,\n\tpartialByRole,\n\tStrictObject,\n} from \"./flow-common.ts\";\n\nexport { FlowProfileRefSchema, type FlowProfileRefV1 } from \"./flow-common.ts\";\n\n/**\n * Privacy rule: every string in an event is an Id, a Digest, an enum literal, or an ISO timestamp.\n * There is no free-text field, so prompts, messages and model output have no place to go. Syntax checks cannot tell\n * semantic content, though: a path-like string can match an Id or model pattern. Producers must put only catalog\n * provider/model identifiers in those fields (see docs/flow-contracts.md, trust boundaries).\n */\n\nexport const FLOW_EVENT_KINDS = [\n\t\"run_started\",\n\t\"size_decided\",\n\t\"escalated\",\n\t\"route_bound\",\n\t\"fallback\",\n\t\"attempt\",\n\t\"request_usage\",\n\t\"verdict\",\n\t\"budget\",\n\t\"control\",\n\t\"message\",\n\t\"run_settled\",\n\t\"warning\",\n] as const;\nexport type FlowEventKind = (typeof FLOW_EVENT_KINDS)[number];\n\n/** Content-free warning reasons. `preexisting_check_failures`: checks already failed identically before the run changed anything. */\nexport const FLOW_WARNING_REASONS = [\"preexisting_check_failures\"] as const;\nexport type FlowWarningReason = (typeof FLOW_WARNING_REASONS)[number];\n\nconst Mode = lit(\"auto\", \"direct\");\nconst Effort = lit(\"low\", \"medium\", \"high\");\nconst EventModelRefSchema = StrictObject({ provider: FlowIdSchema, model: Type.String({ pattern: FLOW_ID_PATTERN }) });\n\nconst event = <const K extends string, P extends TSchema>(kind: K, payload: P) =>\n\tStrictObject({\n\t\tschema: Type.Literal(\"humain-flow-event\"),\n\t\tschemaVersion: Type.Literal(1),\n\t\teventId: FlowIdSchema,\n\t\trunId: FlowIdSchema,\n\t\tseq: FlowPositiveIntSchema,\n\t\tts: FlowTimestampSchema,\n\t\tprofile: FlowProfileRefSchema,\n\t\tcauses: Type.Array(FlowIdSchema, { maxItems: 16 }),\n\t\tkind: Type.Literal(kind),\n\t\tpayload,\n\t});\n\nconst RoleTotals = StrictObject({\n\ttokens: FlowCountSchema,\n\tcostMicrousd: FlowMicrousdSchema,\n\tdurationMs: FlowCountSchema,\n\trequests: FlowCountSchema,\n});\n\nexport const FlowEventV1Schema = Type.Union([\n\tevent(\n\t\t\"run_started\",\n\t\tStrictObject({\n\t\t\tmode: Mode,\n\t\t\tsurface: lit(\"cli\", \"web\"),\n\t\t\tadmissionDigest: FlowDigestSchema,\n\t\t\tinputsCount: FlowCountSchema,\n\t\t\tgoalSha256: FlowDigestSchema,\n\t\t}),\n\t),\n\tevent(\n\t\t\"size_decided\",\n\t\tStrictObject({\n\t\t\tsize: FlowSizeSchema,\n\t\t\tsource: lit(\"rules\", \"triage\", \"override\"),\n\t\t\truleScore: Type.Number({ minimum: 0, maximum: 1_000_000 }),\n\t\t\tthresholds: StrictObject({\n\t\t\t\tmediumAt: Type.Number({ minimum: 0, maximum: 1_000_000 }),\n\t\t\t\tlargeAt: Type.Number({ minimum: 0, maximum: 1_000_000 }),\n\t\t\t}),\n\t\t}),\n\t),\n\tevent(\"escalated\", StrictObject({ from: FlowSizeSchema, to: FlowSizeSchema, reasonClass: FlowReasonClassSchema })),\n\tevent(\n\t\t\"route_bound\",\n\t\tStrictObject({\n\t\t\ttaskId: FlowIdSchema,\n\t\t\trole: FlowRoleSchema,\n\t\t\tmodel: EventModelRefSchema,\n\t\t\teffort: Effort,\n\t\t\tbinding: lit(\"primary\", \"backup\", \"lead_selected\"),\n\t\t\tbackupIndex: Type.Integer({ minimum: 0, maximum: 7 }),\n\t\t}),\n\t),\n\tevent(\n\t\t\"fallback\",\n\t\tStrictObject({\n\t\t\ttaskId: FlowIdSchema,\n\t\t\trole: FlowRoleSchema,\n\t\t\tfrom: EventModelRefSchema,\n\t\t\tto: EventModelRefSchema,\n\t\t\treasonClass: FlowReasonClassSchema,\n\t\t}),\n\t),\n\tevent(\n\t\t\"attempt\",\n\t\tStrictObject({\n\t\t\ttaskId: FlowIdSchema,\n\t\t\trole: FlowRoleSchema,\n\t\t\tattempt: FlowPositiveIntSchema,\n\t\t\tstate: lit(\"started\", \"succeeded\", \"failed\", \"retried\", \"cancelled\"),\n\t\t\tfailureClass: Type.Optional(FlowFailureClassSchema),\n\t\t}),\n\t),\n\tevent(\n\t\t\"request_usage\",\n\t\tStrictObject({\n\t\t\trequestId: FlowIdSchema,\n\t\t\ttaskId: FlowIdSchema,\n\t\t\trole: FlowRoleSchema,\n\t\t\tmodel: EventModelRefSchema,\n\t\t\tinputTokens: FlowCountSchema,\n\t\t\toutputTokens: FlowCountSchema,\n\t\t\tcacheReadTokens: FlowCountSchema,\n\t\t\tcacheWriteTokens: FlowCountSchema,\n\t\t\tcostMicrousd: Type.Union([FlowMicrousdSchema, Type.Null()]),\n\t\t\tcostBasis: lit(\"reported\", \"estimated\", \"unknown\"),\n\t\t\tdurationMs: FlowCountSchema,\n\t\t}),\n\t),\n\tevent(\n\t\t\"verdict\",\n\t\tStrictObject({\n\t\t\tstage: lit(\"check\", \"review\", \"qa\"),\n\t\t\ttaskId: FlowIdSchema,\n\t\t\tverdict: lit(\"pass\", \"fail\", \"blocked\"),\n\t\t\tfindingsCount: FlowCountSchema,\n\t\t\tcheckId: Type.Optional(FlowIdSchema),\n\t\t}),\n\t),\n\tevent(\n\t\t\"budget\",\n\t\tStrictObject({\n\t\t\tspentMicrousd: FlowMicrousdSchema,\n\t\t\tcapMicrousd: FlowMicrousdSchema,\n\t\t\tpct: Type.Number({ minimum: 0, maximum: 100 }),\n\t\t\tstate: lit(\"ok\", \"warn\", \"stop\"),\n\t\t}),\n\t),\n\tevent(\n\t\t\"control\",\n\t\tStrictObject({\n\t\t\taction: lit(\"pause\", \"resume\", \"cancel\", \"message\", \"status\"),\n\t\t\tcommandId: FlowIdSchema,\n\t\t\tstate: lit(\"accepted\", \"applied\", \"rejected\"),\n\t\t\tlatencyMs: FlowCountSchema,\n\t\t}),\n\t),\n\tevent(\n\t\t\"message\",\n\t\tStrictObject({\n\t\t\tmessageId: FlowIdSchema,\n\t\t\tdisposition: lit(\"live\", \"queued\", \"rejected\"),\n\t\t\ttargetRole: FlowRoleSchema,\n\t\t\ttextSha256: FlowDigestSchema,\n\t\t\ttextLength: Type.Integer({ minimum: 1, maximum: 16_000 }),\n\t\t}),\n\t),\n\tevent(\n\t\t\"run_settled\",\n\t\tStrictObject({\n\t\t\toutcome: lit(\"succeeded\", \"failed\", \"cancelled\", \"budget_stopped\", \"interrupted\"),\n\t\t\tfailureClass: Type.Optional(FlowFailureClassSchema),\n\t\t\tsettledCleanly: Type.Boolean(),\n\t\t\t// Subset of the two retry modes offered to the user; unique, order-free (full offer = both).\n\t\t\tretryOffer: Type.Array(lit(\"flow\", \"direct\"), { maxItems: 2, uniqueItems: true }),\n\t\t\ttotals: partialByRole(RoleTotals),\n\t\t}),\n\t),\n\tevent(\n\t\t\"warning\",\n\t\tStrictObject({\n\t\t\treason: lit(...FLOW_WARNING_REASONS),\n\t\t\t// Opaque check ids (the same ids `verdict.checkId` uses), never check names or commands.\n\t\t\tcheckIds: Type.Array(FlowIdSchema, { minItems: 1, maxItems: 16, uniqueItems: true }),\n\t\t}),\n\t),\n]);\nexport type FlowEventV1 = Static<typeof FlowEventV1Schema>;\n\nconst Validator = compileFlow(FlowEventV1Schema);\n\n/** `request_usage.costMicrousd` is null exactly when `costBasis` is \"unknown\"; never 0 for unknown. */\nfunction crossFieldsValid(doc: FlowEventV1): boolean {\n\tif (doc.kind === \"request_usage\")\n\t\treturn (doc.payload.costMicrousd === null) === (doc.payload.costBasis === \"unknown\");\n\treturn true;\n}\n\nfunction isEvent(value: unknown): value is FlowEventV1 {\n\treturn Validator.Check(value) && crossFieldsValid(value);\n}\n\n/** Validates a plain-data snapshot of `input` and returns the snapshot (never the caller's object). */\nexport function parseFlowEventV1(input: unknown): FlowEventV1 {\n\treturn parseFlowData(\"event_invalid\", input, isEvent);\n}\n"]}
|