@mrtdown/core 2.0.0-alpha.4 → 2.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/create.js +3 -3
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/list.js +2 -2
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/show.js +3 -3
- package/dist/cli/commands/show.js.map +1 -1
- package/dist/cli/commands/validate.js +1 -1
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/helpers/keyForAffectedEntity.d.ts +1 -1
- package/dist/helpers/keyForAffectedEntity.js.map +1 -1
- package/dist/helpers/normalizeRecurringPeriod.d.ts +1 -1
- package/dist/helpers/normalizeRecurringPeriod.js +1 -1
- package/dist/helpers/normalizeRecurringPeriod.js.map +1 -1
- package/dist/helpers/normalizeRecurringPeriod.test.js.map +1 -1
- package/dist/helpers/resolvePeriods.d.ts +1 -1
- package/dist/helpers/resolvePeriods.js +1 -1
- package/dist/helpers/resolvePeriods.js.map +1 -1
- package/dist/helpers/resolvePeriods.test.js.map +1 -1
- package/dist/index.d.ts +25 -25
- package/dist/index.js +25 -25
- package/dist/index.js.map +1 -1
- package/dist/llm/common/MemoryStore.d.ts +2 -2
- package/dist/llm/common/MemoryStore.js.map +1 -1
- package/dist/llm/common/formatCurrentState.d.ts +2 -2
- package/dist/llm/common/formatCurrentState.js.map +1 -1
- package/dist/llm/functions/extractClaimsFromNewEvidence/eval.test.js +3 -3
- package/dist/llm/functions/extractClaimsFromNewEvidence/eval.test.js.map +1 -1
- package/dist/llm/functions/extractClaimsFromNewEvidence/index.d.ts +2 -2
- package/dist/llm/functions/extractClaimsFromNewEvidence/index.js +4 -4
- package/dist/llm/functions/extractClaimsFromNewEvidence/index.js.map +1 -1
- package/dist/llm/functions/extractClaimsFromNewEvidence/tools/FindLinesTool.d.ts +1 -1
- package/dist/llm/functions/extractClaimsFromNewEvidence/tools/FindLinesTool.js.map +1 -1
- package/dist/llm/functions/extractClaimsFromNewEvidence/tools/FindServicesTool.d.ts +1 -1
- package/dist/llm/functions/extractClaimsFromNewEvidence/tools/FindServicesTool.js +1 -1
- package/dist/llm/functions/extractClaimsFromNewEvidence/tools/FindServicesTool.js.map +1 -1
- package/dist/llm/functions/extractClaimsFromNewEvidence/tools/FindStationsTool.d.ts +2 -2
- package/dist/llm/functions/extractClaimsFromNewEvidence/tools/FindStationsTool.js +2 -2
- package/dist/llm/functions/extractClaimsFromNewEvidence/tools/FindStationsTool.js.map +1 -1
- package/dist/llm/functions/generateIssueTitleAndSlug/index.js +2 -2
- package/dist/llm/functions/generateIssueTitleAndSlug/index.js.map +1 -1
- package/dist/llm/functions/translate/index.js +4 -4
- package/dist/llm/functions/translate/index.js.map +1 -1
- package/dist/llm/functions/triageNewEvidence/eval.test.js +2 -2
- package/dist/llm/functions/triageNewEvidence/eval.test.js.map +1 -1
- package/dist/llm/functions/triageNewEvidence/index.d.ts +1 -1
- package/dist/llm/functions/triageNewEvidence/index.js +4 -4
- package/dist/llm/functions/triageNewEvidence/index.js.map +1 -1
- package/dist/llm/functions/triageNewEvidence/tools/FindIssuesTool.d.ts +2 -2
- package/dist/llm/functions/triageNewEvidence/tools/FindIssuesTool.js +1 -1
- package/dist/llm/functions/triageNewEvidence/tools/FindIssuesTool.js.map +1 -1
- package/dist/llm/functions/triageNewEvidence/tools/GetIssueTool.d.ts +1 -1
- package/dist/llm/functions/triageNewEvidence/tools/GetIssueTool.js +1 -1
- package/dist/llm/functions/triageNewEvidence/tools/GetIssueTool.js.map +1 -1
- package/dist/repo/issue/IssueRepository.d.ts +1 -1
- package/dist/repo/issue/IssueRepository.js +3 -3
- package/dist/repo/issue/IssueRepository.js.map +1 -1
- package/dist/repo/issue/helpers/deriveCurrentState.d.ts +6 -6
- package/dist/repo/issue/helpers/deriveCurrentState.js +1 -1
- package/dist/repo/issue/helpers/deriveCurrentState.js.map +1 -1
- package/dist/repo/issue/helpers/deriveCurrentState.test.js.map +1 -1
- package/dist/schema/issue/evidence.js +1 -1
- package/dist/schema/issue/evidence.js.map +1 -1
- package/dist/schema/issue/issue.js +1 -1
- package/dist/schema/issue/issue.js.map +1 -1
- package/dist/util/ingestContent/helpers/getSlugDateTimeFromClaims.d.ts +1 -1
- package/dist/util/ingestContent/helpers/getSlugDateTimeFromClaims.js +1 -1
- package/dist/util/ingestContent/helpers/getSlugDateTimeFromClaims.js.map +1 -1
- package/dist/util/ingestContent/index.js +9 -9
- package/dist/util/ingestContent/index.js.map +1 -1
- package/dist/validators/buildContext.js +6 -6
- package/dist/validators/buildContext.js.map +1 -1
- package/dist/validators/issue.d.ts +1 -1
- package/dist/validators/issue.js +3 -3
- package/dist/validators/issue.js.map +1 -1
- package/dist/validators/line.d.ts +1 -1
- package/dist/validators/line.js +1 -1
- package/dist/validators/line.js.map +1 -1
- package/dist/validators/operator.js +1 -1
- package/dist/validators/operator.js.map +1 -1
- package/dist/validators/town.d.ts +1 -1
- package/dist/validators/town.js +1 -1
- package/dist/validators/town.js.map +1 -1
- package/dist/write/issue/IssueWriter.d.ts +3 -3
- package/dist/write/issue/IssueWriter.js.map +1 -1
- package/package.json +1 -10
package/dist/index.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
export { FileStore } from '
|
|
2
|
-
export { MRTDownRepository } from '
|
|
3
|
-
export * from '
|
|
4
|
-
export * from '
|
|
5
|
-
export * from '
|
|
6
|
-
export * from '
|
|
7
|
-
export * from '
|
|
8
|
-
export * from '
|
|
9
|
-
export * from '
|
|
10
|
-
export * from '
|
|
11
|
-
export * from '
|
|
12
|
-
export * from '
|
|
13
|
-
export * from '
|
|
14
|
-
export * from '
|
|
15
|
-
export * from '
|
|
16
|
-
export * from '
|
|
17
|
-
export * from '
|
|
18
|
-
export * from '
|
|
19
|
-
export * from '
|
|
20
|
-
export * from '
|
|
21
|
-
export * from '
|
|
22
|
-
export * from '
|
|
23
|
-
export { FileWriteStore } from '
|
|
24
|
-
export { IdGenerator } from '
|
|
25
|
-
export { MRTDownWriter } from '
|
|
1
|
+
export { FileStore } from './repo/common/FileStore.js';
|
|
2
|
+
export { MRTDownRepository } from './repo/MRTDownRepository.js';
|
|
3
|
+
export * from './schema/common.js';
|
|
4
|
+
export * from './schema/issue/bundle.js';
|
|
5
|
+
export * from './schema/issue/cause.js';
|
|
6
|
+
export * from './schema/issue/claim.js';
|
|
7
|
+
export * from './schema/issue/entity.js';
|
|
8
|
+
export * from './schema/issue/evidence.js';
|
|
9
|
+
export * from './schema/issue/facilityEffect.js';
|
|
10
|
+
export * from './schema/issue/id.js';
|
|
11
|
+
export * from './schema/issue/impactEvent.js';
|
|
12
|
+
export * from './schema/issue/issue.js';
|
|
13
|
+
export * from './schema/issue/issueType.js';
|
|
14
|
+
export * from './schema/issue/period.js';
|
|
15
|
+
export * from './schema/issue/serviceEffect.js';
|
|
16
|
+
export * from './schema/issue/serviceScope.js';
|
|
17
|
+
export * from './schema/Landmark.js';
|
|
18
|
+
export * from './schema/Line.js';
|
|
19
|
+
export * from './schema/Operator.js';
|
|
20
|
+
export * from './schema/Service.js';
|
|
21
|
+
export * from './schema/Station.js';
|
|
22
|
+
export * from './schema/Town.js';
|
|
23
|
+
export { FileWriteStore } from './write/common/FileWriteStore.js';
|
|
24
|
+
export { IdGenerator } from './write/id/IdGenerator.js';
|
|
25
|
+
export { MRTDownWriter } from './write/MRTDownWriter.js';
|
|
26
26
|
export { normalizeRecurringPeriod } from './helpers/normalizeRecurringPeriod.js';
|
|
27
27
|
export { resolvePeriods } from './helpers/resolvePeriods.js';
|
|
28
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC","sourcesContent":["export { FileStore } from './repo/common/FileStore.js';\nexport { MRTDownRepository } from './repo/MRTDownRepository.js';\n\nexport * from './schema/common.js';\nexport * from './schema/issue/bundle.js';\nexport * from './schema/issue/cause.js';\nexport * from './schema/issue/claim.js';\nexport * from './schema/issue/entity.js';\nexport * from './schema/issue/evidence.js';\nexport * from './schema/issue/facilityEffect.js';\nexport * from './schema/issue/id.js';\nexport * from './schema/issue/impactEvent.js';\nexport * from './schema/issue/issue.js';\nexport * from './schema/issue/issueType.js';\nexport * from './schema/issue/period.js';\nexport * from './schema/issue/serviceEffect.js';\nexport * from './schema/issue/serviceScope.js';\nexport * from './schema/Landmark.js';\nexport * from './schema/Line.js';\nexport * from './schema/Operator.js';\nexport * from './schema/Service.js';\nexport * from './schema/Station.js';\nexport * from './schema/Town.js';\n\nexport { FileWriteStore } from './write/common/FileWriteStore.js';\nexport { IdGenerator } from './write/id/IdGenerator.js';\nexport { MRTDownWriter } from './write/MRTDownWriter.js';\nexport { normalizeRecurringPeriod } from './helpers/normalizeRecurringPeriod.js';\nexport { resolvePeriods } from './helpers/resolvePeriods.js';\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { IStore } from '
|
|
2
|
-
import type { IWriteStore } from '
|
|
1
|
+
import type { IStore } from '../../repo/common/store.js';
|
|
2
|
+
import type { IWriteStore } from '../../write/common/store.js';
|
|
3
3
|
export declare class MemoryStore implements IStore, IWriteStore {
|
|
4
4
|
private readonly files;
|
|
5
5
|
private readonly dirs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryStore.js","sourceRoot":"/","sources":["llm/common/MemoryStore.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, dirname, normalize } from 'node:path';\nimport type { IStore } from '
|
|
1
|
+
{"version":3,"file":"MemoryStore.js","sourceRoot":"/","sources":["llm/common/MemoryStore.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, dirname, normalize } from 'node:path';\nimport type { IStore } from '../../repo/common/store.js';\nimport type { IWriteStore } from '../../write/common/store.js';\n\nexport class MemoryStore implements IStore, IWriteStore {\n private readonly files = new Map<string, string>();\n private readonly dirs = new Map<string, Set<string>>();\n\n constructor(seed?: { files?: Record<string, string> }) {\n // Root dir\n this.dirs.set('', new Set());\n\n if (seed?.files) {\n for (const [path, text] of Object.entries(seed.files)) {\n this.writeText(path, text);\n }\n }\n }\n\n // --------- IStore ---------\n private toStorePath(path: string): string {\n const p = normalize(path);\n return p === '.' ? '' : p;\n }\n\n exists(path: string): boolean {\n const p = this.toStorePath(path);\n return this.files.has(p) || this.dirs.has(p);\n }\n\n readText(path: string): string {\n const p = this.toStorePath(path);\n const v = this.files.get(p);\n if (v == null) {\n throw new Error(`MemoryStore: File not found: ${path}`);\n }\n return v;\n }\n\n readJson<T>(path: string): T {\n return JSON.parse(this.readText(path));\n }\n\n listDir(path: string): string[] {\n const p = this.toStorePath(path);\n const children = this.dirs.get(p);\n if (children == null) {\n throw new Error(`MemoryStore: Directory not found: ${path}`);\n }\n return Array.from(children.values()).sort();\n }\n\n // --------- IWriteStore ---------\n ensureDir(path: string): void {\n const p = this.toStorePath(path);\n if (this.dirs.has(p)) {\n return;\n }\n\n // Ensure parents (dirname returns '.' for root, treat as '')\n const rawParent = dirname(p === '' ? '.' : p);\n const parent = rawParent === '.' ? '' : rawParent;\n if (parent !== '') {\n this.ensureDir(parent);\n }\n\n // Create this directory\n this.dirs.set(p, new Set());\n\n // Register in parent (including root when parent is '')\n this.addChild(parent, basename(p));\n }\n\n private addChild(dir: string, child: string): void {\n const d = this.toStorePath(dir);\n const set = this.dirs.get(d);\n if (set == null) {\n this.ensureDir(d);\n this.addChild(d, child);\n return;\n }\n set.add(child);\n }\n\n writeText(path: string, text: string): void {\n const p = this.toStorePath(path);\n this.ensureDir(dirname(p));\n this.addChild(dirname(p), basename(p));\n this.files.set(p, text);\n }\n\n writeJson(path: string, json: unknown): void {\n this.writeText(path, JSON.stringify(json));\n }\n\n appendText(path: string, text: string): void {\n const p = this.toStorePath(path);\n this.ensureDir(dirname(p));\n this.addChild(dirname(p), basename(p));\n const prevContent = this.files.get(p) ?? '';\n this.files.set(p, prevContent + text);\n }\n\n delete(path: string): void {\n const p = this.toStorePath(path);\n this.files.delete(p);\n this.dirs.delete(p);\n this.dirs.delete(path);\n }\n\n // Debug helpers\n dumpFiles(): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [path, text] of this.files.entries()) {\n result[path] = text;\n }\n return result;\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { IssueBundleState } from '
|
|
2
|
-
import type { Evidence } from '
|
|
1
|
+
import type { IssueBundleState } from '../../repo/issue/helpers/deriveCurrentState.js';
|
|
2
|
+
import type { Evidence } from '../../schema/issue/evidence.js';
|
|
3
3
|
export type FormatCurrentStateOptions = {
|
|
4
4
|
state: IssueBundleState | null;
|
|
5
5
|
evidence?: Evidence[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatCurrentState.js","sourceRoot":"/","sources":["llm/common/formatCurrentState.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Heading, Root } from 'mdast';\nimport { gfmToMarkdown } from 'mdast-util-gfm';\nimport { toMarkdown } from 'mdast-util-to-markdown';\nimport type { IssueBundleState } from '#repo/issue/helpers/deriveCurrentState.js';\nimport type { Evidence } from '#schema/issue/evidence.js';\nimport type { Period } from '#schema/issue/period.js';\nimport type { ServiceScope } from '#schema/issue/serviceScope.js';\n\nexport type FormatCurrentStateOptions = {\n state: IssueBundleState | null;\n evidence?: Evidence[];\n};\n\n/**\n * Format the current state as markdown for better LLM readability\n */\nexport function formatCurrentState(\n stateOrOptions: IssueBundleState | null | FormatCurrentStateOptions,\n): string {\n const options: FormatCurrentStateOptions =\n stateOrOptions != null &&\n typeof stateOrOptions === 'object' &&\n 'state' in stateOrOptions\n ? stateOrOptions\n : { state: stateOrOptions };\n const state = options.state;\n const evidence = options.evidence ?? [];\n\n if (state == null && evidence.length === 0) {\n return 'No state';\n }\n\n const services = state?.services ?? {};\n const facilities = state?.facilities ?? {};\n const impactEventIds = state?.impactEventIds ?? [];\n const relevantEvidenceIds = state != null ? collectEvidenceIds(state) : [];\n\n const root: Root = {\n type: 'root',\n children: [],\n };\n\n // Evidence Section\n root.children.push({\n type: 'heading',\n depth: 2,\n children: [{ type: 'text', value: 'Evidence' }],\n });\n\n if (evidence.length === 0) {\n root.children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'None' }],\n });\n } else {\n for (const ev of evidence) {\n root.children.push(...formatEvidenceItem(ev));\n }\n }\n\n // Services Section\n root.children.push({\n type: 'heading',\n depth: 2,\n children: [{ type: 'text', value: 'Services' }],\n });\n\n const serviceKeys = Object.keys(services);\n if (serviceKeys.length === 0) {\n root.children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'None' }],\n });\n } else {\n for (const key of serviceKeys) {\n const svc = services[key];\n root.children.push(\n ...formatServiceSection(\n key,\n svc.serviceId,\n svc.effect,\n svc.scopes,\n svc.periods,\n svc.causes,\n ),\n );\n }\n }\n\n // Facilities Section\n const facilitiesHeading: Heading = {\n type: 'heading',\n depth: 2,\n children: [{ type: 'text', value: 'Facilities' }],\n };\n root.children.push(facilitiesHeading);\n\n const facilityKeys = Object.keys(facilities);\n if (facilityKeys.length === 0) {\n root.children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'None' }],\n });\n } else {\n for (const key of facilityKeys) {\n const fac = facilities[key];\n root.children.push(\n ...formatFacilitySection(\n key,\n fac.stationId,\n fac.kind,\n fac.effect,\n fac.periods,\n ),\n );\n }\n }\n\n // Impact Event IDs Section\n root.children.push({\n type: 'heading',\n depth: 2,\n children: [{ type: 'text', value: 'Impact Event IDs' }],\n });\n\n if (impactEventIds.length === 0) {\n root.children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'None' }],\n });\n } else {\n root.children.push({\n type: 'list',\n ordered: false,\n children: impactEventIds.map((id) => ({\n type: 'listItem',\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'inlineCode', value: id }],\n },\n ],\n })),\n });\n }\n\n // Relevant Evidence IDs Section\n const evidenceHeading: Heading = {\n type: 'heading',\n depth: 2,\n children: [{ type: 'text', value: 'Relevant Evidence IDs' }],\n };\n root.children.push(evidenceHeading);\n\n if (relevantEvidenceIds.length === 0) {\n root.children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'None' }],\n });\n } else {\n root.children.push({\n type: 'list',\n ordered: false,\n children: relevantEvidenceIds.map((id) => ({\n type: 'listItem',\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'inlineCode', value: id }],\n },\n ],\n })),\n });\n }\n\n return toMarkdown(root, { extensions: [gfmToMarkdown()] });\n}\n\nfunction formatEvidenceItem(ev: Evidence): Root['children'] {\n const children: Root['children'] = [];\n\n children.push({\n type: 'heading',\n depth: 3,\n children: [\n { type: 'inlineCode', value: ev.id },\n { type: 'text', value: ` (${ev.type})` },\n ],\n });\n\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Timestamp: ' },\n { type: 'inlineCode', value: ev.ts },\n ],\n });\n\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Source: ' },\n { type: 'inlineCode', value: ev.render?.source ?? '—' },\n ],\n });\n\n if ('sourceUrl' in ev) {\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'URL: ' },\n {\n type: 'link',\n url: ev.sourceUrl,\n children: [{ type: 'text', value: ev.sourceUrl }],\n },\n ],\n });\n }\n\n children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'Text:' }],\n });\n children.push({\n type: 'blockquote',\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'text', value: ev.text }],\n },\n ],\n });\n\n return children;\n}\n\nfunction collectEvidenceIds(state: IssueBundleState): string[] {\n const ids = new Set<string>();\n for (const prov of Object.values(state.servicesProvenance)) {\n if (prov.effect?.evidenceId) ids.add(prov.effect.evidenceId);\n if (prov.scopes?.evidenceId) ids.add(prov.scopes.evidenceId);\n if (prov.periods?.evidenceId) ids.add(prov.periods.evidenceId);\n if (prov.causes?.evidenceId) ids.add(prov.causes.evidenceId);\n }\n for (const prov of Object.values(state.facilitiesProvenance)) {\n if (prov.effect?.evidenceId) ids.add(prov.effect.evidenceId);\n if (prov.periods?.evidenceId) ids.add(prov.periods.evidenceId);\n }\n return [...ids];\n}\n\nfunction formatServiceSection(\n key: string,\n serviceId: string,\n effect: { kind: string } | null,\n scopes: ServiceScope[],\n periods: Period[],\n causes: string[],\n): Root['children'] {\n const children: Root['children'] = [];\n\n children.push({\n type: 'heading',\n depth: 3,\n children: [{ type: 'text', value: key }],\n });\n\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Service ID: ' },\n { type: 'inlineCode', value: serviceId },\n ],\n });\n\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Effect: ' },\n { type: 'inlineCode', value: effect?.kind ?? 'null' },\n ],\n });\n\n if (scopes.length > 0) {\n children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'Scopes:' }],\n });\n children.push({\n type: 'list',\n ordered: false,\n children: scopes.map((scope) => ({\n type: 'listItem',\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'inlineCode', value: formatScope(scope) }],\n },\n ],\n })),\n });\n }\n\n if (periods.length > 0) {\n children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'Periods:' }],\n });\n children.push({\n type: 'list',\n ordered: false,\n children: periods.map((period, i) => ({\n type: 'listItem',\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'text', value: formatPeriod(period, i) }],\n },\n ],\n })),\n });\n }\n\n if (causes.length > 0) {\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Causes: ' },\n { type: 'inlineCode', value: causes.join(', ') },\n ],\n });\n }\n\n return children;\n}\n\nfunction formatFacilitySection(\n key: string,\n stationId: string,\n kind: string,\n effect: { kind: string } | null,\n periods: Period[],\n): Root['children'] {\n const children: Root['children'] = [];\n\n children.push({\n type: 'heading',\n depth: 3,\n children: [{ type: 'text', value: key }],\n });\n\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Station: ' },\n { type: 'inlineCode', value: stationId },\n { type: 'text', value: ', Kind: ' },\n { type: 'inlineCode', value: kind },\n ],\n });\n\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Effect: ' },\n { type: 'inlineCode', value: effect?.kind ?? 'null' },\n ],\n });\n\n if (periods.length > 0) {\n children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'Periods:' }],\n });\n children.push({\n type: 'list',\n ordered: false,\n children: periods.map((period, i) => ({\n type: 'listItem',\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'text', value: formatPeriod(period, i) }],\n },\n ],\n })),\n });\n }\n\n return children;\n}\n\nfunction formatScope(scope: ServiceScope): string {\n switch (scope.type) {\n case 'service.whole':\n return scope.type;\n case 'service.segment':\n return `${scope.type} (${scope.fromStationId} → ${scope.toStationId})`;\n case 'service.point':\n return `${scope.type} (${scope.stationId})`;\n }\n}\n\nfunction formatPeriod(period: Period, index: number): string {\n switch (period.kind) {\n case 'fixed':\n return `[${index}] fixed: ${period.startAt} → ${period.endAt ?? 'ongoing'}`;\n case 'recurring':\n return `[${index}] recurring ${period.frequency}: ${period.startAt}–${period.endAt} ${period.timeWindow.startAt}–${period.timeWindow.endAt}`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"formatCurrentState.js","sourceRoot":"/","sources":["llm/common/formatCurrentState.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Heading, Root } from 'mdast';\nimport { gfmToMarkdown } from 'mdast-util-gfm';\nimport { toMarkdown } from 'mdast-util-to-markdown';\nimport type { IssueBundleState } from '../../repo/issue/helpers/deriveCurrentState.js';\nimport type { Evidence } from '../../schema/issue/evidence.js';\nimport type { Period } from '../../schema/issue/period.js';\nimport type { ServiceScope } from '../../schema/issue/serviceScope.js';\n\nexport type FormatCurrentStateOptions = {\n state: IssueBundleState | null;\n evidence?: Evidence[];\n};\n\n/**\n * Format the current state as markdown for better LLM readability\n */\nexport function formatCurrentState(\n stateOrOptions: IssueBundleState | null | FormatCurrentStateOptions,\n): string {\n const options: FormatCurrentStateOptions =\n stateOrOptions != null &&\n typeof stateOrOptions === 'object' &&\n 'state' in stateOrOptions\n ? stateOrOptions\n : { state: stateOrOptions };\n const state = options.state;\n const evidence = options.evidence ?? [];\n\n if (state == null && evidence.length === 0) {\n return 'No state';\n }\n\n const services = state?.services ?? {};\n const facilities = state?.facilities ?? {};\n const impactEventIds = state?.impactEventIds ?? [];\n const relevantEvidenceIds = state != null ? collectEvidenceIds(state) : [];\n\n const root: Root = {\n type: 'root',\n children: [],\n };\n\n // Evidence Section\n root.children.push({\n type: 'heading',\n depth: 2,\n children: [{ type: 'text', value: 'Evidence' }],\n });\n\n if (evidence.length === 0) {\n root.children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'None' }],\n });\n } else {\n for (const ev of evidence) {\n root.children.push(...formatEvidenceItem(ev));\n }\n }\n\n // Services Section\n root.children.push({\n type: 'heading',\n depth: 2,\n children: [{ type: 'text', value: 'Services' }],\n });\n\n const serviceKeys = Object.keys(services);\n if (serviceKeys.length === 0) {\n root.children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'None' }],\n });\n } else {\n for (const key of serviceKeys) {\n const svc = services[key];\n root.children.push(\n ...formatServiceSection(\n key,\n svc.serviceId,\n svc.effect,\n svc.scopes,\n svc.periods,\n svc.causes,\n ),\n );\n }\n }\n\n // Facilities Section\n const facilitiesHeading: Heading = {\n type: 'heading',\n depth: 2,\n children: [{ type: 'text', value: 'Facilities' }],\n };\n root.children.push(facilitiesHeading);\n\n const facilityKeys = Object.keys(facilities);\n if (facilityKeys.length === 0) {\n root.children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'None' }],\n });\n } else {\n for (const key of facilityKeys) {\n const fac = facilities[key];\n root.children.push(\n ...formatFacilitySection(\n key,\n fac.stationId,\n fac.kind,\n fac.effect,\n fac.periods,\n ),\n );\n }\n }\n\n // Impact Event IDs Section\n root.children.push({\n type: 'heading',\n depth: 2,\n children: [{ type: 'text', value: 'Impact Event IDs' }],\n });\n\n if (impactEventIds.length === 0) {\n root.children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'None' }],\n });\n } else {\n root.children.push({\n type: 'list',\n ordered: false,\n children: impactEventIds.map((id) => ({\n type: 'listItem',\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'inlineCode', value: id }],\n },\n ],\n })),\n });\n }\n\n // Relevant Evidence IDs Section\n const evidenceHeading: Heading = {\n type: 'heading',\n depth: 2,\n children: [{ type: 'text', value: 'Relevant Evidence IDs' }],\n };\n root.children.push(evidenceHeading);\n\n if (relevantEvidenceIds.length === 0) {\n root.children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'None' }],\n });\n } else {\n root.children.push({\n type: 'list',\n ordered: false,\n children: relevantEvidenceIds.map((id) => ({\n type: 'listItem',\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'inlineCode', value: id }],\n },\n ],\n })),\n });\n }\n\n return toMarkdown(root, { extensions: [gfmToMarkdown()] });\n}\n\nfunction formatEvidenceItem(ev: Evidence): Root['children'] {\n const children: Root['children'] = [];\n\n children.push({\n type: 'heading',\n depth: 3,\n children: [\n { type: 'inlineCode', value: ev.id },\n { type: 'text', value: ` (${ev.type})` },\n ],\n });\n\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Timestamp: ' },\n { type: 'inlineCode', value: ev.ts },\n ],\n });\n\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Source: ' },\n { type: 'inlineCode', value: ev.render?.source ?? '—' },\n ],\n });\n\n if ('sourceUrl' in ev) {\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'URL: ' },\n {\n type: 'link',\n url: ev.sourceUrl,\n children: [{ type: 'text', value: ev.sourceUrl }],\n },\n ],\n });\n }\n\n children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'Text:' }],\n });\n children.push({\n type: 'blockquote',\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'text', value: ev.text }],\n },\n ],\n });\n\n return children;\n}\n\nfunction collectEvidenceIds(state: IssueBundleState): string[] {\n const ids = new Set<string>();\n for (const prov of Object.values(state.servicesProvenance)) {\n if (prov.effect?.evidenceId) ids.add(prov.effect.evidenceId);\n if (prov.scopes?.evidenceId) ids.add(prov.scopes.evidenceId);\n if (prov.periods?.evidenceId) ids.add(prov.periods.evidenceId);\n if (prov.causes?.evidenceId) ids.add(prov.causes.evidenceId);\n }\n for (const prov of Object.values(state.facilitiesProvenance)) {\n if (prov.effect?.evidenceId) ids.add(prov.effect.evidenceId);\n if (prov.periods?.evidenceId) ids.add(prov.periods.evidenceId);\n }\n return [...ids];\n}\n\nfunction formatServiceSection(\n key: string,\n serviceId: string,\n effect: { kind: string } | null,\n scopes: ServiceScope[],\n periods: Period[],\n causes: string[],\n): Root['children'] {\n const children: Root['children'] = [];\n\n children.push({\n type: 'heading',\n depth: 3,\n children: [{ type: 'text', value: key }],\n });\n\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Service ID: ' },\n { type: 'inlineCode', value: serviceId },\n ],\n });\n\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Effect: ' },\n { type: 'inlineCode', value: effect?.kind ?? 'null' },\n ],\n });\n\n if (scopes.length > 0) {\n children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'Scopes:' }],\n });\n children.push({\n type: 'list',\n ordered: false,\n children: scopes.map((scope) => ({\n type: 'listItem',\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'inlineCode', value: formatScope(scope) }],\n },\n ],\n })),\n });\n }\n\n if (periods.length > 0) {\n children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'Periods:' }],\n });\n children.push({\n type: 'list',\n ordered: false,\n children: periods.map((period, i) => ({\n type: 'listItem',\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'text', value: formatPeriod(period, i) }],\n },\n ],\n })),\n });\n }\n\n if (causes.length > 0) {\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Causes: ' },\n { type: 'inlineCode', value: causes.join(', ') },\n ],\n });\n }\n\n return children;\n}\n\nfunction formatFacilitySection(\n key: string,\n stationId: string,\n kind: string,\n effect: { kind: string } | null,\n periods: Period[],\n): Root['children'] {\n const children: Root['children'] = [];\n\n children.push({\n type: 'heading',\n depth: 3,\n children: [{ type: 'text', value: key }],\n });\n\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Station: ' },\n { type: 'inlineCode', value: stationId },\n { type: 'text', value: ', Kind: ' },\n { type: 'inlineCode', value: kind },\n ],\n });\n\n children.push({\n type: 'paragraph',\n children: [\n { type: 'text', value: 'Effect: ' },\n { type: 'inlineCode', value: effect?.kind ?? 'null' },\n ],\n });\n\n if (periods.length > 0) {\n children.push({\n type: 'paragraph',\n children: [{ type: 'text', value: 'Periods:' }],\n });\n children.push({\n type: 'list',\n ordered: false,\n children: periods.map((period, i) => ({\n type: 'listItem',\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'text', value: formatPeriod(period, i) }],\n },\n ],\n })),\n });\n }\n\n return children;\n}\n\nfunction formatScope(scope: ServiceScope): string {\n switch (scope.type) {\n case 'service.whole':\n return scope.type;\n case 'service.segment':\n return `${scope.type} (${scope.fromStationId} → ${scope.toStationId})`;\n case 'service.point':\n return `${scope.type} (${scope.stationId})`;\n }\n}\n\nfunction formatPeriod(period: Period, index: number): string {\n switch (period.kind) {\n case 'fixed':\n return `[${index}] fixed: ${period.startAt} → ${period.endAt ?? 'ongoing'}`;\n case 'recurring':\n return `[${index}] recurring ${period.frequency}: ${period.startAt}–${period.endAt} ${period.timeWindow.startAt}–${period.timeWindow.endAt}`;\n }\n}\n"]}
|
|
@@ -2,9 +2,9 @@ import 'dotenv/config';
|
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
3
|
import { describe } from 'vitest';
|
|
4
4
|
import { describeEval, StructuredOutputScorer } from 'vitest-evals';
|
|
5
|
-
import { FileStore } from '
|
|
6
|
-
import { MRTDownRepository } from '
|
|
7
|
-
import { assert } from '
|
|
5
|
+
import { FileStore } from '../../../repo/common/FileStore.js';
|
|
6
|
+
import { MRTDownRepository } from '../../../repo/MRTDownRepository.js';
|
|
7
|
+
import { assert } from '../../../util/assert.js';
|
|
8
8
|
import { extractClaimsFromNewEvidence, } from './index.js';
|
|
9
9
|
describe('extractClaimsFromNewEvidence', () => {
|
|
10
10
|
describeEval('should extract claims from new disruption evidence', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eval.test.js","sourceRoot":"/","sources":["llm/functions/extractClaimsFromNewEvidence/eval.test.ts"],"names":[],"mappings":"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","sourcesContent":["import 'dotenv/config';\n\nimport { resolve } from 'node:path';\nimport { describe } from 'vitest';\nimport { describeEval, StructuredOutputScorer } from 'vitest-evals';\nimport { FileStore } from '#repo/common/FileStore.js';\nimport { MRTDownRepository } from '#repo/MRTDownRepository.js';\nimport { assert } from '#util/assert.js';\nimport {\n type ExtractClaimsFromNewEvidenceParams,\n type ExtractClaimsFromNewEvidenceResult,\n extractClaimsFromNewEvidence,\n} from './index.js';\n\ndescribe('extractClaimsFromNewEvidence', () => {\n describeEval('should extract claims from new disruption evidence', {\n // @ts-expect-error input is a string in the vitest-evals library\n async data() {\n const store = new FileStore(\n resolve(import.meta.dirname, '../../fixtures/data'),\n );\n const repo = new MRTDownRepository({ store });\n const issueBundle = repo.issues.get('2026-01-01-tgl-train-fault');\n assert(issueBundle != null, 'Issue bundle not found');\n\n return [\n {\n input: {\n newEvidence: {\n ts: '2026-01-01T07:10:00+08:00',\n text: '[TGL] Due to a track fault at Tengah, train services on the Tengah Line are delayed between Bukit Batok and Bukit Merah Central',\n },\n repo,\n // This is used by vitest-evals as the test name, as the library expects `input` to be a string.\n toString() {\n return '[DISRUPTION] Expansion of scope';\n },\n },\n expected: {\n claims: [\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_E',\n },\n effect: {\n facility: null,\n service: {\n kind: 'delay',\n duration: null,\n },\n },\n statusSignal: 'open',\n scopes: {\n service: [\n {\n type: 'service.segment',\n fromStationId: 'BBT',\n toStationId: 'BMC',\n },\n ],\n },\n timeHints: {\n kind: 'start-only',\n startAt: '2026-01-01T07:10:00+08:00',\n },\n causes: ['track.fault'],\n },\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_W',\n },\n effect: {\n facility: null,\n service: {\n kind: 'delay',\n duration: null,\n },\n },\n statusSignal: 'open',\n scopes: {\n service: [\n {\n type: 'service.segment',\n fromStationId: 'BMC',\n toStationId: 'BBT',\n },\n ],\n },\n timeHints: {\n kind: 'start-only',\n startAt: '2026-01-01T07:10:00+08:00',\n },\n causes: ['track.fault'],\n },\n ],\n },\n },\n {\n input: {\n newEvidence: {\n ts: '2026-01-01T07:10:00+08:00',\n text: '[TGL] CLEARED: Fault has been cleared. Train service has resumed.',\n },\n repo,\n // This is used by vitest-evals as the test name, as the library expects `input` to be a string.\n toString() {\n return '[DISRUPTION] Issue resolved';\n },\n },\n expected: {\n claims: [\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_E',\n },\n effect: {\n service: null,\n facility: null,\n },\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n statusSignal: 'cleared',\n timeHints: {\n kind: 'end-only',\n endAt: '2026-01-01T07:10:00+08:00',\n },\n causes: null,\n },\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_W',\n },\n effect: {\n service: null,\n facility: null,\n },\n statusSignal: 'cleared',\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'end-only',\n endAt: '2026-01-01T07:10:00+08:00',\n },\n causes: null,\n },\n ],\n },\n },\n {\n input: {\n newEvidence: {\n ts: '2026-01-01T07:10:00+08:00',\n text: '[TGL] UPDATE: For alternative travel options, please refer to https://t.co/Le6ROZGqsm',\n },\n repo,\n // This is used by vitest-evals as the test name, as the library expects `input` to be a string.\n toString() {\n return '[DISRUPTION] Irrelevant update';\n },\n },\n expected: {\n claims: [],\n },\n },\n ] satisfies {\n input: ExtractClaimsFromNewEvidenceParams & { toString(): string };\n expected: ExtractClaimsFromNewEvidenceResult;\n }[];\n },\n async task(input) {\n const result = await extractClaimsFromNewEvidence(\n input as unknown as ExtractClaimsFromNewEvidenceParams,\n );\n return JSON.stringify(result);\n },\n scorers: [StructuredOutputScorer()],\n });\n describeEval('should compute the impact of new maintenance evidence', {\n // @ts-expect-error input is a string in the vitest-evals library\n async data() {\n const store = new FileStore(\n resolve(import.meta.dirname, '../../fixtures/data'),\n );\n const repo = new MRTDownRepository({ store });\n\n return [\n {\n input: {\n newEvidence: {\n ts: '2026-01-01T07:10:00+08:00',\n text: '[TGL] The Tengah Line will be closed for maintenance on Sat & Sun from 7 to 8 February 2026.',\n },\n repo,\n // This is used by vitest-evals as the test name, as the library expects `input` to be a string.\n toString() {\n return '[MAINTENANCE] New issue';\n },\n },\n expected: {\n claims: [\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_E',\n },\n effect: {\n service: { kind: 'no-service' },\n facility: null,\n },\n statusSignal: 'planned',\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'fixed',\n startAt: '2026-02-07T00:00:00+08:00',\n endAt: '2026-02-09T00:00:00+08:00',\n },\n causes: null,\n },\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_W',\n },\n effect: {\n service: { kind: 'no-service' },\n facility: null,\n },\n statusSignal: 'planned',\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'fixed',\n startAt: '2026-02-07T00:00:00+08:00',\n endAt: '2026-02-09T00:00:00+08:00',\n },\n causes: null,\n },\n ],\n },\n },\n {\n input: {\n newEvidence: {\n ts: '2026-01-01T07:10:00+08:00',\n text: 'To continue testing the integrated systems and trains in preparation for Stage 2 of #TGL, train services from Bukit Batok to Bukit Merah Central will start later at 6.30am and end at 9pm daily from 1 to 8 February 2026.',\n },\n repo,\n // This is used by vitest-evals as the test name, as the library expects `input` to be a string.\n toString() {\n return '[MAINTENANCE] Service hour adjustments';\n },\n },\n expected: {\n claims: [\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_E',\n },\n effect: {\n service: {\n kind: 'service-hours-adjustment',\n },\n facility: null,\n },\n statusSignal: 'planned',\n scopes: {\n service: [\n {\n type: 'service.segment',\n fromStationId: 'BBT',\n toStationId: 'BMC',\n },\n ],\n },\n timeHints: {\n kind: 'recurring',\n frequency: 'daily',\n startAt: '2026-02-01T21:00:00+08:00',\n endAt: '2026-02-08T21:00:00+08:00',\n daysOfWeek: null,\n timeZone: 'Asia/Singapore',\n timeWindow: {\n startAt: '21:00:00',\n endAt: '06:30:00',\n },\n excludedDates: null,\n },\n causes: ['system.upgrade'],\n },\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_W',\n },\n effect: {\n service: {\n kind: 'service-hours-adjustment',\n },\n facility: null,\n },\n statusSignal: 'planned',\n scopes: {\n service: [\n {\n type: 'service.segment',\n fromStationId: 'BMC',\n toStationId: 'BBT',\n },\n ],\n },\n timeHints: {\n kind: 'recurring',\n frequency: 'daily',\n startAt: '2026-02-01T21:00:00+08:00',\n endAt: '2026-02-08T21:00:00+08:00',\n daysOfWeek: null,\n timeZone: 'Asia/Singapore',\n timeWindow: {\n startAt: '21:00:00',\n endAt: '06:30:00',\n },\n excludedDates: null,\n },\n causes: ['system.upgrade'],\n },\n ],\n },\n },\n {\n input: {\n newEvidence: {\n ts: '2026-01-10T22:00:00+08:00',\n text: 'The Tengah & Seletar Lines train service will start at 10am on 18 Feb. For MRT Shuttle Bus pick-up points, visit http://t.co/fwb2wOqI',\n },\n repo,\n // This is used by vitest-evals as the test name, as the library expects `input` to be a string.\n toString() {\n return '[MAINTENANCE] Service hour adjustments';\n },\n },\n expected: {\n claims: [\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_E',\n },\n effect: {\n service: { kind: 'service-hours-adjustment' },\n facility: null,\n },\n statusSignal: 'planned',\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'fixed',\n startAt: '2026-02-18T00:00:00+08:00',\n endAt: '2026-02-18T10:00:00+08:00',\n },\n causes: null,\n },\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_W',\n },\n effect: {\n service: { kind: 'service-hours-adjustment' },\n facility: null,\n },\n statusSignal: 'planned',\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'fixed',\n startAt: '2026-02-18T00:00:00+08:00',\n endAt: '2026-02-18T10:00:00+08:00',\n },\n causes: null,\n },\n {\n entity: {\n type: 'service',\n serviceId: 'SLL_MAIN_N',\n },\n effect: {\n service: { kind: 'service-hours-adjustment' },\n facility: null,\n },\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'fixed',\n startAt: '2026-02-18T00:00:00+08:00',\n endAt: '2026-02-18T10:00:00+08:00',\n },\n statusSignal: 'planned',\n causes: null,\n },\n {\n entity: {\n type: 'service',\n serviceId: 'SLL_MAIN_S',\n },\n effect: {\n service: { kind: 'service-hours-adjustment' },\n facility: null,\n },\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'fixed',\n startAt: '2026-02-18T00:00:00+08:00',\n endAt: '2026-02-18T10:00:00+08:00',\n },\n statusSignal: 'planned',\n causes: null,\n },\n ],\n },\n },\n ] satisfies {\n input: ExtractClaimsFromNewEvidenceParams & { toString(): string };\n expected: ExtractClaimsFromNewEvidenceResult;\n }[];\n },\n async task(input) {\n const result = await extractClaimsFromNewEvidence(\n input as unknown as ExtractClaimsFromNewEvidenceParams,\n );\n return JSON.stringify(result);\n },\n scorers: [\n StructuredOutputScorer({\n match: 'fuzzy',\n fuzzyOptions: { ignoreArrayOrder: true },\n }),\n ],\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"eval.test.js","sourceRoot":"/","sources":["llm/functions/extractClaimsFromNewEvidence/eval.test.ts"],"names":[],"mappings":"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","sourcesContent":["import 'dotenv/config';\n\nimport { resolve } from 'node:path';\nimport { describe } from 'vitest';\nimport { describeEval, StructuredOutputScorer } from 'vitest-evals';\nimport { FileStore } from '../../../repo/common/FileStore.js';\nimport { MRTDownRepository } from '../../../repo/MRTDownRepository.js';\nimport { assert } from '../../../util/assert.js';\nimport {\n type ExtractClaimsFromNewEvidenceParams,\n type ExtractClaimsFromNewEvidenceResult,\n extractClaimsFromNewEvidence,\n} from './index.js';\n\ndescribe('extractClaimsFromNewEvidence', () => {\n describeEval('should extract claims from new disruption evidence', {\n // @ts-expect-error input is a string in the vitest-evals library\n async data() {\n const store = new FileStore(\n resolve(import.meta.dirname, '../../fixtures/data'),\n );\n const repo = new MRTDownRepository({ store });\n const issueBundle = repo.issues.get('2026-01-01-tgl-train-fault');\n assert(issueBundle != null, 'Issue bundle not found');\n\n return [\n {\n input: {\n newEvidence: {\n ts: '2026-01-01T07:10:00+08:00',\n text: '[TGL] Due to a track fault at Tengah, train services on the Tengah Line are delayed between Bukit Batok and Bukit Merah Central',\n },\n repo,\n // This is used by vitest-evals as the test name, as the library expects `input` to be a string.\n toString() {\n return '[DISRUPTION] Expansion of scope';\n },\n },\n expected: {\n claims: [\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_E',\n },\n effect: {\n facility: null,\n service: {\n kind: 'delay',\n duration: null,\n },\n },\n statusSignal: 'open',\n scopes: {\n service: [\n {\n type: 'service.segment',\n fromStationId: 'BBT',\n toStationId: 'BMC',\n },\n ],\n },\n timeHints: {\n kind: 'start-only',\n startAt: '2026-01-01T07:10:00+08:00',\n },\n causes: ['track.fault'],\n },\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_W',\n },\n effect: {\n facility: null,\n service: {\n kind: 'delay',\n duration: null,\n },\n },\n statusSignal: 'open',\n scopes: {\n service: [\n {\n type: 'service.segment',\n fromStationId: 'BMC',\n toStationId: 'BBT',\n },\n ],\n },\n timeHints: {\n kind: 'start-only',\n startAt: '2026-01-01T07:10:00+08:00',\n },\n causes: ['track.fault'],\n },\n ],\n },\n },\n {\n input: {\n newEvidence: {\n ts: '2026-01-01T07:10:00+08:00',\n text: '[TGL] CLEARED: Fault has been cleared. Train service has resumed.',\n },\n repo,\n // This is used by vitest-evals as the test name, as the library expects `input` to be a string.\n toString() {\n return '[DISRUPTION] Issue resolved';\n },\n },\n expected: {\n claims: [\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_E',\n },\n effect: {\n service: null,\n facility: null,\n },\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n statusSignal: 'cleared',\n timeHints: {\n kind: 'end-only',\n endAt: '2026-01-01T07:10:00+08:00',\n },\n causes: null,\n },\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_W',\n },\n effect: {\n service: null,\n facility: null,\n },\n statusSignal: 'cleared',\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'end-only',\n endAt: '2026-01-01T07:10:00+08:00',\n },\n causes: null,\n },\n ],\n },\n },\n {\n input: {\n newEvidence: {\n ts: '2026-01-01T07:10:00+08:00',\n text: '[TGL] UPDATE: For alternative travel options, please refer to https://t.co/Le6ROZGqsm',\n },\n repo,\n // This is used by vitest-evals as the test name, as the library expects `input` to be a string.\n toString() {\n return '[DISRUPTION] Irrelevant update';\n },\n },\n expected: {\n claims: [],\n },\n },\n ] satisfies {\n input: ExtractClaimsFromNewEvidenceParams & { toString(): string };\n expected: ExtractClaimsFromNewEvidenceResult;\n }[];\n },\n async task(input) {\n const result = await extractClaimsFromNewEvidence(\n input as unknown as ExtractClaimsFromNewEvidenceParams,\n );\n return JSON.stringify(result);\n },\n scorers: [StructuredOutputScorer()],\n });\n describeEval('should compute the impact of new maintenance evidence', {\n // @ts-expect-error input is a string in the vitest-evals library\n async data() {\n const store = new FileStore(\n resolve(import.meta.dirname, '../../fixtures/data'),\n );\n const repo = new MRTDownRepository({ store });\n\n return [\n {\n input: {\n newEvidence: {\n ts: '2026-01-01T07:10:00+08:00',\n text: '[TGL] The Tengah Line will be closed for maintenance on Sat & Sun from 7 to 8 February 2026.',\n },\n repo,\n // This is used by vitest-evals as the test name, as the library expects `input` to be a string.\n toString() {\n return '[MAINTENANCE] New issue';\n },\n },\n expected: {\n claims: [\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_E',\n },\n effect: {\n service: { kind: 'no-service' },\n facility: null,\n },\n statusSignal: 'planned',\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'fixed',\n startAt: '2026-02-07T00:00:00+08:00',\n endAt: '2026-02-09T00:00:00+08:00',\n },\n causes: null,\n },\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_W',\n },\n effect: {\n service: { kind: 'no-service' },\n facility: null,\n },\n statusSignal: 'planned',\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'fixed',\n startAt: '2026-02-07T00:00:00+08:00',\n endAt: '2026-02-09T00:00:00+08:00',\n },\n causes: null,\n },\n ],\n },\n },\n {\n input: {\n newEvidence: {\n ts: '2026-01-01T07:10:00+08:00',\n text: 'To continue testing the integrated systems and trains in preparation for Stage 2 of #TGL, train services from Bukit Batok to Bukit Merah Central will start later at 6.30am and end at 9pm daily from 1 to 8 February 2026.',\n },\n repo,\n // This is used by vitest-evals as the test name, as the library expects `input` to be a string.\n toString() {\n return '[MAINTENANCE] Service hour adjustments';\n },\n },\n expected: {\n claims: [\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_E',\n },\n effect: {\n service: {\n kind: 'service-hours-adjustment',\n },\n facility: null,\n },\n statusSignal: 'planned',\n scopes: {\n service: [\n {\n type: 'service.segment',\n fromStationId: 'BBT',\n toStationId: 'BMC',\n },\n ],\n },\n timeHints: {\n kind: 'recurring',\n frequency: 'daily',\n startAt: '2026-02-01T21:00:00+08:00',\n endAt: '2026-02-08T21:00:00+08:00',\n daysOfWeek: null,\n timeZone: 'Asia/Singapore',\n timeWindow: {\n startAt: '21:00:00',\n endAt: '06:30:00',\n },\n excludedDates: null,\n },\n causes: ['system.upgrade'],\n },\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_W',\n },\n effect: {\n service: {\n kind: 'service-hours-adjustment',\n },\n facility: null,\n },\n statusSignal: 'planned',\n scopes: {\n service: [\n {\n type: 'service.segment',\n fromStationId: 'BMC',\n toStationId: 'BBT',\n },\n ],\n },\n timeHints: {\n kind: 'recurring',\n frequency: 'daily',\n startAt: '2026-02-01T21:00:00+08:00',\n endAt: '2026-02-08T21:00:00+08:00',\n daysOfWeek: null,\n timeZone: 'Asia/Singapore',\n timeWindow: {\n startAt: '21:00:00',\n endAt: '06:30:00',\n },\n excludedDates: null,\n },\n causes: ['system.upgrade'],\n },\n ],\n },\n },\n {\n input: {\n newEvidence: {\n ts: '2026-01-10T22:00:00+08:00',\n text: 'The Tengah & Seletar Lines train service will start at 10am on 18 Feb. For MRT Shuttle Bus pick-up points, visit http://t.co/fwb2wOqI',\n },\n repo,\n // This is used by vitest-evals as the test name, as the library expects `input` to be a string.\n toString() {\n return '[MAINTENANCE] Service hour adjustments';\n },\n },\n expected: {\n claims: [\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_E',\n },\n effect: {\n service: { kind: 'service-hours-adjustment' },\n facility: null,\n },\n statusSignal: 'planned',\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'fixed',\n startAt: '2026-02-18T00:00:00+08:00',\n endAt: '2026-02-18T10:00:00+08:00',\n },\n causes: null,\n },\n {\n entity: {\n type: 'service',\n serviceId: 'TGL_MAIN_W',\n },\n effect: {\n service: { kind: 'service-hours-adjustment' },\n facility: null,\n },\n statusSignal: 'planned',\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'fixed',\n startAt: '2026-02-18T00:00:00+08:00',\n endAt: '2026-02-18T10:00:00+08:00',\n },\n causes: null,\n },\n {\n entity: {\n type: 'service',\n serviceId: 'SLL_MAIN_N',\n },\n effect: {\n service: { kind: 'service-hours-adjustment' },\n facility: null,\n },\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'fixed',\n startAt: '2026-02-18T00:00:00+08:00',\n endAt: '2026-02-18T10:00:00+08:00',\n },\n statusSignal: 'planned',\n causes: null,\n },\n {\n entity: {\n type: 'service',\n serviceId: 'SLL_MAIN_S',\n },\n effect: {\n service: { kind: 'service-hours-adjustment' },\n facility: null,\n },\n scopes: {\n service: [{ type: 'service.whole' }],\n },\n timeHints: {\n kind: 'fixed',\n startAt: '2026-02-18T00:00:00+08:00',\n endAt: '2026-02-18T10:00:00+08:00',\n },\n statusSignal: 'planned',\n causes: null,\n },\n ],\n },\n },\n ] satisfies {\n input: ExtractClaimsFromNewEvidenceParams & { toString(): string };\n expected: ExtractClaimsFromNewEvidenceResult;\n }[];\n },\n async task(input) {\n const result = await extractClaimsFromNewEvidence(\n input as unknown as ExtractClaimsFromNewEvidenceParams,\n );\n return JSON.stringify(result);\n },\n scorers: [\n StructuredOutputScorer({\n match: 'fuzzy',\n fuzzyOptions: { ignoreArrayOrder: true },\n }),\n ],\n });\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { MRTDownRepository } from '
|
|
2
|
-
import { type Claim } from '
|
|
1
|
+
import type { MRTDownRepository } from '../../../repo/MRTDownRepository.js';
|
|
2
|
+
import { type Claim } from '../../../schema/issue/claim.js';
|
|
3
3
|
export interface ExtractClaimsFromNewEvidenceParams {
|
|
4
4
|
newEvidence: {
|
|
5
5
|
ts: string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { DateTime } from 'luxon';
|
|
2
2
|
import z from 'zod';
|
|
3
|
-
import { estimateOpenAICostFromUsage, normalizeOpenAIResponsesUsage, } from '
|
|
4
|
-
import { openAiClient } from '
|
|
5
|
-
import { ClaimSchema } from '
|
|
6
|
-
import { assert } from '
|
|
3
|
+
import { estimateOpenAICostFromUsage, normalizeOpenAIResponsesUsage, } from '../../../helpers/estimateOpenAICost.js';
|
|
4
|
+
import { openAiClient } from '../../client.js';
|
|
5
|
+
import { ClaimSchema } from '../../../schema/issue/claim.js';
|
|
6
|
+
import { assert } from '../../../util/assert.js';
|
|
7
7
|
import { buildSystemPrompt } from './prompt.js';
|
|
8
8
|
import { FindLinesTool } from './tools/FindLinesTool.js';
|
|
9
9
|
import { FindServicesTool } from './tools/FindServicesTool.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["llm/functions/extractClaimsFromNewEvidence/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { DateTime } from 'luxon';\nimport type {\n ParsedResponse,\n ResponseInputItem,\n} from 'openai/resources/responses/responses.js';\nimport z from 'zod';\nimport {\n estimateOpenAICostFromUsage,\n normalizeOpenAIResponsesUsage,\n} from '#helpers/estimateOpenAICost.js';\nimport { openAiClient } from '#llm/client.js';\nimport type { MRTDownRepository } from '#repo/MRTDownRepository.js';\nimport { type Claim, ClaimSchema } from '#schema/issue/claim.js';\nimport { assert } from '#util/assert.js';\nimport type { ToolRegistry } from '../../common/tool.js';\nimport { buildSystemPrompt } from './prompt.js';\nimport { FindLinesTool } from './tools/FindLinesTool.js';\nimport { FindServicesTool } from './tools/FindServicesTool.js';\nimport { FindStationsTool } from './tools/FindStationsTool.js';\n\nconst TOOL_CALL_LIMIT = 5;\n\nconst ResponseSchema = z.object({\n claims: z.array(ClaimSchema),\n});\n\nexport interface ExtractClaimsFromNewEvidenceParams {\n newEvidence: {\n ts: string;\n text: string;\n };\n repo: MRTDownRepository;\n}\n\nexport type ExtractClaimsFromNewEvidenceResult = {\n claims: Claim[];\n};\n\n/**\n * Extract claims from new evidence.\n * @param params\n * @returns\n */\nexport async function extractClaimsFromNewEvidence(\n params: ExtractClaimsFromNewEvidenceParams,\n): Promise<ExtractClaimsFromNewEvidenceResult> {\n const evidenceTs = DateTime.fromISO(params.newEvidence.ts);\n assert(evidenceTs.isValid, `Invalid date: ${params.newEvidence.ts}`);\n\n const findStationsTool = new FindStationsTool(evidenceTs, params.repo);\n const findServicesTool = new FindServicesTool(evidenceTs, params.repo);\n const findLinesTool = new FindLinesTool(params.repo);\n const toolRegistry: ToolRegistry = {\n [findStationsTool.name]: findStationsTool,\n [findServicesTool.name]: findServicesTool,\n [findLinesTool.name]: findLinesTool,\n };\n\n const context: ResponseInputItem[] = [\n {\n role: 'user',\n content: `\nEvidence: ${params.newEvidence.text}\n\nTimestamp: ${evidenceTs.toISO({ includeOffset: true })}\n`.trim(),\n },\n ];\n\n const systemPrompt = buildSystemPrompt();\n const model = 'gpt-5-mini';\n\n let toolCallCount = 0;\n\n let response: ParsedResponse<z.infer<typeof ResponseSchema>>;\n do {\n response = await openAiClient.responses.parse({\n model,\n instructions: systemPrompt,\n input: context,\n reasoning: {\n effort: 'medium',\n summary: 'concise',\n },\n text: {\n format: {\n type: 'json_schema',\n name: 'Response',\n strict: true,\n schema: z.toJSONSchema(ResponseSchema),\n },\n },\n tools: Object.values(toolRegistry).map((tool) => {\n return {\n type: 'function',\n name: tool.name,\n description: tool.description,\n parameters: tool.paramsSchema,\n strict: true,\n };\n }),\n\n // Don't persist conversation with OpenAI, but include reasoning content to\n // continue the thread with the same reasoning.\n store: false,\n include: ['reasoning.encrypted_content'],\n });\n\n for (const item of response.output) {\n switch (item.type) {\n case 'function_call': {\n /**\n * Prevent the `parsed_arguments` field from being included\n * https://github.com/openai/openai-python/issues/2374\n */\n context.push({\n type: 'function_call',\n id: item.id,\n call_id: item.call_id,\n name: item.name,\n arguments: item.arguments,\n });\n\n if (toolCallCount > TOOL_CALL_LIMIT) {\n context.push({\n type: 'function_call_output',\n call_id: item.call_id,\n output: 'Ran out of tool calls. Stop Calling.',\n });\n console.log(\n 'Forced short-circuit, returning error message in tool call result.',\n );\n }\n\n if (item.name in toolRegistry) {\n const tool = toolRegistry[item.name];\n\n let params: unknown;\n\n try {\n params = tool.parseParams(JSON.parse(item.arguments));\n } catch (e) {\n console.error(\n `[extractClaimsFromNewEvidence] Error parsing parameters for tool \"${item.name}\" with arguments \"${item.arguments}\":`,\n e,\n );\n context.push({\n type: 'function_call_output',\n call_id: item.call_id,\n output: `Invalid parameters for tool \"${item.name}\". Please try again.`,\n });\n continue;\n }\n\n // Call the tool's run function\n const result = await tool.runner(params);\n\n context.push({\n type: 'function_call_output',\n call_id: item.call_id,\n output: result,\n });\n }\n\n toolCallCount++;\n break;\n }\n default: {\n context.push(item);\n break;\n }\n }\n }\n\n const usage = normalizeOpenAIResponsesUsage(response.usage);\n const estimate = estimateOpenAICostFromUsage({ model, usage });\n if (usage != null) {\n console.log('[extractClaimsFromNewEvidence] Usage:', {\n inputTokens: usage.inputTokens,\n cachedInputTokens: usage.cachedInputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n });\n if (estimate != null) {\n console.log(\n '[extractClaimsFromNewEvidence] Estimated cost (USD):',\n estimate.estimatedCostUsd.toFixed(8),\n );\n } else {\n console.log(\n `[extractClaimsFromNewEvidence] No pricing configured for model \"${model}\".`,\n );\n }\n } else {\n console.log('[extractClaimsFromNewEvidence] Usage is unavailable');\n }\n } while (response.output.some((item) => item.type === 'function_call'));\n\n assert(response.output_parsed != null, 'Response output parsed is null');\n\n return response.output_parsed;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["llm/functions/extractClaimsFromNewEvidence/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { DateTime } from 'luxon';\nimport type {\n ParsedResponse,\n ResponseInputItem,\n} from 'openai/resources/responses/responses.js';\nimport z from 'zod';\nimport {\n estimateOpenAICostFromUsage,\n normalizeOpenAIResponsesUsage,\n} from '../../../helpers/estimateOpenAICost.js';\nimport { openAiClient } from '../../client.js';\nimport type { MRTDownRepository } from '../../../repo/MRTDownRepository.js';\nimport { type Claim, ClaimSchema } from '../../../schema/issue/claim.js';\nimport { assert } from '../../../util/assert.js';\nimport type { ToolRegistry } from '../../common/tool.js';\nimport { buildSystemPrompt } from './prompt.js';\nimport { FindLinesTool } from './tools/FindLinesTool.js';\nimport { FindServicesTool } from './tools/FindServicesTool.js';\nimport { FindStationsTool } from './tools/FindStationsTool.js';\n\nconst TOOL_CALL_LIMIT = 5;\n\nconst ResponseSchema = z.object({\n claims: z.array(ClaimSchema),\n});\n\nexport interface ExtractClaimsFromNewEvidenceParams {\n newEvidence: {\n ts: string;\n text: string;\n };\n repo: MRTDownRepository;\n}\n\nexport type ExtractClaimsFromNewEvidenceResult = {\n claims: Claim[];\n};\n\n/**\n * Extract claims from new evidence.\n * @param params\n * @returns\n */\nexport async function extractClaimsFromNewEvidence(\n params: ExtractClaimsFromNewEvidenceParams,\n): Promise<ExtractClaimsFromNewEvidenceResult> {\n const evidenceTs = DateTime.fromISO(params.newEvidence.ts);\n assert(evidenceTs.isValid, `Invalid date: ${params.newEvidence.ts}`);\n\n const findStationsTool = new FindStationsTool(evidenceTs, params.repo);\n const findServicesTool = new FindServicesTool(evidenceTs, params.repo);\n const findLinesTool = new FindLinesTool(params.repo);\n const toolRegistry: ToolRegistry = {\n [findStationsTool.name]: findStationsTool,\n [findServicesTool.name]: findServicesTool,\n [findLinesTool.name]: findLinesTool,\n };\n\n const context: ResponseInputItem[] = [\n {\n role: 'user',\n content: `\nEvidence: ${params.newEvidence.text}\n\nTimestamp: ${evidenceTs.toISO({ includeOffset: true })}\n`.trim(),\n },\n ];\n\n const systemPrompt = buildSystemPrompt();\n const model = 'gpt-5-mini';\n\n let toolCallCount = 0;\n\n let response: ParsedResponse<z.infer<typeof ResponseSchema>>;\n do {\n response = await openAiClient.responses.parse({\n model,\n instructions: systemPrompt,\n input: context,\n reasoning: {\n effort: 'medium',\n summary: 'concise',\n },\n text: {\n format: {\n type: 'json_schema',\n name: 'Response',\n strict: true,\n schema: z.toJSONSchema(ResponseSchema),\n },\n },\n tools: Object.values(toolRegistry).map((tool) => {\n return {\n type: 'function',\n name: tool.name,\n description: tool.description,\n parameters: tool.paramsSchema,\n strict: true,\n };\n }),\n\n // Don't persist conversation with OpenAI, but include reasoning content to\n // continue the thread with the same reasoning.\n store: false,\n include: ['reasoning.encrypted_content'],\n });\n\n for (const item of response.output) {\n switch (item.type) {\n case 'function_call': {\n /**\n * Prevent the `parsed_arguments` field from being included\n * https://github.com/openai/openai-python/issues/2374\n */\n context.push({\n type: 'function_call',\n id: item.id,\n call_id: item.call_id,\n name: item.name,\n arguments: item.arguments,\n });\n\n if (toolCallCount > TOOL_CALL_LIMIT) {\n context.push({\n type: 'function_call_output',\n call_id: item.call_id,\n output: 'Ran out of tool calls. Stop Calling.',\n });\n console.log(\n 'Forced short-circuit, returning error message in tool call result.',\n );\n }\n\n if (item.name in toolRegistry) {\n const tool = toolRegistry[item.name];\n\n let params: unknown;\n\n try {\n params = tool.parseParams(JSON.parse(item.arguments));\n } catch (e) {\n console.error(\n `[extractClaimsFromNewEvidence] Error parsing parameters for tool \"${item.name}\" with arguments \"${item.arguments}\":`,\n e,\n );\n context.push({\n type: 'function_call_output',\n call_id: item.call_id,\n output: `Invalid parameters for tool \"${item.name}\". Please try again.`,\n });\n continue;\n }\n\n // Call the tool's run function\n const result = await tool.runner(params);\n\n context.push({\n type: 'function_call_output',\n call_id: item.call_id,\n output: result,\n });\n }\n\n toolCallCount++;\n break;\n }\n default: {\n context.push(item);\n break;\n }\n }\n }\n\n const usage = normalizeOpenAIResponsesUsage(response.usage);\n const estimate = estimateOpenAICostFromUsage({ model, usage });\n if (usage != null) {\n console.log('[extractClaimsFromNewEvidence] Usage:', {\n inputTokens: usage.inputTokens,\n cachedInputTokens: usage.cachedInputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n });\n if (estimate != null) {\n console.log(\n '[extractClaimsFromNewEvidence] Estimated cost (USD):',\n estimate.estimatedCostUsd.toFixed(8),\n );\n } else {\n console.log(\n `[extractClaimsFromNewEvidence] No pricing configured for model \"${model}\".`,\n );\n }\n } else {\n console.log('[extractClaimsFromNewEvidence] Usage is unavailable');\n }\n } while (response.output.some((item) => item.type === 'function_call'));\n\n assert(response.output_parsed != null, 'Response output parsed is null');\n\n return response.output_parsed;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import z from 'zod';
|
|
2
|
-
import type { MRTDownRepository } from '
|
|
2
|
+
import type { MRTDownRepository } from '../../../../repo/MRTDownRepository.js';
|
|
3
3
|
import { Tool } from '../../../common/tool.js';
|
|
4
4
|
declare const FindLinesToolParametersSchema: z.ZodObject<{
|
|
5
5
|
lineNames: z.ZodArray<z.ZodString>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FindLinesTool.js","sourceRoot":"/","sources":["llm/functions/extractClaimsFromNewEvidence/tools/FindLinesTool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE/C,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC/B,CAAC,CAAC;AAGH,MAAM,OAAO,aAAc,SAAQ,IAA6B;IACvD,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,oBAAoB,CAAC;IACzB,IAAI,CAAoB;IAEzC,YAAY,IAAuB;QACjC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,CAAC,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAC;IACvD,CAAC;IAEM,WAAW,CAAC,MAAe;QAChC,OAAO,6BAA6B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,MAA+B;QACjD,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,MAAM,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE7D,MAAM,KAAK,GAAU;YACnB,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,WAAW;4BACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;yBAC/C;wBACD;4BACE,IAAI,EAAE,WAAW;4BACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;yBACjD;qBACF;iBACF;aACF;SACF,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,WAAW;wBACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;qBAC7C;oBACD;wBACE,IAAI,EAAE,WAAW;wBACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;qBACxD;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE;YAC/B,UAAU,EAAE,CAAC,aAAa,EAAE,CAAC;SAC9B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;QAEvD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF","sourcesContent":["import type { Table } from 'mdast';\nimport { gfmToMarkdown } from 'mdast-util-gfm';\nimport { toMarkdown } from 'mdast-util-to-markdown';\nimport z from 'zod';\nimport type { MRTDownRepository } from '
|
|
1
|
+
{"version":3,"file":"FindLinesTool.js","sourceRoot":"/","sources":["llm/functions/extractClaimsFromNewEvidence/tools/FindLinesTool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE/C,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC/B,CAAC,CAAC;AAGH,MAAM,OAAO,aAAc,SAAQ,IAA6B;IACvD,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,oBAAoB,CAAC;IACzB,IAAI,CAAoB;IAEzC,YAAY,IAAuB;QACjC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,CAAC,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAC;IACvD,CAAC;IAEM,WAAW,CAAC,MAAe;QAChC,OAAO,6BAA6B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,MAA+B;QACjD,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,MAAM,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE7D,MAAM,KAAK,GAAU;YACnB,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,WAAW;4BACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;yBAC/C;wBACD;4BACE,IAAI,EAAE,WAAW;4BACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;yBACjD;qBACF;iBACF;aACF;SACF,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,WAAW;wBACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;qBAC7C;oBACD;wBACE,IAAI,EAAE,WAAW;wBACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;qBACxD;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE;YAC/B,UAAU,EAAE,CAAC,aAAa,EAAE,CAAC;SAC9B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;QAEvD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF","sourcesContent":["import type { Table } from 'mdast';\nimport { gfmToMarkdown } from 'mdast-util-gfm';\nimport { toMarkdown } from 'mdast-util-to-markdown';\nimport z from 'zod';\nimport type { MRTDownRepository } from '../../../../repo/MRTDownRepository.js';\nimport { Tool } from '../../../common/tool.js';\n\nconst FindLinesToolParametersSchema = z.object({\n lineNames: z.array(z.string()),\n});\ntype FindLinesToolParameters = z.infer<typeof FindLinesToolParametersSchema>;\n\nexport class FindLinesTool extends Tool<FindLinesToolParameters> {\n public name = 'findLines';\n public description = 'Find lines by name';\n private readonly repo: MRTDownRepository;\n\n constructor(repo: MRTDownRepository) {\n super();\n this.repo = repo;\n }\n\n public get paramsSchema(): { [key: string]: unknown } {\n return z.toJSONSchema(FindLinesToolParametersSchema);\n }\n\n public parseParams(params: unknown): FindLinesToolParameters {\n return FindLinesToolParametersSchema.parse(params);\n }\n\n public async runner(params: FindLinesToolParameters): Promise<string> {\n console.log('[findLines] Calling tool with parameters:', params);\n\n const lines = this.repo.lines.searchByName(params.lineNames);\n\n const table: Table = {\n type: 'table',\n children: [\n {\n type: 'tableRow',\n children: [\n {\n type: 'tableCell',\n children: [{ type: 'text', value: 'Line ID' }],\n },\n {\n type: 'tableCell',\n children: [{ type: 'text', value: 'Line Name' }],\n },\n ],\n },\n ],\n };\n\n for (const line of lines) {\n table.children.push({\n type: 'tableRow',\n children: [\n {\n type: 'tableCell',\n children: [{ type: 'text', value: line.id }],\n },\n {\n type: 'tableCell',\n children: [{ type: 'text', value: line.name['en-SG'] }],\n },\n ],\n });\n }\n\n const output = toMarkdown(table, {\n extensions: [gfmToMarkdown()],\n });\n console.log(`[findLines] Response output:\\n${output}`);\n\n return output;\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DateTime } from 'luxon';
|
|
2
2
|
import z from 'zod';
|
|
3
|
-
import type { MRTDownRepository } from '
|
|
3
|
+
import type { MRTDownRepository } from '../../../../repo/MRTDownRepository.js';
|
|
4
4
|
import { Tool } from '../../../common/tool.js';
|
|
5
5
|
declare const FindServicesToolParametersSchema: z.ZodObject<{
|
|
6
6
|
lineId: z.ZodString;
|
|
@@ -2,7 +2,7 @@ import { DateTime } from 'luxon';
|
|
|
2
2
|
import { gfmToMarkdown } from 'mdast-util-gfm';
|
|
3
3
|
import { toMarkdown } from 'mdast-util-to-markdown';
|
|
4
4
|
import z from 'zod';
|
|
5
|
-
import { assert } from '
|
|
5
|
+
import { assert } from '../../../../util/assert.js';
|
|
6
6
|
import { Tool } from '../../../common/tool.js';
|
|
7
7
|
const FindServicesToolParametersSchema = z.object({
|
|
8
8
|
lineId: z.string(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FindServicesTool.js","sourceRoot":"/","sources":["llm/functions/extractClaimsFromNewEvidence/tools/FindServicesTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"FindServicesTool.js","sourceRoot":"/","sources":["llm/functions/extractClaimsFromNewEvidence/tools/FindServicesTool.ts"],"names":[],"mappings":"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","sourcesContent":["import { DateTime } from 'luxon';\nimport type { Table } from 'mdast';\nimport { gfmToMarkdown } from 'mdast-util-gfm';\nimport { toMarkdown } from 'mdast-util-to-markdown';\nimport z from 'zod';\nimport type { MRTDownRepository } from '../../../../repo/MRTDownRepository.js';\nimport { assert } from '../../../../util/assert.js';\nimport { Tool } from '../../../common/tool.js';\n\nconst FindServicesToolParametersSchema = z.object({\n lineId: z.string(),\n});\ntype FindServicesToolParameters = z.infer<\n typeof FindServicesToolParametersSchema\n>;\n\nexport class FindServicesTool extends Tool<FindServicesToolParameters> {\n public name = 'findServices';\n public description = 'Find services by name';\n private readonly evidenceTs: DateTime;\n private readonly repo: MRTDownRepository;\n\n constructor(evidenceTs: DateTime, repo: MRTDownRepository) {\n super();\n this.evidenceTs = evidenceTs;\n this.repo = repo;\n }\n\n public get paramsSchema(): { [key: string]: unknown } {\n return z.toJSONSchema(FindServicesToolParametersSchema);\n }\n\n public parseParams(params: unknown): FindServicesToolParameters {\n return FindServicesToolParametersSchema.parse(params);\n }\n\n public async runner(params: FindServicesToolParameters): Promise<string> {\n console.log('[findServices] Calling tool with parameters:', params);\n\n const services = this.repo.services.searchByLineId(params.lineId);\n\n const table: Table = {\n type: 'table',\n children: [\n {\n type: 'tableRow',\n children: [\n {\n type: 'tableCell',\n children: [{ type: 'text', value: 'Service ID' }],\n },\n {\n type: 'tableCell',\n children: [{ type: 'text', value: 'Service Name' }],\n },\n {\n type: 'tableCell',\n children: [{ type: 'text', value: 'Line ID' }],\n },\n {\n type: 'tableCell',\n children: [{ type: 'text', value: 'Station IDs' }],\n },\n {\n type: 'tableCell',\n children: [{ type: 'text', value: 'Operating Hours' }],\n },\n ],\n },\n ],\n };\n\n for (const service of services) {\n const relevantRevision = service.revisions.findLast((revision) => {\n const startAt = DateTime.fromISO(revision.startAt);\n assert(startAt.isValid, `Invalid date: ${revision.startAt}`);\n\n if (revision.endAt == null) {\n return startAt <= this.evidenceTs;\n }\n\n const endAt = DateTime.fromISO(revision.endAt);\n assert(endAt.isValid, `Invalid date: ${revision.endAt}`);\n\n return startAt <= this.evidenceTs && endAt > this.evidenceTs;\n });\n\n if (relevantRevision == null) continue;\n\n table.children.push({\n type: 'tableRow',\n children: [\n {\n type: 'tableCell',\n children: [{ type: 'text', value: service.id }],\n },\n {\n type: 'tableCell',\n children: [{ type: 'text', value: service.name['en-SG'] }],\n },\n {\n type: 'tableCell',\n children: [{ type: 'text', value: service.lineId }],\n },\n {\n type: 'tableCell',\n children: [\n {\n type: 'text',\n value: `${relevantRevision.path.stations.length} (${relevantRevision.path.stations.map((station) => station.stationId).join('→')})`,\n },\n ],\n },\n {\n type: 'tableCell',\n children: [\n {\n type: 'text',\n value: `Weekdays: ${relevantRevision.operatingHours.weekdays.start}-${relevantRevision.operatingHours.weekdays.end} | Weekends: ${relevantRevision.operatingHours.weekends.start}-${relevantRevision.operatingHours.weekends.end}`,\n },\n ],\n },\n ],\n });\n }\n\n const output = toMarkdown(table, {\n extensions: [gfmToMarkdown()],\n });\n console.log(`[findServices] Response output:\\n${output}`);\n\n return output;\n }\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DateTime } from 'luxon';
|
|
2
2
|
import z from 'zod';
|
|
3
|
-
import { Tool } from '
|
|
4
|
-
import type { MRTDownRepository } from '
|
|
3
|
+
import { Tool } from '../../../common/tool.js';
|
|
4
|
+
import type { MRTDownRepository } from '../../../../repo/MRTDownRepository.js';
|
|
5
5
|
declare const FindStationsToolParametersSchema: z.ZodObject<{
|
|
6
6
|
stationNames: z.ZodArray<z.ZodString>;
|
|
7
7
|
}, z.z.core.$strip>;
|
|
@@ -2,8 +2,8 @@ import { DateTime } from 'luxon';
|
|
|
2
2
|
import { gfmToMarkdown } from 'mdast-util-gfm';
|
|
3
3
|
import { toMarkdown } from 'mdast-util-to-markdown';
|
|
4
4
|
import z from 'zod';
|
|
5
|
-
import { Tool } from '
|
|
6
|
-
import { assert } from '
|
|
5
|
+
import { Tool } from '../../../common/tool.js';
|
|
6
|
+
import { assert } from '../../../../util/assert.js';
|
|
7
7
|
const FindStationsToolParametersSchema = z.object({
|
|
8
8
|
stationNames: z.array(z.string()),
|
|
9
9
|
});
|