dsh-convert-core 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/bin/media-to-md.mjs +168 -0
  4. package/bin/tita-convert.mjs +85 -0
  5. package/docs/media-to-md.md +143 -0
  6. package/lib/adapters/anydoc.d.ts +73 -0
  7. package/lib/adapters/anydoc.d.ts.map +1 -0
  8. package/lib/adapters/anydoc.js +295 -0
  9. package/lib/adapters/anydoc.js.map +1 -0
  10. package/lib/adapters/iddoc.d.ts +28 -0
  11. package/lib/adapters/iddoc.d.ts.map +1 -0
  12. package/lib/adapters/iddoc.js +153 -0
  13. package/lib/adapters/iddoc.js.map +1 -0
  14. package/lib/adapters/index.d.ts +41 -0
  15. package/lib/adapters/index.d.ts.map +1 -0
  16. package/lib/adapters/index.js +115 -0
  17. package/lib/adapters/index.js.map +1 -0
  18. package/lib/adapters/scanned.d.ts +28 -0
  19. package/lib/adapters/scanned.d.ts.map +1 -0
  20. package/lib/adapters/scanned.js +121 -0
  21. package/lib/adapters/scanned.js.map +1 -0
  22. package/lib/adapters/text.d.ts +29 -0
  23. package/lib/adapters/text.d.ts.map +1 -0
  24. package/lib/adapters/text.js +135 -0
  25. package/lib/adapters/text.js.map +1 -0
  26. package/lib/adapters/types.d.ts +65 -0
  27. package/lib/adapters/types.d.ts.map +1 -0
  28. package/lib/adapters/types.js +11 -0
  29. package/lib/adapters/types.js.map +1 -0
  30. package/lib/contract.d.ts +185 -0
  31. package/lib/contract.d.ts.map +1 -0
  32. package/lib/contract.js +59 -0
  33. package/lib/contract.js.map +1 -0
  34. package/lib/delivery.d.ts +36 -0
  35. package/lib/delivery.d.ts.map +1 -0
  36. package/lib/delivery.js +97 -0
  37. package/lib/delivery.js.map +1 -0
  38. package/lib/http.d.ts +34 -0
  39. package/lib/http.d.ts.map +1 -0
  40. package/lib/http.js +372 -0
  41. package/lib/http.js.map +1 -0
  42. package/lib/markdown.d.ts +32 -0
  43. package/lib/markdown.d.ts.map +1 -0
  44. package/lib/markdown.js +145 -0
  45. package/lib/markdown.js.map +1 -0
  46. package/lib/media/binaries.d.ts +26 -0
  47. package/lib/media/binaries.d.ts.map +1 -0
  48. package/lib/media/binaries.js +60 -0
  49. package/lib/media/binaries.js.map +1 -0
  50. package/lib/media/convert.d.ts +19 -0
  51. package/lib/media/convert.d.ts.map +1 -0
  52. package/lib/media/convert.js +210 -0
  53. package/lib/media/convert.js.map +1 -0
  54. package/lib/media/index.d.ts +27 -0
  55. package/lib/media/index.d.ts.map +1 -0
  56. package/lib/media/index.js +27 -0
  57. package/lib/media/index.js.map +1 -0
  58. package/lib/media/markdown.d.ts +40 -0
  59. package/lib/media/markdown.d.ts.map +1 -0
  60. package/lib/media/markdown.js +89 -0
  61. package/lib/media/markdown.js.map +1 -0
  62. package/lib/media/media.d.ts +45 -0
  63. package/lib/media/media.d.ts.map +1 -0
  64. package/lib/media/media.js +167 -0
  65. package/lib/media/media.js.map +1 -0
  66. package/lib/media/models.d.ts +31 -0
  67. package/lib/media/models.d.ts.map +1 -0
  68. package/lib/media/models.js +87 -0
  69. package/lib/media/models.js.map +1 -0
  70. package/lib/media/scanned.d.ts +18 -0
  71. package/lib/media/scanned.d.ts.map +1 -0
  72. package/lib/media/scanned.js +179 -0
  73. package/lib/media/scanned.js.map +1 -0
  74. package/lib/media/types.d.ts +154 -0
  75. package/lib/media/types.d.ts.map +1 -0
  76. package/lib/media/types.js +23 -0
  77. package/lib/media/types.js.map +1 -0
  78. package/lib/server.d.ts +35 -0
  79. package/lib/server.d.ts.map +1 -0
  80. package/lib/server.js +64 -0
  81. package/lib/server.js.map +1 -0
  82. package/lib/service.d.ts +170 -0
  83. package/lib/service.d.ts.map +1 -0
  84. package/lib/service.js +562 -0
  85. package/lib/service.js.map +1 -0
  86. package/package.json +59 -0
  87. package/scripts/asr.py +55 -0
  88. package/scripts/ocr.py +40 -0
  89. package/scripts/pdf_pages.py +49 -0
  90. package/scripts/vendor.mjs +76 -0
  91. package/src/adapters/anydoc.ts +356 -0
  92. package/src/adapters/iddoc.ts +171 -0
  93. package/src/adapters/index.ts +147 -0
  94. package/src/adapters/scanned.ts +139 -0
  95. package/src/adapters/text.ts +146 -0
  96. package/src/adapters/types.ts +76 -0
  97. package/src/contract.ts +230 -0
  98. package/src/delivery.ts +124 -0
  99. package/src/http.ts +394 -0
  100. package/src/markdown.ts +141 -0
  101. package/src/media/binaries.ts +67 -0
  102. package/src/media/convert.ts +232 -0
  103. package/src/media/index.ts +43 -0
  104. package/src/media/markdown.ts +105 -0
  105. package/src/media/media.ts +204 -0
  106. package/src/media/models.ts +124 -0
  107. package/src/media/scanned.ts +200 -0
  108. package/src/media/types.ts +171 -0
  109. package/src/server.ts +85 -0
  110. package/src/service.ts +639 -0
  111. package/web/app.js +382 -0
  112. package/web/index.html +217 -0
  113. package/web/styles.css +263 -0
  114. package/web/vendor/icons.js +25 -0
  115. package/web/vendor/vue.global.prod.js +14 -0
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Wire-level contract for the conversion kernel.
3
+ *
4
+ * The kernel owns exactly one promise: given an input, produce a
5
+ * *knowledge-ready* Markdown bundle (`index.md` + `assets/` + `manifest.json`)
6
+ * plus an `ingest` payload that plugins/dsh-data-domain-knowledge can consume
7
+ * without the two ever importing each other.
8
+ *
9
+ * Boundary rule (issue 0013): the kernel never decides `source_type`. It only
10
+ * proposes candidates; the ingestion side decides and records
11
+ * `source_type_source`.
12
+ */
13
+ /**
14
+ * `source_format` values from the 0013 contract. The full vocabulary is kept so
15
+ * the front matter stays wire-compatible, but this version only ever emits
16
+ * `markdown`, `text`, `pdf` and `office`.
17
+ */
18
+ export declare const SOURCE_FORMATS: readonly ["markdown", "text", "html", "pdf", "office", "web_page", "video", "audio", "image"];
19
+ export type SourceFormat = (typeof SOURCE_FORMATS)[number];
20
+ /**
21
+ * This version is documents-only (issue 0015 scope cut): web pages and video
22
+ * moved to issues/0017, so only `file` and `text` can be requested.
23
+ */
24
+ export declare const CONVERT_INPUT_KINDS: readonly ["file", "text"];
25
+ export type ConvertInputKind = (typeof CONVERT_INPUT_KINDS)[number];
26
+ export declare const TASK_STATES: readonly ["queued", "running", "succeeded", "failed", "cancelled"];
27
+ export type TaskState = (typeof TASK_STATES)[number];
28
+ /** Lineage mirrors the knowledge plugin so both ends speak one vocabulary. */
29
+ export interface Lineage {
30
+ sessionId?: string;
31
+ turnId?: string;
32
+ intentId?: string;
33
+ taskId?: string;
34
+ subtaskId?: string;
35
+ parentSubtaskId?: string;
36
+ runId?: string;
37
+ traceId?: string;
38
+ domain?: string;
39
+ }
40
+ export type SourceTypeSource = 'agent' | 'user' | 'default';
41
+ /**
42
+ * Front matter written into `index.md`.
43
+ *
44
+ * Required by the knowledge-ready contract: `title`, `created_at`,
45
+ * `updated_at`. `source_id` and `source_type` are optional here because the
46
+ * kernel must not invent them — ingestion fills them in and re-writes the file.
47
+ */
48
+ export interface ConversionFrontMatter {
49
+ source_id?: string;
50
+ source_type?: string;
51
+ title: string;
52
+ created_at: string;
53
+ updated_at: string;
54
+ external_id?: string;
55
+ source_format?: SourceFormat;
56
+ content_hash?: string;
57
+ parser?: string;
58
+ source_url?: string;
59
+ source_path?: string;
60
+ source_type_source?: SourceTypeSource;
61
+ source_type_candidates?: string[];
62
+ word_count?: number;
63
+ asset_count?: number;
64
+ lineage?: Lineage;
65
+ }
66
+ export interface ConvertAsset {
67
+ /** Path relative to the delivery directory, e.g. `assets/img-1a2b3c4d.png`. */
68
+ rel: string;
69
+ /** Absolute path on disk inside the delivery directory. */
70
+ path: string;
71
+ bytes: number;
72
+ contentType?: string;
73
+ sha1: string;
74
+ /** Original remote URL when the asset was downloaded. */
75
+ sourceUrl?: string;
76
+ /** `inline` when it came from a data: URI, `remote` when downloaded, `local` when copied. */
77
+ origin: 'remote' | 'inline' | 'local';
78
+ }
79
+ export interface ConvertWarning {
80
+ code: string;
81
+ message: string;
82
+ }
83
+ /** Everything an ingestion side needs to file this bundle, without guessing. */
84
+ export interface IngestPayload {
85
+ /** Markdown body with a leading front matter block, ready for `add_source`. */
86
+ markdown: string;
87
+ /** Same body without front matter. */
88
+ content: string;
89
+ title: string;
90
+ externalId: string;
91
+ contentHash: string;
92
+ sourceFormat: SourceFormat;
93
+ parser: string;
94
+ sourceUrl?: string;
95
+ sourcePath?: string;
96
+ sourceTypeCandidates: string[];
97
+ /** True when nobody supplied a `source_type` yet. */
98
+ sourceTypeRequired: boolean;
99
+ assets: ConvertAsset[];
100
+ /**
101
+ * Image references are relative to the delivery `index.md`. A wiki card lives
102
+ * in `02_wiki/<type>/`, so ingestion must re-base them before a card can feed
103
+ * the multimodal embedder.
104
+ */
105
+ assetRefBase: 'delivery';
106
+ }
107
+ export interface ConvertManifest {
108
+ version: 1;
109
+ taskId: string;
110
+ inputKind: ConvertInputKind;
111
+ sourceFormat: SourceFormat;
112
+ parser: string;
113
+ title: string;
114
+ createdAt: string;
115
+ updatedAt: string;
116
+ deliveryDir: string;
117
+ contentHash: string;
118
+ externalId: string;
119
+ wordCount: number;
120
+ assets: ConvertAsset[];
121
+ warnings: ConvertWarning[];
122
+ /** Version of the external binary / service that did the work, when any. */
123
+ dependencyVersions: Record<string, string>;
124
+ lineage?: Lineage;
125
+ ingest: IngestPayload;
126
+ }
127
+ export interface ConvertTask {
128
+ id: string;
129
+ state: TaskState;
130
+ inputKind: ConvertInputKind;
131
+ /** Human label shown in the console. */
132
+ label: string;
133
+ sourceFormat: SourceFormat;
134
+ createdAt: string;
135
+ updatedAt: string;
136
+ startedAt?: string;
137
+ finishedAt?: string;
138
+ /** 0..1, or null when the adapter cannot report a ratio. */
139
+ progress: number | null;
140
+ stage: string;
141
+ message?: string;
142
+ error?: {
143
+ code: string;
144
+ message: string;
145
+ suggestion?: string;
146
+ };
147
+ warnings: ConvertWarning[];
148
+ deliveryDir?: string;
149
+ manifest?: ConvertManifest;
150
+ attempts: number;
151
+ /** Absolute input path inside the kernel work dir, when the input was a file. */
152
+ inputPath?: string;
153
+ request: ConvertRequest;
154
+ }
155
+ export interface ConvertRequest {
156
+ kind: ConvertInputKind;
157
+ /** Absolute path on the host for kind=file|video; the kernel reads and stages it. */
158
+ localPath?: string;
159
+ /** File name inside the kernel work dir (kind=file|video). */
160
+ filename?: string;
161
+ /** Inline text (kind=text). */
162
+ text?: string;
163
+ title?: string;
164
+ /** Caller-supplied business classification; the kernel never invents one. */
165
+ sourceType?: string;
166
+ sourceTypeCandidates?: string[];
167
+ sourceTypeSource?: SourceTypeSource;
168
+ /** Stable identity for idempotency, e.g. a canonical URL or a file hash. */
169
+ externalId?: string;
170
+ lineage?: Lineage;
171
+ /** Adapter override, mostly for tests and for the high-quality tier. */
172
+ adapter?: string;
173
+ }
174
+ export interface ConvertError {
175
+ code: string;
176
+ message: string;
177
+ suggestion?: string;
178
+ }
179
+ export interface ConvertResult {
180
+ task: ConvertTask;
181
+ }
182
+ export declare function isSourceFormat(value: unknown): value is SourceFormat;
183
+ /** Default business-classification hints per carrier format. */
184
+ export declare function defaultSourceTypeCandidates(format: SourceFormat): string[];
185
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Wire-level contract for the conversion kernel.
3
+ *
4
+ * The kernel owns exactly one promise: given an input, produce a
5
+ * *knowledge-ready* Markdown bundle (`index.md` + `assets/` + `manifest.json`)
6
+ * plus an `ingest` payload that plugins/dsh-data-domain-knowledge can consume
7
+ * without the two ever importing each other.
8
+ *
9
+ * Boundary rule (issue 0013): the kernel never decides `source_type`. It only
10
+ * proposes candidates; the ingestion side decides and records
11
+ * `source_type_source`.
12
+ */
13
+ /**
14
+ * `source_format` values from the 0013 contract. The full vocabulary is kept so
15
+ * the front matter stays wire-compatible, but this version only ever emits
16
+ * `markdown`, `text`, `pdf` and `office`.
17
+ */
18
+ export const SOURCE_FORMATS = [
19
+ 'markdown',
20
+ 'text',
21
+ 'html',
22
+ 'pdf',
23
+ 'office',
24
+ 'web_page',
25
+ 'video',
26
+ 'audio',
27
+ 'image',
28
+ ];
29
+ /**
30
+ * This version is documents-only (issue 0015 scope cut): web pages and video
31
+ * moved to issues/0017, so only `file` and `text` can be requested.
32
+ */
33
+ export const CONVERT_INPUT_KINDS = ['file', 'text'];
34
+ export const TASK_STATES = ['queued', 'running', 'succeeded', 'failed', 'cancelled'];
35
+ export function isSourceFormat(value) {
36
+ return typeof value === 'string' && SOURCE_FORMATS.includes(value);
37
+ }
38
+ /** Default business-classification hints per carrier format. */
39
+ export function defaultSourceTypeCandidates(format) {
40
+ switch (format) {
41
+ case 'pdf':
42
+ return ['article', 'book', 'prd', 'document'];
43
+ case 'office':
44
+ return ['prd', 'document'];
45
+ case 'markdown':
46
+ case 'text':
47
+ return ['document', 'article'];
48
+ // iddoc 档(issue 0017):音视频与图片的业务归类与文档不同,别让它们默认落到 "document"。
49
+ case 'video':
50
+ return ['video', 'course', 'interview', 'document'];
51
+ case 'audio':
52
+ return ['audio', 'interview', 'meeting', 'document'];
53
+ case 'image':
54
+ return ['image', 'screenshot', 'diagram', 'document'];
55
+ default:
56
+ return ['document'];
57
+ }
58
+ }
59
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU;IACV,MAAM;IACN,MAAM;IACN,KAAK;IACL,QAAQ;IACR,UAAU;IACV,OAAO;IACP,OAAO;IACP,OAAO;CACC,CAAA;AAIV;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAA;AAI5D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAA;AAqK7F,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC3F,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,2BAA2B,CAAC,MAAoB;IAC9D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;QAC/C,KAAK,QAAQ;YACX,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;QAC5B,KAAK,UAAU,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;QAChC,4DAA4D;QAC5D,KAAK,OAAO;YACV,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAA;QACrD,KAAK,OAAO;YACV,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;QACtD,KAAK,OAAO;YACV,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;QACvD;YACE,OAAO,CAAC,UAAU,CAAC,CAAA;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Delivery bundle writer.
3
+ *
4
+ * Layout is fixed by the 0013 knowledge-ready contract:
5
+ *
6
+ * convert-out/<taskId>/
7
+ * index.md front matter + body, images referenced as assets/…
8
+ * assets/img-*.ext content-addressed local images
9
+ * manifest.json provenance, parser/version, warnings, ingest payload
10
+ *
11
+ * The kernel never writes into the knowledge store; it only produces this
12
+ * directory plus the `ingest` payload that the DSH layer forwards.
13
+ */
14
+ import type { ConvertAsset, ConvertManifest, ConvertRequest, ConvertWarning, IngestPayload, SourceFormat, SourceTypeSource } from './contract.js';
15
+ export interface DeliveryInput {
16
+ taskId: string;
17
+ title: string;
18
+ request: ConvertRequest;
19
+ /** Markdown body with image references relative to `index.md`. */
20
+ markdown: string;
21
+ sourceFormat: SourceFormat;
22
+ parser: string;
23
+ sourceUrl?: string;
24
+ sourcePath?: string;
25
+ assets: ConvertAsset[];
26
+ warnings: ConvertWarning[];
27
+ dependencyVersions: Record<string, string>;
28
+ externalId: string;
29
+ createdAt: string;
30
+ updatedAt: string;
31
+ }
32
+ export declare function buildFrontMatter(input: DeliveryInput, contentHash: string): Record<string, unknown>;
33
+ export declare function buildIngestPayload(input: DeliveryInput, contentHash: string): IngestPayload;
34
+ export declare function writeDelivery(deliveryDir: string, input: DeliveryInput): Promise<ConvertManifest>;
35
+ export declare function sourceTypeSourceOf(value: string | undefined): SourceTypeSource | undefined;
36
+ //# sourceMappingURL=delivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,EACd,aAAa,EACb,YAAY,EACZ,gBAAgB,EACjB,MAAM,eAAe,CAAA;AAItB,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,cAAc,CAAA;IACvB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,YAAY,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,YAAY,EAAE,CAAA;IACtB,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBnG;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CAmB3F;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CA4BvG;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAE1F"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Delivery bundle writer.
3
+ *
4
+ * Layout is fixed by the 0013 knowledge-ready contract:
5
+ *
6
+ * convert-out/<taskId>/
7
+ * index.md front matter + body, images referenced as assets/…
8
+ * assets/img-*.ext content-addressed local images
9
+ * manifest.json provenance, parser/version, warnings, ingest payload
10
+ *
11
+ * The kernel never writes into the knowledge store; it only produces this
12
+ * directory plus the `ingest` payload that the DSH layer forwards.
13
+ */
14
+ import { mkdir } from 'node:fs/promises';
15
+ import { join } from 'node:path';
16
+ import { defaultSourceTypeCandidates } from './contract.js';
17
+ import { sha256, toMarkdownDocument, wordCount, writeTextAtomic } from './markdown.js';
18
+ export function buildFrontMatter(input, contentHash) {
19
+ const candidates = input.request.sourceTypeCandidates?.length
20
+ ? input.request.sourceTypeCandidates
21
+ : defaultSourceTypeCandidates(input.sourceFormat);
22
+ const frontMatter = {
23
+ title: input.title,
24
+ created_at: input.createdAt,
25
+ updated_at: input.updatedAt,
26
+ external_id: input.externalId,
27
+ source_format: input.sourceFormat,
28
+ content_hash: contentHash,
29
+ parser: input.parser,
30
+ source_type_candidates: candidates,
31
+ word_count: wordCount(input.markdown),
32
+ asset_count: input.assets.length,
33
+ };
34
+ if (input.request.sourceType)
35
+ frontMatter.source_type = input.request.sourceType;
36
+ if (input.sourceUrl)
37
+ frontMatter.source_url = input.sourceUrl;
38
+ if (input.sourcePath)
39
+ frontMatter.source_path = input.sourcePath;
40
+ if (input.request.sourceTypeSource)
41
+ frontMatter.source_type_source = input.request.sourceTypeSource;
42
+ if (input.request.lineage && Object.keys(input.request.lineage).length > 0)
43
+ frontMatter.lineage = input.request.lineage;
44
+ return frontMatter;
45
+ }
46
+ export function buildIngestPayload(input, contentHash) {
47
+ const candidates = input.request.sourceTypeCandidates?.length
48
+ ? input.request.sourceTypeCandidates
49
+ : defaultSourceTypeCandidates(input.sourceFormat);
50
+ return {
51
+ markdown: toMarkdownDocument(buildFrontMatter(input, contentHash), input.markdown),
52
+ content: input.markdown,
53
+ title: input.title,
54
+ externalId: input.externalId,
55
+ contentHash,
56
+ sourceFormat: input.sourceFormat,
57
+ parser: input.parser,
58
+ ...(input.sourceUrl ? { sourceUrl: input.sourceUrl } : {}),
59
+ ...(input.sourcePath ? { sourcePath: input.sourcePath } : {}),
60
+ sourceTypeCandidates: candidates,
61
+ sourceTypeRequired: !input.request.sourceType,
62
+ assets: input.assets,
63
+ assetRefBase: 'delivery',
64
+ };
65
+ }
66
+ export async function writeDelivery(deliveryDir, input) {
67
+ await mkdir(deliveryDir, { recursive: true });
68
+ const contentHash = sha256(input.markdown);
69
+ const frontMatter = buildFrontMatter(input, contentHash);
70
+ const document = toMarkdownDocument(frontMatter, input.markdown);
71
+ await writeTextAtomic(join(deliveryDir, 'index.md'), document);
72
+ const manifest = {
73
+ version: 1,
74
+ taskId: input.taskId,
75
+ inputKind: input.request.kind,
76
+ sourceFormat: input.sourceFormat,
77
+ parser: input.parser,
78
+ title: input.title,
79
+ createdAt: input.createdAt,
80
+ updatedAt: input.updatedAt,
81
+ deliveryDir,
82
+ contentHash,
83
+ externalId: input.externalId,
84
+ wordCount: wordCount(input.markdown),
85
+ assets: input.assets,
86
+ warnings: input.warnings,
87
+ dependencyVersions: input.dependencyVersions,
88
+ ...(input.request.lineage ? { lineage: input.request.lineage } : {}),
89
+ ingest: buildIngestPayload(input, contentHash),
90
+ };
91
+ await writeTextAtomic(join(deliveryDir, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\n`);
92
+ return manifest;
93
+ }
94
+ export function sourceTypeSourceOf(value) {
95
+ return value === 'agent' || value === 'user' || value === 'default' ? value : undefined;
96
+ }
97
+ //# sourceMappingURL=delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"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"}
package/lib/http.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Transport for the kernel: a plain `node:http` handler.
3
+ *
4
+ * It is mounted three ways — standalone (`bin/tita-convert.mjs`), inside the
5
+ * DSH web server (`/convert/*`), and from tests — which is exactly why the
6
+ * kernel owns a handler instead of a server.
7
+ */
8
+ import type { IncomingMessage, ServerResponse } from 'node:http';
9
+ import type { ConvertTask } from './contract.js';
10
+ import { ConvertService } from './service.js';
11
+ export interface HandlerOptions {
12
+ service: ConvertService;
13
+ /** Path prefix the handler answers on, e.g. `/convert`. Empty means `/`. */
14
+ basePath?: string;
15
+ /** Directory holding the Vue console. Resolved relative to this module by default. */
16
+ webRoot?: string;
17
+ /** Unauthenticated-local default; when set, every /api call must present it. */
18
+ apiKey?: string;
19
+ }
20
+ export declare function defaultWebRoot(): string;
21
+ interface MultipartPart {
22
+ name: string;
23
+ filename?: string;
24
+ contentType?: string;
25
+ data: Buffer;
26
+ }
27
+ /** Minimal multipart/form-data reader: no dependency, no streaming, no surprises. */
28
+ export declare function parseMultipart(body: Buffer, boundary: string): MultipartPart[];
29
+ declare function taskSummary(task: ConvertTask): Record<string, unknown>;
30
+ /** Full task view, including the ingest payload the DSH layer forwards. */
31
+ declare function taskDetail(task: ConvertTask): Record<string, unknown>;
32
+ export declare function createRequestHandler(options: HandlerOptions): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
33
+ export { taskSummary, taskDetail };
34
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAIhE,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,eAAe,CAAA;AAChE,OAAO,EAAE,cAAc,EAAiB,MAAM,cAAc,CAAA;AAE5D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,cAAc,CAAA;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAID,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAmCD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAyB9E;AAED,iBAAS,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyB/D;AAED,2EAA2E;AAC3E,iBAAS,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO9D;AAgBD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CA6J1H;AAqFD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,CAAA"}