From 833859039ffa6d54cc9db138e643e65514b5f1b4 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 21:52:21 -0700 Subject: [PATCH 01/19] iteration 1 --- fjs/media/json/module.f.ts | 26 +------------------------- fjs/media/json/rtti/module.f.ts | 24 ++++++++++++++++++++++++ fjs/media/json/schema/module.f.ts | 2 +- fjs/protocol/json_rpc/module.f.ts | 3 ++- fjs/protocol/mcp/module.f.ts | 3 ++- 5 files changed, 30 insertions(+), 28 deletions(-) create mode 100644 fjs/media/json/rtti/module.f.ts diff --git a/fjs/media/json/module.f.ts b/fjs/media/json/module.f.ts index 1ea2f8517..837159e01 100644 --- a/fjs/media/json/module.f.ts +++ b/fjs/media/json/module.f.ts @@ -22,34 +22,10 @@ import { at, definedEntries } from '../../types/object/module.f.mjs' import type { Entry as ObjectEntry } from '../../types/object/types.ts' import { compose, fn } from '../../types/function/module.f.mjs' import { objectWrap, arrayWrap, stringSerialize, numberSerialize, nullSerialize, boolSerialize } from './serializer/module.f.mjs' -import { boolean as rttiBoolean, number as rttiNumber, string as rttiString, or, record, array as rttiArray } from '../../types/rtti/module.f.mjs' import type { Ts } from '../../types/rtti/ts/types.ts' import type { Assert } from '../../asserts/types.ts' import type { Equal } from '../../types/ts/types.ts' - -// ── rtti schemas ────────────────────────────────────────────────────────────── - -/** rtti schema matching any JSON primitive: `null`, `boolean`, `number`, or `string`. */ -export const primitive = or(null, rttiBoolean, rttiNumber, rttiString) - -/** - * rtti schema matching any JSON value: a primitive, an array of JSON values, - * or an object whose values are JSON values. Self-referential via a thunk; - * rtti instantiates array/record item validators lazily so recursion terminates - * on acyclic input. - * - * A struct field typed `unknown` is **required when present** — unlike rtti - * core's `unknown`, the JSON `unknown` excludes `undefined`. - */ -export const unknown = () => ['or', primitive, object, array] as const - -/** - * rtti schema matching a JSON object: `{ readonly [k: string]?: Unknown }`. - */ -export const object = record(unknown) - -/** rtti schema matching a JSON array: `readonly Unknown[]`. */ -export const array = rttiArray(unknown) +import type { primitive, unknown } from './rtti/module.f.ts' // ── TypeScript types (derived from schemas — single source of truth) ────────── diff --git a/fjs/media/json/rtti/module.f.ts b/fjs/media/json/rtti/module.f.ts new file mode 100644 index 000000000..0898e6663 --- /dev/null +++ b/fjs/media/json/rtti/module.f.ts @@ -0,0 +1,24 @@ + +import { boolean as rttiBoolean, number as rttiNumber, string as rttiString, or, record, array as rttiArray } from '../../../types/rtti/module.f.mjs' + +/** rtti schema matching any JSON primitive: `null`, `boolean`, `number`, or `string`. */ +export const primitive = or(null, rttiBoolean, rttiNumber, rttiString) + +/** + * rtti schema matching any JSON value: a primitive, an array of JSON values, + * or an object whose values are JSON values. Self-referential via a thunk; + * rtti instantiates array/record item validators lazily so recursion terminates + * on acyclic input. + * + * A struct field typed `unknown` is **required when present** — unlike rtti + * core's `unknown`, the JSON `unknown` excludes `undefined`. + */ +export const unknown = () => ['or', primitive, object, array] as const + +/** + * rtti schema matching a JSON object: `{ readonly [k: string]?: Unknown }`. + */ +export const object = record(unknown) + +/** rtti schema matching a JSON array: `readonly Unknown[]`. */ +export const array = rttiArray(unknown) diff --git a/fjs/media/json/schema/module.f.ts b/fjs/media/json/schema/module.f.ts index 4022ea694..d0226112f 100644 --- a/fjs/media/json/schema/module.f.ts +++ b/fjs/media/json/schema/module.f.ts @@ -13,7 +13,7 @@ import type { Visitor } from '../../../types/rtti/common/types.ts' import type { Primitive } from '../../../djs/module.f.ts' import type { Ts } from '../../../types/rtti/ts/types.ts' import type { Phantom } from '../../../types/phantom/types.ts' -import { unknown as jsonUnknown } from '../module.f.ts' +import { unknown as jsonUnknown } from '../rtti/module.f.ts' const unknownThunk = () => ['const', unknownConst] as const diff --git a/fjs/protocol/json_rpc/module.f.ts b/fjs/protocol/json_rpc/module.f.ts index 6f761b360..fb8d127ff 100644 --- a/fjs/protocol/json_rpc/module.f.ts +++ b/fjs/protocol/json_rpc/module.f.ts @@ -18,7 +18,8 @@ import { number, string, or, option } from '../../types/rtti/module.f.mjs' import type { Ts } from '../../types/rtti/ts/types.ts' import { validate } from '../../types/rtti/validate/module.f.mjs' import type { Result } from '../../types/result/types.ts' -import { unknown, type Unknown } from '../../media/json/module.f.ts' +import { type Unknown } from '../../media/json/module.f.ts' +import { unknown } from '../../media/json/rtti/module.f.ts' export const jsonrpc = '2.0' as const diff --git a/fjs/protocol/mcp/module.f.ts b/fjs/protocol/mcp/module.f.ts index 579a92614..57e82ffb3 100644 --- a/fjs/protocol/mcp/module.f.ts +++ b/fjs/protocol/mcp/module.f.ts @@ -14,7 +14,7 @@ * @module */ import { boolean, string, option, array, record, or } from '../../types/rtti/module.f.mjs' -import { unknown, type Unknown } from '../../media/json/module.f.ts' +import { type Unknown } from '../../media/json/module.f.ts' import type { Ts } from '../../types/rtti/ts/types.ts' import { pure, step } from '../../effects/module.f.mjs' import type { Operation, Effect } from '../../effects/types.ts' @@ -29,6 +29,7 @@ import { import { validate } from '../../types/rtti/validate/module.f.mjs' import { toJsonSchema } from '../../media/json/schema/module.f.ts' import type { Type } from '../../types/rtti/types.ts' +import { unknown } from '../../media/json/rtti/module.f.ts' // ── Shared ───────────────────────────────────────────────────────────────────── From af7345e1efeb825efe0de2533c81601451c44a4d Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 21:58:23 -0700 Subject: [PATCH 02/19] Unknown --- fjs/media/json/rtti/module.f.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/fjs/media/json/rtti/module.f.ts b/fjs/media/json/rtti/module.f.ts index 0898e6663..4dc758e7a 100644 --- a/fjs/media/json/rtti/module.f.ts +++ b/fjs/media/json/rtti/module.f.ts @@ -1,9 +1,18 @@ -import { boolean as rttiBoolean, number as rttiNumber, string as rttiString, or, record, array as rttiArray } from '../../../types/rtti/module.f.mjs' +import { + boolean as rttiBoolean, + number as rttiNumber, + string as rttiString, + or, + record, + array as rttiArray +} from '../../../types/rtti/module.f.mjs' /** rtti schema matching any JSON primitive: `null`, `boolean`, `number`, or `string`. */ export const primitive = or(null, rttiBoolean, rttiNumber, rttiString) +export type Unknown = () => ['or', typeof primitive, typeof object, typeof array] + /** * rtti schema matching any JSON value: a primitive, an array of JSON values, * or an object whose values are JSON values. Self-referential via a thunk; @@ -13,7 +22,7 @@ export const primitive = or(null, rttiBoolean, rttiNumber, rttiString) * A struct field typed `unknown` is **required when present** — unlike rtti * core's `unknown`, the JSON `unknown` excludes `undefined`. */ -export const unknown = () => ['or', primitive, object, array] as const +export const unknown: Unknown = () => ['or', primitive, object, array] as const /** * rtti schema matching a JSON object: `{ readonly [k: string]?: Unknown }`. From e2a7df3bc5c613100111dbc5ac04aef9a939472c Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 21:59:19 -0700 Subject: [PATCH 03/19] ok --- fjs/media/json/module.f.ts | 2 +- fjs/media/json/rtti/{module.f.ts => module.f.mjs} | 6 ++++-- fjs/media/json/schema/module.f.ts | 2 +- fjs/protocol/json_rpc/module.f.ts | 2 +- fjs/protocol/mcp/module.f.ts | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) rename fjs/media/json/rtti/{module.f.ts => module.f.mjs} (85%) diff --git a/fjs/media/json/module.f.ts b/fjs/media/json/module.f.ts index 837159e01..f07176b18 100644 --- a/fjs/media/json/module.f.ts +++ b/fjs/media/json/module.f.ts @@ -25,7 +25,7 @@ import { objectWrap, arrayWrap, stringSerialize, numberSerialize, nullSerialize, import type { Ts } from '../../types/rtti/ts/types.ts' import type { Assert } from '../../asserts/types.ts' import type { Equal } from '../../types/ts/types.ts' -import type { primitive, unknown } from './rtti/module.f.ts' +import type { primitive, unknown } from './rtti/module.f.mjs' // ── TypeScript types (derived from schemas — single source of truth) ────────── diff --git a/fjs/media/json/rtti/module.f.ts b/fjs/media/json/rtti/module.f.mjs similarity index 85% rename from fjs/media/json/rtti/module.f.ts rename to fjs/media/json/rtti/module.f.mjs index 4dc758e7a..b04588ac2 100644 --- a/fjs/media/json/rtti/module.f.ts +++ b/fjs/media/json/rtti/module.f.mjs @@ -11,7 +11,7 @@ import { /** rtti schema matching any JSON primitive: `null`, `boolean`, `number`, or `string`. */ export const primitive = or(null, rttiBoolean, rttiNumber, rttiString) -export type Unknown = () => ['or', typeof primitive, typeof object, typeof array] +/** @typedef {() => ['or', typeof primitive, typeof object, typeof array]} Unknown */ /** * rtti schema matching any JSON value: a primitive, an array of JSON values, @@ -21,8 +21,10 @@ export type Unknown = () => ['or', typeof primitive, typeof object, typeof array * * A struct field typed `unknown` is **required when present** — unlike rtti * core's `unknown`, the JSON `unknown` excludes `undefined`. + * + * @type {Unknown} */ -export const unknown: Unknown = () => ['or', primitive, object, array] as const +export const unknown = () => ['or', primitive, object, array] /** * rtti schema matching a JSON object: `{ readonly [k: string]?: Unknown }`. diff --git a/fjs/media/json/schema/module.f.ts b/fjs/media/json/schema/module.f.ts index d0226112f..74517b329 100644 --- a/fjs/media/json/schema/module.f.ts +++ b/fjs/media/json/schema/module.f.ts @@ -13,7 +13,7 @@ import type { Visitor } from '../../../types/rtti/common/types.ts' import type { Primitive } from '../../../djs/module.f.ts' import type { Ts } from '../../../types/rtti/ts/types.ts' import type { Phantom } from '../../../types/phantom/types.ts' -import { unknown as jsonUnknown } from '../rtti/module.f.ts' +import { unknown as jsonUnknown } from '../rtti/module.f.mjs' const unknownThunk = () => ['const', unknownConst] as const diff --git a/fjs/protocol/json_rpc/module.f.ts b/fjs/protocol/json_rpc/module.f.ts index fb8d127ff..a4de67b9d 100644 --- a/fjs/protocol/json_rpc/module.f.ts +++ b/fjs/protocol/json_rpc/module.f.ts @@ -19,7 +19,7 @@ import type { Ts } from '../../types/rtti/ts/types.ts' import { validate } from '../../types/rtti/validate/module.f.mjs' import type { Result } from '../../types/result/types.ts' import { type Unknown } from '../../media/json/module.f.ts' -import { unknown } from '../../media/json/rtti/module.f.ts' +import { unknown } from '../../media/json/rtti/module.f.mjs' export const jsonrpc = '2.0' as const diff --git a/fjs/protocol/mcp/module.f.ts b/fjs/protocol/mcp/module.f.ts index 57e82ffb3..e14e4d06d 100644 --- a/fjs/protocol/mcp/module.f.ts +++ b/fjs/protocol/mcp/module.f.ts @@ -29,7 +29,7 @@ import { import { validate } from '../../types/rtti/validate/module.f.mjs' import { toJsonSchema } from '../../media/json/schema/module.f.ts' import type { Type } from '../../types/rtti/types.ts' -import { unknown } from '../../media/json/rtti/module.f.ts' +import { unknown } from '../../media/json/rtti/module.f.mjs' // ── Shared ───────────────────────────────────────────────────────────────────── From d30ee39aa612436caabb7d79ae9b88e4c381a412 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 22:32:32 -0700 Subject: [PATCH 04/19] second --- fjs/djs/module.f.ts | 2 +- fjs/media/json/module.f.ts | 5 +---- fjs/media/json/types.ts | 6 ++++++ 3 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 fjs/media/json/types.ts diff --git a/fjs/djs/module.f.ts b/fjs/djs/module.f.ts index 377d016ee..b492679ed 100644 --- a/fjs/djs/module.f.ts +++ b/fjs/djs/module.f.ts @@ -3,7 +3,7 @@ * * @module */ -import type { Primitive as JsonPrimitive } from '../media/json/module.f.ts' +import type { Primitive as JsonPrimitive } from '../media/json/types.ts' import { transpile } from './transpiler/module.f.ts' import { stringify, stringifyAsTree } from './serializer/module.f.ts' import { sort } from '../types/object/module.f.mjs' diff --git a/fjs/media/json/module.f.ts b/fjs/media/json/module.f.ts index f07176b18..42e78d463 100644 --- a/fjs/media/json/module.f.ts +++ b/fjs/media/json/module.f.ts @@ -26,10 +26,7 @@ import type { Ts } from '../../types/rtti/ts/types.ts' import type { Assert } from '../../asserts/types.ts' import type { Equal } from '../../types/ts/types.ts' import type { primitive, unknown } from './rtti/module.f.mjs' - -// ── TypeScript types (derived from schemas — single source of truth) ────────── - -export type Primitive = Ts +import type { Primitive } from './types.ts' export type Unknown = Object | Array | Primitive diff --git a/fjs/media/json/types.ts b/fjs/media/json/types.ts new file mode 100644 index 000000000..a63902a3c --- /dev/null +++ b/fjs/media/json/types.ts @@ -0,0 +1,6 @@ +import type { Assert } from "../../asserts/types.ts" +import type { Ts } from "../../types/rtti/ts/types.ts" +import type { Equal } from "../../types/ts/types.ts" +import type { primitive, unknown } from "./rtti/module.f.mjs" + +export type Primitive = Ts From 074b40a4998f9cf60f35968a940dab09f3ba34d3 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 22:46:59 -0700 Subject: [PATCH 05/19] second --- fjs/mcp/proof.f.ts | 4 +++- fjs/media/json/module.f.ts | 8 +------- fjs/media/json/parser/module.f.ts | 4 +++- fjs/media/json/schema/proof.f.ts | 4 +++- fjs/media/json/types.ts | 10 +++++++--- fjs/media/revision/module.f.ts | 5 ++++- fjs/media/revision/proof.f.ts | 3 ++- fjs/protocol/json_rpc/module.f.ts | 4 +++- fjs/protocol/mcp/module.f.ts | 3 ++- fjs/protocol/mcp/proof.f.ts | 3 ++- fjs/protocol/mcp/stdio/module.f.ts | 4 +++- fjs/protocol/mcp/stdio/proof.f.ts | 3 ++- fjs/text/utf16/proof.f.ts | 4 +++- fjs/types/btree/find/proof.f.ts | 4 +++- fjs/types/btree/proof.f.ts | 4 +++- fjs/types/byte_set/proof.f.ts | 4 +++- fjs/types/list/proof.f.ts | 4 +++- fjs/types/range_map/proof.f.ts | 4 +++- fjs/types/sorted_list/proof.f.ts | 4 +++- fjs/types/sorted_set/proof.f.ts | 4 +++- 20 files changed, 59 insertions(+), 28 deletions(-) diff --git a/fjs/mcp/proof.f.ts b/fjs/mcp/proof.f.ts index 4d4837453..03c599000 100644 --- a/fjs/mcp/proof.f.ts +++ b/fjs/mcp/proof.f.ts @@ -1,8 +1,10 @@ +import type { Unknown } from '../media/json/types.ts' + import { assert, assertEq } from '../asserts/module.f.mjs' import { pure, step } from '../effects/module.f.mjs' import type { Effect, Operation } from '../effects/types.ts' import { create } from '../effects/memory/module.f.mjs' -import { parse as parseJson, type Unknown } from '../media/json/module.f.ts' +import { parse as parseJson } from '../media/json/module.f.ts' import { number as rttiNumber, option, string as rttiString } from '../types/rtti/module.f.mjs' import { parse as rttiParse } from '../types/rtti/parse/module.f.mjs' import type { Response } from '../protocol/json_rpc/module.f.ts' diff --git a/fjs/media/json/module.f.ts b/fjs/media/json/module.f.ts index 42e78d463..82a89a2e1 100644 --- a/fjs/media/json/module.f.ts +++ b/fjs/media/json/module.f.ts @@ -26,13 +26,7 @@ import type { Ts } from '../../types/rtti/ts/types.ts' import type { Assert } from '../../asserts/types.ts' import type { Equal } from '../../types/ts/types.ts' import type { primitive, unknown } from './rtti/module.f.mjs' -import type { Primitive } from './types.ts' - -export type Unknown = Object | Array | Primitive - -export type Object = { readonly[k in string]?: Unknown } - -export type Array = readonly Unknown[] +import type { Object, Unknown } from './types.ts' type _Unknown = Assert>> diff --git a/fjs/media/json/parser/module.f.ts b/fjs/media/json/parser/module.f.ts index f5c79caf3..54d97d396 100644 --- a/fjs/media/json/parser/module.f.ts +++ b/fjs/media/json/parser/module.f.ts @@ -3,6 +3,9 @@ * * @module */ + +import type { Unknown } from '../types.ts' + import type { Result } from '../../../types/result/types.ts' import { error, ok } from '../../../types/result/module.f.mjs' import type { List } from '../../../types/list/types.ts' @@ -11,7 +14,6 @@ import type { Fold } from '../../../types/function/operator/types.ts' import type { JsonToken } from '../tokenizer/types.ts' import { setReplace } from '../../../types/ordered_map/module.f.mjs' import type { OrderedMap } from '../../../types/ordered_map/types.ts' -import { type Unknown } from '../module.f.ts' import { fromMap } from '../../../types/object/module.f.mjs' import { assertEq } from '../../../asserts/module.f.mjs' diff --git a/fjs/media/json/schema/proof.f.ts b/fjs/media/json/schema/proof.f.ts index 3fb6d1c8f..1c50c63bb 100644 --- a/fjs/media/json/schema/proof.f.ts +++ b/fjs/media/json/schema/proof.f.ts @@ -1,5 +1,7 @@ +import { type Unknown as JsonValue } from '../types.ts' + import { boolean, number, string, bigint, unknown, array, record, or, option } from '../../../types/rtti/module.f.mjs' -import { stringify, type Unknown as JsonValue } from '../module.f.ts' +import { stringify } from '../module.f.ts' import { toJsonSchema, type Unknown, unknown as schemaUnknown } from './module.f.ts' import { assert, assertEq } from '../../../asserts/module.f.mjs' diff --git a/fjs/media/json/types.ts b/fjs/media/json/types.ts index a63902a3c..ba0c30a2b 100644 --- a/fjs/media/json/types.ts +++ b/fjs/media/json/types.ts @@ -1,6 +1,10 @@ -import type { Assert } from "../../asserts/types.ts" import type { Ts } from "../../types/rtti/ts/types.ts" -import type { Equal } from "../../types/ts/types.ts" -import type { primitive, unknown } from "./rtti/module.f.mjs" +import type { primitive } from "./rtti/module.f.mjs" export type Primitive = Ts + +export type Unknown = Object | Array | Primitive + +export type Object = { readonly[k in string]?: Unknown } + +export type Array = readonly Unknown[] diff --git a/fjs/media/revision/module.f.ts b/fjs/media/revision/module.f.ts index 33b28e411..6cce0e3d8 100644 --- a/fjs/media/revision/module.f.ts +++ b/fjs/media/revision/module.f.ts @@ -14,11 +14,14 @@ * * @module */ + +import type { Unknown } from '../json/types.ts' + import { array, number, option, record, string } from '../../types/rtti/module.f.mjs' import { validate as rttiValidate } from '../../types/rtti/validate/module.f.mjs' import type { ValidationError } from '../../types/rtti/common/types.ts' import type { Ts } from '../../types/rtti/ts/types.ts' -import { parse as parseJson, type Unknown } from '../json/module.f.ts' +import { parse as parseJson } from '../json/module.f.ts' import { cBase32ToVec } from '../../basen/cbase32/module.f.mjs' import type { Result } from '../../types/result/types.ts' import { error, ok } from '../../types/result/module.f.mjs' diff --git a/fjs/media/revision/proof.f.ts b/fjs/media/revision/proof.f.ts index 8f2f6c804..a56a4c029 100644 --- a/fjs/media/revision/proof.f.ts +++ b/fjs/media/revision/proof.f.ts @@ -1,5 +1,6 @@ +import type { Object as JsonObject } from '../json/types.ts' + import { assert, assertEq } from '../../asserts/module.f.mjs' -import type { Object as JsonObject } from '../json/module.f.ts' import { dialect, mediaType, isHash, validate, decodeText, encodeText, type LockMap } from './module.f.ts' // Valid cbase32 hashes (round-tripped in fjs/basen/cbase32/proof.f.mjs): single diff --git a/fjs/protocol/json_rpc/module.f.ts b/fjs/protocol/json_rpc/module.f.ts index a4de67b9d..7357a7f71 100644 --- a/fjs/protocol/json_rpc/module.f.ts +++ b/fjs/protocol/json_rpc/module.f.ts @@ -14,11 +14,13 @@ * * @module */ + +import type { Unknown } from '../../media/json/types.ts' + import { number, string, or, option } from '../../types/rtti/module.f.mjs' import type { Ts } from '../../types/rtti/ts/types.ts' import { validate } from '../../types/rtti/validate/module.f.mjs' import type { Result } from '../../types/result/types.ts' -import { type Unknown } from '../../media/json/module.f.ts' import { unknown } from '../../media/json/rtti/module.f.mjs' export const jsonrpc = '2.0' as const diff --git a/fjs/protocol/mcp/module.f.ts b/fjs/protocol/mcp/module.f.ts index e14e4d06d..4f6674ad0 100644 --- a/fjs/protocol/mcp/module.f.ts +++ b/fjs/protocol/mcp/module.f.ts @@ -13,8 +13,9 @@ * * @module */ +import type { Unknown } from '../../media/json/types.ts' + import { boolean, string, option, array, record, or } from '../../types/rtti/module.f.mjs' -import { type Unknown } from '../../media/json/module.f.ts' import type { Ts } from '../../types/rtti/ts/types.ts' import { pure, step } from '../../effects/module.f.mjs' import type { Operation, Effect } from '../../effects/types.ts' diff --git a/fjs/protocol/mcp/proof.f.ts b/fjs/protocol/mcp/proof.f.ts index 173c53c2a..f0e67b8fe 100644 --- a/fjs/protocol/mcp/proof.f.ts +++ b/fjs/protocol/mcp/proof.f.ts @@ -1,3 +1,5 @@ +import type { Unknown } from '../../media/json/types.ts' + import { assert, assertEq } from '../../asserts/module.f.mjs' import { pure, step } from '../../effects/module.f.mjs' import { eff } from '../../effects/eff/module.f.mjs' @@ -6,7 +8,6 @@ import { run } from '../../effects/mock/module.f.mjs' import type { MemOperationMap } from '../../effects/mock/types.ts' import { asBase, asNominal, create, read } from '../../effects/memory/module.f.mjs' import type { Key, MemOp } from '../../effects/memory/types.ts' -import type { Unknown } from '../../media/json/module.f.ts' import { type ToolsListParams, type ToolsListResult, type ToolsCallParams, type ToolsCallResult, type McpHandlers, type McpConfig, type McpSessionState, diff --git a/fjs/protocol/mcp/stdio/module.f.ts b/fjs/protocol/mcp/stdio/module.f.ts index 3133aaaae..d19f935bb 100644 --- a/fjs/protocol/mcp/stdio/module.f.ts +++ b/fjs/protocol/mcp/stdio/module.f.ts @@ -29,12 +29,14 @@ * * @module */ +import type { Unknown } from '../../../media/json/types.ts' + import { pure, step } from '../../../effects/module.f.mjs' import type { Effect, Operation } from '../../../effects/types.ts' import { readLine, write } from '../../../effects/node/module.f.mjs' import type { IoResult, Read, Write } from '../../../effects/node/types.ts' import { tryUtf8 } from '../../../text/module.f.mjs' -import { parse, stringify, type Unknown } from '../../../media/json/module.f.ts' +import { parse, stringify } from '../../../media/json/module.f.ts' import { sort } from '../../../types/object/module.f.mjs' import { internalError, jsonrpc, parseError, type Response } from '../../json_rpc/module.f.ts' import { error, ok } from '../../../types/result/module.f.mjs' diff --git a/fjs/protocol/mcp/stdio/proof.f.ts b/fjs/protocol/mcp/stdio/proof.f.ts index 04eff280d..7d7ea1494 100644 --- a/fjs/protocol/mcp/stdio/proof.f.ts +++ b/fjs/protocol/mcp/stdio/proof.f.ts @@ -1,9 +1,10 @@ +import type { Unknown } from '../../../media/json/types.ts' + import { assertEq } from '../../../asserts/module.f.mjs' import { pure } from '../../../effects/module.f.mjs' import type { Effect } from '../../../effects/types.ts' import { emptyState, virtual } from '../../../effects/node/virtual/module.f.mjs' import type { State } from '../../../effects/node/virtual/types.ts' -import type { Unknown } from '../../../media/json/module.f.ts' import { stringify } from '../../../media/json/module.f.ts' import { utf8 } from '../../../text/module.f.mjs' import { fromVec } from '../../../types/uint8array/module.f.mjs' diff --git a/fjs/text/utf16/proof.f.ts b/fjs/text/utf16/proof.f.ts index e6fe4f377..81a31b194 100644 --- a/fjs/text/utf16/proof.f.ts +++ b/fjs/text/utf16/proof.f.ts @@ -1,3 +1,5 @@ +import type { Unknown } from '../../media/json/types.ts' + import { toCodePointList, fromCodePointList, @@ -7,7 +9,7 @@ import { codePointListToString, codePointToString } from './module.f.mjs' -import { stringify as jsonStringify, type Unknown } from '../../media/json/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { toArray } from '../../types/list/module.f.mjs' import { assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/types/btree/find/proof.f.ts b/fjs/types/btree/find/proof.f.ts index 111d71bbb..04054962a 100644 --- a/fjs/types/btree/find/proof.f.ts +++ b/fjs/types/btree/find/proof.f.ts @@ -1,7 +1,9 @@ +import type { Unknown } from '../../../media/json/types.ts' + import type { Result } from './types.ts' import { find as btreeFind } from './module.f.mjs' import { map, toArray } from '../../list/module.f.mjs' -import { stringify, type Unknown } from '../../../media/json/module.f.ts' +import { stringify } from '../../../media/json/module.f.ts' import { sort } from '../../object/module.f.mjs' import type { TNode } from '../types/types.ts' import { cmp } from '../../string/module.f.mjs' diff --git a/fjs/types/btree/proof.f.ts b/fjs/types/btree/proof.f.ts index fc927e915..961fc642a 100644 --- a/fjs/types/btree/proof.f.ts +++ b/fjs/types/btree/proof.f.ts @@ -1,6 +1,8 @@ +import type { Unknown } from '../../media/json/types.ts' + import type { TNode } from './types/types.ts' import { values } from './module.f.mjs' -import { stringify as jsonStringify, type Unknown } from '../../media/json/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { cmp } from '../string/module.f.mjs' import type { List, Result } from '../list/types.ts' diff --git a/fjs/types/byte_set/proof.f.ts b/fjs/types/byte_set/proof.f.ts index 563aff748..87badfd9b 100644 --- a/fjs/types/byte_set/proof.f.ts +++ b/fjs/types/byte_set/proof.f.ts @@ -1,6 +1,8 @@ +import type { Unknown } from '../../media/json/types.ts' + import { has, empty, set, setRange, unset, universe, complement, toRangeMap } from './module.f.mjs' import { every, countdown, map, toArray } from '../list/module.f.mjs' -import { stringify as jsonStringify, type Unknown } from '../../media/json/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { assert, assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/types/list/proof.f.ts b/fjs/types/list/proof.f.ts index c93e47724..0186e3aa9 100644 --- a/fjs/types/list/proof.f.ts +++ b/fjs/types/list/proof.f.ts @@ -1,6 +1,8 @@ +import type { Unknown } from '../../media/json/types.ts' + import type { List } from './types.ts' import { length, concat, countdown, cycle, drop, dropWhile, entries, every, filter, find, flat, flatMap, map, next, reduce, reverse, scan, some, take, takeWhile, toArray, zip, first, filterMap, isEmpty, equal, tryFold } from './module.f.mjs' -import { stringify, type Unknown } from '../../media/json/module.f.ts' +import { stringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { addition, strictEqual, reduceToScan } from '../function/operator/module.f.mjs' import { assert, assertEq, assertNotNullish } from '../../asserts/module.f.mjs' diff --git a/fjs/types/range_map/proof.f.ts b/fjs/types/range_map/proof.f.ts index 2f33d95ca..c2c6ea4f5 100644 --- a/fjs/types/range_map/proof.f.ts +++ b/fjs/types/range_map/proof.f.ts @@ -1,6 +1,8 @@ +import type { Unknown } from '../../media/json/types.ts' + import type { RangeMapArray, Properties, RangeMap } from './types.ts' import { get, merge, fromRange, rangeMap } from './module.f.mjs' -import { stringify, type Unknown } from '../../media/json/module.f.ts' +import { stringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { union } from '../sorted_set/module.f.mjs' import type { SortedSet } from '../sorted_set/types.ts' diff --git a/fjs/types/sorted_list/proof.f.ts b/fjs/types/sorted_list/proof.f.ts index 92235a1ae..90cd28554 100644 --- a/fjs/types/sorted_list/proof.f.ts +++ b/fjs/types/sorted_list/proof.f.ts @@ -1,5 +1,7 @@ +import type { Unknown } from '../../media/json/types.ts' + import { find, merge } from './module.f.mjs' -import { stringify, type Unknown } from '../../media/json/module.f.ts' +import { stringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { toArray, countdown, length } from '../list/module.f.mjs' import { flip } from '../function/module.f.mjs' diff --git a/fjs/types/sorted_set/proof.f.ts b/fjs/types/sorted_set/proof.f.ts index 4b429c30c..7c4a0a6e5 100644 --- a/fjs/types/sorted_set/proof.f.ts +++ b/fjs/types/sorted_set/proof.f.ts @@ -1,5 +1,7 @@ +import type { Unknown } from '../../media/json/types.ts' + import { has, intersect, union } from './module.f.mjs' -import { stringify, type Unknown } from '../../media/json/module.f.ts' +import { stringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { toArray, countdown, length } from '../list/module.f.mjs' import { flip } from '../function/module.f.mjs' From 6620128915b321e9b994c6a05e8b8eb7d0de9471 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 22:55:53 -0700 Subject: [PATCH 06/19] 3 --- fjs/media/json/module.f.ts | 6 ------ fjs/media/json/rtti/module.f.mjs | 4 ++-- fjs/media/json/types.ts | 6 +++++- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/fjs/media/json/module.f.ts b/fjs/media/json/module.f.ts index 82a89a2e1..069fda011 100644 --- a/fjs/media/json/module.f.ts +++ b/fjs/media/json/module.f.ts @@ -22,14 +22,8 @@ import { at, definedEntries } from '../../types/object/module.f.mjs' import type { Entry as ObjectEntry } from '../../types/object/types.ts' import { compose, fn } from '../../types/function/module.f.mjs' import { objectWrap, arrayWrap, stringSerialize, numberSerialize, nullSerialize, boolSerialize } from './serializer/module.f.mjs' -import type { Ts } from '../../types/rtti/ts/types.ts' -import type { Assert } from '../../asserts/types.ts' -import type { Equal } from '../../types/ts/types.ts' -import type { primitive, unknown } from './rtti/module.f.mjs' import type { Object, Unknown } from './types.ts' -type _Unknown = Assert>> - // ── JSON utilities ──────────────────────────────────────────────────────────── export const setProperty = (value: Unknown) => { diff --git a/fjs/media/json/rtti/module.f.mjs b/fjs/media/json/rtti/module.f.mjs index b04588ac2..11743726d 100644 --- a/fjs/media/json/rtti/module.f.mjs +++ b/fjs/media/json/rtti/module.f.mjs @@ -11,7 +11,7 @@ import { /** rtti schema matching any JSON primitive: `null`, `boolean`, `number`, or `string`. */ export const primitive = or(null, rttiBoolean, rttiNumber, rttiString) -/** @typedef {() => ['or', typeof primitive, typeof object, typeof array]} Unknown */ +/** @typedef {() => ['or', typeof primitive, typeof object, typeof array]} _RttiUnknown */ /** * rtti schema matching any JSON value: a primitive, an array of JSON values, @@ -22,7 +22,7 @@ export const primitive = or(null, rttiBoolean, rttiNumber, rttiString) * A struct field typed `unknown` is **required when present** — unlike rtti * core's `unknown`, the JSON `unknown` excludes `undefined`. * - * @type {Unknown} + * @type {_RttiUnknown} */ export const unknown = () => ['or', primitive, object, array] diff --git a/fjs/media/json/types.ts b/fjs/media/json/types.ts index ba0c30a2b..29dccb920 100644 --- a/fjs/media/json/types.ts +++ b/fjs/media/json/types.ts @@ -1,5 +1,7 @@ +import type { Assert } from "../../asserts/types.ts" import type { Ts } from "../../types/rtti/ts/types.ts" -import type { primitive } from "./rtti/module.f.mjs" +import type { Equal } from "../../types/ts/types.ts" +import type { primitive, unknown } from "./rtti/module.f.mjs" export type Primitive = Ts @@ -8,3 +10,5 @@ export type Unknown = Object | Array | Primitive export type Object = { readonly[k in string]?: Unknown } export type Array = readonly Unknown[] + +type _Unknown = Assert>> From d6760452c9ea3e652fa689fe1389814794f01930 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 22:58:59 -0700 Subject: [PATCH 07/19] json/common --- fjs/bnf/data/proof.f.ts | 2 +- fjs/ci/proof.f.ts | 2 +- fjs/dev/package_json/module.f.ts | 2 +- fjs/djs/parser/proof.f.ts | 2 +- fjs/djs/serializer/proof.f.ts | 2 +- fjs/emergent_testing/proof.f.ts | 2 +- fjs/fsc/proof.f.ts | 2 +- fjs/fsm/module.f.ts | 2 +- fjs/fsm/proof.f.ts | 2 +- fjs/mcp/cas/module.f.ts | 2 +- fjs/mcp/evo/module.f.ts | 2 +- fjs/mcp/evo/proof.f.ts | 2 +- fjs/mcp/proof.f.ts | 2 +- fjs/media/json/{rtti => }/module.f.mjs | 2 +- fjs/media/json/parser/proof.f.ts | 2 +- fjs/media/json/proof.f.ts | 2 +- fjs/media/json/schema/module.f.ts | 2 +- fjs/media/json/schema/proof.f.ts | 2 +- fjs/media/json/{ => sede}/module.f.ts | 24 ++++++++++---------- fjs/media/{revision => json/sede}/proof.f.ts | 6 ++--- fjs/media/json/types.ts | 2 +- fjs/media/module.f.ts | 2 +- fjs/media/revision/module.f.ts | 4 ++-- fjs/protocol/json_rpc/module.f.ts | 2 +- fjs/protocol/mcp/module.f.ts | 2 +- fjs/protocol/mcp/stdio/module.f.ts | 2 +- fjs/protocol/mcp/stdio/proof.f.ts | 2 +- fjs/text/ascii/proof.f.ts | 2 +- fjs/text/utf16/proof.f.ts | 2 +- fjs/text/utf8/proof.f.ts | 2 +- fjs/types/array/proof.f.ts | 2 +- fjs/types/btree/find/proof.f.ts | 2 +- fjs/types/btree/proof.f.ts | 2 +- fjs/types/btree/remove/proof.f.ts | 2 +- fjs/types/btree/set/proof.f.ts | 2 +- fjs/types/byte_set/proof.f.ts | 2 +- fjs/types/list/proof.f.ts | 2 +- fjs/types/range_map/proof.f.ts | 2 +- fjs/types/sorted_list/proof.f.ts | 2 +- fjs/types/sorted_set/proof.f.ts | 2 +- 40 files changed, 54 insertions(+), 54 deletions(-) rename fjs/media/json/{rtti => }/module.f.mjs (96%) rename fjs/media/json/{ => sede}/module.f.ts (82%) rename fjs/media/{revision => json/sede}/proof.f.ts (98%) diff --git a/fjs/bnf/data/proof.f.ts b/fjs/bnf/data/proof.f.ts index f41d8ae06..78b38830d 100644 --- a/fjs/bnf/data/proof.f.ts +++ b/fjs/bnf/data/proof.f.ts @@ -1,4 +1,4 @@ -import { stringify } from '../../media/json/module.f.ts' +import { stringify } from '../../media/json/sede/module.f.ts' import { identity } from '../../types/function/module.f.mjs' import { sort } from '../../types/object/module.f.mjs' import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from '../module.f.mjs' diff --git a/fjs/ci/proof.f.ts b/fjs/ci/proof.f.ts index b7386598c..4d0e5cdba 100644 --- a/fjs/ci/proof.f.ts +++ b/fjs/ci/proof.f.ts @@ -9,7 +9,7 @@ import type { MetaStep, Os, GitHubAction } from './common/types.ts' import { assert, assertEq } from '../asserts/module.f.mjs' import { emptyState, virtual } from '../effects/node/virtual/module.f.mjs' import type { Dir, State } from '../effects/node/virtual/types.ts' -import { parse as jsonParse } from '../media/json/module.f.ts' +import { parse as jsonParse } from '../media/json/sede/module.f.ts' import { unwrap } from '../types/result/module.f.mjs' import { definedValues } from '../types/object/module.f.mjs' diff --git a/fjs/dev/package_json/module.f.ts b/fjs/dev/package_json/module.f.ts index 7d943290c..3a6db1aee 100644 --- a/fjs/dev/package_json/module.f.ts +++ b/fjs/dev/package_json/module.f.ts @@ -4,7 +4,7 @@ * * @module */ -import { parse as parseJsonText } from '../../media/json/module.f.ts' +import { parse as parseJsonText } from '../../media/json/sede/module.f.ts' import { option, record, string } from '../../types/rtti/module.f.mjs' import { validate as rttiValidate } from '../../types/rtti/validate/module.f.mjs' import type { ValidationError } from '../../types/rtti/common/types.ts' diff --git a/fjs/djs/parser/proof.f.ts b/fjs/djs/parser/proof.f.ts index 0203a455e..9ac3d9785 100644 --- a/fjs/djs/parser/proof.f.ts +++ b/fjs/djs/parser/proof.f.ts @@ -4,7 +4,7 @@ import { toArray } from '../../types/list/module.f.mjs' import { sort } from '../../types/object/module.f.mjs' import { stringToList } from '../../text/utf16/module.f.mjs' import { stringifyAsTree } from '../serializer/module.f.ts' -import { stringify } from '../../media/json/module.f.ts' +import { stringify } from '../../media/json/sede/module.f.ts' import { assert, assertEq } from '../../asserts/module.f.mjs' const tokenizeString diff --git a/fjs/djs/serializer/proof.f.ts b/fjs/djs/serializer/proof.f.ts index d56b1154e..e130413f1 100644 --- a/fjs/djs/serializer/proof.f.ts +++ b/fjs/djs/serializer/proof.f.ts @@ -1,7 +1,7 @@ import { countRefs, stringify, stringifyAsTree } from './module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { identity } from '../../types/function/module.f.mjs' -import { setProperty } from '../../media/json/module.f.ts' +import { setProperty } from '../../media/json/sede/module.f.ts' import { assertEq } from '../../asserts/module.f.mjs' export const proof = { diff --git a/fjs/emergent_testing/proof.f.ts b/fjs/emergent_testing/proof.f.ts index 35a39bffd..f207b260e 100644 --- a/fjs/emergent_testing/proof.f.ts +++ b/fjs/emergent_testing/proof.f.ts @@ -13,7 +13,7 @@ import type { Reporter } from './types.ts' import { run as mockRun } from '../effects/mock/module.f.mjs' import type { All, Await, Test, TestContext } from '../effects/node/types.ts' import { shouldLoad } from '../dev/module.f.mjs' -import { parse as parseJson } from '../media/json/module.f.ts' +import { parse as parseJson } from '../media/json/sede/module.f.ts' import { array, number as rttiNumber, or, string as rttiString } from '../types/rtti/module.f.mjs' import { parse as rttiParse } from '../types/rtti/parse/module.f.mjs' import type { Ts } from '../types/rtti/ts/types.ts' diff --git a/fjs/fsc/proof.f.ts b/fjs/fsc/proof.f.ts index f869f4ad8..6275907f2 100644 --- a/fjs/fsc/proof.f.ts +++ b/fjs/fsc/proof.f.ts @@ -1,6 +1,6 @@ import { init, terminal } from './module.f.mjs' import { one } from '../text/ascii/module.f.mjs' -import { stringify } from '../media/json/module.f.ts' +import { stringify } from '../media/json/sede/module.f.ts' import { assertEq } from '../asserts/module.f.mjs' const s = stringify(i => i) diff --git a/fjs/fsm/module.f.ts b/fjs/fsm/module.f.ts index 093bdcc40..cd955aaea 100644 --- a/fjs/fsm/module.f.ts +++ b/fjs/fsm/module.f.ts @@ -14,7 +14,7 @@ import type { RangeMap, Properties, RangeMapArray, Entry } from '../types/range_ import { merge, get as rangeMapGet } from '../types/range_map/module.f.mjs' import type { Fold, Scan } from '../types/function/operator/types.ts' import { strictEqual } from '../types/function/operator/module.f.mjs' -import { stringify } from '../media/json/module.f.ts' +import { stringify } from '../media/json/sede/module.f.ts' import { identity } from '../types/function/module.f.mjs' import { stringToList } from '../text/utf16/module.f.mjs' import { cmp } from '../types/string/module.f.mjs' diff --git a/fjs/fsm/proof.f.ts b/fjs/fsm/proof.f.ts index b132716c0..608ea106e 100644 --- a/fjs/fsm/proof.f.ts +++ b/fjs/fsm/proof.f.ts @@ -1,7 +1,7 @@ import { dfa, run, toRange, toUnion, type Grammar } from './module.f.ts' import { union } from '../types/byte_set/module.f.mjs' import { sort, fromEntries } from '../types/object/module.f.mjs' -import { stringify } from '../media/json/module.f.ts' +import { stringify } from '../media/json/sede/module.f.ts' import { identity } from '../types/function/module.f.mjs' import { toArray } from '../types/list/module.f.mjs' import { stringToList } from '../text/utf16/module.f.mjs' diff --git a/fjs/mcp/cas/module.f.ts b/fjs/mcp/cas/module.f.ts index c01614bc5..8c414e4e9 100644 --- a/fjs/mcp/cas/module.f.ts +++ b/fjs/mcp/cas/module.f.ts @@ -102,7 +102,7 @@ * @module */ import { string, option, or, boolean } from '../../types/rtti/module.f.mjs' -import { stringify } from '../../media/json/module.f.ts' +import { stringify } from '../../media/json/sede/module.f.ts' import { pure, step } from '../../effects/module.f.mjs' import type { Effect } from '../../effects/types.ts' import type { MemOp } from '../../effects/memory/types.ts' diff --git a/fjs/mcp/evo/module.f.ts b/fjs/mcp/evo/module.f.ts index 64708b808..ca3cd3f29 100644 --- a/fjs/mcp/evo/module.f.ts +++ b/fjs/mcp/evo/module.f.ts @@ -51,7 +51,7 @@ import { toolEntry, errorResult, okResult, type ToolEntry, type ToolsCallResult, } from '../../protocol/mcp/module.f.ts' -import { stringify } from '../../media/json/module.f.ts' +import { stringify } from '../../media/json/sede/module.f.ts' import { identity } from '../../types/function/module.f.mjs' import { type Evo } from '../../cas/evo/module.f.ts' diff --git a/fjs/mcp/evo/proof.f.ts b/fjs/mcp/evo/proof.f.ts index b0b8182db..ace71f333 100644 --- a/fjs/mcp/evo/proof.f.ts +++ b/fjs/mcp/evo/proof.f.ts @@ -8,7 +8,7 @@ import { initEvo, evo, type Evo } from '../../cas/evo/module.f.ts' import { evoToolRegistry } from './module.f.ts' import type { ToolEntry, ToolsCallResult } from '../../protocol/mcp/module.f.ts' import type { Operation } from '../../effects/types.ts' -import { parse as parseJson } from '../../media/json/module.f.ts' +import { parse as parseJson } from '../../media/json/sede/module.f.ts' import { array, string as rttiString } from '../../types/rtti/module.f.mjs' import { parse as rttiParse } from '../../types/rtti/parse/module.f.mjs' import { unwrap } from '../../types/result/module.f.mjs' diff --git a/fjs/mcp/proof.f.ts b/fjs/mcp/proof.f.ts index 03c599000..e1784cd32 100644 --- a/fjs/mcp/proof.f.ts +++ b/fjs/mcp/proof.f.ts @@ -4,7 +4,7 @@ import { assert, assertEq } from '../asserts/module.f.mjs' import { pure, step } from '../effects/module.f.mjs' import type { Effect, Operation } from '../effects/types.ts' import { create } from '../effects/memory/module.f.mjs' -import { parse as parseJson } from '../media/json/module.f.ts' +import { parse as parseJson } from '../media/json/sede/module.f.ts' import { number as rttiNumber, option, string as rttiString } from '../types/rtti/module.f.mjs' import { parse as rttiParse } from '../types/rtti/parse/module.f.mjs' import type { Response } from '../protocol/json_rpc/module.f.ts' diff --git a/fjs/media/json/rtti/module.f.mjs b/fjs/media/json/module.f.mjs similarity index 96% rename from fjs/media/json/rtti/module.f.mjs rename to fjs/media/json/module.f.mjs index 11743726d..1f0832ef6 100644 --- a/fjs/media/json/rtti/module.f.mjs +++ b/fjs/media/json/module.f.mjs @@ -6,7 +6,7 @@ import { or, record, array as rttiArray -} from '../../../types/rtti/module.f.mjs' +} from '../../types/rtti/module.f.mjs' /** rtti schema matching any JSON primitive: `null`, `boolean`, `number`, or `string`. */ export const primitive = or(null, rttiBoolean, rttiNumber, rttiString) diff --git a/fjs/media/json/parser/proof.f.ts b/fjs/media/json/parser/proof.f.ts index 66387429e..04bb06a9d 100644 --- a/fjs/media/json/parser/proof.f.ts +++ b/fjs/media/json/parser/proof.f.ts @@ -2,7 +2,7 @@ import { parse } from './module.f.ts' import { tokenize } from '../tokenizer/module.f.mjs' import type { JsonToken } from '../tokenizer/types.ts' import { toArray } from '../../../types/list/module.f.mjs' -import { stringify as jsonStringify } from '../module.f.ts' +import { stringify as jsonStringify } from '../sede/module.f.ts' import { sort } from '../../../types/object/module.f.mjs' import { stringToList } from '../../../text/utf16/module.f.mjs' import { assertEq } from '../../../asserts/module.f.mjs' diff --git a/fjs/media/json/proof.f.ts b/fjs/media/json/proof.f.ts index 21336e1b9..33299391d 100644 --- a/fjs/media/json/proof.f.ts +++ b/fjs/media/json/proof.f.ts @@ -1,4 +1,4 @@ -import { parse, setProperty, stringify } from './module.f.ts' +import { parse, setProperty, stringify } from './sede/module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { identity } from '../../types/function/module.f.mjs' import { assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/media/json/schema/module.f.ts b/fjs/media/json/schema/module.f.ts index 74517b329..9b3f5f41c 100644 --- a/fjs/media/json/schema/module.f.ts +++ b/fjs/media/json/schema/module.f.ts @@ -13,7 +13,7 @@ import type { Visitor } from '../../../types/rtti/common/types.ts' import type { Primitive } from '../../../djs/module.f.ts' import type { Ts } from '../../../types/rtti/ts/types.ts' import type { Phantom } from '../../../types/phantom/types.ts' -import { unknown as jsonUnknown } from '../rtti/module.f.mjs' +import { unknown as jsonUnknown } from '../module.f.mjs' const unknownThunk = () => ['const', unknownConst] as const diff --git a/fjs/media/json/schema/proof.f.ts b/fjs/media/json/schema/proof.f.ts index 1c50c63bb..3cb57e332 100644 --- a/fjs/media/json/schema/proof.f.ts +++ b/fjs/media/json/schema/proof.f.ts @@ -1,7 +1,7 @@ import { type Unknown as JsonValue } from '../types.ts' import { boolean, number, string, bigint, unknown, array, record, or, option } from '../../../types/rtti/module.f.mjs' -import { stringify } from '../module.f.ts' +import { stringify } from '../sede/module.f.ts' import { toJsonSchema, type Unknown, unknown as schemaUnknown } from './module.f.ts' import { assert, assertEq } from '../../../asserts/module.f.mjs' diff --git a/fjs/media/json/module.f.ts b/fjs/media/json/sede/module.f.ts similarity index 82% rename from fjs/media/json/module.f.ts rename to fjs/media/json/sede/module.f.ts index 069fda011..635f1a956 100644 --- a/fjs/media/json/module.f.ts +++ b/fjs/media/json/sede/module.f.ts @@ -11,18 +11,18 @@ * * @module */ -import type { List } from '../../types/list/types.ts' -import { next, flat, map } from '../../types/list/module.f.mjs' -import { concat } from '../../types/string/module.f.mjs' -import { stringToList } from '../../text/utf16/module.f.mjs' -import type { Result } from '../../types/result/types.ts' -import { parse as parseTokens } from './parser/module.f.ts' -import { tokenize } from './tokenizer/module.f.mjs' -import { at, definedEntries } from '../../types/object/module.f.mjs' -import type { Entry as ObjectEntry } from '../../types/object/types.ts' -import { compose, fn } from '../../types/function/module.f.mjs' -import { objectWrap, arrayWrap, stringSerialize, numberSerialize, nullSerialize, boolSerialize } from './serializer/module.f.mjs' -import type { Object, Unknown } from './types.ts' +import type { List } from '../../../types/list/types.ts' +import { next, flat, map } from '../../../types/list/module.f.mjs' +import { concat } from '../../../types/string/module.f.mjs' +import { stringToList } from '../../../text/utf16/module.f.mjs' +import type { Result } from '../../../types/result/types.ts' +import { parse as parseTokens } from '../parser/module.f.ts' +import { tokenize } from '../tokenizer/module.f.mjs' +import { at, definedEntries } from '../../../types/object/module.f.mjs' +import type { Entry as ObjectEntry } from '../../../types/object/types.ts' +import { compose, fn } from '../../../types/function/module.f.mjs' +import { objectWrap, arrayWrap, stringSerialize, numberSerialize, nullSerialize, boolSerialize } from '../serializer/module.f.mjs' +import type { Object, Unknown } from '../types.ts' // ── JSON utilities ──────────────────────────────────────────────────────────── diff --git a/fjs/media/revision/proof.f.ts b/fjs/media/json/sede/proof.f.ts similarity index 98% rename from fjs/media/revision/proof.f.ts rename to fjs/media/json/sede/proof.f.ts index a56a4c029..9d35889cc 100644 --- a/fjs/media/revision/proof.f.ts +++ b/fjs/media/json/sede/proof.f.ts @@ -1,7 +1,7 @@ -import type { Object as JsonObject } from '../json/types.ts' +import type { Object as JsonObject } from '../types.ts' -import { assert, assertEq } from '../../asserts/module.f.mjs' -import { dialect, mediaType, isHash, validate, decodeText, encodeText, type LockMap } from './module.f.ts' +import { assert, assertEq } from '../../../asserts/module.f.mjs' +import { dialect, mediaType, isHash, validate, decodeText, encodeText, type LockMap } from '../../revision/module.f.ts' // Valid cbase32 hashes (round-tripped in fjs/basen/cbase32/proof.f.mjs): single // cbase32 symbols, cheap to write inline here. diff --git a/fjs/media/json/types.ts b/fjs/media/json/types.ts index 29dccb920..538dcdd5a 100644 --- a/fjs/media/json/types.ts +++ b/fjs/media/json/types.ts @@ -1,7 +1,7 @@ import type { Assert } from "../../asserts/types.ts" import type { Ts } from "../../types/rtti/ts/types.ts" import type { Equal } from "../../types/ts/types.ts" -import type { primitive, unknown } from "./rtti/module.f.mjs" +import type { primitive, unknown } from "./module.f.mjs" export type Primitive = Ts diff --git a/fjs/media/module.f.ts b/fjs/media/module.f.ts index a370703ac..3508fc924 100644 --- a/fjs/media/module.f.ts +++ b/fjs/media/module.f.ts @@ -45,7 +45,7 @@ import type { Vec } from '../types/bit_vec/types.ts' import { fromVec } from '../text/utf8/module.f.mjs' import { detectVec } from './type/module.f.mjs' import type { DetectMeta } from './type/types.ts' -import { parse } from './json/module.f.ts' +import { parse } from './json/sede/module.f.ts' import { assert, assertNotNullish } from '../asserts/module.f.mjs' import type { Struct } from '../types/rtti/types.ts' import type { Ts, Unknown } from '../types/rtti/ts/types.ts' diff --git a/fjs/media/revision/module.f.ts b/fjs/media/revision/module.f.ts index 6cce0e3d8..e760d0183 100644 --- a/fjs/media/revision/module.f.ts +++ b/fjs/media/revision/module.f.ts @@ -21,13 +21,13 @@ import { array, number, option, record, string } from '../../types/rtti/module.f import { validate as rttiValidate } from '../../types/rtti/validate/module.f.mjs' import type { ValidationError } from '../../types/rtti/common/types.ts' import type { Ts } from '../../types/rtti/ts/types.ts' -import { parse as parseJson } from '../json/module.f.ts' +import { parse as parseJson } from '../json/sede/module.f.ts' import { cBase32ToVec } from '../../basen/cbase32/module.f.mjs' import type { Result } from '../../types/result/types.ts' import { error, ok } from '../../types/result/module.f.mjs' import { dialectEntry, type DialectEntry } from '../module.f.ts' import { definedEntries, sort } from '../../types/object/module.f.mjs' -import { stringify } from '../json/module.f.ts' +import { stringify } from '../json/sede/module.f.ts' /** * Format tag: names the dialect of this BLOB. The media type it is served diff --git a/fjs/protocol/json_rpc/module.f.ts b/fjs/protocol/json_rpc/module.f.ts index 7357a7f71..7b2dce490 100644 --- a/fjs/protocol/json_rpc/module.f.ts +++ b/fjs/protocol/json_rpc/module.f.ts @@ -21,7 +21,7 @@ import { number, string, or, option } from '../../types/rtti/module.f.mjs' import type { Ts } from '../../types/rtti/ts/types.ts' import { validate } from '../../types/rtti/validate/module.f.mjs' import type { Result } from '../../types/result/types.ts' -import { unknown } from '../../media/json/rtti/module.f.mjs' +import { unknown } from '../../media/json/module.f.mjs' export const jsonrpc = '2.0' as const diff --git a/fjs/protocol/mcp/module.f.ts b/fjs/protocol/mcp/module.f.ts index 4f6674ad0..7f843ae35 100644 --- a/fjs/protocol/mcp/module.f.ts +++ b/fjs/protocol/mcp/module.f.ts @@ -30,7 +30,7 @@ import { import { validate } from '../../types/rtti/validate/module.f.mjs' import { toJsonSchema } from '../../media/json/schema/module.f.ts' import type { Type } from '../../types/rtti/types.ts' -import { unknown } from '../../media/json/rtti/module.f.mjs' +import { unknown } from '../../media/json/module.f.mjs' // ── Shared ───────────────────────────────────────────────────────────────────── diff --git a/fjs/protocol/mcp/stdio/module.f.ts b/fjs/protocol/mcp/stdio/module.f.ts index d19f935bb..9e228252c 100644 --- a/fjs/protocol/mcp/stdio/module.f.ts +++ b/fjs/protocol/mcp/stdio/module.f.ts @@ -36,7 +36,7 @@ import type { Effect, Operation } from '../../../effects/types.ts' import { readLine, write } from '../../../effects/node/module.f.mjs' import type { IoResult, Read, Write } from '../../../effects/node/types.ts' import { tryUtf8 } from '../../../text/module.f.mjs' -import { parse, stringify } from '../../../media/json/module.f.ts' +import { parse, stringify } from '../../../media/json/sede/module.f.ts' import { sort } from '../../../types/object/module.f.mjs' import { internalError, jsonrpc, parseError, type Response } from '../../json_rpc/module.f.ts' import { error, ok } from '../../../types/result/module.f.mjs' diff --git a/fjs/protocol/mcp/stdio/proof.f.ts b/fjs/protocol/mcp/stdio/proof.f.ts index 7d7ea1494..d77ce3661 100644 --- a/fjs/protocol/mcp/stdio/proof.f.ts +++ b/fjs/protocol/mcp/stdio/proof.f.ts @@ -5,7 +5,7 @@ import { pure } from '../../../effects/module.f.mjs' import type { Effect } from '../../../effects/types.ts' import { emptyState, virtual } from '../../../effects/node/virtual/module.f.mjs' import type { State } from '../../../effects/node/virtual/types.ts' -import { stringify } from '../../../media/json/module.f.ts' +import { stringify } from '../../../media/json/sede/module.f.ts' import { utf8 } from '../../../text/module.f.mjs' import { fromVec } from '../../../types/uint8array/module.f.mjs' import { maxLengthBytes } from '../../../types/bit_vec/module.f.mjs' diff --git a/fjs/text/ascii/proof.f.ts b/fjs/text/ascii/proof.f.ts index 1117343d4..0967a4d0c 100644 --- a/fjs/text/ascii/proof.f.ts +++ b/fjs/text/ascii/proof.f.ts @@ -1,5 +1,5 @@ import { one, range } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/sede/module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/text/utf16/proof.f.ts b/fjs/text/utf16/proof.f.ts index 81a31b194..98a9f62bb 100644 --- a/fjs/text/utf16/proof.f.ts +++ b/fjs/text/utf16/proof.f.ts @@ -9,7 +9,7 @@ import { codePointListToString, codePointToString } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/sede/module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { toArray } from '../../types/list/module.f.mjs' import { assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/text/utf8/proof.f.ts b/fjs/text/utf8/proof.f.ts index bc80dfd66..f70870bb9 100644 --- a/fjs/text/utf8/proof.f.ts +++ b/fjs/text/utf8/proof.f.ts @@ -1,5 +1,5 @@ import { toCodePointList, fromCodePointList, fromVec, utf8ByteToCodePointOp } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/sede/module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { toArray } from '../../types/list/module.f.mjs' import { msb, u8ListToVec, vec } from '../../types/bit_vec/module.f.mjs' diff --git a/fjs/types/array/proof.f.ts b/fjs/types/array/proof.f.ts index a22743f53..6f95176b0 100644 --- a/fjs/types/array/proof.f.ts +++ b/fjs/types/array/proof.f.ts @@ -1,5 +1,5 @@ import { at, first, last, head, tail, splitFirst, splitLast, empty } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/sede/module.f.ts' import { sort } from '../object/module.f.mjs' import { assertEq, assertNotNullish } from '../../asserts/module.f.mjs' diff --git a/fjs/types/btree/find/proof.f.ts b/fjs/types/btree/find/proof.f.ts index 04054962a..d117f3689 100644 --- a/fjs/types/btree/find/proof.f.ts +++ b/fjs/types/btree/find/proof.f.ts @@ -3,7 +3,7 @@ import type { Unknown } from '../../../media/json/types.ts' import type { Result } from './types.ts' import { find as btreeFind } from './module.f.mjs' import { map, toArray } from '../../list/module.f.mjs' -import { stringify } from '../../../media/json/module.f.ts' +import { stringify } from '../../../media/json/sede/module.f.ts' import { sort } from '../../object/module.f.mjs' import type { TNode } from '../types/types.ts' import { cmp } from '../../string/module.f.mjs' diff --git a/fjs/types/btree/proof.f.ts b/fjs/types/btree/proof.f.ts index 961fc642a..e5c43628c 100644 --- a/fjs/types/btree/proof.f.ts +++ b/fjs/types/btree/proof.f.ts @@ -2,7 +2,7 @@ import type { Unknown } from '../../media/json/types.ts' import type { TNode } from './types/types.ts' import { values } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/sede/module.f.ts' import { sort } from '../object/module.f.mjs' import { cmp } from '../string/module.f.mjs' import type { List, Result } from '../list/types.ts' diff --git a/fjs/types/btree/remove/proof.f.ts b/fjs/types/btree/remove/proof.f.ts index 967e89f2f..a5b9d6ef0 100644 --- a/fjs/types/btree/remove/proof.f.ts +++ b/fjs/types/btree/remove/proof.f.ts @@ -2,7 +2,7 @@ import { nodeRemove } from './module.f.mjs' import type { TNode } from '../types/types.ts' import { set as setSet } from '../set/module.f.mjs' import { cmp } from '../../string/module.f.mjs' -import { stringify } from '../../../media/json/module.f.ts' +import { stringify } from '../../../media/json/sede/module.f.ts' import { sort } from '../../object/module.f.mjs' import { assertEq, assertNotNullish } from '../../../asserts/module.f.mjs' diff --git a/fjs/types/btree/set/proof.f.ts b/fjs/types/btree/set/proof.f.ts index 5582926a4..afb2c6950 100644 --- a/fjs/types/btree/set/proof.f.ts +++ b/fjs/types/btree/set/proof.f.ts @@ -1,7 +1,7 @@ import { set as setSet } from './module.f.mjs' import type { TNode } from '../types/types.ts' import { cmp } from '../../string/module.f.mjs' -import { stringify } from '../../../media/json/module.f.ts' +import { stringify } from '../../../media/json/sede/module.f.ts' import { sort } from '../../object/module.f.mjs' import { assertEq } from '../../../asserts/module.f.mjs' diff --git a/fjs/types/byte_set/proof.f.ts b/fjs/types/byte_set/proof.f.ts index 87badfd9b..f29c59803 100644 --- a/fjs/types/byte_set/proof.f.ts +++ b/fjs/types/byte_set/proof.f.ts @@ -2,7 +2,7 @@ import type { Unknown } from '../../media/json/types.ts' import { has, empty, set, setRange, unset, universe, complement, toRangeMap } from './module.f.mjs' import { every, countdown, map, toArray } from '../list/module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/sede/module.f.ts' import { sort } from '../object/module.f.mjs' import { assert, assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/types/list/proof.f.ts b/fjs/types/list/proof.f.ts index 0186e3aa9..2f6a1801a 100644 --- a/fjs/types/list/proof.f.ts +++ b/fjs/types/list/proof.f.ts @@ -2,7 +2,7 @@ import type { Unknown } from '../../media/json/types.ts' import type { List } from './types.ts' import { length, concat, countdown, cycle, drop, dropWhile, entries, every, filter, find, flat, flatMap, map, next, reduce, reverse, scan, some, take, takeWhile, toArray, zip, first, filterMap, isEmpty, equal, tryFold } from './module.f.mjs' -import { stringify } from '../../media/json/module.f.ts' +import { stringify } from '../../media/json/sede/module.f.ts' import { sort } from '../object/module.f.mjs' import { addition, strictEqual, reduceToScan } from '../function/operator/module.f.mjs' import { assert, assertEq, assertNotNullish } from '../../asserts/module.f.mjs' diff --git a/fjs/types/range_map/proof.f.ts b/fjs/types/range_map/proof.f.ts index c2c6ea4f5..9833ecf83 100644 --- a/fjs/types/range_map/proof.f.ts +++ b/fjs/types/range_map/proof.f.ts @@ -2,7 +2,7 @@ import type { Unknown } from '../../media/json/types.ts' import type { RangeMapArray, Properties, RangeMap } from './types.ts' import { get, merge, fromRange, rangeMap } from './module.f.mjs' -import { stringify } from '../../media/json/module.f.ts' +import { stringify } from '../../media/json/sede/module.f.ts' import { sort } from '../object/module.f.mjs' import { union } from '../sorted_set/module.f.mjs' import type { SortedSet } from '../sorted_set/types.ts' diff --git a/fjs/types/sorted_list/proof.f.ts b/fjs/types/sorted_list/proof.f.ts index 90cd28554..f6105d244 100644 --- a/fjs/types/sorted_list/proof.f.ts +++ b/fjs/types/sorted_list/proof.f.ts @@ -1,7 +1,7 @@ import type { Unknown } from '../../media/json/types.ts' import { find, merge } from './module.f.mjs' -import { stringify } from '../../media/json/module.f.ts' +import { stringify } from '../../media/json/sede/module.f.ts' import { sort } from '../object/module.f.mjs' import { toArray, countdown, length } from '../list/module.f.mjs' import { flip } from '../function/module.f.mjs' diff --git a/fjs/types/sorted_set/proof.f.ts b/fjs/types/sorted_set/proof.f.ts index 7c4a0a6e5..a34002ded 100644 --- a/fjs/types/sorted_set/proof.f.ts +++ b/fjs/types/sorted_set/proof.f.ts @@ -1,7 +1,7 @@ import type { Unknown } from '../../media/json/types.ts' import { has, intersect, union } from './module.f.mjs' -import { stringify } from '../../media/json/module.f.ts' +import { stringify } from '../../media/json/sede/module.f.ts' import { sort } from '../object/module.f.mjs' import { toArray, countdown, length } from '../list/module.f.mjs' import { flip } from '../function/module.f.mjs' From f3a482dfd9d9be21f5516e7368b548ab0571b6ab Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 22:59:10 -0700 Subject: [PATCH 08/19] 4 --- fjs/bnf/data/proof.f.ts | 2 +- fjs/ci/proof.f.ts | 2 +- fjs/dev/package_json/module.f.ts | 2 +- fjs/djs/parser/proof.f.ts | 2 +- fjs/djs/serializer/proof.f.ts | 2 +- fjs/emergent_testing/proof.f.ts | 2 +- fjs/fsc/proof.f.ts | 2 +- fjs/fsm/module.f.ts | 2 +- fjs/fsm/proof.f.ts | 2 +- fjs/mcp/cas/module.f.ts | 2 +- fjs/mcp/evo/module.f.ts | 2 +- fjs/mcp/evo/proof.f.ts | 2 +- fjs/mcp/proof.f.ts | 2 +- fjs/media/json/{sede => common}/module.f.ts | 0 fjs/media/json/{sede => common}/proof.f.ts | 0 fjs/media/json/parser/proof.f.ts | 2 +- fjs/media/json/proof.f.ts | 2 +- fjs/media/json/schema/proof.f.ts | 2 +- fjs/media/module.f.ts | 2 +- fjs/media/revision/module.f.ts | 4 ++-- fjs/protocol/mcp/stdio/module.f.ts | 2 +- fjs/protocol/mcp/stdio/proof.f.ts | 2 +- fjs/text/ascii/proof.f.ts | 2 +- fjs/text/utf16/proof.f.ts | 2 +- fjs/text/utf8/proof.f.ts | 2 +- fjs/types/array/proof.f.ts | 2 +- fjs/types/btree/find/proof.f.ts | 2 +- fjs/types/btree/proof.f.ts | 2 +- fjs/types/btree/remove/proof.f.ts | 2 +- fjs/types/btree/set/proof.f.ts | 2 +- fjs/types/byte_set/proof.f.ts | 2 +- fjs/types/list/proof.f.ts | 2 +- fjs/types/range_map/proof.f.ts | 2 +- fjs/types/sorted_list/proof.f.ts | 2 +- fjs/types/sorted_set/proof.f.ts | 2 +- 35 files changed, 34 insertions(+), 34 deletions(-) rename fjs/media/json/{sede => common}/module.f.ts (100%) rename fjs/media/json/{sede => common}/proof.f.ts (100%) diff --git a/fjs/bnf/data/proof.f.ts b/fjs/bnf/data/proof.f.ts index 78b38830d..0aada67ad 100644 --- a/fjs/bnf/data/proof.f.ts +++ b/fjs/bnf/data/proof.f.ts @@ -1,4 +1,4 @@ -import { stringify } from '../../media/json/sede/module.f.ts' +import { stringify } from '../../media/json/common/module.f.ts' import { identity } from '../../types/function/module.f.mjs' import { sort } from '../../types/object/module.f.mjs' import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from '../module.f.mjs' diff --git a/fjs/ci/proof.f.ts b/fjs/ci/proof.f.ts index 4d0e5cdba..485bbceb2 100644 --- a/fjs/ci/proof.f.ts +++ b/fjs/ci/proof.f.ts @@ -9,7 +9,7 @@ import type { MetaStep, Os, GitHubAction } from './common/types.ts' import { assert, assertEq } from '../asserts/module.f.mjs' import { emptyState, virtual } from '../effects/node/virtual/module.f.mjs' import type { Dir, State } from '../effects/node/virtual/types.ts' -import { parse as jsonParse } from '../media/json/sede/module.f.ts' +import { parse as jsonParse } from '../media/json/common/module.f.ts' import { unwrap } from '../types/result/module.f.mjs' import { definedValues } from '../types/object/module.f.mjs' diff --git a/fjs/dev/package_json/module.f.ts b/fjs/dev/package_json/module.f.ts index 3a6db1aee..5ceec9025 100644 --- a/fjs/dev/package_json/module.f.ts +++ b/fjs/dev/package_json/module.f.ts @@ -4,7 +4,7 @@ * * @module */ -import { parse as parseJsonText } from '../../media/json/sede/module.f.ts' +import { parse as parseJsonText } from '../../media/json/common/module.f.ts' import { option, record, string } from '../../types/rtti/module.f.mjs' import { validate as rttiValidate } from '../../types/rtti/validate/module.f.mjs' import type { ValidationError } from '../../types/rtti/common/types.ts' diff --git a/fjs/djs/parser/proof.f.ts b/fjs/djs/parser/proof.f.ts index 9ac3d9785..8121017d6 100644 --- a/fjs/djs/parser/proof.f.ts +++ b/fjs/djs/parser/proof.f.ts @@ -4,7 +4,7 @@ import { toArray } from '../../types/list/module.f.mjs' import { sort } from '../../types/object/module.f.mjs' import { stringToList } from '../../text/utf16/module.f.mjs' import { stringifyAsTree } from '../serializer/module.f.ts' -import { stringify } from '../../media/json/sede/module.f.ts' +import { stringify } from '../../media/json/common/module.f.ts' import { assert, assertEq } from '../../asserts/module.f.mjs' const tokenizeString diff --git a/fjs/djs/serializer/proof.f.ts b/fjs/djs/serializer/proof.f.ts index e130413f1..69c1f550d 100644 --- a/fjs/djs/serializer/proof.f.ts +++ b/fjs/djs/serializer/proof.f.ts @@ -1,7 +1,7 @@ import { countRefs, stringify, stringifyAsTree } from './module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { identity } from '../../types/function/module.f.mjs' -import { setProperty } from '../../media/json/sede/module.f.ts' +import { setProperty } from '../../media/json/common/module.f.ts' import { assertEq } from '../../asserts/module.f.mjs' export const proof = { diff --git a/fjs/emergent_testing/proof.f.ts b/fjs/emergent_testing/proof.f.ts index f207b260e..35dc6d0a5 100644 --- a/fjs/emergent_testing/proof.f.ts +++ b/fjs/emergent_testing/proof.f.ts @@ -13,7 +13,7 @@ import type { Reporter } from './types.ts' import { run as mockRun } from '../effects/mock/module.f.mjs' import type { All, Await, Test, TestContext } from '../effects/node/types.ts' import { shouldLoad } from '../dev/module.f.mjs' -import { parse as parseJson } from '../media/json/sede/module.f.ts' +import { parse as parseJson } from '../media/json/common/module.f.ts' import { array, number as rttiNumber, or, string as rttiString } from '../types/rtti/module.f.mjs' import { parse as rttiParse } from '../types/rtti/parse/module.f.mjs' import type { Ts } from '../types/rtti/ts/types.ts' diff --git a/fjs/fsc/proof.f.ts b/fjs/fsc/proof.f.ts index 6275907f2..5f9467b24 100644 --- a/fjs/fsc/proof.f.ts +++ b/fjs/fsc/proof.f.ts @@ -1,6 +1,6 @@ import { init, terminal } from './module.f.mjs' import { one } from '../text/ascii/module.f.mjs' -import { stringify } from '../media/json/sede/module.f.ts' +import { stringify } from '../media/json/common/module.f.ts' import { assertEq } from '../asserts/module.f.mjs' const s = stringify(i => i) diff --git a/fjs/fsm/module.f.ts b/fjs/fsm/module.f.ts index cd955aaea..cae9f3726 100644 --- a/fjs/fsm/module.f.ts +++ b/fjs/fsm/module.f.ts @@ -14,7 +14,7 @@ import type { RangeMap, Properties, RangeMapArray, Entry } from '../types/range_ import { merge, get as rangeMapGet } from '../types/range_map/module.f.mjs' import type { Fold, Scan } from '../types/function/operator/types.ts' import { strictEqual } from '../types/function/operator/module.f.mjs' -import { stringify } from '../media/json/sede/module.f.ts' +import { stringify } from '../media/json/common/module.f.ts' import { identity } from '../types/function/module.f.mjs' import { stringToList } from '../text/utf16/module.f.mjs' import { cmp } from '../types/string/module.f.mjs' diff --git a/fjs/fsm/proof.f.ts b/fjs/fsm/proof.f.ts index 608ea106e..c7bcb0430 100644 --- a/fjs/fsm/proof.f.ts +++ b/fjs/fsm/proof.f.ts @@ -1,7 +1,7 @@ import { dfa, run, toRange, toUnion, type Grammar } from './module.f.ts' import { union } from '../types/byte_set/module.f.mjs' import { sort, fromEntries } from '../types/object/module.f.mjs' -import { stringify } from '../media/json/sede/module.f.ts' +import { stringify } from '../media/json/common/module.f.ts' import { identity } from '../types/function/module.f.mjs' import { toArray } from '../types/list/module.f.mjs' import { stringToList } from '../text/utf16/module.f.mjs' diff --git a/fjs/mcp/cas/module.f.ts b/fjs/mcp/cas/module.f.ts index 8c414e4e9..279c86646 100644 --- a/fjs/mcp/cas/module.f.ts +++ b/fjs/mcp/cas/module.f.ts @@ -102,7 +102,7 @@ * @module */ import { string, option, or, boolean } from '../../types/rtti/module.f.mjs' -import { stringify } from '../../media/json/sede/module.f.ts' +import { stringify } from '../../media/json/common/module.f.ts' import { pure, step } from '../../effects/module.f.mjs' import type { Effect } from '../../effects/types.ts' import type { MemOp } from '../../effects/memory/types.ts' diff --git a/fjs/mcp/evo/module.f.ts b/fjs/mcp/evo/module.f.ts index ca3cd3f29..493f5c5b4 100644 --- a/fjs/mcp/evo/module.f.ts +++ b/fjs/mcp/evo/module.f.ts @@ -51,7 +51,7 @@ import { toolEntry, errorResult, okResult, type ToolEntry, type ToolsCallResult, } from '../../protocol/mcp/module.f.ts' -import { stringify } from '../../media/json/sede/module.f.ts' +import { stringify } from '../../media/json/common/module.f.ts' import { identity } from '../../types/function/module.f.mjs' import { type Evo } from '../../cas/evo/module.f.ts' diff --git a/fjs/mcp/evo/proof.f.ts b/fjs/mcp/evo/proof.f.ts index ace71f333..f6e738d2e 100644 --- a/fjs/mcp/evo/proof.f.ts +++ b/fjs/mcp/evo/proof.f.ts @@ -8,7 +8,7 @@ import { initEvo, evo, type Evo } from '../../cas/evo/module.f.ts' import { evoToolRegistry } from './module.f.ts' import type { ToolEntry, ToolsCallResult } from '../../protocol/mcp/module.f.ts' import type { Operation } from '../../effects/types.ts' -import { parse as parseJson } from '../../media/json/sede/module.f.ts' +import { parse as parseJson } from '../../media/json/common/module.f.ts' import { array, string as rttiString } from '../../types/rtti/module.f.mjs' import { parse as rttiParse } from '../../types/rtti/parse/module.f.mjs' import { unwrap } from '../../types/result/module.f.mjs' diff --git a/fjs/mcp/proof.f.ts b/fjs/mcp/proof.f.ts index e1784cd32..ace184f0e 100644 --- a/fjs/mcp/proof.f.ts +++ b/fjs/mcp/proof.f.ts @@ -4,7 +4,7 @@ import { assert, assertEq } from '../asserts/module.f.mjs' import { pure, step } from '../effects/module.f.mjs' import type { Effect, Operation } from '../effects/types.ts' import { create } from '../effects/memory/module.f.mjs' -import { parse as parseJson } from '../media/json/sede/module.f.ts' +import { parse as parseJson } from '../media/json/common/module.f.ts' import { number as rttiNumber, option, string as rttiString } from '../types/rtti/module.f.mjs' import { parse as rttiParse } from '../types/rtti/parse/module.f.mjs' import type { Response } from '../protocol/json_rpc/module.f.ts' diff --git a/fjs/media/json/sede/module.f.ts b/fjs/media/json/common/module.f.ts similarity index 100% rename from fjs/media/json/sede/module.f.ts rename to fjs/media/json/common/module.f.ts diff --git a/fjs/media/json/sede/proof.f.ts b/fjs/media/json/common/proof.f.ts similarity index 100% rename from fjs/media/json/sede/proof.f.ts rename to fjs/media/json/common/proof.f.ts diff --git a/fjs/media/json/parser/proof.f.ts b/fjs/media/json/parser/proof.f.ts index 04bb06a9d..6e2f752bd 100644 --- a/fjs/media/json/parser/proof.f.ts +++ b/fjs/media/json/parser/proof.f.ts @@ -2,7 +2,7 @@ import { parse } from './module.f.ts' import { tokenize } from '../tokenizer/module.f.mjs' import type { JsonToken } from '../tokenizer/types.ts' import { toArray } from '../../../types/list/module.f.mjs' -import { stringify as jsonStringify } from '../sede/module.f.ts' +import { stringify as jsonStringify } from '../common/module.f.ts' import { sort } from '../../../types/object/module.f.mjs' import { stringToList } from '../../../text/utf16/module.f.mjs' import { assertEq } from '../../../asserts/module.f.mjs' diff --git a/fjs/media/json/proof.f.ts b/fjs/media/json/proof.f.ts index 33299391d..fa79e6768 100644 --- a/fjs/media/json/proof.f.ts +++ b/fjs/media/json/proof.f.ts @@ -1,4 +1,4 @@ -import { parse, setProperty, stringify } from './sede/module.f.ts' +import { parse, setProperty, stringify } from './common/module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { identity } from '../../types/function/module.f.mjs' import { assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/media/json/schema/proof.f.ts b/fjs/media/json/schema/proof.f.ts index 3cb57e332..3bc034b25 100644 --- a/fjs/media/json/schema/proof.f.ts +++ b/fjs/media/json/schema/proof.f.ts @@ -1,7 +1,7 @@ import { type Unknown as JsonValue } from '../types.ts' import { boolean, number, string, bigint, unknown, array, record, or, option } from '../../../types/rtti/module.f.mjs' -import { stringify } from '../sede/module.f.ts' +import { stringify } from '../common/module.f.ts' import { toJsonSchema, type Unknown, unknown as schemaUnknown } from './module.f.ts' import { assert, assertEq } from '../../../asserts/module.f.mjs' diff --git a/fjs/media/module.f.ts b/fjs/media/module.f.ts index 3508fc924..fb6b7abf7 100644 --- a/fjs/media/module.f.ts +++ b/fjs/media/module.f.ts @@ -45,7 +45,7 @@ import type { Vec } from '../types/bit_vec/types.ts' import { fromVec } from '../text/utf8/module.f.mjs' import { detectVec } from './type/module.f.mjs' import type { DetectMeta } from './type/types.ts' -import { parse } from './json/sede/module.f.ts' +import { parse } from './json/common/module.f.ts' import { assert, assertNotNullish } from '../asserts/module.f.mjs' import type { Struct } from '../types/rtti/types.ts' import type { Ts, Unknown } from '../types/rtti/ts/types.ts' diff --git a/fjs/media/revision/module.f.ts b/fjs/media/revision/module.f.ts index e760d0183..08b8740f5 100644 --- a/fjs/media/revision/module.f.ts +++ b/fjs/media/revision/module.f.ts @@ -21,13 +21,13 @@ import { array, number, option, record, string } from '../../types/rtti/module.f import { validate as rttiValidate } from '../../types/rtti/validate/module.f.mjs' import type { ValidationError } from '../../types/rtti/common/types.ts' import type { Ts } from '../../types/rtti/ts/types.ts' -import { parse as parseJson } from '../json/sede/module.f.ts' +import { parse as parseJson } from '../json/common/module.f.ts' import { cBase32ToVec } from '../../basen/cbase32/module.f.mjs' import type { Result } from '../../types/result/types.ts' import { error, ok } from '../../types/result/module.f.mjs' import { dialectEntry, type DialectEntry } from '../module.f.ts' import { definedEntries, sort } from '../../types/object/module.f.mjs' -import { stringify } from '../json/sede/module.f.ts' +import { stringify } from '../json/common/module.f.ts' /** * Format tag: names the dialect of this BLOB. The media type it is served diff --git a/fjs/protocol/mcp/stdio/module.f.ts b/fjs/protocol/mcp/stdio/module.f.ts index 9e228252c..0b0582c54 100644 --- a/fjs/protocol/mcp/stdio/module.f.ts +++ b/fjs/protocol/mcp/stdio/module.f.ts @@ -36,7 +36,7 @@ import type { Effect, Operation } from '../../../effects/types.ts' import { readLine, write } from '../../../effects/node/module.f.mjs' import type { IoResult, Read, Write } from '../../../effects/node/types.ts' import { tryUtf8 } from '../../../text/module.f.mjs' -import { parse, stringify } from '../../../media/json/sede/module.f.ts' +import { parse, stringify } from '../../../media/json/common/module.f.ts' import { sort } from '../../../types/object/module.f.mjs' import { internalError, jsonrpc, parseError, type Response } from '../../json_rpc/module.f.ts' import { error, ok } from '../../../types/result/module.f.mjs' diff --git a/fjs/protocol/mcp/stdio/proof.f.ts b/fjs/protocol/mcp/stdio/proof.f.ts index d77ce3661..2dcb4d922 100644 --- a/fjs/protocol/mcp/stdio/proof.f.ts +++ b/fjs/protocol/mcp/stdio/proof.f.ts @@ -5,7 +5,7 @@ import { pure } from '../../../effects/module.f.mjs' import type { Effect } from '../../../effects/types.ts' import { emptyState, virtual } from '../../../effects/node/virtual/module.f.mjs' import type { State } from '../../../effects/node/virtual/types.ts' -import { stringify } from '../../../media/json/sede/module.f.ts' +import { stringify } from '../../../media/json/common/module.f.ts' import { utf8 } from '../../../text/module.f.mjs' import { fromVec } from '../../../types/uint8array/module.f.mjs' import { maxLengthBytes } from '../../../types/bit_vec/module.f.mjs' diff --git a/fjs/text/ascii/proof.f.ts b/fjs/text/ascii/proof.f.ts index 0967a4d0c..d375fe62f 100644 --- a/fjs/text/ascii/proof.f.ts +++ b/fjs/text/ascii/proof.f.ts @@ -1,5 +1,5 @@ import { one, range } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/sede/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/common/module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/text/utf16/proof.f.ts b/fjs/text/utf16/proof.f.ts index 98a9f62bb..930d5dd91 100644 --- a/fjs/text/utf16/proof.f.ts +++ b/fjs/text/utf16/proof.f.ts @@ -9,7 +9,7 @@ import { codePointListToString, codePointToString } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/sede/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/common/module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { toArray } from '../../types/list/module.f.mjs' import { assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/text/utf8/proof.f.ts b/fjs/text/utf8/proof.f.ts index f70870bb9..687a95bee 100644 --- a/fjs/text/utf8/proof.f.ts +++ b/fjs/text/utf8/proof.f.ts @@ -1,5 +1,5 @@ import { toCodePointList, fromCodePointList, fromVec, utf8ByteToCodePointOp } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/sede/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/common/module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { toArray } from '../../types/list/module.f.mjs' import { msb, u8ListToVec, vec } from '../../types/bit_vec/module.f.mjs' diff --git a/fjs/types/array/proof.f.ts b/fjs/types/array/proof.f.ts index 6f95176b0..6f664b25d 100644 --- a/fjs/types/array/proof.f.ts +++ b/fjs/types/array/proof.f.ts @@ -1,5 +1,5 @@ import { at, first, last, head, tail, splitFirst, splitLast, empty } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/sede/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/common/module.f.ts' import { sort } from '../object/module.f.mjs' import { assertEq, assertNotNullish } from '../../asserts/module.f.mjs' diff --git a/fjs/types/btree/find/proof.f.ts b/fjs/types/btree/find/proof.f.ts index d117f3689..ad4021c6e 100644 --- a/fjs/types/btree/find/proof.f.ts +++ b/fjs/types/btree/find/proof.f.ts @@ -3,7 +3,7 @@ import type { Unknown } from '../../../media/json/types.ts' import type { Result } from './types.ts' import { find as btreeFind } from './module.f.mjs' import { map, toArray } from '../../list/module.f.mjs' -import { stringify } from '../../../media/json/sede/module.f.ts' +import { stringify } from '../../../media/json/common/module.f.ts' import { sort } from '../../object/module.f.mjs' import type { TNode } from '../types/types.ts' import { cmp } from '../../string/module.f.mjs' diff --git a/fjs/types/btree/proof.f.ts b/fjs/types/btree/proof.f.ts index e5c43628c..b4a8bf2b9 100644 --- a/fjs/types/btree/proof.f.ts +++ b/fjs/types/btree/proof.f.ts @@ -2,7 +2,7 @@ import type { Unknown } from '../../media/json/types.ts' import type { TNode } from './types/types.ts' import { values } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/sede/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/common/module.f.ts' import { sort } from '../object/module.f.mjs' import { cmp } from '../string/module.f.mjs' import type { List, Result } from '../list/types.ts' diff --git a/fjs/types/btree/remove/proof.f.ts b/fjs/types/btree/remove/proof.f.ts index a5b9d6ef0..3f753bbfd 100644 --- a/fjs/types/btree/remove/proof.f.ts +++ b/fjs/types/btree/remove/proof.f.ts @@ -2,7 +2,7 @@ import { nodeRemove } from './module.f.mjs' import type { TNode } from '../types/types.ts' import { set as setSet } from '../set/module.f.mjs' import { cmp } from '../../string/module.f.mjs' -import { stringify } from '../../../media/json/sede/module.f.ts' +import { stringify } from '../../../media/json/common/module.f.ts' import { sort } from '../../object/module.f.mjs' import { assertEq, assertNotNullish } from '../../../asserts/module.f.mjs' diff --git a/fjs/types/btree/set/proof.f.ts b/fjs/types/btree/set/proof.f.ts index afb2c6950..3be289165 100644 --- a/fjs/types/btree/set/proof.f.ts +++ b/fjs/types/btree/set/proof.f.ts @@ -1,7 +1,7 @@ import { set as setSet } from './module.f.mjs' import type { TNode } from '../types/types.ts' import { cmp } from '../../string/module.f.mjs' -import { stringify } from '../../../media/json/sede/module.f.ts' +import { stringify } from '../../../media/json/common/module.f.ts' import { sort } from '../../object/module.f.mjs' import { assertEq } from '../../../asserts/module.f.mjs' diff --git a/fjs/types/byte_set/proof.f.ts b/fjs/types/byte_set/proof.f.ts index f29c59803..28e9f9d1d 100644 --- a/fjs/types/byte_set/proof.f.ts +++ b/fjs/types/byte_set/proof.f.ts @@ -2,7 +2,7 @@ import type { Unknown } from '../../media/json/types.ts' import { has, empty, set, setRange, unset, universe, complement, toRangeMap } from './module.f.mjs' import { every, countdown, map, toArray } from '../list/module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/sede/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/common/module.f.ts' import { sort } from '../object/module.f.mjs' import { assert, assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/types/list/proof.f.ts b/fjs/types/list/proof.f.ts index 2f6a1801a..c5e940fd6 100644 --- a/fjs/types/list/proof.f.ts +++ b/fjs/types/list/proof.f.ts @@ -2,7 +2,7 @@ import type { Unknown } from '../../media/json/types.ts' import type { List } from './types.ts' import { length, concat, countdown, cycle, drop, dropWhile, entries, every, filter, find, flat, flatMap, map, next, reduce, reverse, scan, some, take, takeWhile, toArray, zip, first, filterMap, isEmpty, equal, tryFold } from './module.f.mjs' -import { stringify } from '../../media/json/sede/module.f.ts' +import { stringify } from '../../media/json/common/module.f.ts' import { sort } from '../object/module.f.mjs' import { addition, strictEqual, reduceToScan } from '../function/operator/module.f.mjs' import { assert, assertEq, assertNotNullish } from '../../asserts/module.f.mjs' diff --git a/fjs/types/range_map/proof.f.ts b/fjs/types/range_map/proof.f.ts index 9833ecf83..00a70a2a4 100644 --- a/fjs/types/range_map/proof.f.ts +++ b/fjs/types/range_map/proof.f.ts @@ -2,7 +2,7 @@ import type { Unknown } from '../../media/json/types.ts' import type { RangeMapArray, Properties, RangeMap } from './types.ts' import { get, merge, fromRange, rangeMap } from './module.f.mjs' -import { stringify } from '../../media/json/sede/module.f.ts' +import { stringify } from '../../media/json/common/module.f.ts' import { sort } from '../object/module.f.mjs' import { union } from '../sorted_set/module.f.mjs' import type { SortedSet } from '../sorted_set/types.ts' diff --git a/fjs/types/sorted_list/proof.f.ts b/fjs/types/sorted_list/proof.f.ts index f6105d244..4ae187611 100644 --- a/fjs/types/sorted_list/proof.f.ts +++ b/fjs/types/sorted_list/proof.f.ts @@ -1,7 +1,7 @@ import type { Unknown } from '../../media/json/types.ts' import { find, merge } from './module.f.mjs' -import { stringify } from '../../media/json/sede/module.f.ts' +import { stringify } from '../../media/json/common/module.f.ts' import { sort } from '../object/module.f.mjs' import { toArray, countdown, length } from '../list/module.f.mjs' import { flip } from '../function/module.f.mjs' diff --git a/fjs/types/sorted_set/proof.f.ts b/fjs/types/sorted_set/proof.f.ts index a34002ded..bc297d157 100644 --- a/fjs/types/sorted_set/proof.f.ts +++ b/fjs/types/sorted_set/proof.f.ts @@ -1,7 +1,7 @@ import type { Unknown } from '../../media/json/types.ts' import { has, intersect, union } from './module.f.mjs' -import { stringify } from '../../media/json/sede/module.f.ts' +import { stringify } from '../../media/json/common/module.f.ts' import { sort } from '../object/module.f.mjs' import { toArray, countdown, length } from '../list/module.f.mjs' import { flip } from '../function/module.f.mjs' From 7f0459ab68193d259ee4d45e4206cca7df0cfdd3 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 23:01:20 -0700 Subject: [PATCH 09/19] common --- fjs/media/json/module.f.mjs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fjs/media/json/module.f.mjs b/fjs/media/json/module.f.mjs index 1f0832ef6..2060d6fae 100644 --- a/fjs/media/json/module.f.mjs +++ b/fjs/media/json/module.f.mjs @@ -11,8 +11,6 @@ import { /** rtti schema matching any JSON primitive: `null`, `boolean`, `number`, or `string`. */ export const primitive = or(null, rttiBoolean, rttiNumber, rttiString) -/** @typedef {() => ['or', typeof primitive, typeof object, typeof array]} _RttiUnknown */ - /** * rtti schema matching any JSON value: a primitive, an array of JSON values, * or an object whose values are JSON values. Self-referential via a thunk; @@ -22,7 +20,7 @@ export const primitive = or(null, rttiBoolean, rttiNumber, rttiString) * A struct field typed `unknown` is **required when present** — unlike rtti * core's `unknown`, the JSON `unknown` excludes `undefined`. * - * @type {_RttiUnknown} + * @type {() => ['or', typeof primitive, typeof object, typeof array]} */ export const unknown = () => ['or', primitive, object, array] From f2da8d5057b8b7b037de2b463d4a0b09946fb228 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 23:08:25 -0700 Subject: [PATCH 10/19] rev --- fjs/media/{json/common => revision}/proof.f.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename fjs/media/{json/common => revision}/proof.f.ts (100%) diff --git a/fjs/media/json/common/proof.f.ts b/fjs/media/revision/proof.f.ts similarity index 100% rename from fjs/media/json/common/proof.f.ts rename to fjs/media/revision/proof.f.ts From 334cd919457bb3570d916597e4f644fb8c93e033 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 23:09:49 -0700 Subject: [PATCH 11/19] fix --- fjs/media/revision/proof.f.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fjs/media/revision/proof.f.ts b/fjs/media/revision/proof.f.ts index 9d35889cc..a56a4c029 100644 --- a/fjs/media/revision/proof.f.ts +++ b/fjs/media/revision/proof.f.ts @@ -1,7 +1,7 @@ -import type { Object as JsonObject } from '../types.ts' +import type { Object as JsonObject } from '../json/types.ts' -import { assert, assertEq } from '../../../asserts/module.f.mjs' -import { dialect, mediaType, isHash, validate, decodeText, encodeText, type LockMap } from '../../revision/module.f.ts' +import { assert, assertEq } from '../../asserts/module.f.mjs' +import { dialect, mediaType, isHash, validate, decodeText, encodeText, type LockMap } from './module.f.ts' // Valid cbase32 hashes (round-tripped in fjs/basen/cbase32/proof.f.mjs): single // cbase32 symbols, cheap to write inline here. From 2c5cdaf4e5011c21270adc66719800d20222564d Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 23:17:49 -0700 Subject: [PATCH 12/19] ok --- fjs/media/json/{ => rtti}/module.f.mjs | 2 +- fjs/media/json/schema/module.f.ts | 2 +- fjs/media/json/types.ts | 2 +- fjs/protocol/json_rpc/module.f.ts | 2 +- fjs/protocol/mcp/module.f.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename fjs/media/json/{ => rtti}/module.f.mjs (96%) diff --git a/fjs/media/json/module.f.mjs b/fjs/media/json/rtti/module.f.mjs similarity index 96% rename from fjs/media/json/module.f.mjs rename to fjs/media/json/rtti/module.f.mjs index 2060d6fae..f700ccb7f 100644 --- a/fjs/media/json/module.f.mjs +++ b/fjs/media/json/rtti/module.f.mjs @@ -6,7 +6,7 @@ import { or, record, array as rttiArray -} from '../../types/rtti/module.f.mjs' +} from '../../../types/rtti/module.f.mjs' /** rtti schema matching any JSON primitive: `null`, `boolean`, `number`, or `string`. */ export const primitive = or(null, rttiBoolean, rttiNumber, rttiString) diff --git a/fjs/media/json/schema/module.f.ts b/fjs/media/json/schema/module.f.ts index 9b3f5f41c..74517b329 100644 --- a/fjs/media/json/schema/module.f.ts +++ b/fjs/media/json/schema/module.f.ts @@ -13,7 +13,7 @@ import type { Visitor } from '../../../types/rtti/common/types.ts' import type { Primitive } from '../../../djs/module.f.ts' import type { Ts } from '../../../types/rtti/ts/types.ts' import type { Phantom } from '../../../types/phantom/types.ts' -import { unknown as jsonUnknown } from '../module.f.mjs' +import { unknown as jsonUnknown } from '../rtti/module.f.mjs' const unknownThunk = () => ['const', unknownConst] as const diff --git a/fjs/media/json/types.ts b/fjs/media/json/types.ts index 538dcdd5a..29dccb920 100644 --- a/fjs/media/json/types.ts +++ b/fjs/media/json/types.ts @@ -1,7 +1,7 @@ import type { Assert } from "../../asserts/types.ts" import type { Ts } from "../../types/rtti/ts/types.ts" import type { Equal } from "../../types/ts/types.ts" -import type { primitive, unknown } from "./module.f.mjs" +import type { primitive, unknown } from "./rtti/module.f.mjs" export type Primitive = Ts diff --git a/fjs/protocol/json_rpc/module.f.ts b/fjs/protocol/json_rpc/module.f.ts index 7b2dce490..7357a7f71 100644 --- a/fjs/protocol/json_rpc/module.f.ts +++ b/fjs/protocol/json_rpc/module.f.ts @@ -21,7 +21,7 @@ import { number, string, or, option } from '../../types/rtti/module.f.mjs' import type { Ts } from '../../types/rtti/ts/types.ts' import { validate } from '../../types/rtti/validate/module.f.mjs' import type { Result } from '../../types/result/types.ts' -import { unknown } from '../../media/json/module.f.mjs' +import { unknown } from '../../media/json/rtti/module.f.mjs' export const jsonrpc = '2.0' as const diff --git a/fjs/protocol/mcp/module.f.ts b/fjs/protocol/mcp/module.f.ts index 7f843ae35..4f6674ad0 100644 --- a/fjs/protocol/mcp/module.f.ts +++ b/fjs/protocol/mcp/module.f.ts @@ -30,7 +30,7 @@ import { import { validate } from '../../types/rtti/validate/module.f.mjs' import { toJsonSchema } from '../../media/json/schema/module.f.ts' import type { Type } from '../../types/rtti/types.ts' -import { unknown } from '../../media/json/module.f.mjs' +import { unknown } from '../../media/json/rtti/module.f.mjs' // ── Shared ───────────────────────────────────────────────────────────────────── From 3b1230188741990372dec0e0b0e5159ae89eac9a Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 23:18:32 -0700 Subject: [PATCH 13/19] ok --- fjs/bnf/data/proof.f.ts | 2 +- fjs/ci/proof.f.ts | 2 +- fjs/dev/package_json/module.f.ts | 2 +- fjs/djs/parser/proof.f.ts | 2 +- fjs/djs/serializer/proof.f.ts | 2 +- fjs/emergent_testing/proof.f.ts | 2 +- fjs/fsc/proof.f.ts | 2 +- fjs/fsm/module.f.ts | 2 +- fjs/fsm/proof.f.ts | 2 +- fjs/mcp/cas/module.f.ts | 2 +- fjs/mcp/evo/module.f.ts | 2 +- fjs/mcp/evo/proof.f.ts | 2 +- fjs/mcp/proof.f.ts | 2 +- fjs/media/json/{common => }/module.f.ts | 24 ++++++++++++------------ fjs/media/json/parser/proof.f.ts | 2 +- fjs/media/json/proof.f.ts | 2 +- fjs/media/json/schema/proof.f.ts | 2 +- fjs/media/module.f.ts | 2 +- fjs/media/revision/module.f.ts | 4 ++-- fjs/protocol/mcp/stdio/module.f.ts | 2 +- fjs/protocol/mcp/stdio/proof.f.ts | 2 +- fjs/text/ascii/proof.f.ts | 2 +- fjs/text/utf16/proof.f.ts | 2 +- fjs/text/utf8/proof.f.ts | 2 +- fjs/types/array/proof.f.ts | 2 +- fjs/types/btree/find/proof.f.ts | 2 +- fjs/types/btree/proof.f.ts | 2 +- fjs/types/btree/remove/proof.f.ts | 2 +- fjs/types/btree/set/proof.f.ts | 2 +- fjs/types/byte_set/proof.f.ts | 2 +- fjs/types/list/proof.f.ts | 2 +- fjs/types/range_map/proof.f.ts | 2 +- fjs/types/sorted_list/proof.f.ts | 2 +- fjs/types/sorted_set/proof.f.ts | 2 +- 34 files changed, 46 insertions(+), 46 deletions(-) rename fjs/media/json/{common => }/module.f.ts (82%) diff --git a/fjs/bnf/data/proof.f.ts b/fjs/bnf/data/proof.f.ts index 0aada67ad..f41d8ae06 100644 --- a/fjs/bnf/data/proof.f.ts +++ b/fjs/bnf/data/proof.f.ts @@ -1,4 +1,4 @@ -import { stringify } from '../../media/json/common/module.f.ts' +import { stringify } from '../../media/json/module.f.ts' import { identity } from '../../types/function/module.f.mjs' import { sort } from '../../types/object/module.f.mjs' import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from '../module.f.mjs' diff --git a/fjs/ci/proof.f.ts b/fjs/ci/proof.f.ts index 485bbceb2..b7386598c 100644 --- a/fjs/ci/proof.f.ts +++ b/fjs/ci/proof.f.ts @@ -9,7 +9,7 @@ import type { MetaStep, Os, GitHubAction } from './common/types.ts' import { assert, assertEq } from '../asserts/module.f.mjs' import { emptyState, virtual } from '../effects/node/virtual/module.f.mjs' import type { Dir, State } from '../effects/node/virtual/types.ts' -import { parse as jsonParse } from '../media/json/common/module.f.ts' +import { parse as jsonParse } from '../media/json/module.f.ts' import { unwrap } from '../types/result/module.f.mjs' import { definedValues } from '../types/object/module.f.mjs' diff --git a/fjs/dev/package_json/module.f.ts b/fjs/dev/package_json/module.f.ts index 5ceec9025..7d943290c 100644 --- a/fjs/dev/package_json/module.f.ts +++ b/fjs/dev/package_json/module.f.ts @@ -4,7 +4,7 @@ * * @module */ -import { parse as parseJsonText } from '../../media/json/common/module.f.ts' +import { parse as parseJsonText } from '../../media/json/module.f.ts' import { option, record, string } from '../../types/rtti/module.f.mjs' import { validate as rttiValidate } from '../../types/rtti/validate/module.f.mjs' import type { ValidationError } from '../../types/rtti/common/types.ts' diff --git a/fjs/djs/parser/proof.f.ts b/fjs/djs/parser/proof.f.ts index 8121017d6..0203a455e 100644 --- a/fjs/djs/parser/proof.f.ts +++ b/fjs/djs/parser/proof.f.ts @@ -4,7 +4,7 @@ import { toArray } from '../../types/list/module.f.mjs' import { sort } from '../../types/object/module.f.mjs' import { stringToList } from '../../text/utf16/module.f.mjs' import { stringifyAsTree } from '../serializer/module.f.ts' -import { stringify } from '../../media/json/common/module.f.ts' +import { stringify } from '../../media/json/module.f.ts' import { assert, assertEq } from '../../asserts/module.f.mjs' const tokenizeString diff --git a/fjs/djs/serializer/proof.f.ts b/fjs/djs/serializer/proof.f.ts index 69c1f550d..d56b1154e 100644 --- a/fjs/djs/serializer/proof.f.ts +++ b/fjs/djs/serializer/proof.f.ts @@ -1,7 +1,7 @@ import { countRefs, stringify, stringifyAsTree } from './module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { identity } from '../../types/function/module.f.mjs' -import { setProperty } from '../../media/json/common/module.f.ts' +import { setProperty } from '../../media/json/module.f.ts' import { assertEq } from '../../asserts/module.f.mjs' export const proof = { diff --git a/fjs/emergent_testing/proof.f.ts b/fjs/emergent_testing/proof.f.ts index 35dc6d0a5..35a39bffd 100644 --- a/fjs/emergent_testing/proof.f.ts +++ b/fjs/emergent_testing/proof.f.ts @@ -13,7 +13,7 @@ import type { Reporter } from './types.ts' import { run as mockRun } from '../effects/mock/module.f.mjs' import type { All, Await, Test, TestContext } from '../effects/node/types.ts' import { shouldLoad } from '../dev/module.f.mjs' -import { parse as parseJson } from '../media/json/common/module.f.ts' +import { parse as parseJson } from '../media/json/module.f.ts' import { array, number as rttiNumber, or, string as rttiString } from '../types/rtti/module.f.mjs' import { parse as rttiParse } from '../types/rtti/parse/module.f.mjs' import type { Ts } from '../types/rtti/ts/types.ts' diff --git a/fjs/fsc/proof.f.ts b/fjs/fsc/proof.f.ts index 5f9467b24..f869f4ad8 100644 --- a/fjs/fsc/proof.f.ts +++ b/fjs/fsc/proof.f.ts @@ -1,6 +1,6 @@ import { init, terminal } from './module.f.mjs' import { one } from '../text/ascii/module.f.mjs' -import { stringify } from '../media/json/common/module.f.ts' +import { stringify } from '../media/json/module.f.ts' import { assertEq } from '../asserts/module.f.mjs' const s = stringify(i => i) diff --git a/fjs/fsm/module.f.ts b/fjs/fsm/module.f.ts index cae9f3726..093bdcc40 100644 --- a/fjs/fsm/module.f.ts +++ b/fjs/fsm/module.f.ts @@ -14,7 +14,7 @@ import type { RangeMap, Properties, RangeMapArray, Entry } from '../types/range_ import { merge, get as rangeMapGet } from '../types/range_map/module.f.mjs' import type { Fold, Scan } from '../types/function/operator/types.ts' import { strictEqual } from '../types/function/operator/module.f.mjs' -import { stringify } from '../media/json/common/module.f.ts' +import { stringify } from '../media/json/module.f.ts' import { identity } from '../types/function/module.f.mjs' import { stringToList } from '../text/utf16/module.f.mjs' import { cmp } from '../types/string/module.f.mjs' diff --git a/fjs/fsm/proof.f.ts b/fjs/fsm/proof.f.ts index c7bcb0430..b132716c0 100644 --- a/fjs/fsm/proof.f.ts +++ b/fjs/fsm/proof.f.ts @@ -1,7 +1,7 @@ import { dfa, run, toRange, toUnion, type Grammar } from './module.f.ts' import { union } from '../types/byte_set/module.f.mjs' import { sort, fromEntries } from '../types/object/module.f.mjs' -import { stringify } from '../media/json/common/module.f.ts' +import { stringify } from '../media/json/module.f.ts' import { identity } from '../types/function/module.f.mjs' import { toArray } from '../types/list/module.f.mjs' import { stringToList } from '../text/utf16/module.f.mjs' diff --git a/fjs/mcp/cas/module.f.ts b/fjs/mcp/cas/module.f.ts index 279c86646..c01614bc5 100644 --- a/fjs/mcp/cas/module.f.ts +++ b/fjs/mcp/cas/module.f.ts @@ -102,7 +102,7 @@ * @module */ import { string, option, or, boolean } from '../../types/rtti/module.f.mjs' -import { stringify } from '../../media/json/common/module.f.ts' +import { stringify } from '../../media/json/module.f.ts' import { pure, step } from '../../effects/module.f.mjs' import type { Effect } from '../../effects/types.ts' import type { MemOp } from '../../effects/memory/types.ts' diff --git a/fjs/mcp/evo/module.f.ts b/fjs/mcp/evo/module.f.ts index 493f5c5b4..64708b808 100644 --- a/fjs/mcp/evo/module.f.ts +++ b/fjs/mcp/evo/module.f.ts @@ -51,7 +51,7 @@ import { toolEntry, errorResult, okResult, type ToolEntry, type ToolsCallResult, } from '../../protocol/mcp/module.f.ts' -import { stringify } from '../../media/json/common/module.f.ts' +import { stringify } from '../../media/json/module.f.ts' import { identity } from '../../types/function/module.f.mjs' import { type Evo } from '../../cas/evo/module.f.ts' diff --git a/fjs/mcp/evo/proof.f.ts b/fjs/mcp/evo/proof.f.ts index f6e738d2e..b0b8182db 100644 --- a/fjs/mcp/evo/proof.f.ts +++ b/fjs/mcp/evo/proof.f.ts @@ -8,7 +8,7 @@ import { initEvo, evo, type Evo } from '../../cas/evo/module.f.ts' import { evoToolRegistry } from './module.f.ts' import type { ToolEntry, ToolsCallResult } from '../../protocol/mcp/module.f.ts' import type { Operation } from '../../effects/types.ts' -import { parse as parseJson } from '../../media/json/common/module.f.ts' +import { parse as parseJson } from '../../media/json/module.f.ts' import { array, string as rttiString } from '../../types/rtti/module.f.mjs' import { parse as rttiParse } from '../../types/rtti/parse/module.f.mjs' import { unwrap } from '../../types/result/module.f.mjs' diff --git a/fjs/mcp/proof.f.ts b/fjs/mcp/proof.f.ts index ace184f0e..03c599000 100644 --- a/fjs/mcp/proof.f.ts +++ b/fjs/mcp/proof.f.ts @@ -4,7 +4,7 @@ import { assert, assertEq } from '../asserts/module.f.mjs' import { pure, step } from '../effects/module.f.mjs' import type { Effect, Operation } from '../effects/types.ts' import { create } from '../effects/memory/module.f.mjs' -import { parse as parseJson } from '../media/json/common/module.f.ts' +import { parse as parseJson } from '../media/json/module.f.ts' import { number as rttiNumber, option, string as rttiString } from '../types/rtti/module.f.mjs' import { parse as rttiParse } from '../types/rtti/parse/module.f.mjs' import type { Response } from '../protocol/json_rpc/module.f.ts' diff --git a/fjs/media/json/common/module.f.ts b/fjs/media/json/module.f.ts similarity index 82% rename from fjs/media/json/common/module.f.ts rename to fjs/media/json/module.f.ts index 635f1a956..069fda011 100644 --- a/fjs/media/json/common/module.f.ts +++ b/fjs/media/json/module.f.ts @@ -11,18 +11,18 @@ * * @module */ -import type { List } from '../../../types/list/types.ts' -import { next, flat, map } from '../../../types/list/module.f.mjs' -import { concat } from '../../../types/string/module.f.mjs' -import { stringToList } from '../../../text/utf16/module.f.mjs' -import type { Result } from '../../../types/result/types.ts' -import { parse as parseTokens } from '../parser/module.f.ts' -import { tokenize } from '../tokenizer/module.f.mjs' -import { at, definedEntries } from '../../../types/object/module.f.mjs' -import type { Entry as ObjectEntry } from '../../../types/object/types.ts' -import { compose, fn } from '../../../types/function/module.f.mjs' -import { objectWrap, arrayWrap, stringSerialize, numberSerialize, nullSerialize, boolSerialize } from '../serializer/module.f.mjs' -import type { Object, Unknown } from '../types.ts' +import type { List } from '../../types/list/types.ts' +import { next, flat, map } from '../../types/list/module.f.mjs' +import { concat } from '../../types/string/module.f.mjs' +import { stringToList } from '../../text/utf16/module.f.mjs' +import type { Result } from '../../types/result/types.ts' +import { parse as parseTokens } from './parser/module.f.ts' +import { tokenize } from './tokenizer/module.f.mjs' +import { at, definedEntries } from '../../types/object/module.f.mjs' +import type { Entry as ObjectEntry } from '../../types/object/types.ts' +import { compose, fn } from '../../types/function/module.f.mjs' +import { objectWrap, arrayWrap, stringSerialize, numberSerialize, nullSerialize, boolSerialize } from './serializer/module.f.mjs' +import type { Object, Unknown } from './types.ts' // ── JSON utilities ──────────────────────────────────────────────────────────── diff --git a/fjs/media/json/parser/proof.f.ts b/fjs/media/json/parser/proof.f.ts index 6e2f752bd..66387429e 100644 --- a/fjs/media/json/parser/proof.f.ts +++ b/fjs/media/json/parser/proof.f.ts @@ -2,7 +2,7 @@ import { parse } from './module.f.ts' import { tokenize } from '../tokenizer/module.f.mjs' import type { JsonToken } from '../tokenizer/types.ts' import { toArray } from '../../../types/list/module.f.mjs' -import { stringify as jsonStringify } from '../common/module.f.ts' +import { stringify as jsonStringify } from '../module.f.ts' import { sort } from '../../../types/object/module.f.mjs' import { stringToList } from '../../../text/utf16/module.f.mjs' import { assertEq } from '../../../asserts/module.f.mjs' diff --git a/fjs/media/json/proof.f.ts b/fjs/media/json/proof.f.ts index fa79e6768..21336e1b9 100644 --- a/fjs/media/json/proof.f.ts +++ b/fjs/media/json/proof.f.ts @@ -1,4 +1,4 @@ -import { parse, setProperty, stringify } from './common/module.f.ts' +import { parse, setProperty, stringify } from './module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { identity } from '../../types/function/module.f.mjs' import { assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/media/json/schema/proof.f.ts b/fjs/media/json/schema/proof.f.ts index 3bc034b25..1c50c63bb 100644 --- a/fjs/media/json/schema/proof.f.ts +++ b/fjs/media/json/schema/proof.f.ts @@ -1,7 +1,7 @@ import { type Unknown as JsonValue } from '../types.ts' import { boolean, number, string, bigint, unknown, array, record, or, option } from '../../../types/rtti/module.f.mjs' -import { stringify } from '../common/module.f.ts' +import { stringify } from '../module.f.ts' import { toJsonSchema, type Unknown, unknown as schemaUnknown } from './module.f.ts' import { assert, assertEq } from '../../../asserts/module.f.mjs' diff --git a/fjs/media/module.f.ts b/fjs/media/module.f.ts index fb6b7abf7..a370703ac 100644 --- a/fjs/media/module.f.ts +++ b/fjs/media/module.f.ts @@ -45,7 +45,7 @@ import type { Vec } from '../types/bit_vec/types.ts' import { fromVec } from '../text/utf8/module.f.mjs' import { detectVec } from './type/module.f.mjs' import type { DetectMeta } from './type/types.ts' -import { parse } from './json/common/module.f.ts' +import { parse } from './json/module.f.ts' import { assert, assertNotNullish } from '../asserts/module.f.mjs' import type { Struct } from '../types/rtti/types.ts' import type { Ts, Unknown } from '../types/rtti/ts/types.ts' diff --git a/fjs/media/revision/module.f.ts b/fjs/media/revision/module.f.ts index 08b8740f5..6cce0e3d8 100644 --- a/fjs/media/revision/module.f.ts +++ b/fjs/media/revision/module.f.ts @@ -21,13 +21,13 @@ import { array, number, option, record, string } from '../../types/rtti/module.f import { validate as rttiValidate } from '../../types/rtti/validate/module.f.mjs' import type { ValidationError } from '../../types/rtti/common/types.ts' import type { Ts } from '../../types/rtti/ts/types.ts' -import { parse as parseJson } from '../json/common/module.f.ts' +import { parse as parseJson } from '../json/module.f.ts' import { cBase32ToVec } from '../../basen/cbase32/module.f.mjs' import type { Result } from '../../types/result/types.ts' import { error, ok } from '../../types/result/module.f.mjs' import { dialectEntry, type DialectEntry } from '../module.f.ts' import { definedEntries, sort } from '../../types/object/module.f.mjs' -import { stringify } from '../json/common/module.f.ts' +import { stringify } from '../json/module.f.ts' /** * Format tag: names the dialect of this BLOB. The media type it is served diff --git a/fjs/protocol/mcp/stdio/module.f.ts b/fjs/protocol/mcp/stdio/module.f.ts index 0b0582c54..d19f935bb 100644 --- a/fjs/protocol/mcp/stdio/module.f.ts +++ b/fjs/protocol/mcp/stdio/module.f.ts @@ -36,7 +36,7 @@ import type { Effect, Operation } from '../../../effects/types.ts' import { readLine, write } from '../../../effects/node/module.f.mjs' import type { IoResult, Read, Write } from '../../../effects/node/types.ts' import { tryUtf8 } from '../../../text/module.f.mjs' -import { parse, stringify } from '../../../media/json/common/module.f.ts' +import { parse, stringify } from '../../../media/json/module.f.ts' import { sort } from '../../../types/object/module.f.mjs' import { internalError, jsonrpc, parseError, type Response } from '../../json_rpc/module.f.ts' import { error, ok } from '../../../types/result/module.f.mjs' diff --git a/fjs/protocol/mcp/stdio/proof.f.ts b/fjs/protocol/mcp/stdio/proof.f.ts index 2dcb4d922..7d7ea1494 100644 --- a/fjs/protocol/mcp/stdio/proof.f.ts +++ b/fjs/protocol/mcp/stdio/proof.f.ts @@ -5,7 +5,7 @@ import { pure } from '../../../effects/module.f.mjs' import type { Effect } from '../../../effects/types.ts' import { emptyState, virtual } from '../../../effects/node/virtual/module.f.mjs' import type { State } from '../../../effects/node/virtual/types.ts' -import { stringify } from '../../../media/json/common/module.f.ts' +import { stringify } from '../../../media/json/module.f.ts' import { utf8 } from '../../../text/module.f.mjs' import { fromVec } from '../../../types/uint8array/module.f.mjs' import { maxLengthBytes } from '../../../types/bit_vec/module.f.mjs' diff --git a/fjs/text/ascii/proof.f.ts b/fjs/text/ascii/proof.f.ts index d375fe62f..1117343d4 100644 --- a/fjs/text/ascii/proof.f.ts +++ b/fjs/text/ascii/proof.f.ts @@ -1,5 +1,5 @@ import { one, range } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/common/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/text/utf16/proof.f.ts b/fjs/text/utf16/proof.f.ts index 930d5dd91..81a31b194 100644 --- a/fjs/text/utf16/proof.f.ts +++ b/fjs/text/utf16/proof.f.ts @@ -9,7 +9,7 @@ import { codePointListToString, codePointToString } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/common/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { toArray } from '../../types/list/module.f.mjs' import { assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/text/utf8/proof.f.ts b/fjs/text/utf8/proof.f.ts index 687a95bee..bc80dfd66 100644 --- a/fjs/text/utf8/proof.f.ts +++ b/fjs/text/utf8/proof.f.ts @@ -1,5 +1,5 @@ import { toCodePointList, fromCodePointList, fromVec, utf8ByteToCodePointOp } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/common/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/module.f.ts' import { sort } from '../../types/object/module.f.mjs' import { toArray } from '../../types/list/module.f.mjs' import { msb, u8ListToVec, vec } from '../../types/bit_vec/module.f.mjs' diff --git a/fjs/types/array/proof.f.ts b/fjs/types/array/proof.f.ts index 6f664b25d..a22743f53 100644 --- a/fjs/types/array/proof.f.ts +++ b/fjs/types/array/proof.f.ts @@ -1,5 +1,5 @@ import { at, first, last, head, tail, splitFirst, splitLast, empty } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/common/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { assertEq, assertNotNullish } from '../../asserts/module.f.mjs' diff --git a/fjs/types/btree/find/proof.f.ts b/fjs/types/btree/find/proof.f.ts index ad4021c6e..04054962a 100644 --- a/fjs/types/btree/find/proof.f.ts +++ b/fjs/types/btree/find/proof.f.ts @@ -3,7 +3,7 @@ import type { Unknown } from '../../../media/json/types.ts' import type { Result } from './types.ts' import { find as btreeFind } from './module.f.mjs' import { map, toArray } from '../../list/module.f.mjs' -import { stringify } from '../../../media/json/common/module.f.ts' +import { stringify } from '../../../media/json/module.f.ts' import { sort } from '../../object/module.f.mjs' import type { TNode } from '../types/types.ts' import { cmp } from '../../string/module.f.mjs' diff --git a/fjs/types/btree/proof.f.ts b/fjs/types/btree/proof.f.ts index b4a8bf2b9..961fc642a 100644 --- a/fjs/types/btree/proof.f.ts +++ b/fjs/types/btree/proof.f.ts @@ -2,7 +2,7 @@ import type { Unknown } from '../../media/json/types.ts' import type { TNode } from './types/types.ts' import { values } from './module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/common/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { cmp } from '../string/module.f.mjs' import type { List, Result } from '../list/types.ts' diff --git a/fjs/types/btree/remove/proof.f.ts b/fjs/types/btree/remove/proof.f.ts index 3f753bbfd..967e89f2f 100644 --- a/fjs/types/btree/remove/proof.f.ts +++ b/fjs/types/btree/remove/proof.f.ts @@ -2,7 +2,7 @@ import { nodeRemove } from './module.f.mjs' import type { TNode } from '../types/types.ts' import { set as setSet } from '../set/module.f.mjs' import { cmp } from '../../string/module.f.mjs' -import { stringify } from '../../../media/json/common/module.f.ts' +import { stringify } from '../../../media/json/module.f.ts' import { sort } from '../../object/module.f.mjs' import { assertEq, assertNotNullish } from '../../../asserts/module.f.mjs' diff --git a/fjs/types/btree/set/proof.f.ts b/fjs/types/btree/set/proof.f.ts index 3be289165..5582926a4 100644 --- a/fjs/types/btree/set/proof.f.ts +++ b/fjs/types/btree/set/proof.f.ts @@ -1,7 +1,7 @@ import { set as setSet } from './module.f.mjs' import type { TNode } from '../types/types.ts' import { cmp } from '../../string/module.f.mjs' -import { stringify } from '../../../media/json/common/module.f.ts' +import { stringify } from '../../../media/json/module.f.ts' import { sort } from '../../object/module.f.mjs' import { assertEq } from '../../../asserts/module.f.mjs' diff --git a/fjs/types/byte_set/proof.f.ts b/fjs/types/byte_set/proof.f.ts index 28e9f9d1d..87badfd9b 100644 --- a/fjs/types/byte_set/proof.f.ts +++ b/fjs/types/byte_set/proof.f.ts @@ -2,7 +2,7 @@ import type { Unknown } from '../../media/json/types.ts' import { has, empty, set, setRange, unset, universe, complement, toRangeMap } from './module.f.mjs' import { every, countdown, map, toArray } from '../list/module.f.mjs' -import { stringify as jsonStringify } from '../../media/json/common/module.f.ts' +import { stringify as jsonStringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { assert, assertEq } from '../../asserts/module.f.mjs' diff --git a/fjs/types/list/proof.f.ts b/fjs/types/list/proof.f.ts index c5e940fd6..0186e3aa9 100644 --- a/fjs/types/list/proof.f.ts +++ b/fjs/types/list/proof.f.ts @@ -2,7 +2,7 @@ import type { Unknown } from '../../media/json/types.ts' import type { List } from './types.ts' import { length, concat, countdown, cycle, drop, dropWhile, entries, every, filter, find, flat, flatMap, map, next, reduce, reverse, scan, some, take, takeWhile, toArray, zip, first, filterMap, isEmpty, equal, tryFold } from './module.f.mjs' -import { stringify } from '../../media/json/common/module.f.ts' +import { stringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { addition, strictEqual, reduceToScan } from '../function/operator/module.f.mjs' import { assert, assertEq, assertNotNullish } from '../../asserts/module.f.mjs' diff --git a/fjs/types/range_map/proof.f.ts b/fjs/types/range_map/proof.f.ts index 00a70a2a4..c2c6ea4f5 100644 --- a/fjs/types/range_map/proof.f.ts +++ b/fjs/types/range_map/proof.f.ts @@ -2,7 +2,7 @@ import type { Unknown } from '../../media/json/types.ts' import type { RangeMapArray, Properties, RangeMap } from './types.ts' import { get, merge, fromRange, rangeMap } from './module.f.mjs' -import { stringify } from '../../media/json/common/module.f.ts' +import { stringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { union } from '../sorted_set/module.f.mjs' import type { SortedSet } from '../sorted_set/types.ts' diff --git a/fjs/types/sorted_list/proof.f.ts b/fjs/types/sorted_list/proof.f.ts index 4ae187611..90cd28554 100644 --- a/fjs/types/sorted_list/proof.f.ts +++ b/fjs/types/sorted_list/proof.f.ts @@ -1,7 +1,7 @@ import type { Unknown } from '../../media/json/types.ts' import { find, merge } from './module.f.mjs' -import { stringify } from '../../media/json/common/module.f.ts' +import { stringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { toArray, countdown, length } from '../list/module.f.mjs' import { flip } from '../function/module.f.mjs' diff --git a/fjs/types/sorted_set/proof.f.ts b/fjs/types/sorted_set/proof.f.ts index bc297d157..7c4a0a6e5 100644 --- a/fjs/types/sorted_set/proof.f.ts +++ b/fjs/types/sorted_set/proof.f.ts @@ -1,7 +1,7 @@ import type { Unknown } from '../../media/json/types.ts' import { has, intersect, union } from './module.f.mjs' -import { stringify } from '../../media/json/common/module.f.ts' +import { stringify } from '../../media/json/module.f.ts' import { sort } from '../object/module.f.mjs' import { toArray, countdown, length } from '../list/module.f.mjs' import { flip } from '../function/module.f.mjs' From 5b0554ce6d0a8da01f55b06d4896ad2addce8669 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 23:26:52 -0700 Subject: [PATCH 14/19] readonly --- fjs/media/json/rtti/module.f.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fjs/media/json/rtti/module.f.mjs b/fjs/media/json/rtti/module.f.mjs index f700ccb7f..51b1b9392 100644 --- a/fjs/media/json/rtti/module.f.mjs +++ b/fjs/media/json/rtti/module.f.mjs @@ -20,7 +20,7 @@ export const primitive = or(null, rttiBoolean, rttiNumber, rttiString) * A struct field typed `unknown` is **required when present** — unlike rtti * core's `unknown`, the JSON `unknown` excludes `undefined`. * - * @type {() => ['or', typeof primitive, typeof object, typeof array]} + * @type {() => readonly['or', typeof primitive, typeof object, typeof array]} */ export const unknown = () => ['or', primitive, object, array] From a681da6d530636db4f5f7773e444c742931818ea Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 23:30:04 -0700 Subject: [PATCH 15/19] Add CHANGELOG entry for the JSON rtti/types split Records the breaking move of the JSON rtti schemas to fjs/media/json/rtti/module.f.mjs and the JSON types to fjs/media/json/types.ts. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b95ab9e8a..6d22ca0d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,15 @@ history. ## Unreleased +- **BREAKING CHANGES:** the JSON rtti schemas `primitive`, `unknown`, + `object`, and `array` move from `fjs/media/json/module.f.ts` to a new + JSDoc-typed `fjs/media/json/rtti/module.f.mjs`, and the `Primitive`, + `Unknown`, `Object`, and `Array` types to a sibling + `fjs/media/json/types.ts` — importers must use the `rtti/module.f.mjs` + specifier for the schemas and the `types.ts` specifier for the types. + `fjs/media/json/module.f.ts` stays TypeScript and no longer re-exports + either + [#1498](https://github.com/functionalscript/functionalscript/pull/1498) - **BREAKING CHANGES:** `fjs/fsc/json.f.ts` and `fjs/fsc/bnf.f.ts` migrate from authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — no local types to split, both use only `Rule`/`TerminalRange` from From cd5a10f583033b70f0327e8472fa0876e857a4bc Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 23:40:48 -0700 Subject: [PATCH 16/19] Document the typeof cross-reference rule for recursive constants Mutually recursive exported constants -- the shape every non-trivial rtti schema group has -- need an explicit @type that names its neighbours via typeof, not /** @type {const} */. Measured on fjs/media/json/rtti/module.f.mjs: no annotation fails TS2345 (literal widens to a mutable array); the const cast type-checks but emits 4 `any` and 2 /*elided*/ into the .d.mts because the emitter has no name for the recursive positions and inlines the structure instead; the typeof form emits neither and is 40% smaller. The const-cast failure is invisible in the repository and visible only to a consumer of the published package, so it needs a rule rather than review. Adds AGENTS.md 6.2 subsection next to the existing @type {const} guidance, plus a proposal section, task, and acceptance criterion in the migration todo. Expect this to recur as rtti use grows. Co-Authored-By: Claude Opus 5 --- AGENTS.md | 35 +++++++++++++++++ todo/migrate-typescript-to-mjs.md | 64 +++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index f745f5b4c..1f4916f14 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -603,6 +603,41 @@ inline-cast position gives it the special const-assertion meaning. This is unlike every other `@type` cast, which works in both positions — don't "clean up" a `@type {const}` inline cast into the declaration form. +#### Mutually recursive constants: cross-reference with `typeof` + +When exported constants refer to each other in a cycle — the usual shape for a +recursive rtti schema, where `unknown` names `object` and `array` and both are +built from `unknown` — pin them with an explicit `@type` whose element types are +`typeof` references to the other constants, **not** with `@type {const}`: + +```js +/** @type {() => readonly['or', typeof primitive, typeof object, typeof array]} */ +export const unknown = () => ['or', primitive, object, array] + +export const object = record(unknown) +export const array = rttiArray(unknown) +``` + +Forward references are fine: `unknown` is annotated in terms of `object` and +`array`, declared below it. + +`@type {const}` is wrong here even though it compiles. It pins the tuple, so +`npx tsc` and `fjs t` both pass — but it gives declaration emit no *name* for +the recursive positions, so the emitter inlines the structure, gives up at +depth, and writes `/*elided*/ any`. On `fjs/media/json/rtti/module.f.mjs` the +const cast emitted 4 `any` and 2 `/*elided*/`; the `typeof` form emitted +neither. Only a consumer type-checking against the published `.d.mts` sees the +difference, which is why this needs to be a rule rather than something review +catches. Omitting the annotation entirely is a third, louder failure: the array +literal widens to `(string | …)[]` and fails `TS2345` outright (see "Pin literal +`const`s" above). + +Pair the annotation with a round-trip assert so it stays checked rather than +merely claimed — `fjs/media/json/types.ts` holds +`Assert>>`. An explicit `@type` on a constant +whose type the compiler would otherwise infer is only as trustworthy as what +verifies it. + #### Avoid type predicates Avoid TypeScript type predicates (`(x: T): x is U`). They are error-prone: the diff --git a/todo/migrate-typescript-to-mjs.md b/todo/migrate-typescript-to-mjs.md index 9896c0fc8..4a8e31a02 100644 --- a/todo/migrate-typescript-to-mjs.md +++ b/todo/migrate-typescript-to-mjs.md @@ -448,6 +448,57 @@ non-composing generics already do) when a generic function does not call other independently-generic functions in its body; switch to the per-arrow style once composition breaks inference. +#### Mutually recursive constants need `typeof`, not `@type {const}` + +rtti schemas are values, not types, so a recursive schema is a cycle in the +*value* graph: `unknown` names `object` and `array`, and both are built from +`unknown`. TypeScript source closed that cycle with inference plus `as const`, +which has no declaration-level JSDoc equivalent. The replacement is an explicit +`@type` whose element types are `typeof` references to the other constants: + +```js +/** @type {() => readonly['or', typeof primitive, typeof object, typeof array]} */ +export const unknown = () => ['or', primitive, object, array] + +export const object = record(unknown) +export const array = rttiArray(unknown) +``` + +Forward references are fine — `unknown` is annotated in terms of `object` and +`array`, which are declared below it. + +The failure this avoids is **declaration emit**, not type checking, and the +three candidate spellings fail in different places. Measured on +`fjs/media/json/rtti/module.f.mjs` ([#1498](https://github.com/functionalscript/functionalscript/pull/1498)): + +| form | `npx tsc` | emitted `.d.mts` | +| ---- | --------- | ---------------- | +| no annotation | **TS2345** — literal widens to `(string \| …)[]`, not a `Type` | — | +| `/** @type {const} */(…)` inline cast | clean | 4 `any` + 2 `/*elided*/` | +| `@type {() => readonly[…typeof…]}` | clean | 0 `any`, 0 `elided` | + +The bare form is just the "pin literal `const`s" rule. The interesting case +is the middle one: it type-checks, `fjs t` is green, and the damage is visible +only to a consumer of the published package — the same invisible-in-repository +failure mode as [curried generic exports](#curried-generic-exports-need-an-explicit-returns). +`@type {const}` pins the tuple but gives the emitter no *name* for the +recursive positions, so it inlines the structure and gives up at depth, +collapsing to `/*elided*/ any`. `typeof primitive` / `typeof object` / +`typeof array` are names the emitter can print, so each node of the cycle +refers to its neighbours by name and the emitted declaration stays finite and +exact (it also stays smaller: 1392 vs 2248 characters). + +Keep the round-trip proven rather than asserted. `fjs/media/json/types.ts` +carries `Assert>>`, so the hand-written type +and the schema-derived one are checked against each other; without such an +assert the explicit `@type` is an unverified claim about a schema the compiler +would otherwise have inferred. + +This generalizes beyond JSON. Any mutually recursive group of exported rtti +schemas needs the same treatment, and more of them are expected as rtti use +grows — reach for `typeof` cross-references first, and check the emitted +`.d.mts` for `any` / `elided` before considering the group migrated. + #### Declaration-only TypeScript is not a migration hard case Do not require the migration plan to pre-design a JavaScript/JSDoc @@ -580,6 +631,15 @@ this rename. hoisted to a leading declaration annotation — the declaration-level form fails with `TS2304` because TypeScript resolves `const` as an ordinary type name there, unlike every other `@type` cast. +- [ ] Annotate mutually recursive exported constants (rtti schema groups above + all) with an explicit `@type` that cross-references its neighbours by + `typeof`, not with `/** @type {const} */`. The const cast type-checks but + leaves the emitter no name for the recursive positions, so it inlines the + structure and collapses it to `/*elided*/ any` in the `.d.mts` while the + repository stays green. Expect more of these as rtti spreads; check the + emitted declaration for `any` / `elided` before calling such a group + migrated, and keep an `Assert>>` beside the schema + so the explicit annotation stays verified rather than asserted. - [ ] Decide each JSDoc typedef's visibility at the migration boundary: prefix implementation-only typedefs with `_` and leave publicly useful ones unprefixed, judged by what the module should offer its consumers rather @@ -673,6 +733,10 @@ this rename. composes other independently-generic functions in its body. - `/** @type {const} */` stays an inline cast on the expression it types, never a leading declaration-level annotation. +- Mutually recursive exported constants carry an explicit `@type` that names its + neighbours through `typeof`, and their emitted declarations contain no `any` or + `/*elided*/`; a `Ts` round-trip assert keeps each such annotation + verified against the schema it describes. - Renaming or removing an emitted `_`-prefixed alias is not breaking solely due to that alias being emitted; any resulting change to a public declaration's assignability is still a breaking change. From 75bdaa25541b69ce535f6d33535217ba27e14978 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 11 Aug 2026 23:47:57 -0700 Subject: [PATCH 17/19] Add @module header and co-located proof to media/json/rtti Addresses review feedback on #1498. The @module header was missing (AGENTS.md 4). It is separated from the first import by a blank line, per the declaration-emit hazard documented in the migration todo; verified it survives into module.f.d.mts. Adds the co-located proof.f.mjs that AGENTS.md 3.2 asks of a new implementation module. Previously the four schemas were only exercised transitively through json_rpc, mcp, and json/schema. Covers each schema's accepted and rejected values, the nested/recursive paths through the thunk, and that JSON `unknown` rejects `undefined` where rtti core's does not. Suite goes 2357 -> 2368, 0 failures. The shared tag helper takes the erased ValidateE rather than a generic Type; instantiating validate's generic result per schema hits TS2589 on these mutually recursive schemas. Also avoids the literal token "elided" in the module doc comment, so `grep -c elided` on the emitted declaration stays a usable check for the condition this module is the test case for. Co-Authored-By: Claude Opus 5 --- fjs/media/json/rtti/module.f.mjs | 18 +++++++ fjs/media/json/rtti/proof.f.mjs | 86 ++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 fjs/media/json/rtti/proof.f.mjs diff --git a/fjs/media/json/rtti/module.f.mjs b/fjs/media/json/rtti/module.f.mjs index 51b1b9392..8c3e14e4e 100644 --- a/fjs/media/json/rtti/module.f.mjs +++ b/fjs/media/json/rtti/module.f.mjs @@ -1,3 +1,21 @@ +/** + * rtti schemas describing the JSON data model: `primitive`, `unknown`, + * `object`, and `array`. + * + * The three composite schemas are mutually recursive — `unknown` names + * `object` and `array`, both of which are built from `unknown` — so `unknown` + * carries an explicit `@type` that cross-references its neighbours through + * `typeof`. That spelling is deliberate: `@type {const}` also type-checks here, + * but leaves declaration emit no name for the recursive positions, so it + * inlines the structure, gives up at depth, and degrades the emitted `.d.mts` + * to `any`. See AGENTS.md §6.2. + * + * The TypeScript counterparts live in the sibling + * [`../types.ts`](../types.ts), which pins them against these schemas with + * `Assert>>`. + * + * @module + */ import { boolean as rttiBoolean, diff --git a/fjs/media/json/rtti/proof.f.mjs b/fjs/media/json/rtti/proof.f.mjs new file mode 100644 index 000000000..78bb662a4 --- /dev/null +++ b/fjs/media/json/rtti/proof.f.mjs @@ -0,0 +1,86 @@ +/** + * Proof for the JSON rtti schemas. + * + * @module + */ + +import { assertEq } from '../../../asserts/module.f.mjs' +import { validate } from '../../../types/rtti/validate/module.f.mjs' +import { primitive, unknown, object, array } from './module.f.mjs' + +/** @import { ValidateE } from '../../../types/rtti/common/types.ts' */ +/** @import { Unknown } from '../../../types/rtti/ts/types.ts' */ + +// Reduces a validation to its `ok`/`error` tag: these schemas are about what is +// accepted, not about the payload, which validation returns unchanged. The +// erased `ValidateE` keeps the shared helper from re-instantiating each +// schema's deep recursive result type (TS2589). +/** @type {(v: ValidateE) => (value: Unknown) => string} */ +const tag = v => value => v(value)[0] + +const primitiveAccepts = tag(validate(primitive)) +const unknownAccepts = tag(validate(unknown)) +const objectAccepts = tag(validate(object)) +const arrayAccepts = tag(validate(array)) + +export const proof = { + primitive: { + accepts: () => { + assertEq(primitiveAccepts(null), 'ok') + assertEq(primitiveAccepts(true), 'ok') + assertEq(primitiveAccepts(0), 'ok') + assertEq(primitiveAccepts(''), 'ok') + }, + rejectsComposite: () => { + assertEq(primitiveAccepts([]), 'error') + assertEq(primitiveAccepts({}), 'error') + }, + }, + object: { + accepts: () => { + assertEq(objectAccepts({}), 'ok') + assertEq(objectAccepts({ a: 1, b: 'two', c: null }), 'ok') + }, + // A record schema descends into its values, so a bad leaf anywhere in + // the tree fails the whole object. + nested: () => { + assertEq(objectAccepts({ a: { b: [1, { c: null }] } }), 'ok') + }, + rejectsNonObject: () => { + assertEq(objectAccepts(1), 'error') + assertEq(objectAccepts([]), 'error') + }, + }, + array: { + accepts: () => { + assertEq(arrayAccepts([]), 'ok') + assertEq(arrayAccepts([null, true, 2, 'three']), 'ok') + }, + nested: () => { + assertEq(arrayAccepts([[{ a: [] }]]), 'ok') + }, + rejectsNonArray: () => { + assertEq(arrayAccepts(1), 'error') + assertEq(arrayAccepts({}), 'error') + }, + }, + unknown: { + // `unknown` is the union of the three above, so it accepts every arm. + acceptsEveryArm: () => { + assertEq(unknownAccepts(null), 'ok') + assertEq(unknownAccepts(false), 'ok') + assertEq(unknownAccepts(1), 'ok') + assertEq(unknownAccepts('s'), 'ok') + assertEq(unknownAccepts([]), 'ok') + assertEq(unknownAccepts({}), 'ok') + }, + // The thunk closes the recursion: an arbitrarily deep acyclic value + // terminates because array/record item validators instantiate lazily. + recurses: () => { + assertEq(unknownAccepts({ a: [{ b: [[{ c: 'd' }]] }] }), 'ok') + }, + rejectsUndefined: () => { + assertEq(unknownAccepts(undefined), 'error') + }, + }, +} From 6dbe384f68798eab4d7299d79a89797fda1a7b0a Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Wed, 12 Aug 2026 00:03:13 -0700 Subject: [PATCH 18/19] Add @module header to media/json/types.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Codex flagged the new public type-only module as missing the §4 header. Placed with a blank line before the first import, so it survives declaration emit rather than folding into the import's leading trivia. Co-Authored-By: Claude Opus 5 --- fjs/media/json/types.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/fjs/media/json/types.ts b/fjs/media/json/types.ts index 29dccb920..c4bc5594e 100644 --- a/fjs/media/json/types.ts +++ b/fjs/media/json/types.ts @@ -1,3 +1,16 @@ +/** + * TypeScript counterparts of the JSON data model: `Primitive`, `Unknown`, + * `Object`, and `Array`. + * + * `Unknown` is written by hand rather than derived, so that the recursion + * reads directly, and is then pinned against the rtti schemas in the sibling + * [`./rtti/module.f.mjs`](./rtti/module.f.mjs) with + * `Assert>>`. The pin is what keeps the two + * descriptions of the same data model from drifting apart. + * + * @module + */ + import type { Assert } from "../../asserts/types.ts" import type { Ts } from "../../types/rtti/ts/types.ts" import type { Equal } from "../../types/ts/types.ts" From cad89b029d8e13098dfd33740374831aecd8d2b1 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Wed, 12 Aug 2026 00:21:22 -0700 Subject: [PATCH 19/19] Point docs at the new homes of the JSON types and schemas MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Codex flagged that the split left instructions pointing at a surface that no longer exists. `fjs/media/json/module.f.ts`'s header still advertised the types and schemas as living there, and three todo designs would have directed future work to import them from the old location. - module.f.ts header: describe the utilities it still owns, and point at `./types.ts` and `./rtti/module.f.mjs` for the rest. - djs/todo/663: the alias block and the `Primitive` import now name `types.ts`, plus a compatibility bullet — re-expressing the aliases over the shared generic tree has to keep the `Assert>` pin satisfied. - media/html/todo/665 and media/json/todo/standard-parse-serialize: split the "value types" half of the reference off to `types.ts`. Co-Authored-By: Claude Opus 5 --- fjs/djs/todo/663-json-djs-tree-type.md | 9 ++++++--- fjs/media/html/todo/665-json-html.md | 3 ++- fjs/media/json/module.f.ts | 10 +++++----- fjs/media/json/todo/standard-parse-serialize.md | 5 +++-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/fjs/djs/todo/663-json-djs-tree-type.md b/fjs/djs/todo/663-json-djs-tree-type.md index 02634e2d9..ac17f6bfa 100644 --- a/fjs/djs/todo/663-json-djs-tree-type.md +++ b/fjs/djs/todo/663-json-djs-tree-type.md @@ -42,7 +42,7 @@ Keep the names the modules already use and import the shared definitions through a namespace where useful: ```ts -// fjs/media/json/module.f.ts +// fjs/media/json/types.ts import type * as Tree from './common/module.f.ts' export type Primitive = boolean | string | number | null export type Unknown = Tree.Unknown @@ -53,7 +53,7 @@ export type Array = Tree.Array ```ts // fjs/djs/module.f.ts import type * as Tree from '../media/json/common/module.f.ts' -import type { Primitive as JsonPrimitive } from '../media/json/module.f.ts' +import type { Primitive as JsonPrimitive } from '../media/json/types.ts' export type Primitive = JsonPrimitive | bigint | undefined export type Unknown = Tree.Unknown export type Object = Tree.Object @@ -80,6 +80,9 @@ serialization behavior. JSON tree, `undefined` is not a primitive leaf, but `object[key]` can still be `undefined` because the property is absent. - Preserve `readonly` recursive containers. +- Keep `fjs/media/json/types.ts`'s + `Assert>>` pin against the rtti schema in + `fjs/media/json/rtti/module.f.mjs` satisfied by the re-expressed aliases. - Keep the shared module in the JSON/DJS family rather than promoting it to a broader generic types package without another real consumer. - Confirm recursive generic aliases work with `tsc` and the repository's Deno @@ -109,7 +112,7 @@ serialization behavior. - [157](./157.md) — shares JSON/DJS parser value machinery; complementary to sharing the recursive value type. - [197](./197.md) — extracts traversal over the same `Unknown` shape. -- `fjs/media/json/module.f.ts` — current JSON recursive type aliases. +- `fjs/media/json/types.ts` — current JSON recursive type aliases. - `fjs/djs/module.f.ts` — current DJS recursive type aliases. - `fjs/media/json/serializer/module.f.mjs` — currently has no separate recursive generic value aliases and therefore is not part of this migration. diff --git a/fjs/media/html/todo/665-json-html.md b/fjs/media/html/todo/665-json-html.md index c111a66c0..0c1abbcbb 100644 --- a/fjs/media/html/todo/665-json-html.md +++ b/fjs/media/html/todo/665-json-html.md @@ -87,5 +87,6 @@ Which serialises to: ### Related -- `fjs/media/json/module.f.ts` — the `Unknown` type and `serialize` +- `fjs/media/json/types.ts` — the `Unknown` type +- `fjs/media/json/module.f.ts` — `serialize` - `fjs/media/json/schema/module.f.ts` — sibling JSON-dialect module diff --git a/fjs/media/json/module.f.ts b/fjs/media/json/module.f.ts index 069fda011..b673e1c9d 100644 --- a/fjs/media/json/module.f.ts +++ b/fjs/media/json/module.f.ts @@ -1,13 +1,13 @@ /** - * JSON value types, rtti schemas, and utilities: `serialize`, `stringify`, - * `parse`, and `setProperty` for immutable nested updates. + * JSON utilities: `serialize`, `stringify`, `parse`, and `setProperty` for + * immutable nested updates. * * `parse` is the total, `Result`-returning `text → Unknown` entry point built * on this module's own tokenizer and parser. * - * The JSON value types (`Unknown`, `Primitive`) are derived from the rtti - * schemas defined here, so the schema is the single source of truth — no - * hand-written types to keep in sync. + * The JSON value types (`Unknown`, `Primitive`, `Object`, `Array`) live in + * [`./types.ts`](./types.ts), and the rtti schemas they are pinned against in + * [`./rtti/module.f.mjs`](./rtti/module.f.mjs). * * @module */ diff --git a/fjs/media/json/todo/standard-parse-serialize.md b/fjs/media/json/todo/standard-parse-serialize.md index 4d37c821b..a78cd3439 100644 --- a/fjs/media/json/todo/standard-parse-serialize.md +++ b/fjs/media/json/todo/standard-parse-serialize.md @@ -140,5 +140,6 @@ This keeps parser/serializer policy separate from generic runtime conversion. - [RTTI-aware extended JSON parser](./rtti-parse.md) — another materializer over the same lossless number-token tree. - [Remove native JSON](./remove-native-json.md) — self-hosts serialization. -- [`fjs/media/json/module.f.ts`](../module.f.ts) — current ordinary JSON value - types and `parse` / `stringify` surface. +- [`fjs/media/json/module.f.ts`](../module.f.ts) — current ordinary JSON + `parse` / `stringify` surface. +- [`fjs/media/json/types.ts`](../types.ts) — current ordinary JSON value types.