@sharpee/text-service 0.9.60-beta
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/LICENSE +21 -0
- package/dist/cli-renderer.d.ts +43 -0
- package/dist/cli-renderer.d.ts.map +1 -0
- package/dist/cli-renderer.js +208 -0
- package/dist/cli-renderer.js.map +1 -0
- package/dist/decoration-parser.d.ts +31 -0
- package/dist/decoration-parser.d.ts.map +1 -0
- package/dist/decoration-parser.js +176 -0
- package/dist/decoration-parser.js.map +1 -0
- package/dist/handlers/action.d.ts +19 -0
- package/dist/handlers/action.d.ts.map +1 -0
- package/dist/handlers/action.js +68 -0
- package/dist/handlers/action.js.map +1 -0
- package/dist/handlers/game.d.ts +29 -0
- package/dist/handlers/game.d.ts.map +1 -0
- package/dist/handlers/game.js +56 -0
- package/dist/handlers/game.js.map +1 -0
- package/dist/handlers/generic.d.ts +23 -0
- package/dist/handlers/generic.d.ts.map +1 -0
- package/dist/handlers/generic.js +70 -0
- package/dist/handlers/generic.js.map +1 -0
- package/dist/handlers/index.d.ts +12 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +22 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/revealed.d.ts +16 -0
- package/dist/handlers/revealed.d.ts.map +1 -0
- package/dist/handlers/revealed.js +50 -0
- package/dist/handlers/revealed.js.map +1 -0
- package/dist/handlers/room.d.ts +22 -0
- package/dist/handlers/room.d.ts.map +1 -0
- package/dist/handlers/room.js +70 -0
- package/dist/handlers/room.js.map +1 -0
- package/dist/handlers/types.d.ts +40 -0
- package/dist/handlers/types.d.ts.map +1 -0
- package/dist/handlers/types.js +8 -0
- package/dist/handlers/types.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/stages/assemble.d.ts +18 -0
- package/dist/stages/assemble.d.ts.map +1 -0
- package/dist/stages/assemble.js +38 -0
- package/dist/stages/assemble.js.map +1 -0
- package/dist/stages/filter.d.ts +14 -0
- package/dist/stages/filter.d.ts.map +1 -0
- package/dist/stages/filter.js +28 -0
- package/dist/stages/filter.js.map +1 -0
- package/dist/stages/index.d.ts +9 -0
- package/dist/stages/index.d.ts.map +1 -0
- package/dist/stages/index.js +17 -0
- package/dist/stages/index.js.map +1 -0
- package/dist/stages/sort.d.ts +36 -0
- package/dist/stages/sort.d.ts.map +1 -0
- package/dist/stages/sort.js +84 -0
- package/dist/stages/sort.js.map +1 -0
- package/dist/text-service.d.ts +85 -0
- package/dist/text-service.d.ts.map +1 -0
- package/dist/text-service.js +233 -0
- package/dist/text-service.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Game Event Handler
|
|
4
|
+
*
|
|
5
|
+
* Handles game lifecycle events like game.started to produce
|
|
6
|
+
* text output (e.g., opening banner).
|
|
7
|
+
*
|
|
8
|
+
* @see ADR-096 Text Service Architecture
|
|
9
|
+
* @see ADR-097 IGameEvent Deprecation (now uses ISemanticEvent with typed data)
|
|
10
|
+
* @see ISSUE-028 Opening banner hardcoded in browser-entry.ts
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.handleGameStarted = handleGameStarted;
|
|
14
|
+
const assemble_js_1 = require("../stages/assemble.js");
|
|
15
|
+
/**
|
|
16
|
+
* Handle game.started event to produce the opening banner.
|
|
17
|
+
*
|
|
18
|
+
* The event data (GameStartedData) contains:
|
|
19
|
+
* - story.title: Game title
|
|
20
|
+
* - story.author: Author name(s)
|
|
21
|
+
* - story.version: Game version
|
|
22
|
+
* - story.id: Story identifier
|
|
23
|
+
* - gameState: 'running'
|
|
24
|
+
* - session: { startTime, turns, moves }
|
|
25
|
+
*
|
|
26
|
+
* The language provider supplies the banner template via 'game.started.banner'.
|
|
27
|
+
* Stories can customize by overriding this message in extendLanguage().
|
|
28
|
+
*/
|
|
29
|
+
function handleGameStarted(event, context) {
|
|
30
|
+
// Event data is now directly in `data` field (ISemanticEvent standard)
|
|
31
|
+
const data = event.data;
|
|
32
|
+
const story = data?.story;
|
|
33
|
+
if (!story) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
// Build params for template substitution
|
|
37
|
+
// engineVersion and clientVersion come from event data (set by engine from world's versionInfo)
|
|
38
|
+
const engineVersion = data?.engineVersion || 'unknown';
|
|
39
|
+
const clientVersion = data?.clientVersion || 'N/A';
|
|
40
|
+
const params = {
|
|
41
|
+
title: story.title || 'Unknown',
|
|
42
|
+
author: story.author || 'Unknown',
|
|
43
|
+
version: story.version || '1.0.0',
|
|
44
|
+
id: story.id || 'unknown',
|
|
45
|
+
engineVersion: engineVersion,
|
|
46
|
+
clientVersion: clientVersion,
|
|
47
|
+
};
|
|
48
|
+
// Look up banner message via language provider
|
|
49
|
+
const message = context.languageProvider?.getMessage('game.started.banner', params);
|
|
50
|
+
// If no template registered or returned the ID (not found), skip output
|
|
51
|
+
if (!message || message === 'game.started.banner') {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
return [(0, assemble_js_1.createBlock)('game.banner', message)];
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=game.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game.js","sourceRoot":"","sources":["../../src/handlers/game.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAqBH,8CAmCC;AApDD,uDAAoD;AAGpD;;;;;;;;;;;;;GAaG;AACH,SAAgB,iBAAiB,CAC/B,KAAqB,EACrB,OAAuB;IAEvB,uEAAuE;IACvE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAgC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC;IAE1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,yCAAyC;IACzC,gGAAgG;IAChG,MAAM,aAAa,GAAG,IAAI,EAAE,aAAa,IAAI,SAAS,CAAC;IACvD,MAAM,aAAa,GAAG,IAAI,EAAE,aAAa,IAAI,KAAK,CAAC;IAEnD,MAAM,MAAM,GAA2B;QACrC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,SAAS;QAC/B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,SAAS;QACjC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO;QACjC,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,SAAS;QACzB,aAAa,EAAE,aAAa;QAC5B,aAAa,EAAE,aAAa;KAC7B,CAAC;IAEF,+CAA+C;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,EAAE,UAAU,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAEpF,wEAAwE;IACxE,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,CAAC,IAAA,yBAAW,EAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic event handlers
|
|
3
|
+
*
|
|
4
|
+
* Handles: game.message, and fallback for unknown events
|
|
5
|
+
*
|
|
6
|
+
* @see ADR-096 Text Service Architecture
|
|
7
|
+
*/
|
|
8
|
+
import type { ITextBlock } from '@sharpee/text-blocks';
|
|
9
|
+
import type { ISemanticEvent } from '@sharpee/core';
|
|
10
|
+
import type { HandlerContext } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Handle game.message events
|
|
13
|
+
*/
|
|
14
|
+
export declare function handleGameMessage(event: ISemanticEvent, context: HandlerContext): ITextBlock[];
|
|
15
|
+
/**
|
|
16
|
+
* Handle generic/unknown events using event.type as template key
|
|
17
|
+
*
|
|
18
|
+
* Many events (especially story-defined ones) follow a simple pattern:
|
|
19
|
+
* - Event type is the template key
|
|
20
|
+
* - Event data is the template params
|
|
21
|
+
*/
|
|
22
|
+
export declare function handleGenericEvent(event: ISemanticEvent, context: HandlerContext): ITextBlock[];
|
|
23
|
+
//# sourceMappingURL=generic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../src/handlers/generic.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAC;AAanE;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,cAAc,GACtB,UAAU,EAAE,CAiBd;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,cAAc,GACtB,UAAU,EAAE,CAoCd"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Generic event handlers
|
|
4
|
+
*
|
|
5
|
+
* Handles: game.message, and fallback for unknown events
|
|
6
|
+
*
|
|
7
|
+
* @see ADR-096 Text Service Architecture
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.handleGameMessage = handleGameMessage;
|
|
11
|
+
exports.handleGenericEvent = handleGenericEvent;
|
|
12
|
+
const text_blocks_1 = require("@sharpee/text-blocks");
|
|
13
|
+
const assemble_js_1 = require("../stages/assemble.js");
|
|
14
|
+
/**
|
|
15
|
+
* Handle game.message events
|
|
16
|
+
*/
|
|
17
|
+
function handleGameMessage(event, context) {
|
|
18
|
+
const data = event.data;
|
|
19
|
+
// Try language provider
|
|
20
|
+
if (data.messageId && context.languageProvider) {
|
|
21
|
+
const message = context.languageProvider.getMessage(data.messageId, data.params);
|
|
22
|
+
if (message && message !== data.messageId) {
|
|
23
|
+
return [(0, assemble_js_1.createBlock)(text_blocks_1.BLOCK_KEYS.GAME_MESSAGE, message)];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const text = data.text ?? data.message;
|
|
27
|
+
if (text) {
|
|
28
|
+
return [(0, assemble_js_1.createBlock)(text_blocks_1.BLOCK_KEYS.GAME_MESSAGE, text)];
|
|
29
|
+
}
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Handle generic/unknown events using event.type as template key
|
|
34
|
+
*
|
|
35
|
+
* Many events (especially story-defined ones) follow a simple pattern:
|
|
36
|
+
* - Event type is the template key
|
|
37
|
+
* - Event data is the template params
|
|
38
|
+
*/
|
|
39
|
+
function handleGenericEvent(event, context) {
|
|
40
|
+
const data = event.data;
|
|
41
|
+
// Guard against undefined data
|
|
42
|
+
if (!data) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
// First check for explicit message/text in event data
|
|
46
|
+
if (data.message || data.text) {
|
|
47
|
+
const text = data.message ?? data.text ?? '';
|
|
48
|
+
if (text) {
|
|
49
|
+
return [(0, assemble_js_1.createBlock)(text_blocks_1.BLOCK_KEYS.ACTION_RESULT, text)];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Try language provider with event type as template key
|
|
53
|
+
if (context.languageProvider) {
|
|
54
|
+
const message = context.languageProvider.getMessage(event.type, data);
|
|
55
|
+
// If we got a real message (not just the key echoed back)
|
|
56
|
+
if (message && message !== event.type) {
|
|
57
|
+
return [(0, assemble_js_1.createBlock)(text_blocks_1.BLOCK_KEYS.ACTION_RESULT, message)];
|
|
58
|
+
}
|
|
59
|
+
// Try with explicit messageId if present
|
|
60
|
+
if (data.messageId) {
|
|
61
|
+
const msgFromId = context.languageProvider.getMessage(data.messageId, data);
|
|
62
|
+
if (msgFromId && msgFromId !== data.messageId) {
|
|
63
|
+
return [(0, assemble_js_1.createBlock)(text_blocks_1.BLOCK_KEYS.ACTION_RESULT, msgFromId)];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// No template found - skip this event (it's probably a state change)
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=generic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic.js","sourceRoot":"","sources":["../../src/handlers/generic.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAqBH,8CAoBC;AASD,gDAuCC;AAtFD,sDAAkD;AAGlD,uDAAoD;AAYpD;;GAEG;AACH,SAAgB,iBAAiB,CAC/B,KAAqB,EACrB,OAAuB;IAEvB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuB,CAAC;IAE3C,wBAAwB;IACxB,IAAI,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACjF,IAAI,OAAO,IAAI,OAAO,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAA,yBAAW,EAAC,wBAAU,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC;IACvC,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,IAAA,yBAAW,EAAC,wBAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAChC,KAAqB,EACrB,OAAuB;IAEvB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAwB,CAAC;IAE5C,+BAA+B;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,sDAAsD;IACtD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7C,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAA,yBAAW,EAAC,wBAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEtE,0DAA0D;QAC1D,IAAI,OAAO,IAAI,OAAO,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YACtC,OAAO,CAAC,IAAA,yBAAW,EAAC,wBAAU,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,yCAAyC;QACzC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC5E,IAAI,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC9C,OAAO,CAAC,IAAA,yBAAW,EAAC,wBAAU,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event handlers for TextService
|
|
3
|
+
*
|
|
4
|
+
* @see ADR-096 Text Service Architecture
|
|
5
|
+
*/
|
|
6
|
+
export type { EventHandler, HandlerContext, ChainableEventData, GenericEventData } from './types.js';
|
|
7
|
+
export { handleRoomDescription } from './room.js';
|
|
8
|
+
export { handleActionSuccess, handleActionFailure } from './action.js';
|
|
9
|
+
export { handleRevealed } from './revealed.js';
|
|
10
|
+
export { handleGameMessage, handleGenericEvent } from './generic.js';
|
|
11
|
+
export { handleGameStarted } from './game.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGrG,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Event handlers for TextService
|
|
4
|
+
*
|
|
5
|
+
* @see ADR-096 Text Service Architecture
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.handleGameStarted = exports.handleGenericEvent = exports.handleGameMessage = exports.handleRevealed = exports.handleActionFailure = exports.handleActionSuccess = exports.handleRoomDescription = void 0;
|
|
9
|
+
// Handlers
|
|
10
|
+
var room_js_1 = require("./room.js");
|
|
11
|
+
Object.defineProperty(exports, "handleRoomDescription", { enumerable: true, get: function () { return room_js_1.handleRoomDescription; } });
|
|
12
|
+
var action_js_1 = require("./action.js");
|
|
13
|
+
Object.defineProperty(exports, "handleActionSuccess", { enumerable: true, get: function () { return action_js_1.handleActionSuccess; } });
|
|
14
|
+
Object.defineProperty(exports, "handleActionFailure", { enumerable: true, get: function () { return action_js_1.handleActionFailure; } });
|
|
15
|
+
var revealed_js_1 = require("./revealed.js");
|
|
16
|
+
Object.defineProperty(exports, "handleRevealed", { enumerable: true, get: function () { return revealed_js_1.handleRevealed; } });
|
|
17
|
+
var generic_js_1 = require("./generic.js");
|
|
18
|
+
Object.defineProperty(exports, "handleGameMessage", { enumerable: true, get: function () { return generic_js_1.handleGameMessage; } });
|
|
19
|
+
Object.defineProperty(exports, "handleGenericEvent", { enumerable: true, get: function () { return generic_js_1.handleGenericEvent; } });
|
|
20
|
+
var game_js_1 = require("./game.js");
|
|
21
|
+
Object.defineProperty(exports, "handleGameStarted", { enumerable: true, get: function () { return game_js_1.handleGameStarted; } });
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAKH,WAAW;AACX,qCAAkD;AAAzC,gHAAA,qBAAqB,OAAA;AAC9B,yCAAuE;AAA9D,gHAAA,mBAAmB,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AACjD,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AACvB,2CAAqE;AAA5D,+GAAA,iBAAiB,OAAA;AAAE,gHAAA,kBAAkB,OAAA;AAC9C,qCAA8C;AAArC,4GAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Revealed event handler
|
|
3
|
+
*
|
|
4
|
+
* Handles: if.event.revealed - when items become visible in a container
|
|
5
|
+
*
|
|
6
|
+
* @see ADR-094 Event Chaining
|
|
7
|
+
* @see ADR-096 Text Service Architecture
|
|
8
|
+
*/
|
|
9
|
+
import type { ITextBlock } from '@sharpee/text-blocks';
|
|
10
|
+
import type { ISemanticEvent } from '@sharpee/core';
|
|
11
|
+
import type { HandlerContext } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Handle if.event.revealed events
|
|
14
|
+
*/
|
|
15
|
+
export declare function handleRevealed(event: ISemanticEvent, context: HandlerContext): ITextBlock[];
|
|
16
|
+
//# sourceMappingURL=revealed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revealed.d.ts","sourceRoot":"","sources":["../../src/handlers/revealed.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,YAAY,CAAC;AAkBrE;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,cAAc,GACtB,UAAU,EAAE,CAsCd"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Revealed event handler
|
|
4
|
+
*
|
|
5
|
+
* Handles: if.event.revealed - when items become visible in a container
|
|
6
|
+
*
|
|
7
|
+
* @see ADR-094 Event Chaining
|
|
8
|
+
* @see ADR-096 Text Service Architecture
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.handleRevealed = handleRevealed;
|
|
12
|
+
const text_blocks_1 = require("@sharpee/text-blocks");
|
|
13
|
+
const assemble_js_1 = require("../stages/assemble.js");
|
|
14
|
+
/**
|
|
15
|
+
* Handle if.event.revealed events
|
|
16
|
+
*/
|
|
17
|
+
function handleRevealed(event, context) {
|
|
18
|
+
const data = event.data;
|
|
19
|
+
// Check for direct message first (simple case)
|
|
20
|
+
if (data.message || data.text) {
|
|
21
|
+
const text = data.message ?? data.text ?? '';
|
|
22
|
+
if (text) {
|
|
23
|
+
return [(0, assemble_js_1.createBlock)(text_blocks_1.BLOCK_KEYS.ACTION_RESULT, text)];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Try language provider with event type as template key
|
|
27
|
+
if (context.languageProvider) {
|
|
28
|
+
const message = context.languageProvider.getMessage(event.type, {
|
|
29
|
+
containerId: data.containerId,
|
|
30
|
+
containerName: data.containerName,
|
|
31
|
+
container: data.containerName,
|
|
32
|
+
items: data.items,
|
|
33
|
+
});
|
|
34
|
+
// If we got a real message (not just the key echoed back)
|
|
35
|
+
if (message && message !== event.type) {
|
|
36
|
+
return [(0, assemble_js_1.createBlock)(text_blocks_1.BLOCK_KEYS.ACTION_RESULT, message)];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Fallback: Build a basic revealed message
|
|
40
|
+
if (data.items && data.items.length > 0) {
|
|
41
|
+
const itemNames = data.items
|
|
42
|
+
.map((item) => item.name ?? item.messageId ?? item.entityId)
|
|
43
|
+
.join(', ');
|
|
44
|
+
const container = data.containerName ?? 'it';
|
|
45
|
+
const text = `Inside the ${container} you see ${itemNames}.`;
|
|
46
|
+
return [(0, assemble_js_1.createBlock)(text_blocks_1.BLOCK_KEYS.ACTION_RESULT, text)];
|
|
47
|
+
}
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=revealed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revealed.js","sourceRoot":"","sources":["../../src/handlers/revealed.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AA0BH,wCAyCC;AAhED,sDAAkD;AAGlD,uDAAoD;AAiBpD;;GAEG;AACH,SAAgB,cAAc,CAC5B,KAAqB,EACrB,OAAuB;IAEvB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAyB,CAAC;IAE7C,+CAA+C;IAC/C,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7C,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAA,yBAAW,EAAC,wBAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE;YAC9D,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,SAAS,EAAE,IAAI,CAAC,aAAa;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QAEH,0DAA0D;QAC1D,IAAI,OAAO,IAAI,OAAO,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YACtC,OAAO,CAAC,IAAA,yBAAW,EAAC,wBAAU,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK;aACzB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC;aAC3D,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;QAC7C,MAAM,IAAI,GAAG,cAAc,SAAS,YAAY,SAAS,GAAG,CAAC;QAC7D,OAAO,CAAC,IAAA,yBAAW,EAAC,wBAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Room description event handler
|
|
3
|
+
*
|
|
4
|
+
* Handles: if.event.room.description (standard format)
|
|
5
|
+
* Also handles: if.event.room_description (legacy/alternate)
|
|
6
|
+
*
|
|
7
|
+
* Note: room.description uses a deliberate dot separator, unlike most
|
|
8
|
+
* events which use underscores for compound words (e.g., actor_moved).
|
|
9
|
+
*
|
|
10
|
+
* @see ADR-096 Text Service Architecture
|
|
11
|
+
*/
|
|
12
|
+
import type { ITextBlock } from '@sharpee/text-blocks';
|
|
13
|
+
import type { ISemanticEvent } from '@sharpee/core';
|
|
14
|
+
import type { HandlerContext } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Handle room description events
|
|
17
|
+
*
|
|
18
|
+
* Supports ADR-107 dual-mode: resolves message IDs through language provider
|
|
19
|
+
* when present, otherwise uses literal text directly.
|
|
20
|
+
*/
|
|
21
|
+
export declare function handleRoomDescription(event: ISemanticEvent, context: HandlerContext): ITextBlock[];
|
|
22
|
+
//# sourceMappingURL=room.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../../src/handlers/room.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA4BjD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,cAAc,GACtB,UAAU,EAAE,CAuDd"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Room description event handler
|
|
4
|
+
*
|
|
5
|
+
* Handles: if.event.room.description (standard format)
|
|
6
|
+
* Also handles: if.event.room_description (legacy/alternate)
|
|
7
|
+
*
|
|
8
|
+
* Note: room.description uses a deliberate dot separator, unlike most
|
|
9
|
+
* events which use underscores for compound words (e.g., actor_moved).
|
|
10
|
+
*
|
|
11
|
+
* @see ADR-096 Text Service Architecture
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.handleRoomDescription = handleRoomDescription;
|
|
15
|
+
const text_blocks_1 = require("@sharpee/text-blocks");
|
|
16
|
+
const assemble_js_1 = require("../stages/assemble.js");
|
|
17
|
+
/**
|
|
18
|
+
* Handle room description events
|
|
19
|
+
*
|
|
20
|
+
* Supports ADR-107 dual-mode: resolves message IDs through language provider
|
|
21
|
+
* when present, otherwise uses literal text directly.
|
|
22
|
+
*/
|
|
23
|
+
function handleRoomDescription(event, context) {
|
|
24
|
+
const data = event.data;
|
|
25
|
+
const blocks = [];
|
|
26
|
+
// Room name (if verbose)
|
|
27
|
+
if (data.verbose) {
|
|
28
|
+
let name;
|
|
29
|
+
// ADR-107: Check for message ID first (takes precedence)
|
|
30
|
+
const nameId = data.roomNameId ?? data.room?.nameId;
|
|
31
|
+
if (nameId && context.languageProvider) {
|
|
32
|
+
const resolved = context.languageProvider.getMessage(nameId, {});
|
|
33
|
+
if (resolved && resolved !== nameId) {
|
|
34
|
+
name = resolved;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Fall back to literal text
|
|
38
|
+
if (!name) {
|
|
39
|
+
name = data.room?.name ?? data.roomName;
|
|
40
|
+
}
|
|
41
|
+
if (name) {
|
|
42
|
+
const resolvedName = (0, assemble_js_1.extractValue)(name);
|
|
43
|
+
if (resolvedName) {
|
|
44
|
+
blocks.push((0, assemble_js_1.createBlock)(text_blocks_1.BLOCK_KEYS.ROOM_NAME, resolvedName));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Room description
|
|
49
|
+
let description;
|
|
50
|
+
// ADR-107: Check for message ID first (takes precedence)
|
|
51
|
+
const descriptionId = data.roomDescriptionId ?? data.room?.descriptionId;
|
|
52
|
+
if (descriptionId && context.languageProvider) {
|
|
53
|
+
const resolved = context.languageProvider.getMessage(descriptionId, {});
|
|
54
|
+
if (resolved && resolved !== descriptionId) {
|
|
55
|
+
description = resolved;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Fall back to literal text
|
|
59
|
+
if (!description) {
|
|
60
|
+
description = data.room?.description ?? data.roomDescription;
|
|
61
|
+
}
|
|
62
|
+
if (description) {
|
|
63
|
+
const resolvedDesc = (0, assemble_js_1.extractValue)(description);
|
|
64
|
+
if (resolvedDesc) {
|
|
65
|
+
blocks.push((0, assemble_js_1.createBlock)(text_blocks_1.BLOCK_KEYS.ROOM_DESCRIPTION, resolvedDesc));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return blocks;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=room.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room.js","sourceRoot":"","sources":["../../src/handlers/room.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAuCH,sDA0DC;AA9FD,sDAAkD;AAGlD,uDAAkE;AA2BlE;;;;;GAKG;AACH,SAAgB,qBAAqB,CACnC,KAAqB,EACrB,OAAuB;IAEvB,MAAM,IAAI,GAAG,KAAK,CAAC,IAA2B,CAAC;IAC/C,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,yBAAyB;IACzB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,IAAwB,CAAC;QAE7B,yDAAyD;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;QACpD,IAAI,MAAM,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACjE,IAAI,QAAQ,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACpC,IAAI,GAAG,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC;QAC1C,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,YAAY,GAAG,IAAA,0BAAY,EAAC,IAAI,CAAC,CAAC;YACxC,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,IAAA,yBAAW,EAAC,wBAAU,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,WAA+B,CAAC;IAEpC,yDAAyD;IACzD,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;IACzE,IAAI,aAAa,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,QAAQ,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC3C,WAAW,GAAG,QAAQ,CAAC;QACzB,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,IAAI,IAAI,CAAC,eAAe,CAAC;IAC/D,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,IAAA,0BAAY,EAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,IAAA,yBAAW,EAAC,wBAAU,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler types for TextService
|
|
3
|
+
*
|
|
4
|
+
* @see ADR-096 Text Service Architecture
|
|
5
|
+
*/
|
|
6
|
+
import type { ITextBlock } from '@sharpee/text-blocks';
|
|
7
|
+
import type { LanguageProvider } from '@sharpee/if-domain';
|
|
8
|
+
import type { ISemanticEvent } from '@sharpee/core';
|
|
9
|
+
/**
|
|
10
|
+
* Context passed to event handlers
|
|
11
|
+
*/
|
|
12
|
+
export interface HandlerContext {
|
|
13
|
+
/** Language provider for template resolution */
|
|
14
|
+
languageProvider?: LanguageProvider;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Event handler function signature
|
|
18
|
+
*
|
|
19
|
+
* Handlers receive an event and context, return zero or more TextBlocks.
|
|
20
|
+
*/
|
|
21
|
+
export type EventHandler = (event: ISemanticEvent, context: HandlerContext) => ITextBlock[];
|
|
22
|
+
/**
|
|
23
|
+
* Common event data with chain metadata (ADR-094)
|
|
24
|
+
*/
|
|
25
|
+
export interface ChainableEventData {
|
|
26
|
+
_transactionId?: string;
|
|
27
|
+
_chainDepth?: number;
|
|
28
|
+
_chainedFrom?: string;
|
|
29
|
+
_chainSourceId?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generic event data with message fields
|
|
33
|
+
*/
|
|
34
|
+
export interface GenericEventData extends ChainableEventData {
|
|
35
|
+
message?: string;
|
|
36
|
+
messageId?: string;
|
|
37
|
+
text?: string;
|
|
38
|
+
[key: string]: unknown;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/handlers/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,cAAc,KACpB,UAAU,EAAE,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/handlers/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @sharpee/text-service
|
|
3
|
+
*
|
|
4
|
+
* Single text service for Sharpee that:
|
|
5
|
+
* - Receives semantic events
|
|
6
|
+
* - Resolves templates via LanguageProvider
|
|
7
|
+
* - Parses decorations into structured IDecoration tree
|
|
8
|
+
* - Outputs ITextBlock[]
|
|
9
|
+
*
|
|
10
|
+
* Includes CLI renderer for testing and CLI clients.
|
|
11
|
+
*
|
|
12
|
+
* Inspired by FyreVM channel I/O (2009).
|
|
13
|
+
*
|
|
14
|
+
* @see ADR-096 Text Service Architecture
|
|
15
|
+
*/
|
|
16
|
+
export type { ITextService } from './text-service.js';
|
|
17
|
+
export { TextService, createTextService } from './text-service.js';
|
|
18
|
+
export { filterEvents } from './stages/filter.js';
|
|
19
|
+
export { sortEventsForProse, getChainMetadata } from './stages/sort.js';
|
|
20
|
+
export { createBlock, extractValue } from './stages/assemble.js';
|
|
21
|
+
export type { EventHandler, HandlerContext, ChainableEventData, GenericEventData } from './handlers/types.js';
|
|
22
|
+
export { handleRoomDescription } from './handlers/room.js';
|
|
23
|
+
export { handleActionSuccess, handleActionFailure } from './handlers/action.js';
|
|
24
|
+
export { handleRevealed } from './handlers/revealed.js';
|
|
25
|
+
export { handleGameMessage, handleGenericEvent } from './handlers/generic.js';
|
|
26
|
+
export { parseDecorations, hasDecorations } from './decoration-parser.js';
|
|
27
|
+
export type { CLIRenderOptions } from './cli-renderer.js';
|
|
28
|
+
export { renderToString, renderStatusLine } from './cli-renderer.js';
|
|
29
|
+
export type { ITextBlock, IDecoration, TextContent } from '@sharpee/text-blocks';
|
|
30
|
+
export { isDecoration, isTextBlock, isStatusBlock, isRoomBlock, isActionBlock, extractPlainText, BLOCK_KEYS, BLOCK_KEY_PREFIXES, CORE_DECORATION_TYPES, } from '@sharpee/text-blocks';
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGjE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG9E,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG1E,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGrE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @sharpee/text-service
|
|
4
|
+
*
|
|
5
|
+
* Single text service for Sharpee that:
|
|
6
|
+
* - Receives semantic events
|
|
7
|
+
* - Resolves templates via LanguageProvider
|
|
8
|
+
* - Parses decorations into structured IDecoration tree
|
|
9
|
+
* - Outputs ITextBlock[]
|
|
10
|
+
*
|
|
11
|
+
* Includes CLI renderer for testing and CLI clients.
|
|
12
|
+
*
|
|
13
|
+
* Inspired by FyreVM channel I/O (2009).
|
|
14
|
+
*
|
|
15
|
+
* @see ADR-096 Text Service Architecture
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.CORE_DECORATION_TYPES = exports.BLOCK_KEY_PREFIXES = exports.BLOCK_KEYS = exports.extractPlainText = exports.isActionBlock = exports.isRoomBlock = exports.isStatusBlock = exports.isTextBlock = exports.isDecoration = exports.renderStatusLine = exports.renderToString = exports.hasDecorations = exports.parseDecorations = exports.handleGenericEvent = exports.handleGameMessage = exports.handleRevealed = exports.handleActionFailure = exports.handleActionSuccess = exports.handleRoomDescription = exports.extractValue = exports.createBlock = exports.getChainMetadata = exports.sortEventsForProse = exports.filterEvents = exports.createTextService = exports.TextService = void 0;
|
|
19
|
+
var text_service_js_1 = require("./text-service.js");
|
|
20
|
+
Object.defineProperty(exports, "TextService", { enumerable: true, get: function () { return text_service_js_1.TextService; } });
|
|
21
|
+
Object.defineProperty(exports, "createTextService", { enumerable: true, get: function () { return text_service_js_1.createTextService; } });
|
|
22
|
+
// Pipeline stages
|
|
23
|
+
var filter_js_1 = require("./stages/filter.js");
|
|
24
|
+
Object.defineProperty(exports, "filterEvents", { enumerable: true, get: function () { return filter_js_1.filterEvents; } });
|
|
25
|
+
var sort_js_1 = require("./stages/sort.js");
|
|
26
|
+
Object.defineProperty(exports, "sortEventsForProse", { enumerable: true, get: function () { return sort_js_1.sortEventsForProse; } });
|
|
27
|
+
Object.defineProperty(exports, "getChainMetadata", { enumerable: true, get: function () { return sort_js_1.getChainMetadata; } });
|
|
28
|
+
var assemble_js_1 = require("./stages/assemble.js");
|
|
29
|
+
Object.defineProperty(exports, "createBlock", { enumerable: true, get: function () { return assemble_js_1.createBlock; } });
|
|
30
|
+
Object.defineProperty(exports, "extractValue", { enumerable: true, get: function () { return assemble_js_1.extractValue; } });
|
|
31
|
+
var room_js_1 = require("./handlers/room.js");
|
|
32
|
+
Object.defineProperty(exports, "handleRoomDescription", { enumerable: true, get: function () { return room_js_1.handleRoomDescription; } });
|
|
33
|
+
var action_js_1 = require("./handlers/action.js");
|
|
34
|
+
Object.defineProperty(exports, "handleActionSuccess", { enumerable: true, get: function () { return action_js_1.handleActionSuccess; } });
|
|
35
|
+
Object.defineProperty(exports, "handleActionFailure", { enumerable: true, get: function () { return action_js_1.handleActionFailure; } });
|
|
36
|
+
var revealed_js_1 = require("./handlers/revealed.js");
|
|
37
|
+
Object.defineProperty(exports, "handleRevealed", { enumerable: true, get: function () { return revealed_js_1.handleRevealed; } });
|
|
38
|
+
var generic_js_1 = require("./handlers/generic.js");
|
|
39
|
+
Object.defineProperty(exports, "handleGameMessage", { enumerable: true, get: function () { return generic_js_1.handleGameMessage; } });
|
|
40
|
+
Object.defineProperty(exports, "handleGenericEvent", { enumerable: true, get: function () { return generic_js_1.handleGenericEvent; } });
|
|
41
|
+
// Decoration parser
|
|
42
|
+
var decoration_parser_js_1 = require("./decoration-parser.js");
|
|
43
|
+
Object.defineProperty(exports, "parseDecorations", { enumerable: true, get: function () { return decoration_parser_js_1.parseDecorations; } });
|
|
44
|
+
Object.defineProperty(exports, "hasDecorations", { enumerable: true, get: function () { return decoration_parser_js_1.hasDecorations; } });
|
|
45
|
+
var cli_renderer_js_1 = require("./cli-renderer.js");
|
|
46
|
+
Object.defineProperty(exports, "renderToString", { enumerable: true, get: function () { return cli_renderer_js_1.renderToString; } });
|
|
47
|
+
Object.defineProperty(exports, "renderStatusLine", { enumerable: true, get: function () { return cli_renderer_js_1.renderStatusLine; } });
|
|
48
|
+
var text_blocks_1 = require("@sharpee/text-blocks");
|
|
49
|
+
Object.defineProperty(exports, "isDecoration", { enumerable: true, get: function () { return text_blocks_1.isDecoration; } });
|
|
50
|
+
Object.defineProperty(exports, "isTextBlock", { enumerable: true, get: function () { return text_blocks_1.isTextBlock; } });
|
|
51
|
+
Object.defineProperty(exports, "isStatusBlock", { enumerable: true, get: function () { return text_blocks_1.isStatusBlock; } });
|
|
52
|
+
Object.defineProperty(exports, "isRoomBlock", { enumerable: true, get: function () { return text_blocks_1.isRoomBlock; } });
|
|
53
|
+
Object.defineProperty(exports, "isActionBlock", { enumerable: true, get: function () { return text_blocks_1.isActionBlock; } });
|
|
54
|
+
Object.defineProperty(exports, "extractPlainText", { enumerable: true, get: function () { return text_blocks_1.extractPlainText; } });
|
|
55
|
+
Object.defineProperty(exports, "BLOCK_KEYS", { enumerable: true, get: function () { return text_blocks_1.BLOCK_KEYS; } });
|
|
56
|
+
Object.defineProperty(exports, "BLOCK_KEY_PREFIXES", { enumerable: true, get: function () { return text_blocks_1.BLOCK_KEY_PREFIXES; } });
|
|
57
|
+
Object.defineProperty(exports, "CORE_DECORATION_TYPES", { enumerable: true, get: function () { return text_blocks_1.CORE_DECORATION_TYPES; } });
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAIH,qDAAmE;AAA1D,8GAAA,WAAW,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAEvC,kBAAkB;AAClB,gDAAkD;AAAzC,yGAAA,YAAY,OAAA;AACrB,4CAAwE;AAA/D,6GAAA,kBAAkB,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAC7C,oDAAiE;AAAxD,0GAAA,WAAW,OAAA;AAAE,2GAAA,YAAY,OAAA;AAIlC,8CAA2D;AAAlD,gHAAA,qBAAqB,OAAA;AAC9B,kDAAgF;AAAvE,gHAAA,mBAAmB,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AACjD,sDAAwD;AAA/C,6GAAA,cAAc,OAAA;AACvB,oDAA8E;AAArE,+GAAA,iBAAiB,OAAA;AAAE,gHAAA,kBAAkB,OAAA;AAE9C,oBAAoB;AACpB,+DAA0E;AAAjE,wHAAA,gBAAgB,OAAA;AAAE,sHAAA,cAAc,OAAA;AAIzC,qDAAqE;AAA5D,iHAAA,cAAc,OAAA;AAAE,mHAAA,gBAAgB,OAAA;AAIzC,oDAU8B;AAT5B,2GAAA,YAAY,OAAA;AACZ,0GAAA,WAAW,OAAA;AACX,4GAAA,aAAa,OAAA;AACb,0GAAA,WAAW,OAAA;AACX,4GAAA,aAAa,OAAA;AACb,+GAAA,gBAAgB,OAAA;AAChB,yGAAA,UAAU,OAAA;AACV,iHAAA,kBAAkB,OAAA;AAClB,oHAAA,qBAAqB,OAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Block assembly stage
|
|
3
|
+
*
|
|
4
|
+
* Creates ITextBlock from resolved text, parsing decorations.
|
|
5
|
+
*
|
|
6
|
+
* @see ADR-091 Text Decorations
|
|
7
|
+
* @see ADR-096 Text Service Architecture
|
|
8
|
+
*/
|
|
9
|
+
import type { ITextBlock } from '@sharpee/text-blocks';
|
|
10
|
+
/**
|
|
11
|
+
* Create a TextBlock, parsing decorations if present
|
|
12
|
+
*/
|
|
13
|
+
export declare function createBlock(key: string, text: string): ITextBlock;
|
|
14
|
+
/**
|
|
15
|
+
* Extract value from provider function or direct value
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractValue(value: unknown): string | null;
|
|
18
|
+
//# sourceMappingURL=assemble.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assemble.d.ts","sourceRoot":"","sources":["../../src/stages/assemble.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,sBAAsB,CAAC;AAGpE;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAMjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAW1D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Block assembly stage
|
|
4
|
+
*
|
|
5
|
+
* Creates ITextBlock from resolved text, parsing decorations.
|
|
6
|
+
*
|
|
7
|
+
* @see ADR-091 Text Decorations
|
|
8
|
+
* @see ADR-096 Text Service Architecture
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.createBlock = createBlock;
|
|
12
|
+
exports.extractValue = extractValue;
|
|
13
|
+
const decoration_parser_js_1 = require("../decoration-parser.js");
|
|
14
|
+
/**
|
|
15
|
+
* Create a TextBlock, parsing decorations if present
|
|
16
|
+
*/
|
|
17
|
+
function createBlock(key, text) {
|
|
18
|
+
const content = (0, decoration_parser_js_1.hasDecorations)(text)
|
|
19
|
+
? (0, decoration_parser_js_1.parseDecorations)(text)
|
|
20
|
+
: [text];
|
|
21
|
+
return { key, content };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Extract value from provider function or direct value
|
|
25
|
+
*/
|
|
26
|
+
function extractValue(value) {
|
|
27
|
+
if (typeof value === 'function') {
|
|
28
|
+
try {
|
|
29
|
+
const result = value();
|
|
30
|
+
return result ? String(result) : null;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return value ? String(value) : null;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=assemble.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assemble.js","sourceRoot":"","sources":["../../src/stages/assemble.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAQH,kCAMC;AAKD,oCAWC;AA3BD,kEAA2E;AAE3E;;GAEG;AACH,SAAgB,WAAW,CAAC,GAAW,EAAE,IAAY;IACnD,MAAM,OAAO,GAAkB,IAAA,qCAAc,EAAC,IAAI,CAAC;QACjD,CAAC,CAAC,IAAA,uCAAgB,EAAC,IAAI,CAAC;QACxB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEX,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event filtering stage
|
|
3
|
+
*
|
|
4
|
+
* Filters out events that should not produce text output:
|
|
5
|
+
* - System events (system.*)
|
|
6
|
+
*
|
|
7
|
+
* @see ADR-096 Text Service Architecture
|
|
8
|
+
*/
|
|
9
|
+
import type { ISemanticEvent } from '@sharpee/core';
|
|
10
|
+
/**
|
|
11
|
+
* Filter events that should produce text output
|
|
12
|
+
*/
|
|
13
|
+
export declare function filterEvents(events: ISemanticEvent[]): ISemanticEvent[];
|
|
14
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/stages/filter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAcvE"}
|