@humain/humain-code-contracts 0.4.14 → 0.4.17
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 +27 -0
- package/dist/flow-admission.d.ts +10 -0
- package/dist/flow-admission.d.ts.map +1 -1
- package/dist/flow-admission.js +2 -0
- package/dist/flow-admission.js.map +1 -1
- package/dist/flow-common.d.ts +3 -3
- package/dist/flow-common.d.ts.map +1 -1
- package/dist/flow-common.js +4 -0
- package/dist/flow-common.js.map +1 -1
- package/dist/flow-control.d.ts +13 -6
- package/dist/flow-control.d.ts.map +1 -1
- package/dist/flow-control.js +12 -3
- package/dist/flow-control.js.map +1 -1
- package/dist/flow-events.d.ts +188 -6
- package/dist/flow-events.d.ts.map +1 -1
- package/dist/flow-events.js +95 -1
- package/dist/flow-events.js.map +1 -1
- package/dist/flow-profile.d.ts +14 -0
- package/dist/flow-profile.d.ts.map +1 -1
- package/dist/flow-profile.js +12 -0
- package/dist/flow-profile.js.map +1 -1
- package/dist/rpc.d.ts +1 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +22 -2
- package/dist/rpc.js.map +1 -1
- package/package.json +3 -3
package/dist/flow-profile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-profile.js","sourceRoot":"","sources":["../src/flow-profile.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, type TObject, type TOptional, type TSchema, Type } from \"typebox\";\nimport {\n\tcanonicalWithout,\n\tcompileFlow,\n\tFlowContractError,\n\ttype FlowDigestHasher,\n\tFlowDigestSchema,\n\tFlowIdSchema,\n\tFlowMicrousdSchema,\n\ttype FlowModelRef,\n\tFlowModelRefSchema,\n\tFlowPositiveIntSchema,\n\tFlowTimestampSchema,\n\thasDuplicateModels,\n\tlit,\n\tparseFlowData,\n\tpartialByRole,\n\tStrictObject,\n\tverifyFlowDigest,\n} from \"./flow-common.ts\";\n\nexport { FlowProfileRefSchema, type FlowProfileRefV1 } from \"./flow-common.ts\";\n\nexport const FlowEffortSchema = Type.Union([Type.Literal(\"low\"), Type.Literal(\"medium\"), Type.Literal(\"high\")]);\n\nexport const FlowRoleBindingSchema = StrictObject({\n\tprimary: FlowModelRefSchema,\n\tbackups: Type.Array(FlowModelRefSchema, { maxItems: 8 }),\n\teffort: FlowEffortSchema,\n});\nexport type FlowRoleBindingV1 = Static<typeof FlowRoleBindingSchema>;\n\n/** Cost tiers a selection may declare (matches Flow's `Tier`). */\nexport const FLOW_MODEL_SELECTION_TIERS = [\"cheap\", \"mid\", \"premium\", \"frontier\"] as const;\nexport type FlowSelectionTier = (typeof FLOW_MODEL_SELECTION_TIERS)[number];\n\n/** Flow's `ALL_CAPABILITIES` (method.json) plus the runtime `triage` capability; parity is pinned in the flow tests. */\nexport const FLOW_MODEL_SELECTION_CAPABILITIES = [\n\t\"scout\",\n\t\"scope_scout\",\n\t\"worker\",\n\t\"implementation_fast\",\n\t\"analysis_mid\",\n\t\"technical_lead\",\n\t\"lead_small\",\n\t\"lead\",\n\t\"lead_large\",\n\t\"implementation_strong\",\n\t\"technical_review\",\n\t\"integration_review\",\n\t\"migration_review\",\n\t\"performance_review\",\n\t\"api_contract_review\",\n\t\"qa_agent\",\n\t\"analysis_strong\",\n\t\"architect\",\n\t\"security_review\",\n\t\"triage\",\n] as const;\nexport type FlowSelectionCapability = (typeof FLOW_MODEL_SELECTION_CAPABILITIES)[number];\n\nexport const FlowSelectionEffortSchema = lit(\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\");\n\n/** Omitted `backups` inherits; an explicit `[]` means no fallbacks. Both must survive round-trips. */\nexport const FlowTierSelectionSchema = StrictObject({\n\tprimary: Type.Optional(FlowModelRefSchema),\n\tbackups: Type.Optional(Type.Array(FlowModelRefSchema, { maxItems: 8 })),\n});\nexport type FlowTierSelectionV1 = Static<typeof FlowTierSelectionSchema>;\n\nexport const FlowCapabilitySelectionSchema = StrictObject({\n\tprimary: Type.Optional(FlowModelRefSchema),\n\tbackups: Type.Optional(Type.Array(FlowModelRefSchema, { maxItems: 8 })),\n\teffort: Type.Optional(FlowSelectionEffortSchema),\n});\nexport type FlowCapabilitySelectionV1 = Static<typeof FlowCapabilitySelectionSchema>;\n\nconst optionalEach = <T extends TSchema>(keys: readonly string[], schema: T) =>\n\tStrictObject(Object.fromEntries(keys.map((key) => [key, Type.Optional(schema)])));\n\nexport const FlowModelSelectionSchema = StrictObject({\n\ttiers: Type.Optional(\n\t\toptionalEach(FLOW_MODEL_SELECTION_TIERS, FlowTierSelectionSchema) as TObject<\n\t\t\tRecord<FlowSelectionTier, TOptional<typeof FlowTierSelectionSchema>>\n\t\t>,\n\t),\n\tcapabilities: Type.Optional(\n\t\toptionalEach(FLOW_MODEL_SELECTION_CAPABILITIES, FlowCapabilitySelectionSchema) as TObject<\n\t\t\tRecord<FlowSelectionCapability, TOptional<typeof FlowCapabilitySelectionSchema>>\n\t\t>,\n\t),\n});\nexport type FlowModelSelectionV1 = Static<typeof FlowModelSelectionSchema>;\n\nexport const FlowProfileV1Schema = StrictObject({\n\tschema: Type.Literal(\"humain-flow-profile\"),\n\tschemaVersion: Type.Literal(1),\n\tid: FlowIdSchema,\n\tversion: FlowPositiveIntSchema,\n\tdigest: FlowDigestSchema,\n\tkind: Type.Union([Type.Literal(\"direct\"), Type.Literal(\"flow\")]),\n\tlabel: Type.String({ minLength: 1, maxLength: 80 }),\n\tdescription: Type.Optional(Type.String({ maxLength: 500 })),\n\tdirect: Type.Optional(\n\t\tStrictObject({ model: FlowModelRefSchema, fallbacks: Type.Array(FlowModelRefSchema, { maxItems: 8 }) }),\n\t),\n\troles: Type.Optional(partialByRole(FlowRoleBindingSchema)),\n\tsizing: Type.Optional(\n\t\tStrictObject({\n\t\t\tclassifierPolicyId: FlowIdSchema,\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\ttriageRole: Type.Literal(\"triage\"),\n\t\t\tmaxEscalations: Type.Union([Type.Literal(0), Type.Literal(1)]),\n\t\t}),\n\t),\n\tlimits: StrictObject({\n\t\tmaxAgents: Type.Integer({ minimum: 1, maximum: 256 }),\n\t\tmaxConcurrent: Type.Integer({ minimum: 1, maximum: 64 }),\n\t\tmaxDepth: Type.Integer({ minimum: 0, maximum: 3 }),\n\t\tmaxRetries: Type.Integer({ minimum: 0, maximum: 16 }),\n\t\tinactivityMs: Type.Integer({ minimum: 1, maximum: 86_400_000 }),\n\t\tciWaitMs: Type.Integer({ minimum: 0, maximum: 86_400_000 }),\n\t}),\n\tspend: StrictObject({\n\t\trunCapMicrousd: FlowMicrousdSchema,\n\t\twarnAtPct: Type.Integer({ minimum: 1, maximum: 99 }),\n\t\tperRoleCapMicrousd: Type.Optional(partialByRole(FlowMicrousdSchema)),\n\t}),\n\tmodelSelection: Type.Optional(FlowModelSelectionSchema),\n\tproviders: Type.Optional(StrictObject({ preference: Type.Array(FlowIdSchema, { maxItems: 16 }) })),\n\tapproval: Type.Optional(StrictObject({ approvedBy: FlowIdSchema, approvedAt: FlowTimestampSchema })),\n\tbuiltIn: Type.Optional(Type.Literal(true)),\n});\nexport type FlowProfileV1 = Static<typeof FlowProfileV1Schema>;\n\nconst Validator = compileFlow(FlowProfileV1Schema);\nconst REQUIRED_FLOW_ROLES = [\"lead\", \"worker\", \"reviewer\", \"qa\"] as const;\n\n/** Canonical text hashed (sha256 hex) to produce `digest`: the document without `digest`. */\nexport function flowProfileDigestInput(doc: FlowProfileV1): string {\n\treturn canonicalWithout(doc, \"digest\");\n}\n\nfunction selectionLayerValid(layer: FlowTierSelectionV1 | FlowCapabilitySelectionV1): boolean {\n\tconst refs = [...(layer.primary === undefined ? [] : [layer.primary]), ...(layer.backups ?? [])];\n\treturn !hasDuplicateModels(refs);\n}\n\nfunction modelSelectionValid(selection: FlowModelSelectionV1): boolean {\n\tconst layers = [...Object.values(selection.tiers ?? {}), ...Object.values(selection.capabilities ?? {})];\n\treturn layers.every(selectionLayerValid);\n}\n\nfunction crossFieldsValid(doc: FlowProfileV1): boolean {\n\tif (doc.modelSelection !== undefined && (doc.kind === \"direct\" || !modelSelectionValid(doc.modelSelection))) {\n\t\treturn false;\n\t}\n\tif (doc.kind === \"direct\") {\n\t\tif (doc.direct === undefined || doc.roles !== undefined || doc.sizing !== undefined) return false;\n\t\treturn !hasDuplicateModels([doc.direct.model, ...doc.direct.fallbacks]);\n\t}\n\tif (doc.direct !== undefined || doc.roles === undefined) return false;\n\tfor (const role of REQUIRED_FLOW_ROLES) if (doc.roles[role] === undefined) return false;\n\tfor (const binding of Object.values(doc.roles)) {\n\t\tconst refs: FlowModelRef[] = [binding.primary, ...binding.backups];\n\t\tif (hasDuplicateModels(refs)) return false;\n\t}\n\treturn doc.sizing === undefined || doc.sizing.thresholds.mediumAt <= doc.sizing.thresholds.largeAt;\n}\n\nfunction isProfile(value: unknown): value is FlowProfileV1 {\n\treturn Validator.Check(value) && crossFieldsValid(value);\n}\n\n/**\n * SHAPE ONLY: validates structure and cross-field rules but does NOT verify `digest`. Use only for documents whose\n * integrity is established elsewhere (e.g. authored drafts); prefer {@link parseFlowProfileV1}.\n */\nexport function parseFlowProfileV1Shape(input: unknown): FlowProfileV1 {\n\treturn parseFlowData(\"profile_invalid\", input, isProfile);\n}\n\n/** Shape validation plus digest verification with the injected hasher (digests are integrity, not authentication). */\nexport function parseFlowProfileV1(input: unknown, hasher: FlowDigestHasher): FlowProfileV1 {\n\tconst profile = parseFlowProfileV1Shape(input);\n\tif (!verifyFlowDigest(hasher, flowProfileDigestInput(profile), profile.digest)) {\n\t\tthrow new FlowContractError(\"digest_mismatch\");\n\t}\n\treturn profile;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"flow-profile.js","sourceRoot":"","sources":["../src/flow-profile.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, type TObject, type TOptional, type TSchema, Type } from \"typebox\";\nimport {\n\tcanonicalWithout,\n\tcompileFlow,\n\tFlowContractError,\n\ttype FlowDigestHasher,\n\tFlowDigestSchema,\n\tFlowIdSchema,\n\tFlowMicrousdSchema,\n\ttype FlowModelRef,\n\tFlowModelRefSchema,\n\tFlowPositiveIntSchema,\n\tFlowTimestampSchema,\n\thasDuplicateModels,\n\tlit,\n\tparseFlowData,\n\tpartialByRole,\n\tStrictObject,\n\tverifyFlowDigest,\n} from \"./flow-common.ts\";\n\nexport { FlowProfileRefSchema, type FlowProfileRefV1 } from \"./flow-common.ts\";\n\nexport const FlowEffortSchema = Type.Union([Type.Literal(\"low\"), Type.Literal(\"medium\"), Type.Literal(\"high\")]);\n\nexport const FlowRoleBindingSchema = StrictObject({\n\tprimary: FlowModelRefSchema,\n\tbackups: Type.Array(FlowModelRefSchema, { maxItems: 8 }),\n\teffort: FlowEffortSchema,\n});\nexport type FlowRoleBindingV1 = Static<typeof FlowRoleBindingSchema>;\n\n/** Cost tiers a selection may declare (matches Flow's `Tier`). */\nexport const FLOW_MODEL_SELECTION_TIERS = [\"cheap\", \"mid\", \"premium\", \"frontier\"] as const;\nexport type FlowSelectionTier = (typeof FLOW_MODEL_SELECTION_TIERS)[number];\n\n/** Flow's `ALL_CAPABILITIES` (method.json) plus the runtime `triage` capability; parity is pinned in the flow tests. */\nexport const FLOW_MODEL_SELECTION_CAPABILITIES = [\n\t\"scout\",\n\t\"scope_scout\",\n\t\"worker\",\n\t\"implementation_fast\",\n\t\"analysis_mid\",\n\t\"technical_lead\",\n\t\"lead_small\",\n\t\"lead\",\n\t\"lead_large\",\n\t\"implementation_strong\",\n\t\"technical_review\",\n\t\"integration_review\",\n\t\"migration_review\",\n\t\"performance_review\",\n\t\"api_contract_review\",\n\t\"qa_agent\",\n\t\"analysis_strong\",\n\t\"architect\",\n\t\"security_review\",\n\t\"triage\",\n] as const;\nexport type FlowSelectionCapability = (typeof FLOW_MODEL_SELECTION_CAPABILITIES)[number];\n\nexport const FlowSelectionEffortSchema = lit(\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\");\n\n/** Omitted `backups` inherits; an explicit `[]` means no fallbacks. Both must survive round-trips. */\nexport const FlowTierSelectionSchema = StrictObject({\n\tprimary: Type.Optional(FlowModelRefSchema),\n\tbackups: Type.Optional(Type.Array(FlowModelRefSchema, { maxItems: 8 })),\n});\nexport type FlowTierSelectionV1 = Static<typeof FlowTierSelectionSchema>;\n\nexport const FlowCapabilitySelectionSchema = StrictObject({\n\tprimary: Type.Optional(FlowModelRefSchema),\n\tbackups: Type.Optional(Type.Array(FlowModelRefSchema, { maxItems: 8 })),\n\teffort: Type.Optional(FlowSelectionEffortSchema),\n});\nexport type FlowCapabilitySelectionV1 = Static<typeof FlowCapabilitySelectionSchema>;\n\nconst optionalEach = <T extends TSchema>(keys: readonly string[], schema: T) =>\n\tStrictObject(Object.fromEntries(keys.map((key) => [key, Type.Optional(schema)])));\n\nexport const FlowModelSelectionSchema = StrictObject({\n\ttiers: Type.Optional(\n\t\toptionalEach(FLOW_MODEL_SELECTION_TIERS, FlowTierSelectionSchema) as TObject<\n\t\t\tRecord<FlowSelectionTier, TOptional<typeof FlowTierSelectionSchema>>\n\t\t>,\n\t),\n\tcapabilities: Type.Optional(\n\t\toptionalEach(FLOW_MODEL_SELECTION_CAPABILITIES, FlowCapabilitySelectionSchema) as TObject<\n\t\t\tRecord<FlowSelectionCapability, TOptional<typeof FlowCapabilitySelectionSchema>>\n\t\t>,\n\t),\n});\nexport type FlowModelSelectionV1 = Static<typeof FlowModelSelectionSchema>;\n\nexport const FlowProfileV1Schema = StrictObject({\n\tschema: Type.Literal(\"humain-flow-profile\"),\n\tschemaVersion: Type.Literal(1),\n\tid: FlowIdSchema,\n\tversion: FlowPositiveIntSchema,\n\tdigest: FlowDigestSchema,\n\tkind: Type.Union([Type.Literal(\"direct\"), Type.Literal(\"flow\")]),\n\tlabel: Type.String({ minLength: 1, maxLength: 80 }),\n\tdescription: Type.Optional(Type.String({ maxLength: 500 })),\n\tdirect: Type.Optional(\n\t\tStrictObject({ model: FlowModelRefSchema, fallbacks: Type.Array(FlowModelRefSchema, { maxItems: 8 }) }),\n\t),\n\troles: Type.Optional(partialByRole(FlowRoleBindingSchema)),\n\tsizing: Type.Optional(\n\t\tStrictObject({\n\t\t\tclassifierPolicyId: FlowIdSchema,\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\ttriageRole: Type.Literal(\"triage\"),\n\t\t\t/** Opt in to the LLM triage call for rules-large runs. Default off: size comes from rules and repo signals. */\n\t\t\ttriage: Type.Optional(Type.Boolean()),\n\t\t\tmaxEscalations: Type.Union([Type.Literal(0), Type.Literal(1)]),\n\t\t}),\n\t),\n\tlimits: StrictObject({\n\t\tmaxAgents: Type.Integer({ minimum: 1, maximum: 256 }),\n\t\tmaxConcurrent: Type.Integer({ minimum: 1, maximum: 64 }),\n\t\tmaxDepth: Type.Integer({ minimum: 0, maximum: 3 }),\n\t\tmaxRetries: Type.Integer({ minimum: 0, maximum: 16 }),\n\t\tinactivityMs: Type.Integer({ minimum: 1, maximum: 86_400_000 }),\n\t\tciWaitMs: Type.Integer({ minimum: 0, maximum: 86_400_000 }),\n\t\t/** Wall-clock budget for the whole run; checks are capped by what remains and the run settles at it. */\n\t\trunDeadlineMs: Type.Optional(Type.Integer({ minimum: 60_000, maximum: 86_400_000 })),\n\t\t/** Per-check timeout for deterministic checks; replaces the method's default and is still capped by the run deadline. */\n\t\tcheckTimeoutMs: Type.Optional(Type.Integer({ minimum: 60_000, maximum: 86_400_000 })),\n\t\t/** Repair rounds a SMALL/MEDIUM run may spend on real deterministic check failures (default 2). */\n\t\trepairRounds: Type.Optional(Type.Integer({ minimum: 0, maximum: 4 })),\n\t\t/** verify-after: wall-clock budget for verification and repair, measured from `implementation_ready` (default 15 min). */\n\t\tverifyBudgetMs: Type.Optional(Type.Integer({ minimum: 60_000, maximum: 7_200_000 })),\n\t}),\n\t/** `after` publishes the result before verification finishes (verify-after); default `inline`. */\n\tverification: Type.Optional(StrictObject({ mode: Type.Union([Type.Literal(\"inline\"), Type.Literal(\"after\")]) })),\n\tspend: StrictObject({\n\t\trunCapMicrousd: FlowMicrousdSchema,\n\t\twarnAtPct: Type.Integer({ minimum: 1, maximum: 99 }),\n\t\tperRoleCapMicrousd: Type.Optional(partialByRole(FlowMicrousdSchema)),\n\t}),\n\tmodelSelection: Type.Optional(FlowModelSelectionSchema),\n\tproviders: Type.Optional(StrictObject({ preference: Type.Array(FlowIdSchema, { maxItems: 16 }) })),\n\tapproval: Type.Optional(StrictObject({ approvedBy: FlowIdSchema, approvedAt: FlowTimestampSchema })),\n\tbuiltIn: Type.Optional(Type.Literal(true)),\n});\nexport type FlowProfileV1 = Static<typeof FlowProfileV1Schema>;\n\nconst Validator = compileFlow(FlowProfileV1Schema);\nconst REQUIRED_FLOW_ROLES = [\"lead\", \"worker\", \"reviewer\", \"qa\"] as const;\n\n/** Canonical text hashed (sha256 hex) to produce `digest`: the document without `digest`. */\nexport function flowProfileDigestInput(doc: FlowProfileV1): string {\n\treturn canonicalWithout(doc, \"digest\");\n}\n\nfunction selectionLayerValid(layer: FlowTierSelectionV1 | FlowCapabilitySelectionV1): boolean {\n\tconst refs = [...(layer.primary === undefined ? [] : [layer.primary]), ...(layer.backups ?? [])];\n\treturn !hasDuplicateModels(refs);\n}\n\nfunction modelSelectionValid(selection: FlowModelSelectionV1): boolean {\n\tconst layers = [...Object.values(selection.tiers ?? {}), ...Object.values(selection.capabilities ?? {})];\n\treturn layers.every(selectionLayerValid);\n}\n\nfunction crossFieldsValid(doc: FlowProfileV1): boolean {\n\tif (doc.modelSelection !== undefined && (doc.kind === \"direct\" || !modelSelectionValid(doc.modelSelection))) {\n\t\treturn false;\n\t}\n\tif (doc.kind === \"direct\") {\n\t\tif (doc.direct === undefined || doc.roles !== undefined || doc.sizing !== undefined) return false;\n\t\treturn !hasDuplicateModels([doc.direct.model, ...doc.direct.fallbacks]);\n\t}\n\tif (doc.direct !== undefined || doc.roles === undefined) return false;\n\tfor (const role of REQUIRED_FLOW_ROLES) if (doc.roles[role] === undefined) return false;\n\tfor (const binding of Object.values(doc.roles)) {\n\t\tconst refs: FlowModelRef[] = [binding.primary, ...binding.backups];\n\t\tif (hasDuplicateModels(refs)) return false;\n\t}\n\treturn doc.sizing === undefined || doc.sizing.thresholds.mediumAt <= doc.sizing.thresholds.largeAt;\n}\n\nfunction isProfile(value: unknown): value is FlowProfileV1 {\n\treturn Validator.Check(value) && crossFieldsValid(value);\n}\n\n/**\n * SHAPE ONLY: validates structure and cross-field rules but does NOT verify `digest`. Use only for documents whose\n * integrity is established elsewhere (e.g. authored drafts); prefer {@link parseFlowProfileV1}.\n */\nexport function parseFlowProfileV1Shape(input: unknown): FlowProfileV1 {\n\treturn parseFlowData(\"profile_invalid\", input, isProfile);\n}\n\n/** Shape validation plus digest verification with the injected hasher (digests are integrity, not authentication). */\nexport function parseFlowProfileV1(input: unknown, hasher: FlowDigestHasher): FlowProfileV1 {\n\tconst profile = parseFlowProfileV1Shape(input);\n\tif (!verifyFlowDigest(hasher, flowProfileDigestInput(profile), profile.digest)) {\n\t\tthrow new FlowContractError(\"digest_mismatch\");\n\t}\n\treturn profile;\n}\n"]}
|
package/dist/rpc.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export declare const MAX_RPC_FRAME_LENGTH: number;
|
|
|
4
4
|
export declare const MAX_GET_STATE_RESPONSE_UTF8_BYTES: number;
|
|
5
5
|
export declare const MAX_GET_STATE_RESPONSE_CODE_UNITS: number;
|
|
6
6
|
export declare const SUBAGENT_PROGRESS_FIELD: "subagentProgress";
|
|
7
|
-
declare const FLOW_COMMAND_TYPES: readonly ["flow_status", "flow_pause", "flow_resume", "flow_cancel", "flow_message"];
|
|
7
|
+
declare const FLOW_COMMAND_TYPES: readonly ["flow_status", "flow_pause", "flow_resume", "flow_cancel", "flow_message", "flow_repair"];
|
|
8
8
|
type FlowCommandType = (typeof FLOW_COMMAND_TYPES)[number];
|
|
9
9
|
export type RpcWireCommand = {
|
|
10
10
|
id: string;
|
package/dist/rpc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAiC,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAMtG,eAAO,MAAM,oBAAoB,QAAmB,CAAC;AACrD,eAAO,MAAM,iCAAiC,QAAmB,CAAC;AAClE,eAAO,MAAM,iCAAiC,QAAmB,CAAC;AAClE,eAAO,MAAM,uBAAuB,EAAG,kBAA2B,CAAC;AAEnE,QAAA,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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"}
|
package/dist/rpc.js
CHANGED
|
@@ -7,11 +7,20 @@ export const MAX_RPC_FRAME_LENGTH = 16 * 1024 * 1024;
|
|
|
7
7
|
export const MAX_GET_STATE_RESPONSE_UTF8_BYTES = 16 * 1024 * 1024;
|
|
8
8
|
export const MAX_GET_STATE_RESPONSE_CODE_UNITS = 16 * 1024 * 1024;
|
|
9
9
|
export const SUBAGENT_PROGRESS_FIELD = "subagentProgress";
|
|
10
|
-
const FLOW_COMMAND_TYPES = [
|
|
10
|
+
const FLOW_COMMAND_TYPES = [
|
|
11
|
+
"flow_status",
|
|
12
|
+
"flow_pause",
|
|
13
|
+
"flow_resume",
|
|
14
|
+
"flow_cancel",
|
|
15
|
+
"flow_message",
|
|
16
|
+
"flow_repair",
|
|
17
|
+
];
|
|
11
18
|
const FLOW_ID_PATTERN = /^[a-z0-9][a-z0-9_.:-]{0,127}$/;
|
|
12
19
|
const FLOW_MESSAGE_MAX_LENGTH = 16_000;
|
|
13
20
|
const FLOW_RECEIPT_STATES = ["accepted", "applied", "rejected"];
|
|
14
|
-
const FLOW_CANCEL_REASONS = ["user", "budget", "shutdown", "kill_switch"];
|
|
21
|
+
const FLOW_CANCEL_REASONS = ["user", "budget", "shutdown", "kill_switch", "superseded"];
|
|
22
|
+
const FLOW_REPAIR_DECISIONS = ["grant", "deny"];
|
|
23
|
+
const FLOW_REPAIR_DENY_REASONS = ["user_edited", "busy", "policy"];
|
|
15
24
|
const FLOW_DISPOSITIONS = ["live", "queued", "rejected"];
|
|
16
25
|
// Mirrors FLOW_FAILURE_CLASSES + "size_underestimated" and FLOW_ROLES in ./flow-common (rpc.ts must stay import-free);
|
|
17
26
|
// test/rpc.test.ts keeps the lists in sync.
|
|
@@ -32,7 +41,9 @@ const FLOW_REASON_CLASSES = [
|
|
|
32
41
|
"internal",
|
|
33
42
|
"review_verdict_missing",
|
|
34
43
|
"verification_unavailable",
|
|
44
|
+
"unsupported_configuration",
|
|
35
45
|
"blocked",
|
|
46
|
+
"review_findings",
|
|
36
47
|
"size_underestimated",
|
|
37
48
|
];
|
|
38
49
|
const FLOW_ROLE_NAMES = [
|
|
@@ -349,6 +360,15 @@ function isRpcWireCommand(value) {
|
|
|
349
360
|
isFlowId(value.id) &&
|
|
350
361
|
isFlowId(value.runId) &&
|
|
351
362
|
FLOW_CANCEL_REASONS.includes(value.reason));
|
|
363
|
+
case "flow_repair":
|
|
364
|
+
return (hasExactKeys(value, ["id", "type", "runId", "round", "decision"], ["reason"]) &&
|
|
365
|
+
isFlowId(value.id) &&
|
|
366
|
+
isFlowId(value.runId) &&
|
|
367
|
+
Number.isInteger(value.round) &&
|
|
368
|
+
value.round >= 1 &&
|
|
369
|
+
value.round <= 4 &&
|
|
370
|
+
FLOW_REPAIR_DECISIONS.includes(value.decision) &&
|
|
371
|
+
(value.reason === undefined || FLOW_REPAIR_DENY_REASONS.includes(value.reason)));
|
|
352
372
|
case "flow_message":
|
|
353
373
|
return (hasExactKeys(value, ["id", "type", "runId", "messageId", "text"], ["target"]) &&
|
|
354
374
|
isFlowId(value.id) &&
|
package/dist/rpc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FlowControlCommandV1 } from \"./flow-control.ts\";\nimport { parseSubagentProgressSnapshot, type SubagentProgressSnapshot } from \"./subagent-progress.ts\";\n\nconst MAX_IDENTIFIER_LENGTH = 256;\nconst MAX_MESSAGE_LENGTH = 100_000;\nconst MAX_ERROR_LENGTH = 10_000;\nconst MAX_SESSION_PATH_LENGTH = 4_096;\nexport const MAX_RPC_FRAME_LENGTH = 16 * 1024 * 1024;\nexport const MAX_GET_STATE_RESPONSE_UTF8_BYTES = 16 * 1024 * 1024;\nexport const MAX_GET_STATE_RESPONSE_CODE_UNITS = 16 * 1024 * 1024;\nexport const SUBAGENT_PROGRESS_FIELD = \"subagentProgress\" as const;\n\nconst FLOW_COMMAND_TYPES = [\"flow_status\", \"flow_pause\", \"flow_resume\", \"flow_cancel\", \"flow_message\"] as const;\ntype FlowCommandType = (typeof FLOW_COMMAND_TYPES)[number];\nconst FLOW_ID_PATTERN = /^[a-z0-9][a-z0-9_.:-]{0,127}$/;\nconst FLOW_MESSAGE_MAX_LENGTH = 16_000;\nconst FLOW_RECEIPT_STATES = [\"accepted\", \"applied\", \"rejected\"];\nconst FLOW_CANCEL_REASONS = [\"user\", \"budget\", \"shutdown\", \"kill_switch\"];\nconst FLOW_DISPOSITIONS = [\"live\", \"queued\", \"rejected\"];\n// Mirrors FLOW_FAILURE_CLASSES + \"size_underestimated\" and FLOW_ROLES in ./flow-common (rpc.ts must stay import-free);\n// test/rpc.test.ts keeps the lists in sync.\nconst FLOW_REASON_CLASSES = [\n\t\"provider_error\",\n\t\"provider_unreachable\",\n\t\"rate_limit\",\n\t\"timeout\",\n\t\"check_failed\",\n\t\"review_rejected\",\n\t\"qa_failed\",\n\t\"budget_stop\",\n\t\"cancelled\",\n\t\"crash\",\n\t\"unsafe_scope\",\n\t\"stalled\",\n\t\"config_invalid\",\n\t\"internal\",\n\t\"review_verdict_missing\",\n\t\"verification_unavailable\",\n\t\"blocked\",\n\t\"size_underestimated\",\n];\nconst FLOW_ROLE_NAMES = [\n\t\"scout\",\n\t\"worker\",\n\t\"implementer\",\n\t\"lead\",\n\t\"lead_large\",\n\t\"architect\",\n\t\"reviewer\",\n\t\"security_reviewer\",\n\t\"qa\",\n\t\"triage\",\n];\nconst INVALID_FRAME_MESSAGE = \"Invalid HUMAIN Code CLI RPC frame\";\nconst INVALID_COMMAND_MESSAGE = \"Invalid HUMAIN Code CLI RPC command\";\nconst MAX_SNAPSHOT_DEPTH = 16;\nconst MAX_SNAPSHOT_NODES = 10_000;\n// The snapshot string cap must never be below any field limit; per-field limits are enforced after the snapshot.\nconst MAX_SNAPSHOT_STRING = Math.max(\n\tMAX_IDENTIFIER_LENGTH,\n\tMAX_MESSAGE_LENGTH,\n\tMAX_ERROR_LENGTH,\n\tMAX_SESSION_PATH_LENGTH,\n\tFLOW_MESSAGE_MAX_LENGTH,\n);\n\nexport type RpcWireCommand =\n\t| { id: string; type: \"prompt\"; message: string }\n\t| { id: string; type: \"abort\" }\n\t| { id: string; type: \"get_state\" }\n\t| { type: \"set_model\"; provider: string; modelId: string }\n\t| { id: string; type: \"switch_session\"; sessionPath: string }\n\t| FlowControlCommandV1;\n\nexport type RpcReadyFrame = {\n\ttype: \"ready\";\n\tprotocolVersion: 1;\n\tsessionId: string;\n\tpid: number;\n};\n\nexport type RpcResponseFrame = {\n\ttype: \"response\";\n\tid?: string;\n\tcommand: string;\n\tsuccess: boolean;\n\terror?: string;\n\tdata?: unknown;\n};\n\n/** Flow receipt: a `response` frame without `success`. Fully validated by `parseRpcWireFrame` (no TypeBox needed). */\nexport type RpcFlowReceiptFrame = {\n\ttype: \"response\";\n\tid: string;\n\tcommand: FlowCommandType;\n\tstate: \"accepted\" | \"applied\" | \"rejected\";\n\t[key: string]: unknown;\n};\n/**\n * Pushed flow frames: `parseRpcWireFrame` validates the ENVELOPE only (exactly `{type, event}` / `{type, status}`\n * with a plain-object payload) because rpc.ts must stay TypeBox-free. Consumers MUST pass `event` to\n * `parseFlowEventV1` (./flow-events) and `status` to `parseFlowStatusV1` (./flow-control) before using it.\n */\nexport type RpcFlowEventFrame = { type: \"flow_event\"; event: Record<string, unknown> };\nexport type RpcFlowStatusFrame = { type: \"flow_status\"; status: Record<string, unknown> };\n\nexport type RpcNativeEventFrame = { type: string; [key: string]: unknown };\nexport type RpcSubagentProgressMetadata = { subagentProgress?: SubagentProgressSnapshot };\nexport type RpcToolExecutionUpdateProgressFrame = RpcNativeEventFrame & {\n\ttype: \"tool_execution_update\";\n} & RpcSubagentProgressMetadata;\nexport type RpcToolExecutionEndProgressFrame = RpcNativeEventFrame & {\n\ttype: \"tool_execution_end\";\n} & RpcSubagentProgressMetadata;\nexport type RpcGetStateProgressData = Record<string, unknown> & RpcSubagentProgressMetadata;\nexport type RpcWireFrame =\n\t| RpcReadyFrame\n\t| RpcResponseFrame\n\t| RpcFlowReceiptFrame\n\t| RpcFlowEventFrame\n\t| RpcFlowStatusFrame\n\t| RpcNativeEventFrame;\n\nexport function encodeRpcWireCommand(command: RpcWireCommand): string {\n\tconst type = readOwnDiscriminant(command, \"type\", INVALID_COMMAND_MESSAGE);\n\tif (typeof type !== \"string\" || !type.startsWith(\"flow_\")) {\n\t\t// Legacy commands keep the contracts 0.3.3 validate-then-stringify behavior.\n\t\tif (!isRpcWireCommand(command)) throw new Error(INVALID_COMMAND_MESSAGE);\n\t\tconst encoded = JSON.stringify(command);\n\t\t// A proxy can answer differently per read; the serialized type must be the classified one.\n\t\tif ((JSON.parse(encoded) as { type?: unknown }).type !== type) throw new Error(INVALID_COMMAND_MESSAGE);\n\t\treturn `${encoded}\\n`;\n\t}\n\t// Flow commands: validate and serialize one plain-data snapshot so getters/proxies cannot change between check and write.\n\tlet snapshot: unknown;\n\ttry {\n\t\tsnapshot = snapshotPlainData(command, 0, { nodes: 0 });\n\t} catch {\n\t\tthrow new Error(INVALID_COMMAND_MESSAGE);\n\t}\n\tif (!isRpcWireCommand(snapshot)) throw new Error(INVALID_COMMAND_MESSAGE);\n\treturn `${JSON.stringify(snapshot)}\\n`;\n}\n\n/**\n * Reads a discriminant once as an OWN DATA property. Inherited or accessor discriminants throw: this is an\n * intentional, security-motivated exception to contracts 0.3.3 parity (a changing/inherited discriminant could\n * select the unvalidated path). Absent returns undefined. Non-records throw.\n */\nfunction readOwnDiscriminant(target: unknown, key: string, message: string): unknown {\n\tif (!isRecord(target)) throw new Error(message);\n\tlet descriptor: PropertyDescriptor | undefined;\n\tlet inherited = false;\n\ttry {\n\t\tdescriptor = Object.getOwnPropertyDescriptor(target, key);\n\t\tinherited = descriptor === undefined && key in target;\n\t} catch {\n\t\tthrow new Error(message);\n\t}\n\tif (inherited || (descriptor !== undefined && !(\"value\" in descriptor))) throw new Error(message);\n\treturn descriptor?.value;\n}\n\n/** Same rules as `snapshotFlowData` in ./flow-common (duplicated: this entry must not import anything). */\nfunction snapshotPlainData(value: unknown, depth: number, budget: { nodes: number }): unknown {\n\tbudget.nodes += 1;\n\tif (depth > MAX_SNAPSHOT_DEPTH || budget.nodes > MAX_SNAPSHOT_NODES) throw new Error(\"bounds\");\n\tif (value === null || typeof value === \"boolean\") return value;\n\tif (typeof value === \"string\") {\n\t\tif (value.length > MAX_SNAPSHOT_STRING || !value.isWellFormed()) throw new Error(\"string\");\n\t\treturn value;\n\t}\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) throw new Error(\"number\");\n\t\treturn value;\n\t}\n\tif (typeof value !== \"object\") throw new Error(\"type\");\n\tif (Array.isArray(value)) {\n\t\tconst length = value.length;\n\t\tif (length > MAX_SNAPSHOT_NODES) throw new Error(\"bounds\");\n\t\tfor (const key of Reflect.ownKeys(value)) {\n\t\t\tif (\n\t\t\t\ttypeof key !== \"string\" ||\n\t\t\t\t(key !== \"length\" &&\n\t\t\t\t\t!(\n\t\t\t\t\t\tNumber.isInteger(Number(key)) &&\n\t\t\t\t\t\tNumber(key) >= 0 &&\n\t\t\t\t\t\tNumber(key) < length &&\n\t\t\t\t\t\tString(Number(key)) === key\n\t\t\t\t\t))\n\t\t\t) {\n\t\t\t\tthrow new Error(\"array\");\n\t\t\t}\n\t\t}\n\t\tconst out: unknown[] = [];\n\t\tfor (let index = 0; index < length; index += 1) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n\t\t\tif (descriptor === undefined || !(\"value\" in descriptor)) throw new Error(\"array\");\n\t\t\tout.push(snapshotPlainData(descriptor.value, depth + 1, budget));\n\t\t}\n\t\treturn out;\n\t}\n\tconst proto = Object.getPrototypeOf(value);\n\tif (proto !== null && Object.getPrototypeOf(proto) !== null) throw new Error(\"prototype\");\n\tconst out: Record<string, unknown> = {};\n\tfor (const key of Reflect.ownKeys(value)) {\n\t\tif (typeof key !== \"string\" || !key.isWellFormed()) throw new Error(\"key\");\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\t\tif (descriptor === undefined || !(\"value\" in descriptor) || descriptor.enumerable !== true)\n\t\t\tthrow new Error(\"property\");\n\t\tif (descriptor.value === undefined) continue;\n\t\tObject.defineProperty(out, key, {\n\t\t\tvalue: snapshotPlainData(descriptor.value, depth + 1, budget),\n\t\t\tenumerable: true,\n\t\t\twritable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\t}\n\treturn out;\n}\n\n/**\n * One-level snapshot of a frame: own enumerable string-keyed DATA properties are copied (each read once); an\n * accessor, a throwing trap or a non-record is the constant invalid-frame error. Discriminants are read only from\n * the copy. Nested values are untouched here (native events pass through; flow frames are deep-snapshotted later).\n */\nfunction copyFrameData(frame: unknown): Record<string, unknown> {\n\ttry {\n\t\tif (!isRecord(frame)) throw new Error(\"record\");\n\t\tconst out: Record<string, unknown> = {};\n\t\tfor (const key of Reflect.ownKeys(frame)) {\n\t\t\tif (typeof key !== \"string\") continue;\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(frame, key);\n\t\t\tif (descriptor === undefined || descriptor.enumerable !== true) continue;\n\t\t\tif (!(\"value\" in descriptor)) throw new Error(\"accessor\");\n\t\t\tObject.defineProperty(out, key, {\n\t\t\t\tvalue: descriptor.value,\n\t\t\t\tenumerable: true,\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t});\n\t\t}\n\t\treturn out;\n\t} catch {\n\t\tthrow new Error(INVALID_FRAME_MESSAGE);\n\t}\n}\n\n/** Deep plain snapshot of an (already copied) flow frame. */\nfunction snapshotFlowFrame(frame: Record<string, unknown>): Record<string, unknown> {\n\ttry {\n\t\treturn snapshotPlainData(frame, 0, { nodes: 0 }) as Record<string, unknown>;\n\t} catch {\n\t\tthrow new Error(INVALID_FRAME_MESSAGE);\n\t}\n}\n\nfunction validateFlowFrame(\n\tframe: Record<string, unknown>,\n): RpcFlowReceiptFrame | RpcFlowEventFrame | RpcFlowStatusFrame {\n\tif (frame.type === \"flow_event\" || frame.type === \"flow_status\") {\n\t\tconst payload = frame.type === \"flow_event\" ? \"event\" : \"status\";\n\t\tif (!hasExactKeys(frame, [\"type\", payload], []) || !isRecord(frame[payload]))\n\t\t\tthrow new Error(INVALID_FRAME_MESSAGE);\n\t\treturn frame as RpcFlowEventFrame | RpcFlowStatusFrame;\n\t}\n\tif (!isFlowReceiptFrame(frame)) throw new Error(INVALID_FRAME_MESSAGE);\n\treturn frame as RpcFlowReceiptFrame;\n}\n\nexport function parseRpcWireFrame(input: unknown): RpcWireFrame {\n\tif (typeof input === \"string\" && input.length > MAX_RPC_FRAME_LENGTH) {\n\t\tthrow new Error(`HUMAIN Code CLI RPC frame exceeds the ${MAX_RPC_FRAME_LENGTH}-character limit`);\n\t}\n\tlet frame: unknown = input;\n\tif (typeof input === \"string\") {\n\t\ttry {\n\t\t\tframe = JSON.parse(input);\n\t\t} catch {\n\t\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t\t}\n\t}\n\t// ponytail: proxy frames are not defended (limit: in-process code building a proxy already controls the process).\n\tconst type = readOwnDiscriminant(frame, \"type\", INVALID_FRAME_MESSAGE);\n\tconst record = frame as Record<string, unknown>;\n\tconst command = type === \"response\" ? readOwnDiscriminant(record, \"command\", INVALID_FRAME_MESSAGE) : undefined;\n\tconst success = type === \"response\" ? readOwnDiscriminant(record, \"success\", INVALID_FRAME_MESSAGE) : undefined;\n\t// HC emits `{success:false,error}` for invalid flow_* commands and Flow handler exceptions; keep the legacy path.\n\tconst isLegacyErrorResponse = () =>\n\t\tsuccess === false && typeof Object.getOwnPropertyDescriptor(record, \"error\")?.value === \"string\";\n\tif (\n\t\ttype === \"flow_event\" ||\n\t\ttype === \"flow_status\" ||\n\t\t(type === \"response\" && typeof command === \"string\" && command.startsWith(\"flow_\") && !isLegacyErrorResponse())\n\t) {\n\t\tconst flowFrame = snapshotFlowFrame(copyFrameData(record));\n\t\treturn validateFlowFrame(flowFrame);\n\t}\n\tif (typeof type !== \"string\" || type.length === 0) {\n\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t}\n\tif (type === \"ready\") {\n\t\tif (\n\t\t\t!hasOnlyKeys(record, [\"type\", \"protocolVersion\", \"sessionId\", \"pid\"]) ||\n\t\t\trecord.protocolVersion !== 1 ||\n\t\t\t!isNonemptyBoundedString(record.sessionId, MAX_IDENTIFIER_LENGTH) ||\n\t\t\t!Number.isSafeInteger(record.pid) ||\n\t\t\t(record.pid as number) <= 0\n\t\t) {\n\t\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t\t}\n\t\treturn record as RpcReadyFrame;\n\t}\n\tif (type === \"response\") {\n\t\tif (\n\t\t\t!hasOnlyKeys(record, [\"type\", \"id\", \"command\", \"success\", \"error\", \"data\"]) ||\n\t\t\t(record.id !== undefined && !isNonemptyBoundedString(record.id, MAX_IDENTIFIER_LENGTH)) ||\n\t\t\t!isNonemptyBoundedString(command, MAX_IDENTIFIER_LENGTH) ||\n\t\t\ttypeof success !== \"boolean\" ||\n\t\t\t(record.error !== undefined && !isBoundedString(record.error, MAX_ERROR_LENGTH))\n\t\t) {\n\t\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t\t}\n\t\treturn record as RpcResponseFrame;\n\t}\n\treturn frame as RpcNativeEventFrame;\n}\n\n/**\n * Reads optional subagent progress metadata. Absent field means unsupported/unavailable\n * (returns undefined); a present field is strictly parsed and throws when invalid.\n * Update/end piggyback envelopes must carry exactly one run (0 or 2+ throws); get_state accepts 0..64 runs.\n * No other frame fields are inspected or validated.\n */\nexport function readRpcSubagentProgress(frame: RpcWireFrame): SubagentProgressSnapshot | undefined {\n\ttry {\n\t\treturn extractRpcSubagentProgress(frame);\n\t} catch {\n\t\tthrow new Error(INVALID_PROGRESS_MESSAGE);\n\t}\n}\n\nconst INVALID_PROGRESS_MESSAGE = \"Invalid subagent progress snapshot\";\n\n/** Own data property lookup: never invokes getters; `inherited` is true when only a non-own property exists. */\nfunction readOwnData(target: object, key: string): { found: boolean; value?: unknown; inherited: boolean } {\n\tconst descriptor = Object.getOwnPropertyDescriptor(target, key);\n\tif (descriptor === undefined) return { found: false, inherited: key in target };\n\tif (!(\"value\" in descriptor)) throw new Error(INVALID_PROGRESS_MESSAGE);\n\treturn { found: true, value: descriptor.value, inherited: false };\n}\n\nfunction extractRpcSubagentProgress(frame: RpcWireFrame): SubagentProgressSnapshot | undefined {\n\tif (!isRecord(frame)) return undefined;\n\tconst type = readOwnData(frame, \"type\").value;\n\tlet carrier: unknown;\n\tlet singleRun = false;\n\tif (type === \"tool_execution_update\" || type === \"tool_execution_end\") {\n\t\tcarrier = frame;\n\t\tsingleRun = true;\n\t} else if (type === \"response\") {\n\t\tif (readOwnData(frame, \"command\").value !== \"get_state\" || readOwnData(frame, \"success\").value !== true) {\n\t\t\treturn undefined;\n\t\t}\n\t\tcarrier = readOwnData(frame, \"data\").value;\n\t} else {\n\t\treturn undefined;\n\t}\n\tif (!isRecord(carrier)) return undefined;\n\tconst field = readOwnData(carrier, SUBAGENT_PROGRESS_FIELD);\n\tif (field.inherited) throw new Error(INVALID_PROGRESS_MESSAGE);\n\tif (!field.found) return undefined;\n\tconst snapshot = parseSubagentProgressSnapshot(field.value);\n\tif (singleRun && snapshot.runs.length !== 1) throw new Error(INVALID_PROGRESS_MESSAGE);\n\treturn snapshot;\n}\n\nfunction isRpcWireCommand(value: unknown): value is RpcWireCommand {\n\tif (!isRecord(value)) return false;\n\tswitch (value.type) {\n\t\tcase \"prompt\":\n\t\t\treturn (\n\t\t\t\thasOnlyKeys(value, [\"id\", \"type\", \"message\"]) &&\n\t\t\t\tisNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH) &&\n\t\t\t\tisNonemptyBoundedString(value.message, MAX_MESSAGE_LENGTH)\n\t\t\t);\n\t\tcase \"abort\":\n\t\tcase \"get_state\":\n\t\t\treturn hasOnlyKeys(value, [\"id\", \"type\"]) && isNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH);\n\t\tcase \"set_model\":\n\t\t\treturn (\n\t\t\t\thasOnlyKeys(value, [\"type\", \"provider\", \"modelId\"]) &&\n\t\t\t\tisNonemptyBoundedString(value.provider, MAX_IDENTIFIER_LENGTH) &&\n\t\t\t\tisNonemptyBoundedString(value.modelId, MAX_IDENTIFIER_LENGTH)\n\t\t\t);\n\t\tcase \"switch_session\":\n\t\t\treturn (\n\t\t\t\thasOnlyKeys(value, [\"id\", \"type\", \"sessionPath\"]) &&\n\t\t\t\tisNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH) &&\n\t\t\t\tisNonemptyBoundedString(value.sessionPath, MAX_SESSION_PATH_LENGTH)\n\t\t\t);\n\t\tcase \"flow_status\":\n\t\t\treturn (\n\t\t\t\thasExactKeys(value, [\"id\", \"type\"], [\"runId\"]) &&\n\t\t\t\tisFlowId(value.id) &&\n\t\t\t\t(!(\"runId\" in value) || isFlowId(value.runId))\n\t\t\t);\n\t\tcase \"flow_pause\":\n\t\tcase \"flow_resume\":\n\t\t\treturn hasExactKeys(value, [\"id\", \"type\", \"runId\"], []) && isFlowId(value.id) && isFlowId(value.runId);\n\t\tcase \"flow_cancel\":\n\t\t\treturn (\n\t\t\t\thasExactKeys(value, [\"id\", \"type\", \"runId\", \"reason\"], []) &&\n\t\t\t\tisFlowId(value.id) &&\n\t\t\t\tisFlowId(value.runId) &&\n\t\t\t\tFLOW_CANCEL_REASONS.includes(value.reason as string)\n\t\t\t);\n\t\tcase \"flow_message\":\n\t\t\treturn (\n\t\t\t\thasExactKeys(value, [\"id\", \"type\", \"runId\", \"messageId\", \"text\"], [\"target\"]) &&\n\t\t\t\tisFlowId(value.id) &&\n\t\t\t\tisFlowId(value.runId) &&\n\t\t\t\tisFlowId(value.messageId) &&\n\t\t\t\tisNonemptyBoundedString(value.text, FLOW_MESSAGE_MAX_LENGTH) &&\n\t\t\t\t(value.target === undefined ||\n\t\t\t\t\tvalue.target === \"lead\" ||\n\t\t\t\t\t(isRecord(value.target) && hasExactKeys(value.target, [\"taskId\"], []) && isFlowId(value.target.taskId)))\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nfunction isFlowCommandType(value: unknown): value is FlowCommandType {\n\treturn FLOW_COMMAND_TYPES.includes(value as FlowCommandType);\n}\n\nfunction isFlowId(value: unknown): value is string {\n\treturn typeof value === \"string\" && FLOW_ID_PATTERN.test(value);\n}\n\nfunction hasExactKeys(\n\tvalue: Record<string, unknown>,\n\trequired: readonly string[],\n\toptional: readonly string[],\n): boolean {\n\treturn (\n\t\tObject.keys(value).every((key) => required.includes(key) || optional.includes(key)) &&\n\t\trequired.every((key) => key in value)\n\t);\n}\n\n/** Full receipt validation (state, reason, terminationConfirmed only for cancel, disposition/deliveredTo only for messages). */\nfunction isFlowReceiptFrame(frame: Record<string, unknown>): boolean {\n\tconst message = frame.command === \"flow_message\";\n\tconst cancel = frame.command === \"flow_cancel\";\n\tif (\n\t\t!hasExactKeys(\n\t\t\tframe,\n\t\t\t[\"type\", \"id\", \"command\", \"state\", ...(message ? [\"messageId\", \"disposition\"] : [])],\n\t\t\t[\"reason\", ...(message ? [\"deliveredTo\"] : cancel ? [\"terminationConfirmed\"] : [])],\n\t\t) ||\n\t\tframe.type !== \"response\" ||\n\t\t!isFlowCommandType(frame.command) ||\n\t\t!isFlowId(frame.id) ||\n\t\t!FLOW_RECEIPT_STATES.includes(frame.state as string) ||\n\t\t(frame.reason !== undefined && !FLOW_REASON_CLASSES.includes(frame.reason as string))\n\t) {\n\t\treturn false;\n\t}\n\tif (cancel) return frame.terminationConfirmed === undefined || typeof frame.terminationConfirmed === \"boolean\";\n\tif (!message) return true;\n\tconst delivered = frame.deliveredTo;\n\treturn (\n\t\tisFlowId(frame.messageId) &&\n\t\tFLOW_DISPOSITIONS.includes(frame.disposition as string) &&\n\t\t(delivered === undefined ||\n\t\t\t(isRecord(delivered) &&\n\t\t\t\thasExactKeys(delivered, [\"taskId\", \"role\"], []) &&\n\t\t\t\tisFlowId(delivered.taskId) &&\n\t\t\t\tFLOW_ROLE_NAMES.includes(delivered.role as string)))\n\t);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNonemptyBoundedString(value: unknown, maxLength: number): value is string {\n\treturn typeof value === \"string\" && value.length > 0 && value.length <= maxLength;\n}\n\nfunction isBoundedString(value: unknown, maxLength: number): value is string {\n\treturn typeof value === \"string\" && value.length <= maxLength;\n}\n\nfunction hasOnlyKeys(value: Record<string, unknown>, allowed: readonly string[]): boolean {\n\tconst keys = Object.keys(value);\n\treturn keys.every((key) => allowed.includes(key)) && allowed.every((key) => key in value || isOptionalKey(key));\n}\n\nfunction isOptionalKey(key: string): boolean {\n\treturn key === \"id\" || key === \"error\" || key === \"data\";\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FlowControlCommandV1 } from \"./flow-control.ts\";\nimport { parseSubagentProgressSnapshot, type SubagentProgressSnapshot } from \"./subagent-progress.ts\";\n\nconst MAX_IDENTIFIER_LENGTH = 256;\nconst MAX_MESSAGE_LENGTH = 100_000;\nconst MAX_ERROR_LENGTH = 10_000;\nconst MAX_SESSION_PATH_LENGTH = 4_096;\nexport const MAX_RPC_FRAME_LENGTH = 16 * 1024 * 1024;\nexport const MAX_GET_STATE_RESPONSE_UTF8_BYTES = 16 * 1024 * 1024;\nexport const MAX_GET_STATE_RESPONSE_CODE_UNITS = 16 * 1024 * 1024;\nexport const SUBAGENT_PROGRESS_FIELD = \"subagentProgress\" as const;\n\nconst FLOW_COMMAND_TYPES = [\n\t\"flow_status\",\n\t\"flow_pause\",\n\t\"flow_resume\",\n\t\"flow_cancel\",\n\t\"flow_message\",\n\t\"flow_repair\",\n] as const;\ntype FlowCommandType = (typeof FLOW_COMMAND_TYPES)[number];\nconst FLOW_ID_PATTERN = /^[a-z0-9][a-z0-9_.:-]{0,127}$/;\nconst FLOW_MESSAGE_MAX_LENGTH = 16_000;\nconst FLOW_RECEIPT_STATES = [\"accepted\", \"applied\", \"rejected\"];\nconst FLOW_CANCEL_REASONS = [\"user\", \"budget\", \"shutdown\", \"kill_switch\", \"superseded\"];\nconst FLOW_REPAIR_DECISIONS = [\"grant\", \"deny\"];\nconst FLOW_REPAIR_DENY_REASONS = [\"user_edited\", \"busy\", \"policy\"];\nconst FLOW_DISPOSITIONS = [\"live\", \"queued\", \"rejected\"];\n// Mirrors FLOW_FAILURE_CLASSES + \"size_underestimated\" and FLOW_ROLES in ./flow-common (rpc.ts must stay import-free);\n// test/rpc.test.ts keeps the lists in sync.\nconst FLOW_REASON_CLASSES = [\n\t\"provider_error\",\n\t\"provider_unreachable\",\n\t\"rate_limit\",\n\t\"timeout\",\n\t\"check_failed\",\n\t\"review_rejected\",\n\t\"qa_failed\",\n\t\"budget_stop\",\n\t\"cancelled\",\n\t\"crash\",\n\t\"unsafe_scope\",\n\t\"stalled\",\n\t\"config_invalid\",\n\t\"internal\",\n\t\"review_verdict_missing\",\n\t\"verification_unavailable\",\n\t\"unsupported_configuration\",\n\t\"blocked\",\n\t\"review_findings\",\n\t\"size_underestimated\",\n];\nconst FLOW_ROLE_NAMES = [\n\t\"scout\",\n\t\"worker\",\n\t\"implementer\",\n\t\"lead\",\n\t\"lead_large\",\n\t\"architect\",\n\t\"reviewer\",\n\t\"security_reviewer\",\n\t\"qa\",\n\t\"triage\",\n];\nconst INVALID_FRAME_MESSAGE = \"Invalid HUMAIN Code CLI RPC frame\";\nconst INVALID_COMMAND_MESSAGE = \"Invalid HUMAIN Code CLI RPC command\";\nconst MAX_SNAPSHOT_DEPTH = 16;\nconst MAX_SNAPSHOT_NODES = 10_000;\n// The snapshot string cap must never be below any field limit; per-field limits are enforced after the snapshot.\nconst MAX_SNAPSHOT_STRING = Math.max(\n\tMAX_IDENTIFIER_LENGTH,\n\tMAX_MESSAGE_LENGTH,\n\tMAX_ERROR_LENGTH,\n\tMAX_SESSION_PATH_LENGTH,\n\tFLOW_MESSAGE_MAX_LENGTH,\n);\n\nexport type RpcWireCommand =\n\t| { id: string; type: \"prompt\"; message: string }\n\t| { id: string; type: \"abort\" }\n\t| { id: string; type: \"get_state\" }\n\t| { type: \"set_model\"; provider: string; modelId: string }\n\t| { id: string; type: \"switch_session\"; sessionPath: string }\n\t| FlowControlCommandV1;\n\nexport type RpcReadyFrame = {\n\ttype: \"ready\";\n\tprotocolVersion: 1;\n\tsessionId: string;\n\tpid: number;\n};\n\nexport type RpcResponseFrame = {\n\ttype: \"response\";\n\tid?: string;\n\tcommand: string;\n\tsuccess: boolean;\n\terror?: string;\n\tdata?: unknown;\n};\n\n/** Flow receipt: a `response` frame without `success`. Fully validated by `parseRpcWireFrame` (no TypeBox needed). */\nexport type RpcFlowReceiptFrame = {\n\ttype: \"response\";\n\tid: string;\n\tcommand: FlowCommandType;\n\tstate: \"accepted\" | \"applied\" | \"rejected\";\n\t[key: string]: unknown;\n};\n/**\n * Pushed flow frames: `parseRpcWireFrame` validates the ENVELOPE only (exactly `{type, event}` / `{type, status}`\n * with a plain-object payload) because rpc.ts must stay TypeBox-free. Consumers MUST pass `event` to\n * `parseFlowEventV1` (./flow-events) and `status` to `parseFlowStatusV1` (./flow-control) before using it.\n */\nexport type RpcFlowEventFrame = { type: \"flow_event\"; event: Record<string, unknown> };\nexport type RpcFlowStatusFrame = { type: \"flow_status\"; status: Record<string, unknown> };\n\nexport type RpcNativeEventFrame = { type: string; [key: string]: unknown };\nexport type RpcSubagentProgressMetadata = { subagentProgress?: SubagentProgressSnapshot };\nexport type RpcToolExecutionUpdateProgressFrame = RpcNativeEventFrame & {\n\ttype: \"tool_execution_update\";\n} & RpcSubagentProgressMetadata;\nexport type RpcToolExecutionEndProgressFrame = RpcNativeEventFrame & {\n\ttype: \"tool_execution_end\";\n} & RpcSubagentProgressMetadata;\nexport type RpcGetStateProgressData = Record<string, unknown> & RpcSubagentProgressMetadata;\nexport type RpcWireFrame =\n\t| RpcReadyFrame\n\t| RpcResponseFrame\n\t| RpcFlowReceiptFrame\n\t| RpcFlowEventFrame\n\t| RpcFlowStatusFrame\n\t| RpcNativeEventFrame;\n\nexport function encodeRpcWireCommand(command: RpcWireCommand): string {\n\tconst type = readOwnDiscriminant(command, \"type\", INVALID_COMMAND_MESSAGE);\n\tif (typeof type !== \"string\" || !type.startsWith(\"flow_\")) {\n\t\t// Legacy commands keep the contracts 0.3.3 validate-then-stringify behavior.\n\t\tif (!isRpcWireCommand(command)) throw new Error(INVALID_COMMAND_MESSAGE);\n\t\tconst encoded = JSON.stringify(command);\n\t\t// A proxy can answer differently per read; the serialized type must be the classified one.\n\t\tif ((JSON.parse(encoded) as { type?: unknown }).type !== type) throw new Error(INVALID_COMMAND_MESSAGE);\n\t\treturn `${encoded}\\n`;\n\t}\n\t// Flow commands: validate and serialize one plain-data snapshot so getters/proxies cannot change between check and write.\n\tlet snapshot: unknown;\n\ttry {\n\t\tsnapshot = snapshotPlainData(command, 0, { nodes: 0 });\n\t} catch {\n\t\tthrow new Error(INVALID_COMMAND_MESSAGE);\n\t}\n\tif (!isRpcWireCommand(snapshot)) throw new Error(INVALID_COMMAND_MESSAGE);\n\treturn `${JSON.stringify(snapshot)}\\n`;\n}\n\n/**\n * Reads a discriminant once as an OWN DATA property. Inherited or accessor discriminants throw: this is an\n * intentional, security-motivated exception to contracts 0.3.3 parity (a changing/inherited discriminant could\n * select the unvalidated path). Absent returns undefined. Non-records throw.\n */\nfunction readOwnDiscriminant(target: unknown, key: string, message: string): unknown {\n\tif (!isRecord(target)) throw new Error(message);\n\tlet descriptor: PropertyDescriptor | undefined;\n\tlet inherited = false;\n\ttry {\n\t\tdescriptor = Object.getOwnPropertyDescriptor(target, key);\n\t\tinherited = descriptor === undefined && key in target;\n\t} catch {\n\t\tthrow new Error(message);\n\t}\n\tif (inherited || (descriptor !== undefined && !(\"value\" in descriptor))) throw new Error(message);\n\treturn descriptor?.value;\n}\n\n/** Same rules as `snapshotFlowData` in ./flow-common (duplicated: this entry must not import anything). */\nfunction snapshotPlainData(value: unknown, depth: number, budget: { nodes: number }): unknown {\n\tbudget.nodes += 1;\n\tif (depth > MAX_SNAPSHOT_DEPTH || budget.nodes > MAX_SNAPSHOT_NODES) throw new Error(\"bounds\");\n\tif (value === null || typeof value === \"boolean\") return value;\n\tif (typeof value === \"string\") {\n\t\tif (value.length > MAX_SNAPSHOT_STRING || !value.isWellFormed()) throw new Error(\"string\");\n\t\treturn value;\n\t}\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) throw new Error(\"number\");\n\t\treturn value;\n\t}\n\tif (typeof value !== \"object\") throw new Error(\"type\");\n\tif (Array.isArray(value)) {\n\t\tconst length = value.length;\n\t\tif (length > MAX_SNAPSHOT_NODES) throw new Error(\"bounds\");\n\t\tfor (const key of Reflect.ownKeys(value)) {\n\t\t\tif (\n\t\t\t\ttypeof key !== \"string\" ||\n\t\t\t\t(key !== \"length\" &&\n\t\t\t\t\t!(\n\t\t\t\t\t\tNumber.isInteger(Number(key)) &&\n\t\t\t\t\t\tNumber(key) >= 0 &&\n\t\t\t\t\t\tNumber(key) < length &&\n\t\t\t\t\t\tString(Number(key)) === key\n\t\t\t\t\t))\n\t\t\t) {\n\t\t\t\tthrow new Error(\"array\");\n\t\t\t}\n\t\t}\n\t\tconst out: unknown[] = [];\n\t\tfor (let index = 0; index < length; index += 1) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n\t\t\tif (descriptor === undefined || !(\"value\" in descriptor)) throw new Error(\"array\");\n\t\t\tout.push(snapshotPlainData(descriptor.value, depth + 1, budget));\n\t\t}\n\t\treturn out;\n\t}\n\tconst proto = Object.getPrototypeOf(value);\n\tif (proto !== null && Object.getPrototypeOf(proto) !== null) throw new Error(\"prototype\");\n\tconst out: Record<string, unknown> = {};\n\tfor (const key of Reflect.ownKeys(value)) {\n\t\tif (typeof key !== \"string\" || !key.isWellFormed()) throw new Error(\"key\");\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\t\tif (descriptor === undefined || !(\"value\" in descriptor) || descriptor.enumerable !== true)\n\t\t\tthrow new Error(\"property\");\n\t\tif (descriptor.value === undefined) continue;\n\t\tObject.defineProperty(out, key, {\n\t\t\tvalue: snapshotPlainData(descriptor.value, depth + 1, budget),\n\t\t\tenumerable: true,\n\t\t\twritable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\t}\n\treturn out;\n}\n\n/**\n * One-level snapshot of a frame: own enumerable string-keyed DATA properties are copied (each read once); an\n * accessor, a throwing trap or a non-record is the constant invalid-frame error. Discriminants are read only from\n * the copy. Nested values are untouched here (native events pass through; flow frames are deep-snapshotted later).\n */\nfunction copyFrameData(frame: unknown): Record<string, unknown> {\n\ttry {\n\t\tif (!isRecord(frame)) throw new Error(\"record\");\n\t\tconst out: Record<string, unknown> = {};\n\t\tfor (const key of Reflect.ownKeys(frame)) {\n\t\t\tif (typeof key !== \"string\") continue;\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(frame, key);\n\t\t\tif (descriptor === undefined || descriptor.enumerable !== true) continue;\n\t\t\tif (!(\"value\" in descriptor)) throw new Error(\"accessor\");\n\t\t\tObject.defineProperty(out, key, {\n\t\t\t\tvalue: descriptor.value,\n\t\t\t\tenumerable: true,\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t});\n\t\t}\n\t\treturn out;\n\t} catch {\n\t\tthrow new Error(INVALID_FRAME_MESSAGE);\n\t}\n}\n\n/** Deep plain snapshot of an (already copied) flow frame. */\nfunction snapshotFlowFrame(frame: Record<string, unknown>): Record<string, unknown> {\n\ttry {\n\t\treturn snapshotPlainData(frame, 0, { nodes: 0 }) as Record<string, unknown>;\n\t} catch {\n\t\tthrow new Error(INVALID_FRAME_MESSAGE);\n\t}\n}\n\nfunction validateFlowFrame(\n\tframe: Record<string, unknown>,\n): RpcFlowReceiptFrame | RpcFlowEventFrame | RpcFlowStatusFrame {\n\tif (frame.type === \"flow_event\" || frame.type === \"flow_status\") {\n\t\tconst payload = frame.type === \"flow_event\" ? \"event\" : \"status\";\n\t\tif (!hasExactKeys(frame, [\"type\", payload], []) || !isRecord(frame[payload]))\n\t\t\tthrow new Error(INVALID_FRAME_MESSAGE);\n\t\treturn frame as RpcFlowEventFrame | RpcFlowStatusFrame;\n\t}\n\tif (!isFlowReceiptFrame(frame)) throw new Error(INVALID_FRAME_MESSAGE);\n\treturn frame as RpcFlowReceiptFrame;\n}\n\nexport function parseRpcWireFrame(input: unknown): RpcWireFrame {\n\tif (typeof input === \"string\" && input.length > MAX_RPC_FRAME_LENGTH) {\n\t\tthrow new Error(`HUMAIN Code CLI RPC frame exceeds the ${MAX_RPC_FRAME_LENGTH}-character limit`);\n\t}\n\tlet frame: unknown = input;\n\tif (typeof input === \"string\") {\n\t\ttry {\n\t\t\tframe = JSON.parse(input);\n\t\t} catch {\n\t\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t\t}\n\t}\n\t// ponytail: proxy frames are not defended (limit: in-process code building a proxy already controls the process).\n\tconst type = readOwnDiscriminant(frame, \"type\", INVALID_FRAME_MESSAGE);\n\tconst record = frame as Record<string, unknown>;\n\tconst command = type === \"response\" ? readOwnDiscriminant(record, \"command\", INVALID_FRAME_MESSAGE) : undefined;\n\tconst success = type === \"response\" ? readOwnDiscriminant(record, \"success\", INVALID_FRAME_MESSAGE) : undefined;\n\t// HC emits `{success:false,error}` for invalid flow_* commands and Flow handler exceptions; keep the legacy path.\n\tconst isLegacyErrorResponse = () =>\n\t\tsuccess === false && typeof Object.getOwnPropertyDescriptor(record, \"error\")?.value === \"string\";\n\tif (\n\t\ttype === \"flow_event\" ||\n\t\ttype === \"flow_status\" ||\n\t\t(type === \"response\" && typeof command === \"string\" && command.startsWith(\"flow_\") && !isLegacyErrorResponse())\n\t) {\n\t\tconst flowFrame = snapshotFlowFrame(copyFrameData(record));\n\t\treturn validateFlowFrame(flowFrame);\n\t}\n\tif (typeof type !== \"string\" || type.length === 0) {\n\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t}\n\tif (type === \"ready\") {\n\t\tif (\n\t\t\t!hasOnlyKeys(record, [\"type\", \"protocolVersion\", \"sessionId\", \"pid\"]) ||\n\t\t\trecord.protocolVersion !== 1 ||\n\t\t\t!isNonemptyBoundedString(record.sessionId, MAX_IDENTIFIER_LENGTH) ||\n\t\t\t!Number.isSafeInteger(record.pid) ||\n\t\t\t(record.pid as number) <= 0\n\t\t) {\n\t\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t\t}\n\t\treturn record as RpcReadyFrame;\n\t}\n\tif (type === \"response\") {\n\t\tif (\n\t\t\t!hasOnlyKeys(record, [\"type\", \"id\", \"command\", \"success\", \"error\", \"data\"]) ||\n\t\t\t(record.id !== undefined && !isNonemptyBoundedString(record.id, MAX_IDENTIFIER_LENGTH)) ||\n\t\t\t!isNonemptyBoundedString(command, MAX_IDENTIFIER_LENGTH) ||\n\t\t\ttypeof success !== \"boolean\" ||\n\t\t\t(record.error !== undefined && !isBoundedString(record.error, MAX_ERROR_LENGTH))\n\t\t) {\n\t\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t\t}\n\t\treturn record as RpcResponseFrame;\n\t}\n\treturn frame as RpcNativeEventFrame;\n}\n\n/**\n * Reads optional subagent progress metadata. Absent field means unsupported/unavailable\n * (returns undefined); a present field is strictly parsed and throws when invalid.\n * Update/end piggyback envelopes must carry exactly one run (0 or 2+ throws); get_state accepts 0..64 runs.\n * No other frame fields are inspected or validated.\n */\nexport function readRpcSubagentProgress(frame: RpcWireFrame): SubagentProgressSnapshot | undefined {\n\ttry {\n\t\treturn extractRpcSubagentProgress(frame);\n\t} catch {\n\t\tthrow new Error(INVALID_PROGRESS_MESSAGE);\n\t}\n}\n\nconst INVALID_PROGRESS_MESSAGE = \"Invalid subagent progress snapshot\";\n\n/** Own data property lookup: never invokes getters; `inherited` is true when only a non-own property exists. */\nfunction readOwnData(target: object, key: string): { found: boolean; value?: unknown; inherited: boolean } {\n\tconst descriptor = Object.getOwnPropertyDescriptor(target, key);\n\tif (descriptor === undefined) return { found: false, inherited: key in target };\n\tif (!(\"value\" in descriptor)) throw new Error(INVALID_PROGRESS_MESSAGE);\n\treturn { found: true, value: descriptor.value, inherited: false };\n}\n\nfunction extractRpcSubagentProgress(frame: RpcWireFrame): SubagentProgressSnapshot | undefined {\n\tif (!isRecord(frame)) return undefined;\n\tconst type = readOwnData(frame, \"type\").value;\n\tlet carrier: unknown;\n\tlet singleRun = false;\n\tif (type === \"tool_execution_update\" || type === \"tool_execution_end\") {\n\t\tcarrier = frame;\n\t\tsingleRun = true;\n\t} else if (type === \"response\") {\n\t\tif (readOwnData(frame, \"command\").value !== \"get_state\" || readOwnData(frame, \"success\").value !== true) {\n\t\t\treturn undefined;\n\t\t}\n\t\tcarrier = readOwnData(frame, \"data\").value;\n\t} else {\n\t\treturn undefined;\n\t}\n\tif (!isRecord(carrier)) return undefined;\n\tconst field = readOwnData(carrier, SUBAGENT_PROGRESS_FIELD);\n\tif (field.inherited) throw new Error(INVALID_PROGRESS_MESSAGE);\n\tif (!field.found) return undefined;\n\tconst snapshot = parseSubagentProgressSnapshot(field.value);\n\tif (singleRun && snapshot.runs.length !== 1) throw new Error(INVALID_PROGRESS_MESSAGE);\n\treturn snapshot;\n}\n\nfunction isRpcWireCommand(value: unknown): value is RpcWireCommand {\n\tif (!isRecord(value)) return false;\n\tswitch (value.type) {\n\t\tcase \"prompt\":\n\t\t\treturn (\n\t\t\t\thasOnlyKeys(value, [\"id\", \"type\", \"message\"]) &&\n\t\t\t\tisNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH) &&\n\t\t\t\tisNonemptyBoundedString(value.message, MAX_MESSAGE_LENGTH)\n\t\t\t);\n\t\tcase \"abort\":\n\t\tcase \"get_state\":\n\t\t\treturn hasOnlyKeys(value, [\"id\", \"type\"]) && isNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH);\n\t\tcase \"set_model\":\n\t\t\treturn (\n\t\t\t\thasOnlyKeys(value, [\"type\", \"provider\", \"modelId\"]) &&\n\t\t\t\tisNonemptyBoundedString(value.provider, MAX_IDENTIFIER_LENGTH) &&\n\t\t\t\tisNonemptyBoundedString(value.modelId, MAX_IDENTIFIER_LENGTH)\n\t\t\t);\n\t\tcase \"switch_session\":\n\t\t\treturn (\n\t\t\t\thasOnlyKeys(value, [\"id\", \"type\", \"sessionPath\"]) &&\n\t\t\t\tisNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH) &&\n\t\t\t\tisNonemptyBoundedString(value.sessionPath, MAX_SESSION_PATH_LENGTH)\n\t\t\t);\n\t\tcase \"flow_status\":\n\t\t\treturn (\n\t\t\t\thasExactKeys(value, [\"id\", \"type\"], [\"runId\"]) &&\n\t\t\t\tisFlowId(value.id) &&\n\t\t\t\t(!(\"runId\" in value) || isFlowId(value.runId))\n\t\t\t);\n\t\tcase \"flow_pause\":\n\t\tcase \"flow_resume\":\n\t\t\treturn hasExactKeys(value, [\"id\", \"type\", \"runId\"], []) && isFlowId(value.id) && isFlowId(value.runId);\n\t\tcase \"flow_cancel\":\n\t\t\treturn (\n\t\t\t\thasExactKeys(value, [\"id\", \"type\", \"runId\", \"reason\"], []) &&\n\t\t\t\tisFlowId(value.id) &&\n\t\t\t\tisFlowId(value.runId) &&\n\t\t\t\tFLOW_CANCEL_REASONS.includes(value.reason as string)\n\t\t\t);\n\t\tcase \"flow_repair\":\n\t\t\treturn (\n\t\t\t\thasExactKeys(value, [\"id\", \"type\", \"runId\", \"round\", \"decision\"], [\"reason\"]) &&\n\t\t\t\tisFlowId(value.id) &&\n\t\t\t\tisFlowId(value.runId) &&\n\t\t\t\tNumber.isInteger(value.round) &&\n\t\t\t\t(value.round as number) >= 1 &&\n\t\t\t\t(value.round as number) <= 4 &&\n\t\t\t\tFLOW_REPAIR_DECISIONS.includes(value.decision as string) &&\n\t\t\t\t(value.reason === undefined || FLOW_REPAIR_DENY_REASONS.includes(value.reason as string))\n\t\t\t);\n\t\tcase \"flow_message\":\n\t\t\treturn (\n\t\t\t\thasExactKeys(value, [\"id\", \"type\", \"runId\", \"messageId\", \"text\"], [\"target\"]) &&\n\t\t\t\tisFlowId(value.id) &&\n\t\t\t\tisFlowId(value.runId) &&\n\t\t\t\tisFlowId(value.messageId) &&\n\t\t\t\tisNonemptyBoundedString(value.text, FLOW_MESSAGE_MAX_LENGTH) &&\n\t\t\t\t(value.target === undefined ||\n\t\t\t\t\tvalue.target === \"lead\" ||\n\t\t\t\t\t(isRecord(value.target) && hasExactKeys(value.target, [\"taskId\"], []) && isFlowId(value.target.taskId)))\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nfunction isFlowCommandType(value: unknown): value is FlowCommandType {\n\treturn FLOW_COMMAND_TYPES.includes(value as FlowCommandType);\n}\n\nfunction isFlowId(value: unknown): value is string {\n\treturn typeof value === \"string\" && FLOW_ID_PATTERN.test(value);\n}\n\nfunction hasExactKeys(\n\tvalue: Record<string, unknown>,\n\trequired: readonly string[],\n\toptional: readonly string[],\n): boolean {\n\treturn (\n\t\tObject.keys(value).every((key) => required.includes(key) || optional.includes(key)) &&\n\t\trequired.every((key) => key in value)\n\t);\n}\n\n/** Full receipt validation (state, reason, terminationConfirmed only for cancel, disposition/deliveredTo only for messages). */\nfunction isFlowReceiptFrame(frame: Record<string, unknown>): boolean {\n\tconst message = frame.command === \"flow_message\";\n\tconst cancel = frame.command === \"flow_cancel\";\n\tif (\n\t\t!hasExactKeys(\n\t\t\tframe,\n\t\t\t[\"type\", \"id\", \"command\", \"state\", ...(message ? [\"messageId\", \"disposition\"] : [])],\n\t\t\t[\"reason\", ...(message ? [\"deliveredTo\"] : cancel ? [\"terminationConfirmed\"] : [])],\n\t\t) ||\n\t\tframe.type !== \"response\" ||\n\t\t!isFlowCommandType(frame.command) ||\n\t\t!isFlowId(frame.id) ||\n\t\t!FLOW_RECEIPT_STATES.includes(frame.state as string) ||\n\t\t(frame.reason !== undefined && !FLOW_REASON_CLASSES.includes(frame.reason as string))\n\t) {\n\t\treturn false;\n\t}\n\tif (cancel) return frame.terminationConfirmed === undefined || typeof frame.terminationConfirmed === \"boolean\";\n\tif (!message) return true;\n\tconst delivered = frame.deliveredTo;\n\treturn (\n\t\tisFlowId(frame.messageId) &&\n\t\tFLOW_DISPOSITIONS.includes(frame.disposition as string) &&\n\t\t(delivered === undefined ||\n\t\t\t(isRecord(delivered) &&\n\t\t\t\thasExactKeys(delivered, [\"taskId\", \"role\"], []) &&\n\t\t\t\tisFlowId(delivered.taskId) &&\n\t\t\t\tFLOW_ROLE_NAMES.includes(delivered.role as string)))\n\t);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNonemptyBoundedString(value: unknown, maxLength: number): value is string {\n\treturn typeof value === \"string\" && value.length > 0 && value.length <= maxLength;\n}\n\nfunction isBoundedString(value: unknown, maxLength: number): value is string {\n\treturn typeof value === \"string\" && value.length <= maxLength;\n}\n\nfunction hasOnlyKeys(value: Record<string, unknown>, allowed: readonly string[]): boolean {\n\tconst keys = Object.keys(value);\n\treturn keys.every((key) => allowed.includes(key)) && allowed.every((key) => key in value || isOptionalKey(key));\n}\n\nfunction isOptionalKey(key: string): boolean {\n\treturn key === \"id\" || key === \"error\" || key === \"data\";\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@humain/humain-code-contracts",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.17",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Runtime-neutral HUMAIN Code CLI execution and RPC wire contracts",
|
|
6
6
|
"type": "module",
|
|
@@ -64,10 +64,10 @@
|
|
|
64
64
|
"prepublishOnly": "npm run clean && npm run build"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"typebox": "1.
|
|
67
|
+
"typebox": "1.4.1"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
|
-
"vitest": "5.0.
|
|
70
|
+
"vitest": "5.0.5"
|
|
71
71
|
},
|
|
72
72
|
"keywords": [
|
|
73
73
|
"humain-code",
|