@dxos/plugin-chess 0.8.4-main.7ace549 → 0.8.4-main.937b3ca

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/lib/browser/ChessboardContainer-IS4PXWJD.mjs +81 -0
  2. package/dist/lib/browser/ChessboardContainer-IS4PXWJD.mjs.map +7 -0
  3. package/dist/lib/browser/blueprint-definition-5RUGJ64Z.mjs +18 -0
  4. package/dist/lib/browser/blueprint-definition-5RUGJ64Z.mjs.map +7 -0
  5. package/dist/lib/browser/blueprints/index.mjs +11 -0
  6. package/dist/lib/browser/{chunk-CCF24VRU.mjs → chunk-7OZ7J7LF.mjs} +9 -28
  7. package/dist/lib/browser/chunk-7OZ7J7LF.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-3LPE2B5J.mjs → chunk-DH4WQRZH.mjs} +105 -45
  9. package/dist/lib/browser/chunk-DH4WQRZH.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-DUO4WTAM.mjs → chunk-H3NUMCQ6.mjs} +1 -8
  11. package/dist/lib/browser/chunk-H3NUMCQ6.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  13. package/dist/lib/browser/{chunk-Q5TZCIH7.mjs → chunk-MV2GQK7M.mjs} +2 -2
  14. package/dist/lib/browser/chunk-UUMPZ2FM.mjs +271 -0
  15. package/dist/lib/browser/chunk-UUMPZ2FM.mjs.map +7 -0
  16. package/dist/lib/browser/cli/index.mjs +28 -0
  17. package/dist/lib/browser/cli/index.mjs.map +7 -0
  18. package/dist/lib/browser/index.mjs +44 -69
  19. package/dist/lib/browser/index.mjs.map +4 -4
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/react-surface-GQE7XMWH.mjs +37 -0
  22. package/dist/lib/browser/react-surface-GQE7XMWH.mjs.map +7 -0
  23. package/dist/lib/browser/types/index.mjs +3 -5
  24. package/dist/lib/node-esm/ChessboardContainer-S3T6OE7P.mjs +82 -0
  25. package/dist/lib/node-esm/ChessboardContainer-S3T6OE7P.mjs.map +7 -0
  26. package/dist/lib/node-esm/blueprint-definition-RYKASBIJ.mjs +19 -0
  27. package/dist/lib/node-esm/blueprint-definition-RYKASBIJ.mjs.map +7 -0
  28. package/dist/lib/node-esm/blueprints/index.mjs +12 -0
  29. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  30. package/dist/lib/node-esm/{chunk-VVXTAVIS.mjs → chunk-DOBR6ILE.mjs} +2 -2
  31. package/dist/lib/node-esm/{chunk-KNOOJFIR.mjs → chunk-F5OMIM4F.mjs} +1 -7
  32. package/dist/lib/node-esm/chunk-F5OMIM4F.mjs.map +7 -0
  33. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  34. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  35. package/dist/lib/node-esm/chunk-LKJ5GDAB.mjs +272 -0
  36. package/dist/lib/node-esm/chunk-LKJ5GDAB.mjs.map +7 -0
  37. package/dist/lib/node-esm/{chunk-QKXLEJNZ.mjs → chunk-NAYRVJR4.mjs} +9 -28
  38. package/dist/lib/node-esm/chunk-NAYRVJR4.mjs.map +7 -0
  39. package/dist/lib/node-esm/{chunk-F3HFLDV5.mjs → chunk-NFDJU7XQ.mjs} +105 -45
  40. package/dist/lib/node-esm/chunk-NFDJU7XQ.mjs.map +7 -0
  41. package/dist/lib/node-esm/cli/index.mjs +29 -0
  42. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  43. package/dist/lib/node-esm/index.mjs +44 -69
  44. package/dist/lib/node-esm/index.mjs.map +4 -4
  45. package/dist/lib/node-esm/meta.json +1 -1
  46. package/dist/lib/node-esm/{react-surface-KV2KBSIU.mjs → react-surface-7UZLIVN6.mjs} +15 -16
  47. package/dist/lib/node-esm/react-surface-7UZLIVN6.mjs.map +7 -0
  48. package/dist/lib/node-esm/types/index.mjs +3 -5
  49. package/dist/types/src/ChessPlugin.d.ts +2 -1
  50. package/dist/types/src/ChessPlugin.d.ts.map +1 -1
  51. package/dist/types/src/blueprints/chess-blueprint.d.ts +21 -0
  52. package/dist/types/src/blueprints/chess-blueprint.d.ts.map +1 -0
  53. package/dist/types/src/{functions → blueprints/functions}/create.d.ts +5 -4
  54. package/dist/types/src/blueprints/functions/create.d.ts.map +1 -0
  55. package/dist/types/src/{functions → blueprints/functions}/index.d.ts +1 -0
  56. package/dist/types/src/blueprints/functions/index.d.ts.map +1 -0
  57. package/dist/types/src/blueprints/functions/move.d.ts.map +1 -0
  58. package/dist/types/src/blueprints/functions/play.d.ts.map +1 -0
  59. package/dist/types/src/blueprints/functions/print.d.ts +8 -0
  60. package/dist/types/src/blueprints/functions/print.d.ts.map +1 -0
  61. package/dist/types/src/blueprints/index.d.ts +3 -0
  62. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  63. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts +12 -0
  64. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts.map +1 -0
  65. package/dist/types/src/capabilities/artifact-definition/index.d.ts +3 -0
  66. package/dist/types/src/capabilities/artifact-definition/index.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +9 -0
  68. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  69. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  70. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/index.d.ts +1 -3
  72. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  74. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  75. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  76. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  77. package/dist/types/src/cli/index.d.ts +2 -0
  78. package/dist/types/src/cli/index.d.ts.map +1 -0
  79. package/dist/types/src/cli/plugin.d.ts +3 -0
  80. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  81. package/dist/types/src/components/Card.stories.d.ts +1 -8
  82. package/dist/types/src/components/Card.stories.d.ts.map +1 -1
  83. package/dist/types/src/components/Chessboard.d.ts +2 -1
  84. package/dist/types/src/components/Chessboard.d.ts.map +1 -1
  85. package/dist/types/src/components/Chessboard.stories.d.ts +6 -6
  86. package/dist/types/src/components/Chessboard.stories.d.ts.map +1 -1
  87. package/dist/types/src/components/ChessboardArticle.d.ts +3 -4
  88. package/dist/types/src/components/ChessboardArticle.d.ts.map +1 -1
  89. package/dist/types/src/components/ChessboardContainer.d.ts +3 -5
  90. package/dist/types/src/components/ChessboardContainer.d.ts.map +1 -1
  91. package/dist/types/src/components/Info.d.ts.map +1 -1
  92. package/dist/types/src/components/index.d.ts +1 -1
  93. package/dist/types/src/components/index.d.ts.map +1 -1
  94. package/dist/types/src/index.d.ts +1 -1
  95. package/dist/types/src/index.d.ts.map +1 -1
  96. package/dist/types/src/meta.d.ts +2 -2
  97. package/dist/types/src/meta.d.ts.map +1 -1
  98. package/dist/types/src/types/Chess.d.ts +14 -14
  99. package/dist/types/src/types/Chess.d.ts.map +1 -1
  100. package/dist/types/src/types/index.d.ts +0 -1
  101. package/dist/types/src/types/index.d.ts.map +1 -1
  102. package/dist/types/tsconfig.tsbuildinfo +1 -1
  103. package/package.json +63 -48
  104. package/src/ChessPlugin.tsx +25 -46
  105. package/src/blueprints/chess-blueprint.ts +28 -0
  106. package/src/{functions → blueprints/functions}/create.ts +10 -4
  107. package/src/{functions → blueprints/functions}/index.ts +1 -0
  108. package/src/{functions → blueprints/functions}/move.ts +9 -5
  109. package/src/{functions → blueprints/functions}/play.ts +9 -5
  110. package/src/blueprints/functions/print.ts +42 -0
  111. package/src/blueprints/index.ts +6 -0
  112. package/src/capabilities/artifact-definition/artifact-definition.ts +135 -0
  113. package/src/capabilities/artifact-definition/index.ts +7 -0
  114. package/src/capabilities/blueprint-definition/blueprint-definition.ts +23 -0
  115. package/src/capabilities/blueprint-definition/index.ts +7 -0
  116. package/src/capabilities/index.ts +1 -6
  117. package/src/capabilities/react-surface/index.ts +7 -0
  118. package/src/capabilities/react-surface/react-surface.tsx +27 -0
  119. package/src/cli/index.ts +5 -0
  120. package/src/cli/plugin.ts +26 -0
  121. package/src/components/Card.stories.tsx +18 -37
  122. package/src/components/Chessboard.stories.tsx +15 -11
  123. package/src/components/Chessboard.tsx +21 -10
  124. package/src/components/ChessboardArticle.tsx +8 -5
  125. package/src/components/ChessboardContainer.tsx +9 -13
  126. package/src/components/Info.tsx +11 -7
  127. package/src/index.ts +1 -1
  128. package/src/meta.ts +2 -2
  129. package/src/types/Chess.ts +3 -3
  130. package/src/types/index.ts +0 -1
  131. package/dist/lib/browser/ChessboardContainer-5YXEM4VR.mjs +0 -96
  132. package/dist/lib/browser/ChessboardContainer-5YXEM4VR.mjs.map +0 -7
  133. package/dist/lib/browser/blueprint-definition-Y5Y4YGNL.mjs +0 -11
  134. package/dist/lib/browser/chunk-3LPE2B5J.mjs.map +0 -7
  135. package/dist/lib/browser/chunk-5DOZV3PW.mjs +0 -294
  136. package/dist/lib/browser/chunk-5DOZV3PW.mjs.map +0 -7
  137. package/dist/lib/browser/chunk-CCF24VRU.mjs.map +0 -7
  138. package/dist/lib/browser/chunk-DUO4WTAM.mjs.map +0 -7
  139. package/dist/lib/browser/intent-resolver-KPGHK5JU.mjs +0 -25
  140. package/dist/lib/browser/intent-resolver-KPGHK5JU.mjs.map +0 -7
  141. package/dist/lib/browser/react-surface-3YST34QI.mjs +0 -38
  142. package/dist/lib/browser/react-surface-3YST34QI.mjs.map +0 -7
  143. package/dist/lib/node-esm/ChessboardContainer-7OQ6TOKB.mjs +0 -97
  144. package/dist/lib/node-esm/ChessboardContainer-7OQ6TOKB.mjs.map +0 -7
  145. package/dist/lib/node-esm/blueprint-definition-GR6OLMB6.mjs +0 -12
  146. package/dist/lib/node-esm/chunk-F3HFLDV5.mjs.map +0 -7
  147. package/dist/lib/node-esm/chunk-F4C2HVZL.mjs +0 -295
  148. package/dist/lib/node-esm/chunk-F4C2HVZL.mjs.map +0 -7
  149. package/dist/lib/node-esm/chunk-KNOOJFIR.mjs.map +0 -7
  150. package/dist/lib/node-esm/chunk-QKXLEJNZ.mjs.map +0 -7
  151. package/dist/lib/node-esm/intent-resolver-ZAELGF7I.mjs +0 -26
  152. package/dist/lib/node-esm/intent-resolver-ZAELGF7I.mjs.map +0 -7
  153. package/dist/lib/node-esm/react-surface-KV2KBSIU.mjs.map +0 -7
  154. package/dist/types/src/capabilities/artifact-definition.d.ts +0 -11
  155. package/dist/types/src/capabilities/artifact-definition.d.ts.map +0 -1
  156. package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -6
  157. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
  158. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  159. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  160. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  161. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  162. package/dist/types/src/functions/create.d.ts.map +0 -1
  163. package/dist/types/src/functions/index.d.ts.map +0 -1
  164. package/dist/types/src/functions/move.d.ts.map +0 -1
  165. package/dist/types/src/functions/play.d.ts.map +0 -1
  166. package/dist/types/src/types/ChessAction.d.ts +0 -24
  167. package/dist/types/src/types/ChessAction.d.ts.map +0 -1
  168. package/src/capabilities/artifact-definition.ts +0 -129
  169. package/src/capabilities/blueprint-definition.ts +0 -36
  170. package/src/capabilities/intent-resolver.ts +0 -22
  171. package/src/capabilities/react-surface.tsx +0 -23
  172. package/src/types/ChessAction.ts +0 -19
  173. /package/dist/lib/browser/{blueprint-definition-Y5Y4YGNL.mjs.map → blueprints/index.mjs.map} +0 -0
  174. /package/dist/lib/{node-esm/blueprint-definition-GR6OLMB6.mjs.map → browser/chunk-J5LGTIGS.mjs.map} +0 -0
  175. /package/dist/lib/browser/{chunk-Q5TZCIH7.mjs.map → chunk-MV2GQK7M.mjs.map} +0 -0
  176. /package/dist/lib/node-esm/{chunk-VVXTAVIS.mjs.map → chunk-DOBR6ILE.mjs.map} +0 -0
  177. /package/dist/types/src/{functions → blueprints/functions}/move.d.ts +0 -0
  178. /package/dist/types/src/{functions → blueprints/functions}/play.d.ts +0 -0
@@ -0,0 +1,272 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ meta
4
+ } from "./chunk-F5OMIM4F.mjs";
5
+
6
+ // src/components/Chessboard.tsx
7
+ import { RegistryContext } from "@effect-atom/atom-react";
8
+ import React2, { forwardRef, useCallback, useContext, useEffect as useEffect2, useImperativeHandle, useMemo as useMemo2, useRef as useRef2 } from "react";
9
+ import { addEventListener } from "@dxos/async";
10
+ import { Obj as Obj2 } from "@dxos/echo";
11
+ import { ChessModel, Gameboard, Chessboard as NaturalChessboard, getRawPgn, useGameboardContext as useGameboardContext2 } from "@dxos/react-ui-gameboard";
12
+ import { useSoundEffect } from "@dxos/react-ui-sfx";
13
+ import { mx as mx2 } from "@dxos/ui-theme";
14
+
15
+ // src/components/Info.tsx
16
+ import { useAtomValue } from "@effect-atom/atom-react";
17
+ import React, { useEffect, useMemo, useRef } from "react";
18
+ import { generateName } from "@dxos/display-name";
19
+ import { Obj } from "@dxos/echo";
20
+ import { useMembers } from "@dxos/react-client/echo";
21
+ import { Icon, IconButton, Select, useTranslation } from "@dxos/react-ui";
22
+ import { useGameboardContext } from "@dxos/react-ui-gameboard";
23
+ import { mx } from "@dxos/ui-theme";
24
+ var Info = ({ classNames, orientation = "white", onOrientationChange, onClose, ...props }) => {
25
+ const { t } = useTranslation(meta.id);
26
+ const { model } = useGameboardContext(Info.displayName);
27
+ const db = Obj.getDatabase(model.object);
28
+ const members = useMembers(db?.spaceId);
29
+ return /* @__PURE__ */ React.createElement("div", {
30
+ className: mx("grid grid-rows-[min-content_1fr_min-content] is-full min-is-[18rem] p-2 overflow-hidden bg-groupSurface rounded-sm", classNames)
31
+ }, /* @__PURE__ */ React.createElement(PlayerIndicator, {
32
+ model,
33
+ player: orientation === "white" ? "black" : "white",
34
+ icon: onClose && /* @__PURE__ */ React.createElement(IconButton, {
35
+ icon: "ph--x--regular",
36
+ iconOnly: true,
37
+ label: t("close info button"),
38
+ size: 4,
39
+ onClick: onClose
40
+ })
41
+ }, /* @__PURE__ */ React.createElement(PlayerSelector, {
42
+ value: model.object.players?.[orientation === "white" ? "black" : "white"],
43
+ onValueChange: (value) => {
44
+ model.object.players[orientation === "white" ? "black" : "white"] = value;
45
+ },
46
+ members
47
+ })), /* @__PURE__ */ React.createElement(History, {
48
+ model,
49
+ ...props
50
+ }), /* @__PURE__ */ React.createElement(PlayerIndicator, {
51
+ model,
52
+ player: orientation,
53
+ icon: onOrientationChange && /* @__PURE__ */ React.createElement(IconButton, {
54
+ classNames: mx("transition duration-200 ease-linear", orientation === "white" && "rotate-180"),
55
+ icon: "ph--arrows-clockwise--regular",
56
+ iconOnly: true,
57
+ label: t("flip board button"),
58
+ size: 4,
59
+ onClick: () => onOrientationChange(orientation === "white" ? "black" : "white")
60
+ })
61
+ }, /* @__PURE__ */ React.createElement(PlayerSelector, {
62
+ value: model.object.players?.[orientation],
63
+ onValueChange: (value) => {
64
+ model.object.players[orientation] = value;
65
+ },
66
+ members
67
+ })));
68
+ };
69
+ Info.displayName = "Chessboard.Info";
70
+ var History = ({ classNames, model, min, max, onSelect }) => {
71
+ const { t } = useTranslation(meta.id);
72
+ const moveIndex = useAtomValue(model.moveIndex);
73
+ const label = model.game.isGameOver() ? model.game.isCheckmate() ? t("game.checkmate label") : model.game.isStalemate() ? t("game.stalemate label") : t("game.draw label") : model.game.isCheck() ? t("game.check label") : void 0;
74
+ const history = model.game.history();
75
+ const moves = useMemo(() => history.reduce((acc, move, index) => {
76
+ if (index % 2 === 0) {
77
+ acc.push([
78
+ {
79
+ index,
80
+ move
81
+ }
82
+ ]);
83
+ } else {
84
+ acc[acc.length - 1].push({
85
+ index,
86
+ move
87
+ });
88
+ }
89
+ return acc;
90
+ }, []), [
91
+ history.length
92
+ ]);
93
+ const scrollerRef = useRef(null);
94
+ useEffect(() => {
95
+ scrollerRef.current?.scrollTo({
96
+ top: scrollerRef.current.scrollHeight
97
+ });
98
+ }, [
99
+ history.length
100
+ ]);
101
+ useEffect(() => {
102
+ const div = scrollerRef.current?.querySelector(`[data-index="${moveIndex - 1}"]`);
103
+ scrollerRef.current?.classList.add("scrollbar-none");
104
+ div?.scrollIntoView({
105
+ behavior: "smooth"
106
+ });
107
+ scrollerRef.current?.classList.remove("scrollbar-none");
108
+ }, [
109
+ moveIndex
110
+ ]);
111
+ return /* @__PURE__ */ React.createElement("div", {
112
+ ref: scrollerRef,
113
+ className: mx("overflow-y-auto", classNames),
114
+ style: {
115
+ minHeight: min === void 0 ? "auto" : `${min * 24}px`,
116
+ maxHeight: max === void 0 ? "auto" : `${max * 24}px`
117
+ }
118
+ }, moves.map(([a, b], index) => /* @__PURE__ */ React.createElement("div", {
119
+ key: index,
120
+ className: "grid grid-cols-[3rem_1fr_1fr_1rem] gap-2 pis-4 leading-1"
121
+ }, /* @__PURE__ */ React.createElement("div", {
122
+ className: "content-center text-xs text-subdued"
123
+ }, index + 1), a && /* @__PURE__ */ React.createElement("div", {
124
+ "data-index": a.index,
125
+ className: mx("pis-2 cursor-pointer", a.index === moveIndex - 1 && "bg-primary-500"),
126
+ onClick: () => onSelect?.(a.index + 1)
127
+ }, a.move), b && /* @__PURE__ */ React.createElement("div", {
128
+ "data-index": b.index,
129
+ className: mx("pis-2 cursor-pointer", b.index === moveIndex - 1 && "bg-primary-500"),
130
+ onClick: () => onSelect?.(b.index + 1)
131
+ }, b.move))), label && /* @__PURE__ */ React.createElement("div", {
132
+ className: "text-center"
133
+ }, label));
134
+ };
135
+ var PlayerIndicator = ({ children, model, player, icon }) => {
136
+ const turn = player === (model.game.turn() === "w" ? "white" : "black");
137
+ return /* @__PURE__ */ React.createElement("div", {
138
+ className: "grid grid-cols-[2rem_1fr_2rem] gap-2 bs-[--rail-size] pli-1 flex items-center overflow-hidden"
139
+ }, /* @__PURE__ */ React.createElement("div", {
140
+ className: "place-items-center"
141
+ }, /* @__PURE__ */ React.createElement(Icon, {
142
+ icon: turn ? "ph--circle--fill" : "ph--circle--thin",
143
+ size: 6,
144
+ classNames: mx(turn && (model.game.isCheckmate() ? "text-red-500" : "text-green-500"))
145
+ })), /* @__PURE__ */ React.createElement("div", {
146
+ className: "truncate overflow-hidden items-center"
147
+ }, children), icon);
148
+ };
149
+ var PlayerSelector = ({ value, onValueChange, members }) => {
150
+ const { t } = useTranslation(meta.id);
151
+ return /* @__PURE__ */ React.createElement(Select.Root, {
152
+ value,
153
+ onValueChange
154
+ }, /* @__PURE__ */ React.createElement(Select.TriggerButton, {
155
+ placeholder: t("select player button")
156
+ }), /* @__PURE__ */ React.createElement(Select.Portal, null, /* @__PURE__ */ React.createElement(Select.Content, null, /* @__PURE__ */ React.createElement(Select.Viewport, null, members.map((member) => {
157
+ const memberKey = member.identity.identityKey.toHex();
158
+ const displayName = member.identity?.profile?.displayName || generateName(memberKey);
159
+ return /* @__PURE__ */ React.createElement(Select.Option, {
160
+ key: memberKey,
161
+ value: memberKey
162
+ }, displayName);
163
+ })), /* @__PURE__ */ React.createElement(Select.Arrow, null))));
164
+ };
165
+
166
+ // src/components/Chessboard.tsx
167
+ var ExtendedChessModel = class extends ChessModel {
168
+ object;
169
+ constructor(registry, object) {
170
+ super(registry), this.object = object;
171
+ }
172
+ };
173
+ var Root = /* @__PURE__ */ forwardRef(({ game, children }, forwardedRef) => {
174
+ const registry = useContext(RegistryContext);
175
+ const model = useMemo2(() => new ExtendedChessModel(registry, game), [
176
+ registry
177
+ ]);
178
+ const click = useSoundEffect("Click");
179
+ useImperativeHandle(forwardedRef, () => {
180
+ return {
181
+ setMoveNumber: (index) => model.setMoveIndex(index)
182
+ };
183
+ }, [
184
+ model
185
+ ]);
186
+ useEffect2(() => {
187
+ if (model.pgn !== getRawPgn(game.pgn ?? "")) {
188
+ const silent = model.pgn === "*";
189
+ model.update(game.pgn);
190
+ if (!silent) {
191
+ void click.play();
192
+ }
193
+ }
194
+ }, [
195
+ game.pgn
196
+ ]);
197
+ const handleDrop = useCallback((move) => {
198
+ if (!model.makeMove(move)) {
199
+ return false;
200
+ }
201
+ void click.play();
202
+ Obj2.change(game, (g) => {
203
+ g.pgn = model.pgn;
204
+ });
205
+ return true;
206
+ }, [
207
+ model
208
+ ]);
209
+ return /* @__PURE__ */ React2.createElement(Gameboard.Root, {
210
+ model,
211
+ onDrop: handleDrop
212
+ }, children);
213
+ });
214
+ var Content = ({ classNames, children, role }) => {
215
+ return /* @__PURE__ */ React2.createElement(Gameboard.Content, {
216
+ classNames: mx2(classNames, role === "card--popover" && "size-container popover-square"),
217
+ grow: !role || role === "card--extrinsic",
218
+ contain: !role || role === "card--extrinsic" || role === "card--popover"
219
+ }, children);
220
+ };
221
+ var Board = (props) => {
222
+ const registry = useContext(RegistryContext);
223
+ const { model } = useGameboardContext2(Board.displayName);
224
+ const ref = useRef2(null);
225
+ useEffect2(() => {
226
+ if (!ref.current) {
227
+ return;
228
+ }
229
+ ref.current.setAttribute("data-arrow-keys", "all");
230
+ return addEventListener(ref.current, "keydown", (ev) => {
231
+ const moveIndex = registry.get(model.moveIndex);
232
+ switch (ev.key) {
233
+ case "ArrowUp":
234
+ model.setMoveIndex(0);
235
+ break;
236
+ case "ArrowDown":
237
+ model.setMoveIndex(model.game.history().length);
238
+ break;
239
+ case "ArrowLeft":
240
+ if (moveIndex > 0) {
241
+ model.setMoveIndex(moveIndex - 1);
242
+ }
243
+ break;
244
+ case "ArrowRight":
245
+ if (moveIndex < model.game.history().length) {
246
+ model.setMoveIndex(moveIndex + 1);
247
+ }
248
+ break;
249
+ }
250
+ });
251
+ }, [
252
+ registry,
253
+ model
254
+ ]);
255
+ return /* @__PURE__ */ React2.createElement(NaturalChessboard, {
256
+ ref,
257
+ ...props
258
+ });
259
+ };
260
+ Board.displayName = "Chessboard.Board";
261
+ var Chessboard = {
262
+ Root,
263
+ Content,
264
+ Board,
265
+ Info
266
+ };
267
+
268
+ export {
269
+ ExtendedChessModel,
270
+ Chessboard
271
+ };
272
+ //# sourceMappingURL=chunk-LKJ5GDAB.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/Chessboard.tsx", "../../../src/components/Info.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Registry, RegistryContext } from '@effect-atom/atom-react';\nimport React, {\n type PropsWithChildren,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from 'react';\n\nimport { addEventListener } from '@dxos/async';\nimport { Obj } from '@dxos/echo';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport {\n ChessModel,\n Gameboard,\n type GameboardRootProps,\n Chessboard as NaturalChessboard,\n type ChessboardProps as NaturalChessboardProps,\n getRawPgn,\n useGameboardContext,\n} from '@dxos/react-ui-gameboard';\nimport { useSoundEffect } from '@dxos/react-ui-sfx';\nimport { mx } from '@dxos/ui-theme';\n\nimport { type Chess } from '../types';\n\nimport { Info, type InfoProps } from './Info';\n\nexport interface ChessboardController {\n setMoveNumber(index: number): void;\n}\n\nexport class ExtendedChessModel extends ChessModel {\n constructor(\n registry: Registry.Registry,\n readonly object: Chess.Game,\n ) {\n super(registry);\n }\n}\n\n//\n// Root\n//\n\ntype RootProps = PropsWithChildren<{\n game: Chess.Game;\n}>;\n\nconst Root = forwardRef<ChessboardController, RootProps>(({ game, children }, forwardedRef) => {\n const registry = useContext(RegistryContext);\n const model = useMemo(() => new ExtendedChessModel(registry, game), [registry]);\n const click = useSoundEffect('Click');\n\n // Controller.\n useImperativeHandle(forwardedRef, () => {\n return {\n setMoveNumber: (index) => model.setMoveIndex(index),\n };\n }, [model]);\n\n // External change.\n // NOTE: Warning if user has not interacted with the board.\n useEffect(() => {\n if (model.pgn !== getRawPgn(game.pgn ?? '')) {\n const silent = model.pgn === '*';\n model.update(game.pgn);\n if (!silent) {\n void click.play();\n }\n }\n }, [game.pgn]);\n\n // Move.\n const handleDrop = useCallback<NonNullable<GameboardRootProps<ChessModel>['onDrop']>>(\n (move) => {\n if (!model.makeMove(move)) {\n return false;\n }\n\n void click.play();\n Obj.change(game, (g) => {\n g.pgn = model.pgn;\n });\n return true;\n },\n [model],\n );\n\n return (\n <Gameboard.Root model={model} onDrop={handleDrop}>\n {children}\n </Gameboard.Root>\n );\n});\n\n//\n// Content\n//\n\ntype Role = 'card--popover' | 'card--intrinsic' | 'card--extrinsic';\n\ntype ContentProps = ThemedClassName<PropsWithChildren<{ role?: Role }>>;\n\nconst Content = ({ classNames, children, role }: ContentProps) => {\n return (\n <Gameboard.Content\n classNames={mx(classNames, role === 'card--popover' && 'size-container popover-square')}\n grow={!role || role === 'card--extrinsic'}\n contain={!role || role === 'card--extrinsic' || role === 'card--popover'}\n >\n {children}\n </Gameboard.Content>\n );\n};\n\n//\n// Board\n//\n\ntype BoardProps = NaturalChessboardProps;\n\nconst Board = (props: BoardProps) => {\n const registry = useContext(RegistryContext);\n const { model } = useGameboardContext<ChessModel>(Board.displayName);\n\n // Keyboard navigation.\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (!ref.current) {\n return;\n }\n\n // Participate in keyboard navigation (set tabIndex={0})\n ref.current.setAttribute('data-arrow-keys', 'all');\n\n return addEventListener(ref.current, 'keydown', (ev) => {\n const moveIndex = registry.get(model.moveIndex);\n switch (ev.key) {\n case 'ArrowUp':\n model.setMoveIndex(0);\n break;\n case 'ArrowDown':\n model.setMoveIndex(model.game.history().length);\n break;\n case 'ArrowLeft':\n if (moveIndex > 0) {\n model.setMoveIndex(moveIndex - 1);\n }\n break;\n case 'ArrowRight':\n if (moveIndex < model.game.history().length) {\n model.setMoveIndex(moveIndex + 1);\n }\n break;\n }\n });\n }, [registry, model]);\n\n return <NaturalChessboard ref={ref} {...props} />;\n};\n\nBoard.displayName = 'Chessboard.Board';\n\n//\n// Chessboard\n//\n\nexport const Chessboard = {\n Root: Root,\n Content: Content,\n Board: Board,\n Info: Info,\n};\n\nexport type {\n RootProps as ChessboardRootProps,\n ContentProps as ChessboardContentProps,\n BoardProps as ChessboardBoardProps,\n InfoProps as ChessboardInfoProps,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { type JSX, type PropsWithChildren, useEffect, useMemo, useRef } from 'react';\n\nimport { generateName } from '@dxos/display-name';\nimport { Obj } from '@dxos/echo';\nimport { type SpaceMember, useMembers } from '@dxos/react-client/echo';\nimport { Icon, IconButton, Select, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { type Player, useGameboardContext } from '@dxos/react-ui-gameboard';\nimport { mx } from '@dxos/ui-theme';\n\nimport { meta } from '../meta';\n\nimport { type ExtendedChessModel } from './Chessboard';\n\nexport type InfoProps = ThemedClassName<\n {\n orientation?: Player;\n onOrientationChange?: (orientation: Player) => void;\n onClose?: () => void;\n } & Pick<HistoryProps, 'min' | 'max' | 'onSelect'>\n>;\n\nexport const Info = ({ classNames, orientation = 'white', onOrientationChange, onClose, ...props }: InfoProps) => {\n const { t } = useTranslation(meta.id);\n const { model } = useGameboardContext<ExtendedChessModel>(Info.displayName);\n const db = Obj.getDatabase(model.object);\n const members = useMembers(db?.spaceId);\n\n return (\n <div\n className={mx(\n 'grid grid-rows-[min-content_1fr_min-content] is-full min-is-[18rem] p-2 overflow-hidden bg-groupSurface rounded-sm',\n classNames,\n )}\n >\n <PlayerIndicator\n model={model}\n player={orientation === 'white' ? 'black' : 'white'}\n icon={\n onClose && (\n <IconButton icon='ph--x--regular' iconOnly label={t('close info button')} size={4} onClick={onClose} />\n )\n }\n >\n <PlayerSelector\n value={model.object.players?.[orientation === 'white' ? 'black' : 'white']}\n onValueChange={(value) => {\n model.object.players![orientation === 'white' ? 'black' : 'white'] = value;\n }}\n members={members}\n />\n </PlayerIndicator>\n\n <History model={model} {...props} />\n\n <PlayerIndicator\n model={model}\n player={orientation}\n icon={\n onOrientationChange && (\n <IconButton\n classNames={mx('transition duration-200 ease-linear', orientation === 'white' && 'rotate-180')}\n icon='ph--arrows-clockwise--regular'\n iconOnly\n label={t('flip board button')}\n size={4}\n onClick={() => onOrientationChange(orientation === 'white' ? 'black' : 'white')}\n />\n )\n }\n >\n <PlayerSelector\n value={model.object.players?.[orientation]}\n onValueChange={(value) => {\n model.object.players![orientation] = value;\n }}\n members={members}\n />\n </PlayerIndicator>\n </div>\n );\n};\n\nInfo.displayName = 'Chessboard.Info';\n\n//\n// History\n//\n\ntype HistoryProps = ThemedClassName<{\n model: ExtendedChessModel;\n min?: number;\n max?: number;\n onSelect?: (index: number) => void;\n}>;\n\nconst History = ({ classNames, model, min, max, onSelect }: HistoryProps) => {\n const { t } = useTranslation(meta.id);\n const moveIndex = useAtomValue(model.moveIndex);\n const label = model.game.isGameOver()\n ? model.game.isCheckmate()\n ? t('game.checkmate label')\n : model.game.isStalemate()\n ? t('game.stalemate label')\n : t('game.draw label')\n : model.game.isCheck()\n ? t('game.check label')\n : undefined;\n\n const history = model.game.history();\n const moves = useMemo(\n () =>\n history.reduce(\n (acc, move, index) => {\n if (index % 2 === 0) {\n acc.push([{ index, move }]);\n } else {\n acc[acc.length - 1].push({ index, move });\n }\n return acc;\n },\n [] as { index: number; move: string }[][],\n ),\n [history.length],\n );\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n scrollerRef.current?.scrollTo({ top: scrollerRef.current.scrollHeight });\n }, [history.length]);\n\n useEffect(() => {\n const div = scrollerRef.current?.querySelector(`[data-index=\"${moveIndex - 1}\"]`);\n scrollerRef.current?.classList.add('scrollbar-none');\n div?.scrollIntoView({ behavior: 'smooth' });\n scrollerRef.current?.classList.remove('scrollbar-none');\n }, [moveIndex]);\n\n return (\n <div\n ref={scrollerRef}\n className={mx('overflow-y-auto', classNames)}\n style={{\n minHeight: min === undefined ? 'auto' : `${min * 24}px`,\n maxHeight: max === undefined ? 'auto' : `${max * 24}px`,\n }}\n >\n {moves.map(([a, b], index) => (\n <div key={index} className='grid grid-cols-[3rem_1fr_1fr_1rem] gap-2 pis-4 leading-1'>\n <div className='content-center text-xs text-subdued'>{index + 1}</div>\n {a && (\n <div\n data-index={a.index}\n className={mx('pis-2 cursor-pointer', a.index === moveIndex - 1 && 'bg-primary-500')}\n onClick={() => onSelect?.(a.index + 1)}\n >\n {a.move}\n </div>\n )}\n {b && (\n <div\n data-index={b.index}\n className={mx('pis-2 cursor-pointer', b.index === moveIndex - 1 && 'bg-primary-500')}\n onClick={() => onSelect?.(b.index + 1)}\n >\n {b.move}\n </div>\n )}\n </div>\n ))}\n {label && <div className='text-center'>{label}</div>}\n </div>\n );\n};\n\n//\n// PlayerIndicator\n//\n\ntype PlayerIndicatorProps = PropsWithChildren<{\n model: ExtendedChessModel;\n player: Player;\n icon?: JSX.Element;\n}>;\n\nconst PlayerIndicator = ({ children, model, player, icon }: PlayerIndicatorProps) => {\n const turn = player === (model.game.turn() === 'w' ? 'white' : 'black');\n return (\n <div className='grid grid-cols-[2rem_1fr_2rem] gap-2 bs-[--rail-size] pli-1 flex items-center overflow-hidden'>\n <div className='place-items-center'>\n <Icon\n icon={turn ? 'ph--circle--fill' : 'ph--circle--thin'}\n size={6}\n classNames={mx(turn && (model.game.isCheckmate() ? 'text-red-500' : 'text-green-500'))}\n />\n </div>\n <div className='truncate overflow-hidden items-center'>{children}</div>\n {icon}\n </div>\n );\n};\n\n//\n// PlayerSelector\n//\n\ntype PlayerSelectorProps = {\n value?: string;\n onValueChange: (player: string) => void;\n members: SpaceMember[];\n};\n\nconst PlayerSelector = ({ value, onValueChange, members }: PlayerSelectorProps) => {\n const { t } = useTranslation(meta.id);\n return (\n <Select.Root value={value} onValueChange={onValueChange}>\n <Select.TriggerButton placeholder={t('select player button')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {members.map((member) => {\n const memberKey = member.identity.identityKey.toHex();\n const displayName = member.identity?.profile?.displayName || generateName(memberKey);\n return (\n <Select.Option key={memberKey} value={memberKey}>\n {displayName}\n </Select.Option>\n );\n })}\n </Select.Viewport>\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["RegistryContext", "React", "forwardRef", "useCallback", "useContext", "useEffect", "useImperativeHandle", "useMemo", "useRef", "addEventListener", "Obj", "ChessModel", "Gameboard", "Chessboard", "NaturalChessboard", "getRawPgn", "useGameboardContext", "useSoundEffect", "mx", "useAtomValue", "React", "useEffect", "useMemo", "useRef", "generateName", "Obj", "useMembers", "Icon", "IconButton", "Select", "useTranslation", "useGameboardContext", "mx", "Info", "classNames", "orientation", "onOrientationChange", "onClose", "props", "t", "useTranslation", "meta", "id", "model", "useGameboardContext", "displayName", "db", "Obj", "getDatabase", "object", "members", "useMembers", "spaceId", "div", "className", "mx", "PlayerIndicator", "player", "icon", "IconButton", "iconOnly", "label", "size", "onClick", "PlayerSelector", "value", "players", "onValueChange", "History", "min", "max", "onSelect", "moveIndex", "useAtomValue", "game", "isGameOver", "isCheckmate", "isStalemate", "isCheck", "undefined", "history", "moves", "useMemo", "reduce", "acc", "move", "index", "push", "length", "scrollerRef", "useRef", "useEffect", "current", "scrollTo", "top", "scrollHeight", "querySelector", "classList", "add", "scrollIntoView", "behavior", "remove", "ref", "style", "minHeight", "maxHeight", "map", "a", "b", "key", "data-index", "children", "turn", "Icon", "Select", "Root", "TriggerButton", "placeholder", "Portal", "Content", "Viewport", "member", "memberKey", "identity", "identityKey", "toHex", "profile", "generateName", "Option", "Arrow", "ExtendedChessModel", "ChessModel", "registry", "object", "Root", "forwardRef", "game", "children", "forwardedRef", "useContext", "RegistryContext", "model", "useMemo", "click", "useSoundEffect", "useImperativeHandle", "setMoveNumber", "index", "setMoveIndex", "useEffect", "pgn", "getRawPgn", "silent", "update", "play", "handleDrop", "useCallback", "move", "makeMove", "Obj", "change", "g", "React", "Gameboard", "onDrop", "Content", "classNames", "role", "mx", "grow", "contain", "Board", "props", "useGameboardContext", "displayName", "ref", "useRef", "current", "setAttribute", "addEventListener", "ev", "moveIndex", "get", "key", "history", "length", "NaturalChessboard", "Chessboard", "Info"]
7
+ }
@@ -1,14 +1,13 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
- __export,
4
- meta
5
- } from "./chunk-KNOOJFIR.mjs";
3
+ __export
4
+ } from "./chunk-HSLMI22Q.mjs";
6
5
 
7
6
  // src/types/Chess.ts
8
7
  var Chess_exports = {};
9
8
  __export(Chess_exports, {
10
9
  Game: () => Game,
11
- makeGame: () => makeGame
10
+ make: () => make
12
11
  });
13
12
  import { Chess as ChessJS } from "chess.js";
14
13
  import * as Schema from "effect/Schema";
@@ -32,13 +31,13 @@ var Game = Schema.Struct({
32
31
  fen: Schema.String.annotations({
33
32
  description: "Forsyth-Edwards Notation."
34
33
  }).pipe(FormInputAnnotation.set(false), Schema.optional)
35
- }).pipe(Type.Obj({
34
+ }).pipe(Type.object({
36
35
  typename: "dxos.org/type/Chess",
37
36
  version: "0.2.0"
38
37
  }), LabelAnnotation.set([
39
38
  "name"
40
39
  ]));
41
- var makeGame = ({ name, pgn, fen } = {}) => {
40
+ var make = ({ name, pgn, fen } = {}) => {
42
41
  const chess = new ChessJS();
43
42
  if (pgn) {
44
43
  try {
@@ -54,31 +53,13 @@ var makeGame = ({ name, pgn, fen } = {}) => {
54
53
  }
55
54
  return Obj.make(Game, {
56
55
  name,
57
- players: {},
58
56
  pgn,
59
- fen
57
+ fen,
58
+ players: {}
60
59
  });
61
60
  };
62
61
 
63
- // src/types/ChessAction.ts
64
- var ChessAction_exports = {};
65
- __export(ChessAction_exports, {
66
- Create: () => Create
67
- });
68
- import * as Schema2 from "effect/Schema";
69
- var Create = class extends Schema2.TaggedClass()(`${meta.id}/action/create`, {
70
- input: Schema2.Struct({
71
- name: Schema2.optional(Schema2.String),
72
- pgn: Schema2.optional(Schema2.String)
73
- }),
74
- output: Schema2.Struct({
75
- object: Game
76
- })
77
- }) {
78
- };
79
-
80
62
  export {
81
- Chess_exports,
82
- ChessAction_exports
63
+ Chess_exports
83
64
  };
84
- //# sourceMappingURL=chunk-QKXLEJNZ.mjs.map
65
+ //# sourceMappingURL=chunk-NAYRVJR4.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/Chess.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Chess as ChessJS } from 'chess.js';\nimport * as Schema from 'effect/Schema';\n\nimport { Obj, Type } from '@dxos/echo';\nimport { FormInputAnnotation, LabelAnnotation } from '@dxos/echo/internal';\nimport { log } from '@dxos/log';\n\nexport const Game = Schema.Struct({\n name: Schema.optional(Schema.String),\n players: Schema.Struct({\n white: Schema.optional(\n Schema.String.annotations({\n description: 'DID of white player',\n }),\n ),\n black: Schema.optional(\n Schema.String.annotations({\n description: 'DID of black player',\n }),\n ),\n }).pipe(Schema.mutable, FormInputAnnotation.set(false), Schema.optional),\n pgn: Schema.String.annotations({\n description: 'Portable Game Notation.',\n }).pipe(FormInputAnnotation.set(false), Schema.optional),\n fen: Schema.String.annotations({\n description: 'Forsyth-Edwards Notation.',\n }).pipe(FormInputAnnotation.set(false), Schema.optional),\n}).pipe(\n Type.object({\n typename: 'dxos.org/type/Chess',\n version: '0.2.0',\n }),\n LabelAnnotation.set(['name']),\n);\n\nexport interface Game extends Schema.Schema.Type<typeof Game> {}\n\nexport const make = ({ name, pgn, fen }: { name?: string; pgn?: string; fen?: string } = {}) => {\n const chess = new ChessJS();\n if (pgn) {\n try {\n chess.loadPgn(pgn);\n } catch {\n log.warn(pgn);\n }\n }\n\n return Obj.make(Game, {\n name,\n pgn,\n fen,\n players: {},\n });\n};\n"],
5
+ "mappings": ";;;;;;AAAA;;;;;AAIA,SAASA,SAASC,eAAe;AACjC,YAAYC,YAAY;AAExB,SAASC,KAAKC,YAAY;AAC1B,SAASC,qBAAqBC,uBAAuB;AACrD,SAASC,WAAW;;AAEb,IAAMC,OAAcC,cAAO;EAChCC,MAAaC,gBAAgBC,aAAM;EACnCC,SAAgBJ,cAAO;IACrBK,OAAcH,gBACLC,cAAOG,YAAY;MACxBC,aAAa;IACf,CAAA,CAAA;IAEFC,OAAcN,gBACLC,cAAOG,YAAY;MACxBC,aAAa;IACf,CAAA,CAAA;EAEJ,CAAA,EAAGE,KAAYC,gBAASd,oBAAoBe,IAAI,KAAA,GAAeT,eAAQ;EACvEU,KAAYT,cAAOG,YAAY;IAC7BC,aAAa;EACf,CAAA,EAAGE,KAAKb,oBAAoBe,IAAI,KAAA,GAAeT,eAAQ;EACvDW,KAAYV,cAAOG,YAAY;IAC7BC,aAAa;EACf,CAAA,EAAGE,KAAKb,oBAAoBe,IAAI,KAAA,GAAeT,eAAQ;AACzD,CAAA,EAAGO,KACDd,KAAKmB,OAAO;EACVC,UAAU;EACVC,SAAS;AACX,CAAA,GACAnB,gBAAgBc,IAAI;EAAC;CAAO,CAAA;AAKvB,IAAMM,OAAO,CAAC,EAAEhB,MAAMW,KAAKC,IAAG,IAAoD,CAAC,MAAC;AACzF,QAAMK,QAAQ,IAAI1B,QAAAA;AAClB,MAAIoB,KAAK;AACP,QAAI;AACFM,YAAMC,QAAQP,GAAAA;IAChB,QAAQ;AACNd,UAAIsB,KAAKR,KAAAA,QAAAA;;;;;;IACX;EACF;AAEA,SAAOlB,IAAIuB,KAAKlB,MAAM;IACpBE;IACAW;IACAC;IACAT,SAAS,CAAC;EACZ,CAAA;AACF;",
6
+ "names": ["Chess", "ChessJS", "Schema", "Obj", "Type", "FormInputAnnotation", "LabelAnnotation", "log", "Game", "Struct", "name", "optional", "String", "players", "white", "annotations", "description", "black", "pipe", "mutable", "set", "pgn", "fen", "object", "typename", "version", "make", "chess", "loadPgn", "warn"]
7
+ }
@@ -1,22 +1,43 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  Chess_exports
4
- } from "./chunk-QKXLEJNZ.mjs";
4
+ } from "./chunk-NAYRVJR4.mjs";
5
+ import {
6
+ __export
7
+ } from "./chunk-HSLMI22Q.mjs";
5
8
 
6
- // src/capabilities/blueprint-definition.ts
7
- import { Capabilities, contributes } from "@dxos/app-framework";
9
+ // src/blueprints/chess-blueprint.ts
10
+ var chess_blueprint_exports = {};
11
+ __export(chess_blueprint_exports, {
12
+ Key: () => Key,
13
+ functions: () => functions,
14
+ make: () => make
15
+ });
8
16
  import { Blueprint, Template } from "@dxos/blueprints";
9
17
  import { trim } from "@dxos/util";
10
18
 
11
- // src/functions/create.ts
19
+ // src/blueprints/functions/index.ts
20
+ var functions_exports = {};
21
+ __export(functions_exports, {
22
+ create: () => create_default,
23
+ move: () => move_default,
24
+ play: () => play_default,
25
+ print: () => print_default
26
+ });
27
+
28
+ // src/blueprints/functions/create.ts
12
29
  import * as Effect from "effect/Effect";
13
30
  import * as Schema from "effect/Schema";
14
- import { DatabaseService, defineFunction } from "@dxos/functions";
31
+ import { Database } from "@dxos/echo";
32
+ import { defineFunction } from "@dxos/functions";
15
33
  var create_default = defineFunction({
16
34
  key: "dxos.org/function/chess/create",
17
35
  name: "Create Chess",
18
36
  description: "Creates a new chess game.",
19
37
  inputSchema: Schema.Struct({
38
+ name: Schema.optional(Schema.String.annotations({
39
+ description: "Name of the game."
40
+ })),
20
41
  pgn: Schema.optional(Schema.String.annotations({
21
42
  description: "Portable Game Notation."
22
43
  })),
@@ -25,20 +46,22 @@ var create_default = defineFunction({
25
46
  }))
26
47
  }),
27
48
  outputSchema: Chess_exports.Game,
28
- handler: Effect.fn(function* ({ data: { pgn, fen } }) {
29
- return yield* DatabaseService.add(Chess_exports.makeGame({
49
+ handler: Effect.fn(function* ({ data: { name, pgn, fen } }) {
50
+ return yield* Database.Service.add(Chess_exports.make({
51
+ name,
30
52
  pgn,
31
53
  fen
32
54
  }));
33
55
  })
34
56
  });
35
57
 
36
- // src/functions/move.ts
58
+ // src/blueprints/functions/move.ts
37
59
  import { Chess as ChessJS } from "chess.js";
38
60
  import * as Effect2 from "effect/Effect";
39
61
  import * as Schema2 from "effect/Schema";
40
62
  import { ArtifactId } from "@dxos/assistant";
41
- import { DatabaseService as DatabaseService2, defineFunction as defineFunction2 } from "@dxos/functions";
63
+ import { Database as Database2, Obj } from "@dxos/echo";
64
+ import { defineFunction as defineFunction2 } from "@dxos/functions";
42
65
  var move_default = defineFunction2({
43
66
  key: "dxos.org/function/chess/move",
44
67
  name: "Move",
@@ -61,7 +84,7 @@ var move_default = defineFunction2({
61
84
  })
62
85
  }),
63
86
  handler: Effect2.fn(function* ({ data: { id, move } }) {
64
- const object = yield* DatabaseService2.resolve(ArtifactId.toDXN(id), Chess_exports.Game);
87
+ const object = yield* Database2.Service.resolve(ArtifactId.toDXN(id), Chess_exports.Game);
65
88
  const chess = new ChessJS();
66
89
  if (object.pgn) {
67
90
  chess.loadPgn(object.pgn);
@@ -71,19 +94,23 @@ var move_default = defineFunction2({
71
94
  chess.move(move, {
72
95
  strict: false
73
96
  });
74
- object.pgn = chess.pgn();
97
+ const pgn = chess.pgn();
98
+ Obj.change(object, (o) => {
99
+ o.pgn = pgn;
100
+ });
75
101
  return {
76
- pgn: object.pgn
102
+ pgn
77
103
  };
78
104
  })
79
105
  });
80
106
 
81
- // src/functions/play.ts
107
+ // src/blueprints/functions/play.ts
82
108
  import { Chess as ChessJS2 } from "chess.js";
83
109
  import * as Effect3 from "effect/Effect";
84
110
  import * as Schema3 from "effect/Schema";
85
111
  import { ArtifactId as ArtifactId2 } from "@dxos/assistant";
86
- import { DatabaseService as DatabaseService3, defineFunction as defineFunction3 } from "@dxos/functions";
112
+ import { Database as Database3, Obj as Obj2 } from "@dxos/echo";
113
+ import { defineFunction as defineFunction3 } from "@dxos/functions";
87
114
  var play_default = defineFunction3({
88
115
  key: "dxos.org/function/chess/play",
89
116
  name: "Play",
@@ -106,7 +133,7 @@ var play_default = defineFunction3({
106
133
  })
107
134
  }),
108
135
  handler: Effect3.fn(function* ({ data: { id, side = "any" } }) {
109
- const object = yield* DatabaseService3.resolve(ArtifactId2.toDXN(id), Chess_exports.Game);
136
+ const object = yield* Database3.Service.resolve(ArtifactId2.toDXN(id), Chess_exports.Game);
110
137
  const chess = new ChessJS2();
111
138
  if (object.pgn) {
112
139
  chess.loadPgn(object.pgn);
@@ -124,47 +151,80 @@ var play_default = defineFunction3({
124
151
  chess.move(move, {
125
152
  strict: false
126
153
  });
127
- object.pgn = chess.pgn();
154
+ const pgn = chess.pgn();
155
+ Obj2.change(object, (o) => {
156
+ o.pgn = pgn;
157
+ });
128
158
  return {
129
159
  move,
130
- pgn: object.pgn
160
+ pgn
131
161
  };
132
162
  })
133
163
  });
134
164
 
135
- // src/capabilities/blueprint-definition.ts
165
+ // src/blueprints/functions/print.ts
166
+ import { Chess as ChessJS3 } from "chess.js";
167
+ import * as Effect4 from "effect/Effect";
168
+ import * as Schema4 from "effect/Schema";
169
+ import { defineFunction as defineFunction4 } from "@dxos/functions";
170
+ var print_default = defineFunction4({
171
+ key: "dxos.org/function/chess/print",
172
+ name: "Print game",
173
+ description: "Prints the chess game to ASCII.",
174
+ inputSchema: Schema4.Struct({
175
+ pgn: Schema4.optional(Schema4.String.annotations({
176
+ description: "Portable Game Notation."
177
+ })),
178
+ fen: Schema4.optional(Schema4.String.annotations({
179
+ description: "Forsyth-Edwards Notation."
180
+ }))
181
+ }),
182
+ outputSchema: Schema4.Struct({
183
+ ascii: Schema4.String
184
+ }),
185
+ handler: Effect4.fn(function* ({ data: { pgn, fen } }) {
186
+ try {
187
+ const chess = new ChessJS3(fen);
188
+ if (pgn) {
189
+ chess.loadPgn(pgn);
190
+ }
191
+ return {
192
+ ascii: chess.ascii()
193
+ };
194
+ } catch {
195
+ return {
196
+ ascii: ""
197
+ };
198
+ }
199
+ })
200
+ });
201
+
202
+ // src/blueprints/chess-blueprint.ts
203
+ var Key = "dxos.org/blueprint/chess";
136
204
  var functions = [
137
205
  create_default,
138
206
  move_default,
139
- play_default
207
+ play_default,
208
+ print_default
140
209
  ];
141
- var CHESS_BLUEPRINT_KEY = "dxos.org/blueprint/chess";
142
- var blueprint_definition_default = (() => {
143
- return [
144
- contributes(Capabilities.Functions, functions),
145
- contributes(Capabilities.BlueprintDefinition, Blueprint.make({
146
- key: CHESS_BLUEPRINT_KEY,
147
- name: "Chess",
148
- tools: Blueprint.toolDefinitions({
149
- functions
150
- }),
151
- instructions: Template.make({
152
- source: trim`
153
- You are an expert chess player.
154
- To analyze a game you can access the "pgn" property by loading the context object that represents the current game.
155
- You could suggest a good next move or offer to play a move.
156
- Don't actually make a move unless you are asked to.
157
- `
158
- })
159
- }))
160
- ];
210
+ var make = () => Blueprint.make({
211
+ key: Key,
212
+ name: "Chess",
213
+ tools: Blueprint.toolDefinitions({
214
+ functions
215
+ }),
216
+ instructions: Template.make({
217
+ source: trim`
218
+ You are an expert chess player.
219
+ To analyze a game you can access the "pgn" property by loading the context object that represents the current game.
220
+ You could suggest a good next move or offer to play a move.
221
+ Don't actually make a move unless you are asked to.
222
+ `
223
+ })
161
224
  });
162
225
 
163
226
  export {
164
- create_default,
165
- move_default,
166
- play_default,
167
- CHESS_BLUEPRINT_KEY,
168
- blueprint_definition_default
227
+ functions_exports,
228
+ chess_blueprint_exports
169
229
  };
170
- //# sourceMappingURL=chunk-F3HFLDV5.mjs.map
230
+ //# sourceMappingURL=chunk-NFDJU7XQ.mjs.map